void Foam::processorGAMGInterfaceField::updateInterfaceMatrix ( solveScalarField& result, const bool add, const solveScalarField&, const scalarField& coeffs, const direction cmpt, const Pstream::commsTypes commsType ) const { if (updatedMatrix()) { return; } if ( commsType == Pstream::commsTypes::nonBlocking && !Pstream::floatTransfer ) { // Fast path. if ( outstandingRecvRequest_ >= 0 && outstandingRecvRequest_ < Pstream::nRequests() ) { UPstream::waitRequest(outstandingRecvRequest_); } // Recv finished so assume sending finished as well. outstandingSendRequest_ = -1; outstandingRecvRequest_ = -1; // Consume straight from scalarReceiveBuf_ // Transform according to the transformation tensor transformCoupleField(scalarReceiveBuf_, cmpt); // Multiply the field by coefficients and add into the result addToInternalField(result, !add, coeffs, scalarReceiveBuf_); } else { solveScalarField pnf ( procInterface_.compressedReceive<solveScalar> ( commsType, coeffs.size() ) ); transformCoupleField(pnf, cmpt); addToInternalField(result, !add, coeffs, pnf); } const_cast<processorGAMGInterfaceField&>(*this).updatedMatrix() = true; }
void Foam::cyclicAMIFvPatchField<Type>::updateInterfaceMatrix ( scalarField& result, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, const Pstream::commsTypes ) const { const labelUList& nbrFaceCells = cyclicAMIPatch_.cyclicAMIPatch().neighbPatch().faceCells(); scalarField pnf(psiInternal, nbrFaceCells); // Transform according to the transformation tensors transformCoupleField(pnf, cmpt); if (cyclicAMIPatch_.applyLowWeightCorrection()) { scalarField pif(psiInternal, cyclicAMIPatch_.faceCells()); pnf = cyclicAMIPatch_.interpolate(pnf, pif); } else { pnf = cyclicAMIPatch_.interpolate(pnf); } // Multiply the field by coefficients and add into the result const labelUList& faceCells = cyclicAMIPatch_.faceCells(); forAll(faceCells, elemI) { result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; }
void cyclicFvPatchField<Type>::updateInterfaceMatrix ( const scalarField& psiInternal, scalarField& result, const lduMatrix&, const scalarField& coeffs, const direction cmpt, const Pstream::commsTypes ) const { scalarField pnf(this->size()); label sizeby2 = this->size()/2; const unallocLabelList& faceCells = cyclicPatch_.faceCells(); for (label facei=0; facei<sizeby2; facei++) { pnf[facei] = psiInternal[faceCells[facei + sizeby2]]; pnf[facei + sizeby2] = psiInternal[faceCells[facei]]; } // Transform according to the transformation tensors transformCoupleField(pnf, cmpt); // Multiply the field by coefficients and add into the result forAll(faceCells, elemI) { result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; }
void processorFvPatchField<Type>::updateInterfaceMatrix ( const scalarField&, scalarField& result, const lduMatrix&, const scalarField& coeffs, const direction cmpt, const Pstream::commsTypes commsType, const bool switchToLhs ) const { scalarField pnf ( procPatch_.compressedReceive<scalar>(commsType, this->size())() ); // Transform according to the transformation tensor transformCoupleField(pnf, cmpt); // Multiply the field by coefficients and add into the result const unallocLabelList& faceCells = this->patch().faceCells(); if (switchToLhs) { forAll(faceCells, elemI) { result[faceCells[elemI]] += coeffs[elemI]*pnf[elemI]; } }
void Foam::processorGAMGInterfaceField::updateInterfaceMatrix ( const scalarField&, scalarField& result, const lduMatrix&, const scalarField& coeffs, const direction cmpt, const Pstream::commsTypes commsType, const bool switchToLhs ) const { scalarField pnf ( procInterface_.compressedReceive<scalar>(commsType, coeffs.size()) ); transformCoupleField(pnf, cmpt); const unallocLabelList& faceCells = procInterface_.faceCells(); if (switchToLhs) { forAll(faceCells, elemI) { result[faceCells[elemI]] += coeffs[elemI]*pnf[elemI]; } }
void Foam::cyclicACMIGAMGInterfaceField::updateInterfaceMatrix ( scalarField& result, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, const Pstream::commsTypes ) const { // Get neighbouring field scalarField pnf ( cyclicACMIInterface_.neighbPatch().interfaceInternalField(psiInternal) ); // Transform according to the transformation tensors transformCoupleField(pnf, cmpt); if (cyclicACMIInterface_.owner()) { pnf = cyclicACMIInterface_.AMI().interpolateToSource(pnf); } else { pnf = cyclicACMIInterface_.neighbPatch().AMI().interpolateToTarget(pnf); } const labelUList& faceCells = cyclicACMIInterface_.faceCells(); forAll(faceCells, elemI) { result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; }
void Foam::cyclicACMIGAMGInterfaceField::updateInterfaceMatrix ( scalargpuField& result, const scalargpuField& psiInternal, const scalargpuField& coeffs, const direction cmpt, const Pstream::commsTypes ) const { // Get neighbouring field scalargpuField pnf ( cyclicACMIInterface_.neighbPatch().interfaceInternalField(psiInternal) ); // Transform according to the transformation tensors transformCoupleField(pnf, cmpt); if (cyclicACMIInterface_.owner()) { pnf = cyclicACMIInterface_.AMI().interpolateToSource(pnf); } else { pnf = cyclicACMIInterface_.neighbPatch().AMI().interpolateToTarget(pnf); } GAMGUpdateInterfaceMatrix ( result, coeffs, pnf, cyclicACMIInterface_ ); }
void Foam::cyclicGAMGInterfaceField::updateInterfaceMatrix ( const scalarField& psiInternal, scalarField& result, const lduMatrix&, const scalarField& coeffs, const direction cmpt, const Pstream::commsTypes ) const { scalarField pnf(size()); label sizeby2 = size()/2; const unallocLabelList& faceCells = cyclicInterface_.faceCells(); for (label facei=0; facei<sizeby2; facei++) { pnf[facei] = psiInternal[faceCells[facei + sizeby2]]; pnf[facei + sizeby2] = psiInternal[faceCells[facei]]; } transformCoupleField(pnf, cmpt); forAll(faceCells, elemI) { result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; }
void Foam::cyclicACMIFvPatchField<Type>::updateInterfaceMatrix ( gpuField<Type>& result, const gpuField<Type>& psiInternal, const scalargpuField& coeffs, const Pstream::commsTypes ) const { // note: only applying coupled contribution const labelgpuList& nbrFaceCellsCoupled = cyclicACMIPatch_.cyclicACMIPatch().neighbPatch().getFaceCells(); gpuField<Type> pnf(psiInternal, nbrFaceCellsCoupled); // Transform according to the transformation tensors transformCoupleField(pnf); pnf = cyclicACMIPatch_.interpolate(pnf); matrixPatchOperation ( this->patch().index(), result, this->patch().boundaryMesh().mesh().lduAddr(), matrixInterfaceFunctor<Type> ( coeffs.data(), pnf.data() ) ); }
void Foam::processorFvPatchField<Type>::updateInterfaceMatrix ( scalarField& result, const scalarField&, const scalarField& coeffs, const direction cmpt, const Pstream::commsTypes commsType ) const { if (this->updatedMatrix()) { return; } const labelUList& faceCells = this->patch().faceCells(); if ( commsType == Pstream::commsTypes::nonBlocking && !Pstream::floatTransfer ) { // Fast path. if ( outstandingRecvRequest_ >= 0 && outstandingRecvRequest_ < Pstream::nRequests() ) { UPstream::waitRequest(outstandingRecvRequest_); } // Recv finished so assume sending finished as well. outstandingSendRequest_ = -1; outstandingRecvRequest_ = -1; // Consume straight from scalarReceiveBuf_ // Transform according to the transformation tensor transformCoupleField(scalarReceiveBuf_, cmpt); // Multiply the field by coefficients and add into the result forAll(faceCells, elemI) { result[faceCells[elemI]] -= coeffs[elemI]*scalarReceiveBuf_[elemI]; } }
void Foam::cyclicGAMGInterfaceField::updateInterfaceMatrix ( scalarField& result, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, const Pstream::commsTypes ) const { // Get neighbouring field scalarField pnf ( cyclicInterface_.neighbPatch().interfaceInternalField(psiInternal) ); transformCoupleField(pnf, cmpt); const labelUList& faceCells = cyclicInterface_.faceCells(); forAll(faceCells, elemI) { result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; }
void Foam::ggiGAMGInterfaceField::updateInterfaceMatrix ( const scalarField& psiInternal, scalarField& result, const lduMatrix&, const scalarField& coeffs, const direction cmpt, const Pstream::commsTypes commsType, const bool switchToLhs ) const { // Get expanded data to zone size. No global reduce allowed // HJ, 15/May/2009 scalarField zonePnf = ggiInterface_.internalFieldTransfer(commsType, psiInternal); transformCoupleField(zonePnf, cmpt); const unallocLabelList& faceCells = ggiInterface_.faceCells(); // New treatment. HJ, 26/Jun/2011 if (zonePnf.size() != faceCells.size()) { FatalErrorIn("ggiGAMGInterfaceField::updateInterfaceMatrix") << "Error in interface update: incorrect size of zone fields" << nl << "Field size = " << zonePnf.size() << " Zone size = " << faceCells.size() << abort(FatalError); } if (switchToLhs) { forAll(faceCells, elemI) { result[faceCells[elemI]] += coeffs[elemI]*zonePnf[elemI]; } }
void Foam::processorFvPatchField<Type>::updateInterfaceMatrix ( gpuField<Type>& result, const gpuField<Type>&, const scalargpuField& coeffs, const Pstream::commsTypes commsType ) const { if (this->updatedMatrix()) { return; } if (commsType == Pstream::nonBlocking && !Pstream::floatTransfer) { // Fast path. if ( outstandingRecvRequest_ >= 0 && outstandingRecvRequest_ < Pstream::nRequests() ) { UPstream::waitRequest(outstandingRecvRequest_); } // Recv finished so assume sending finished as well. outstandingSendRequest_ = -1; outstandingRecvRequest_ = -1; // Consume straight from receiveBuf_ // Transform according to the transformation tensor gpuReceiveBuf_ = receiveBuf_; transformCoupleField(gpuReceiveBuf_); // Multiply the field by coefficients and add into the result matrixPatchOperation ( this->patch().index(), result, this->patch().boundaryMesh().mesh().lduAddr(), processorFvPatchFunctor<Type> ( coeffs.data(), gpuReceiveBuf_.data() ) ); } else { gpuField<Type> pnf ( procPatch_.compressedReceive<Type>(commsType, this->size())() ); // Transform according to the transformation tensor transformCoupleField(pnf); // Multiply the field by coefficients and add into the result matrixPatchOperation ( this->patch().index(), result, this->patch().boundaryMesh().mesh().lduAddr(), processorFvPatchFunctor<Type> ( coeffs.data(), pnf.data() ) ); } const_cast<processorFvPatchField<Type>&>(*this).updatedMatrix() = true; }
void Foam::processorGAMGInterfaceField::updateInterfaceMatrix ( scalargpuField& result, const scalargpuField&, const scalargpuField& coeffs, const direction cmpt, const Pstream::commsTypes commsType ) const { if (updatedMatrix()) { return; } label oldWarn = UPstream::warnComm; UPstream::warnComm = comm(); if (commsType == Pstream::nonBlocking && !Pstream::floatTransfer) { // Fast path. if ( outstandingRecvRequest_ >= 0 && outstandingRecvRequest_ < Pstream::nRequests() ) { UPstream::waitRequest(outstandingRecvRequest_); } // Recv finished so assume sending finished as well. outstandingSendRequest_ = -1; outstandingRecvRequest_ = -1; // Consume straight from scalarReceiveBuf_ if( ! Pstream::gpuDirectTransfer) { scalargpuReceiveBuf_ = scalarReceiveBuf_; } // Transform according to the transformation tensor transformCoupleField(scalargpuReceiveBuf_, cmpt); // Multiply the field by coefficients and add into the result GAMGUpdateInterfaceMatrix ( result, coeffs, scalargpuReceiveBuf_, procInterface_ ); } else { scalargpuReceiveBuf_.setSize(coeffs.size()); procInterface_.compressedReceive<scalar>(commsType, scalargpuReceiveBuf_); transformCoupleField(scalargpuReceiveBuf_, cmpt); GAMGUpdateInterfaceMatrix ( result, coeffs, scalargpuReceiveBuf_, procInterface_ ); } const_cast<processorGAMGInterfaceField&>(*this).updatedMatrix() = true; UPstream::warnComm = oldWarn; }