From 98c42479f693586404489a02fef06a8057a98fc8 Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Thu, 4 May 2023 17:45:58 +0200 Subject: [PATCH] ENH: relax processorField waiting requirements - for interface polling previously required that both send and recv requests were completed before evaluating (values or matrix update). However, only the recv needs to be complete, which helps disentangle the inter-rank waiting. NB: this change is possible following (1f5cf3958bc8) that replaced UPstream::resetRequests() call in favour of UPstream::waitRequests() --- .../lduCalculatedProcessorField.C | 32 +++-- .../lduCalculatedProcessorField.H | 90 ++++++------- .../lduPrimitiveProcessorInterface.C | 1 + .../lduPrimitiveProcessorInterface.H | 78 ++++++------ .../lduInterfaceField/lduInterfaceField.H | 65 +++++----- .../processor/processorFaPatchField.C | 55 ++++---- .../processor/processorFaPatchField.H | 104 +++++++-------- .../calculatedProcessorFvPatchField.C | 35 ++++-- .../calculatedProcessorFvPatchField.H | 119 +++++++++--------- .../processor/processorFvPatchField.C | 67 +++++----- .../processor/processorFvPatchField.H | 108 ++++++++-------- 11 files changed, 402 insertions(+), 352 deletions(-) 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