From e651d63566897f00b049f56d461f48aedb9d129e Mon Sep 17 00:00:00 2001 From: mattijs Date: Thu, 8 Feb 2024 14:58:10 +0000 Subject: [PATCH] ENH: cyclicAMI - clear finished send/recv requests --- .../cyclicACMI/cyclicACMIFvPatchField.C | 68 ++++++++++++------- .../cyclicAMI/cyclicAMIFvPatchField.C | 55 ++++++++++++++- .../cyclicACMIGAMGInterfaceField.C | 17 ++++- .../cyclicAMIGAMGInterfaceField.C | 17 ++++- 4 files changed, 129 insertions(+), 28 deletions(-) diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.C index 3bc1a504bb..7c139b2f9f 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.C +++ b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2013-2017 OpenFOAM Foundation - Copyright (C) 2019-2023 OpenCFD Ltd. + Copyright (C) 2019-2024 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -444,7 +444,14 @@ void Foam::cyclicACMIFvPatchField::initEvaluate << " starting send&receive" << endl; - if (!this->ready()) + // Bypass polyPatch to get nbrId. + // - use cyclicACMIFvPatch::neighbPatch() virtual instead + const cyclicACMIFvPatch& neighbPatch = cyclicACMIPatch_.neighbPatch(); + const labelUList& nbrFaceCells = neighbPatch.faceCells(); + const Field pnf(this->primitiveField(), nbrFaceCells); + + // Assert that all receives are known to have finished + if (!recvRequests_.empty()) { FatalErrorInFunction << "Outstanding recv request(s) on patch " @@ -453,11 +460,8 @@ void Foam::cyclicACMIFvPatchField::initEvaluate << abort(FatalError); } - // By-pass polyPatch to get nbrId. Instead use cyclicACMIFvPatch virtual - // neighbPatch() - const cyclicACMIFvPatch& neighbPatch = cyclicACMIPatch_.neighbPatch(); - const labelUList& nbrFaceCells = neighbPatch.faceCells(); - const Field pnf(this->primitiveField(), nbrFaceCells); + // Assume that sends are also OK + sendRequests_.clear(); cyclicACMIPatch_.initInterpolate ( @@ -515,6 +519,10 @@ void Foam::cyclicACMIFvPatchField::evaluate ).ptr() ); + // Receive requests all handled by last function call + recvRequests_.clear(); + + auto& patchNeighbourField = patchNeighbourFieldPtr_.ref(); if (doTransform()) @@ -559,7 +567,16 @@ void Foam::cyclicACMIFvPatchField::initInterfaceMatrixUpdate << " starting send&receive" << endl; - if (!this->ready()) + const labelUList& nbrFaceCells = + lduAddr.patchAddr(cyclicACMIPatch_.neighbPatchID()); + + solveScalarField pnf(psiInternal, nbrFaceCells); + + // Transform according to the transformation tensors + transformCoupleField(pnf, cmpt); + + // Assert that all receives are known to have finished + if (!recvRequests_.empty()) { FatalErrorInFunction << "Outstanding recv request(s) on patch " @@ -568,13 +585,8 @@ void Foam::cyclicACMIFvPatchField::initInterfaceMatrixUpdate << abort(FatalError); } - const labelUList& nbrFaceCells = - lduAddr.patchAddr(cyclicACMIPatch_.neighbPatchID()); - - solveScalarField pnf(psiInternal, nbrFaceCells); - - // Transform according to the transformation tensors - transformCoupleField(pnf, cmpt); + // Assume that sends are also OK + sendRequests_.clear(); cyclicACMIPatch_.initInterpolate ( @@ -635,6 +647,9 @@ void Foam::cyclicACMIFvPatchField::updateInterfaceMatrix recvRequests_, scalarRecvBufs_ ); + + // Receive requests all handled by last function call + recvRequests_.clear(); } else { @@ -676,7 +691,16 @@ void Foam::cyclicACMIFvPatchField::initInterfaceMatrixUpdate << exit(FatalError); } - if (!this->ready()) + const labelUList& nbrFaceCells = + lduAddr.patchAddr(cyclicACMIPatch_.neighbPatchID()); + + Field pnf(psiInternal, nbrFaceCells); + + // Transform according to the transformation tensors + transformCoupleField(pnf); + + // Assert that all receives are known to have finished + if (!recvRequests_.empty()) { FatalErrorInFunction << "Outstanding recv request(s) on patch " @@ -685,13 +709,8 @@ void Foam::cyclicACMIFvPatchField::initInterfaceMatrixUpdate << abort(FatalError); } - const labelUList& nbrFaceCells = - lduAddr.patchAddr(cyclicACMIPatch_.neighbPatchID()); - - Field pnf(psiInternal, nbrFaceCells); - - // Transform according to the transformation tensors - transformCoupleField(pnf); + // Assume that sends are also OK + sendRequests_.clear(); cyclicACMIPatch_.initInterpolate ( @@ -741,6 +760,9 @@ void Foam::cyclicACMIFvPatchField::updateInterfaceMatrix recvRequests_, recvBufs_ ); + + // Receive requests all handled by last function call + recvRequests_.clear(); } else { diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.C index b732866cb0..452d119105 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.C +++ b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2017 OpenFOAM Foundation - Copyright (C) 2019-2023 OpenCFD Ltd. + Copyright (C) 2019-2024 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -446,14 +446,27 @@ void Foam::cyclicAMIFvPatchField::initEvaluate // Start sending - // By-pass polyPatch to get nbrId. Instead use cyclicAMIFvPatch virtual - // neighbPatch() + // Bypass polyPatch to get nbrId. + // - use cyclicACMIFvPatch::neighbPatch() virtual instead const cyclicAMIFvPatch& neighbPatch = cyclicAMIPatch_.neighbPatch(); const labelUList& nbrFaceCells = neighbPatch.faceCells(); const Field pnf(this->primitiveField(), nbrFaceCells); const cyclicAMIPolyPatch& cpp = cyclicAMIPatch_.cyclicAMIPatch(); + // Assert that all receives are known to have finished + if (!recvRequests_.empty()) + { + FatalErrorInFunction + << "Outstanding recv request(s) on patch " + << cyclicAMIPatch_.name() + << " field " << this->internalField().name() + << abort(FatalError); + } + + // Assume that sends are also OK + sendRequests_.clear(); + cpp.initInterpolate ( pnf, @@ -516,6 +529,10 @@ void Foam::cyclicAMIFvPatchField::evaluate defaultValues ).ptr() ); + + // Receive requests all handled by last function call + recvRequests_.clear(); + auto& patchNeighbourField = patchNeighbourFieldPtr_.ref(); if (doTransform()) @@ -563,6 +580,19 @@ void Foam::cyclicAMIFvPatchField::initInterfaceMatrixUpdate const cyclicAMIPolyPatch& cpp = cyclicAMIPatch_.cyclicAMIPatch(); + // Assert that all receives are known to have finished + if (!recvRequests_.empty()) + { + FatalErrorInFunction + << "Outstanding recv request(s) on patch " + << cyclicAMIPatch_.name() + << " field " << this->internalField().name() + << abort(FatalError); + } + + // Assume that sends are also OK + sendRequests_.clear(); + cpp.initInterpolate ( pnf, @@ -624,6 +654,9 @@ void Foam::cyclicAMIFvPatchField::updateInterfaceMatrix scalarRecvBufs_, defaultValues ); + + // Receive requests all handled by last function call + recvRequests_.clear(); } else { @@ -682,6 +715,19 @@ void Foam::cyclicAMIFvPatchField::initInterfaceMatrixUpdate const cyclicAMIPolyPatch& cpp = cyclicAMIPatch_.cyclicAMIPatch(); + // Assert that all receives are known to have finished + if (!recvRequests_.empty()) + { + FatalErrorInFunction + << "Outstanding recv request(s) on patch " + << cyclicAMIPatch_.name() + << " field " << this->internalField().name() + << abort(FatalError); + } + + // Assume that sends are also OK + sendRequests_.clear(); + cpp.initInterpolate ( pnf, @@ -742,6 +788,9 @@ void Foam::cyclicAMIFvPatchField::updateInterfaceMatrix recvBufs_, defaultValues ); + + // Receive requests all handled by last function call + recvRequests_.clear(); } else { diff --git a/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicACMIGAMGInterfaceField/cyclicACMIGAMGInterfaceField.C b/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicACMIGAMGInterfaceField/cyclicACMIGAMGInterfaceField.C index 5f41ba8cef..2d4491ca77 100644 --- a/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicACMIGAMGInterfaceField/cyclicACMIGAMGInterfaceField.C +++ b/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicACMIGAMGInterfaceField/cyclicACMIGAMGInterfaceField.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2013 OpenFOAM Foundation - Copyright (C) 2019,2023 OpenCFD Ltd. + Copyright (C) 2019-2024 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -217,6 +217,18 @@ void Foam::cyclicACMIGAMGInterfaceField::initInterfaceMatrixUpdate : AMI.srcMap() ); + // Assert that all receives are known to have finished + if (!recvRequests_.empty()) + { + FatalErrorInFunction + << "Outstanding recv request(s) on patch " + << cyclicACMIInterface_.index() + << abort(FatalError); + } + + // Assume that sends are also OK + sendRequests_.clear(); + // Insert send/receive requests (non-blocking). See e.g. // cyclicAMIPolyPatchTemplates.C const label oldWarnComm = UPstream::commWarn(AMI.comm()); @@ -276,6 +288,9 @@ void Foam::cyclicACMIGAMGInterfaceField::updateInterfaceMatrix solveScalarField work; map.receive(recvRequests_, scalarRecvBufs_, work); + // Receive requests all handled by last function call + recvRequests_.clear(); + solveScalarField pnf(faceCells.size(), Zero); AMI.weightedSum ( diff --git a/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.C b/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.C index 793fe4bfa4..68d19e6c1d 100644 --- a/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.C +++ b/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2013 OpenFOAM Foundation - Copyright (C) 2019,2023 OpenCFD Ltd. + Copyright (C) 2019-2024 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -218,6 +218,18 @@ void Foam::cyclicAMIGAMGInterfaceField::initInterfaceMatrixUpdate : AMI.srcMap() ); + // Assert that all receives are known to have finished + if (!recvRequests_.empty()) + { + FatalErrorInFunction + << "Outstanding recv request(s) on patch " + << cyclicAMIInterface_.index() + << abort(FatalError); + } + + // Assume that sends are also OK + sendRequests_.clear(); + // Insert send/receive requests (non-blocking). See e.g. // cyclicAMIPolyPatchTemplates.C const label oldWarnComm = UPstream::commWarn(AMI.comm()); @@ -290,6 +302,9 @@ void Foam::cyclicAMIGAMGInterfaceField::updateInterfaceMatrix solveScalarField work; map.receive(recvRequests_, scalarRecvBufs_, work); + // Receive requests all handled by last function call + recvRequests_.clear(); + solveScalarField pnf(faceCells.size(), Zero); AMI.weightedSum (