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::processorGAMGInterfaceField::updateInterfaceMatrix ( scalarField& result, const scalarField&, const scalarField& coeffs, const direction cmpt, const Pstream::commsTypes commsType ) const { if (updatedMatrix()) { return; } label oldWarn = UPstream::warnComm; UPstream::warnComm = comm(); const labelUList& faceCells = procInterface_.faceCells(); 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_ // 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::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; }