diff --git a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/lduCalculatedProcessorField/lduCalculatedProcessorField.C b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/lduCalculatedProcessorField/lduCalculatedProcessorField.C index d60692571d..0fb082115b 100644 --- a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/lduCalculatedProcessorField/lduCalculatedProcessorField.C +++ b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/lduCalculatedProcessorField/lduCalculatedProcessorField.C @@ -58,12 +58,25 @@ Foam::lduCalculatedProcessorField::lduCalculatedProcessorField // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // template -bool Foam::lduCalculatedProcessorField::ready() const +bool Foam::lduCalculatedProcessorField::all_ready() const { return UPstream::finishedRequestPair(recvRequest_, sendRequest_); } +template +bool Foam::lduCalculatedProcessorField::ready() const +{ + const bool ok = UPstream::finishedRequest(recvRequest_); + if (ok) + { + recvRequest_ = -1; + if (UPstream::finishedRequest(sendRequest_)) sendRequest_ = -1; + } + return ok; +} + + template void Foam::lduCalculatedProcessorField::initInterfaceMatrixUpdate ( @@ -77,10 +90,11 @@ void Foam::lduCalculatedProcessorField::initInterfaceMatrixUpdate const Pstream::commsTypes commsType ) const { - if (!this->ready()) + if (!this->all_ready()) { FatalErrorInFunction - << "Outstanding request." + << "Outstanding request(s) on interface " + //<< procInterface_.name() << abort(FatalError); } @@ -167,12 +181,12 @@ void Foam::lduCalculatedProcessorField::updateInterfaceMatrix return; } - // Require receive data. Update the send request state. - // OR: UPstream::waitRequestPair(recvRequest_, sendRequest_); - - UPstream::waitRequest(recvRequest_); recvRequest_ = -1; - if (UPstream::finishedRequest(sendRequest_)) sendRequest_ = -1; - + { + // Require receive data. + // Only update the send request state. + UPstream::waitRequest(recvRequest_); recvRequest_ = -1; + if (UPstream::finishedRequest(sendRequest_)) sendRequest_ = -1; + } // Consume straight from receive buffer. Note use of our own // helper to avoid using fvPatch addressing diff --git a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/lduCalculatedProcessorField/lduCalculatedProcessorField.H b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/lduCalculatedProcessorField/lduCalculatedProcessorField.H index bb2cba44e4..c9af9ec11d 100644 --- a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/lduCalculatedProcessorField/lduCalculatedProcessorField.H +++ b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/lduCalculatedProcessorField/lduCalculatedProcessorField.H @@ -103,6 +103,9 @@ protected: const solveScalarField& vals ) const; + //- Receive and send requests have both completed + virtual bool all_ready() const; + public: @@ -112,14 +115,13 @@ public: // Constructors - //- Construct from patch and internal field - lduCalculatedProcessorField + //- Construct from ldu interface + explicit lduCalculatedProcessorField ( const lduInterface& interface - //const Field& ); - //- Construct as copy + //- Copy construct lduCalculatedProcessorField ( const lduCalculatedProcessorField& @@ -132,48 +134,9 @@ public: // Member Functions - // Access - - //- Return communicator used for comms - virtual label comm() const - { - return procInterface_.comm(); - } - - //- Return processor number - virtual int myProcNo() const - { - return procInterface_.myProcNo(); - } - - //- Return neighbour processor number - virtual int neighbProcNo() const - { - return procInterface_.myProcNo(); - } - - //- Is the transform required - virtual bool doTransform() const - { - return false; - } - - //- Return face transformation tensor - virtual const tensorField& forwardT() const - { - return procInterface_.forwardT(); - } - - //- Return rank of component for transform - virtual int rank() const - { - return pTraits::rank; - } - - // Evaluation - //- Is all data available + //- Are all (receive) data available? virtual bool ready() const; //- Initialise neighbour matrix update @@ -231,6 +194,45 @@ public: { NotImplemented; } + + + // Processor coupled interface functions + + //- Return communicator used for communication + virtual label comm() const + { + return procInterface_.comm(); + } + + //- Return processor number + virtual int myProcNo() const + { + return procInterface_.myProcNo(); + } + + //- Return neighbour processor number + virtual int neighbProcNo() const + { + return procInterface_.myProcNo(); + } + + //- Is the transform required + virtual bool doTransform() const + { + return false; + } + + //- Return face transformation tensor + virtual const tensorField& forwardT() const + { + return procInterface_.forwardT(); + } + + //- Return rank of component for transform + virtual int rank() const + { + return pTraits::rank; + } }; diff --git a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/lduPrimitiveProcessorInterface.C b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/lduPrimitiveProcessorInterface.C index 48074e2e3e..3f91831e90 100644 --- a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/lduPrimitiveProcessorInterface.C +++ b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/lduPrimitiveProcessorInterface.C @@ -136,4 +136,5 @@ Foam::lduPrimitiveProcessorInterface::internalFieldTransfer return processorLduInterface::receive