diff --git a/src/regionModels/regionModel/regionModel/regionModel.C b/src/regionModels/regionModel/regionModel/regionModel.C index 227af0adb4..55ced3fe53 100644 --- a/src/regionModels/regionModel/regionModel/regionModel.C +++ b/src/regionModels/regionModel/regionModel/regionModel.C @@ -190,6 +190,88 @@ bool Foam::regionModels::regionModel::read(const dictionary& dict) } +const Foam::AMIPatchToPatchInterpolation& +Foam::regionModels::regionModel::interRegionAMI +( + const regionModel& nbrRegion, + const label regionPatchI, + const label nbrPatchI, + const bool flip +) +{ + label nbrRegionID = findIndex(interRegionAMINames_, nbrRegion.name()); + + const fvMesh& nbrRegionMesh = nbrRegion.regionMesh(); + + if (nbrRegionID != -1) + { + if (!interRegionAMI_[nbrRegionID].set(regionPatchI)) + { + const polyPatch& p = regionMesh().boundaryMesh()[regionPatchI]; + const polyPatch& nbrP = nbrRegionMesh.boundaryMesh()[nbrPatchI]; + + int oldTag = UPstream::msgType(); + UPstream::msgType() = oldTag + 1; + + interRegionAMI_[nbrRegionID].set + ( + regionPatchI, + new AMIPatchToPatchInterpolation + ( + p, + nbrP, + faceAreaIntersect::tmMesh, + flip + ) + ); + + UPstream::msgType() = oldTag; + } + + return interRegionAMI_[nbrRegionID][regionPatchI]; + } + else + { + label nbrRegionID = interRegionAMINames_.size(); + + interRegionAMINames_.append(nbrRegion.name()); + + const polyPatch& p = regionMesh().boundaryMesh()[regionPatchI]; + const polyPatch& nbrP = nbrRegionMesh.boundaryMesh()[nbrPatchI]; + + label nPatch = regionMesh().boundaryMesh().size(); + + + interRegionAMI_.resize(nbrRegionID + 1); + + interRegionAMI_.set + ( + nbrRegionID, + new PtrList(nPatch) + ); + + int oldTag = UPstream::msgType(); + UPstream::msgType() = oldTag + 1; + + interRegionAMI_[nbrRegionID].set + ( + regionPatchI, + new AMIPatchToPatchInterpolation + ( + p, + nbrP, + faceAreaIntersect::tmMesh, + flip + ) + ); + + UPstream::msgType() = oldTag; + + return interRegionAMI_[nbrRegionID][regionPatchI]; + } +} + + Foam::label Foam::regionModels::regionModel::nbrCoupledPatchID ( const regionModel& nbrRegion, @@ -234,8 +316,7 @@ Foam::label Foam::regionModels::regionModel::nbrCoupledPatchID FatalErrorIn ( - "Foam::tmp > " - "Foam::regionModels::regionModel::nbrCoupledPatchID" + "Foam::label Foam::regionModels::regionModel::nbrCoupledPatchID" "(" "const regionModel& , " "const label" @@ -275,7 +356,9 @@ Foam::regionModels::regionModel::regionModel(const fvMesh& mesh) primaryPatchIDs_(), intCoupledPatchIDs_(), regionName_("none"), - functions_(*this) + functions_(*this), + interRegionAMINames_(), + interRegionAMI_() {} diff --git a/src/regionModels/regionModel/regionModel/regionModel.H b/src/regionModels/regionModel/regionModel/regionModel.H index c59b8d163d..589402c1cf 100644 --- a/src/regionModels/regionModel/regionModel/regionModel.H +++ b/src/regionModels/regionModel/regionModel/regionModel.H @@ -122,6 +122,15 @@ protected: regionModelFunctionObjectList functions_; + // Inter-region AMI interpolation caching + + //- List of region names this region is coupled to + wordList interRegionAMINames_; + + //- List of AMI objects per coupled region + PtrList > interRegionAMI_; + + // Protected member functions //- Read control parameters from dictionary @@ -130,6 +139,14 @@ protected: //- Read control parameters from dictionary virtual bool read(const dictionary& dict); + //- Create or return a new inter-region AMI object + virtual const Foam::AMIPatchToPatchInterpolation& interRegionAMI + ( + const regionModel& nbrRegion, + const label regionPatchI, + const label nbrPatchI, + const bool flip + ); public: @@ -235,28 +252,28 @@ public: const label nbrPatchI, const Field& nbrField, const bool flip = false - ) const; + ); //- Map patch field from another region model to local patch template tmp > mapRegionPatchField ( - const word& regionModelName, + const regionModel& nbrRegion, const word& fieldName, const label regionPatchI, const bool flip = false - ) const; + ); //- Map patch internal field from another region model to local // patch template tmp > mapRegionPatchInternalField ( - const word& regionModelName, + const regionModel& nbrRegion, const word& fieldName, const label regionPatchI, const bool flip = false - ) const; + ); //- Convert a local region field to the primary region template diff --git a/src/regionModels/regionModel/regionModel/regionModelTemplates.C b/src/regionModels/regionModel/regionModel/regionModelTemplates.C index 4e98b2e2fb..5855ee5906 100644 --- a/src/regionModels/regionModel/regionModel/regionModelTemplates.C +++ b/src/regionModels/regionModel/regionModel/regionModelTemplates.C @@ -32,18 +32,13 @@ Foam::regionModels::regionModel::mapRegionPatchField const label nbrPatchI, const Field& nbrField, const bool flip -) const +) { - const fvMesh& nbrRegionMesh = nbrRegion.regionMesh(); - - const polyPatch& p = regionMesh().boundaryMesh()[regionPatchI]; - - const polyPatch& nbrP = nbrRegionMesh.boundaryMesh()[nbrPatchI]; - int oldTag = UPstream::msgType(); UPstream::msgType() = oldTag + 1; - AMIPatchToPatchInterpolation ami(p, nbrP, faceAreaIntersect::tmMesh, flip); + const AMIPatchToPatchInterpolation& ami = + interRegionAMI(nbrRegion, regionPatchI, nbrPatchI, flip); tmp > tresult(ami.interpolateToSource(nbrField)); @@ -57,40 +52,28 @@ template Foam::tmp > Foam::regionModels::regionModel::mapRegionPatchField ( - const word& regionModelName, + const regionModel& nbrRegion, const word& fieldName, const label regionPatchI, const bool flip -) const +) { typedef GeometricField fieldType; - const regionModel& nbrRegion = - this->primaryMesh_.lookupObject(regionModelName); - const fvMesh& nbrRegionMesh = nbrRegion.regionMesh(); - const polyPatch& p = regionMesh().boundaryMesh()[regionPatchI]; - if (nbrRegionMesh.foundObject(fieldName)) { - const fieldType& nbrField = - nbrRegionMesh.lookupObject(fieldName); - const label nbrPatchI = nbrCoupledPatchID(nbrRegion, regionPatchI); - const polyPatch& nbrP = nbrRegionMesh.boundaryMesh()[nbrPatchI]; - int oldTag = UPstream::msgType(); UPstream::msgType() = oldTag + 1; - AMIPatchToPatchInterpolation ami - ( - p, - nbrP, - faceAreaIntersect::tmMesh, - flip - ); + const AMIPatchToPatchInterpolation& ami = + interRegionAMI(nbrRegion, regionPatchI, nbrPatchI, flip); + + const fieldType& nbrField = + nbrRegionMesh.lookupObject(fieldName); const Field& nbrFieldp = nbrField.boundaryField()[nbrPatchI]; @@ -102,6 +85,8 @@ Foam::regionModels::regionModel::mapRegionPatchField } else { + const polyPatch& p = regionMesh().boundaryMesh()[regionPatchI]; + return tmp > ( @@ -119,40 +104,28 @@ template Foam::tmp > Foam::regionModels::regionModel::mapRegionPatchInternalField ( - const word& regionModelName, + const regionModel& nbrRegion, const word& fieldName, const label regionPatchI, const bool flip -) const +) { typedef GeometricField fieldType; - const regionModel& nbrRegion = - this->primaryMesh_.lookupObject(regionModelName); - const fvMesh& nbrRegionMesh = nbrRegion.regionMesh(); - const polyPatch& p = regionMesh().boundaryMesh()[regionPatchI]; - if (nbrRegionMesh.foundObject(fieldName)) { - const fieldType& nbrField = - nbrRegionMesh.lookupObject(fieldName); - const label nbrPatchI = nbrCoupledPatchID(nbrRegion, regionPatchI); - const polyPatch& nbrP = nbrRegionMesh.boundaryMesh()[nbrPatchI]; - int oldTag = UPstream::msgType(); UPstream::msgType() = oldTag + 1; - AMIPatchToPatchInterpolation ami - ( - p, - nbrP, - faceAreaIntersect::tmMesh, - flip - ); + const AMIPatchToPatchInterpolation& ami = + interRegionAMI(nbrRegion, regionPatchI, nbrPatchI, flip); + + const fieldType& nbrField = + nbrRegionMesh.lookupObject(fieldName); const fvPatchField& nbrFieldp = nbrField.boundaryField()[nbrPatchI]; @@ -168,6 +141,8 @@ Foam::regionModels::regionModel::mapRegionPatchInternalField } else { + const polyPatch& p = regionMesh().boundaryMesh()[regionPatchI]; + return tmp > (