From 147e2794f91dd0dab6095355efea6d816b4d2323 Mon Sep 17 00:00:00 2001 From: andy <andy> Date: Thu, 10 Jan 2013 10:27:17 +0000 Subject: [PATCH] ENH: Updated mesh-to-mesh interpolation --- src/fvOptions/fvOptions/fvOption.C | 5 +- .../meshToMesh/meshToMesh.H | 3 + .../meshToMeshNew/meshToMeshNew.C | 68 ++++++++++++++----- .../meshToMeshNew/meshToMeshNew.H | 25 +++++-- .../meshToMeshNew/meshToMeshNewTemplates.C | 39 ++++++----- 5 files changed, 100 insertions(+), 40 deletions(-) diff --git a/src/fvOptions/fvOptions/fvOption.C b/src/fvOptions/fvOptions/fvOption.C index 4a66ded16eb..6cd5c770f4e 100644 --- a/src/fvOptions/fvOptions/fvOption.C +++ b/src/fvOptions/fvOptions/fvOption.C @@ -191,7 +191,10 @@ void Foam::fv::option::setCellSet() ( mesh_, nbrMesh, - readBool(dict_.lookup("consistentMeshes")) + meshToMeshNew::interpolationMethodNames_.read + ( + dict_.lookup("interpolationMethod") + ) ) ); } diff --git a/src/sampling/meshToMeshInterpolation/meshToMesh/meshToMesh.H b/src/sampling/meshToMeshInterpolation/meshToMesh/meshToMesh.H index 9344f75ba0e..b99c0629ccb 100644 --- a/src/sampling/meshToMeshInterpolation/meshToMesh/meshToMesh.H +++ b/src/sampling/meshToMeshInterpolation/meshToMesh/meshToMesh.H @@ -27,6 +27,9 @@ Class Description mesh to mesh interpolation class. +Note + This class is due to be deprecated in favour of meshToMeshNew + SourceFiles meshToMesh.C calculateMeshToMeshAddressing.C diff --git a/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNew.C b/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNew.C index b71e768f428..9ecda6cb4fb 100644 --- a/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNew.C +++ b/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNew.C @@ -39,6 +39,20 @@ License namespace Foam { defineTypeNameAndDebug(meshToMeshNew, 0); + + template<> + const char* Foam::NamedEnum + < + Foam::meshToMeshNew::interpolationMethod, + 2 + >::names[] = + { + "map", + "cellVolumeWeight" + }; + + const NamedEnum<meshToMeshNew::interpolationMethod, 2> + meshToMeshNew::interpolationMethodNames_; } Foam::scalar Foam::meshToMeshNew::tolerance_ = 1e-6; @@ -707,22 +721,40 @@ void Foam::meshToMeshNew::calcAddressing } - if (directMapping_) + switch (method_) { - calcDirect(src, tgt, srcSeedI, tgtSeedI); - } - else - { - calcIndirect - ( - src, - tgt, - srcSeedI, - tgtSeedI, - srcCellIDs, - mapFlag, - startSeedI - ); + case imMap: + { + calcDirect(src, tgt, srcSeedI, tgtSeedI); + break; + } + case imCellVolumeWeight: + { + calcIndirect + ( + src, + tgt, + srcSeedI, + tgtSeedI, + srcCellIDs, + mapFlag, + startSeedI + ); + break; + } + default: + { + FatalErrorIn + ( + "void Foam::meshToMeshNew::calcAddressing" + "(" + "const polyMesh&, " + "const polyMesh&" + ")" + ) + << "Unknown interpolation method" + << abort(FatalError); + } } @@ -739,7 +771,7 @@ Foam::meshToMeshNew::meshToMeshNew ( const polyMesh& src, const polyMesh& tgt, - const bool directMapping + const interpolationMethod& method ) : srcRegionName_(src.name()), @@ -748,11 +780,11 @@ Foam::meshToMeshNew::meshToMeshNew tgtToSrcCellAddr_(), srcToTgtCellWght_(), tgtToSrcCellWght_(), + method_(method), V_(0.0), singleMeshProc_(-1), srcMapPtr_(NULL), - tgtMapPtr_(NULL), - directMapping_(directMapping) + tgtMapPtr_(NULL) { Info<< "Creating mesh-to-mesh addressing for " << src.name() << " and " << tgt.name() << " regions" << endl; diff --git a/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNew.H b/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNew.H index 6b5211ef43d..85f0c1332e9 100644 --- a/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNew.H +++ b/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNew.H @@ -40,6 +40,7 @@ SourceFiles #include "boundBox.H" #include "mapDistribute.H" #include "volFieldsFwd.H" +#include "NamedEnum.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -52,6 +53,22 @@ namespace Foam class meshToMeshNew { +public: + + // Public data types + + //- Enumeration specifying required accuracy + enum interpolationMethod + { + imMap, + imCellVolumeWeight + }; + + static const NamedEnum<interpolationMethod, 2> + interpolationMethodNames_; + +private: + // Private data //- Name of source mesh region @@ -72,6 +89,9 @@ class meshToMeshNew //- Target to source cell interpolation weights scalarListList tgtToSrcCellWght_; + //- Interpolation method + interpolationMethod method_; + //- Cell total volume in overlap region [m3] scalar V_; @@ -85,9 +105,6 @@ class meshToMeshNew //- Target map pointer - parallel running only autoPtr<mapDistribute> tgtMapPtr_; - //- Flag to indicate that direct (one-to-one) mapping should be applied - bool directMapping_; - //- Tolerance used in volume overlap calculations static scalar tolerance_; @@ -289,7 +306,7 @@ public: ( const polyMesh& src, const polyMesh& tgt, - const bool directMapping + const interpolationMethod& method ); diff --git a/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNewTemplates.C b/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNewTemplates.C index 4587b8ea60a..69bbc69667b 100644 --- a/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNewTemplates.C +++ b/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNewTemplates.C @@ -395,28 +395,33 @@ void Foam::meshToMeshNew::interpolate if (interpPatches) { - if (directMapping_) + switch (method_) { - result.boundaryField() == field.boundaryField(); - } - else - { - notImplemented - ( - "void Foam::meshToMeshNew::interpolate" - "(" - "const GeometricField<Type, fvPatchField, volMesh>&, " - "const CombineOp&, " - "GeometricField<Type, fvPatchField, volMesh>&, " - "const bool" - ") const - non-conformal patches" - ) - - // do something... + case imMap: + { + result.boundaryField() == field.boundaryField(); + break; + } + default: + { + notImplemented + ( + "void Foam::meshToMeshNew::interpolate" + "(" + "const GeometricField<Type, fvPatchField, volMesh>&, " + "const CombineOp&, " + "GeometricField<Type, fvPatchField, volMesh>&, " + "const bool" + ") const - non-conformal patches" + ) + + // do something... + } } } } + template<class Type, class CombineOp> Foam::tmp<Foam::GeometricField<Type, Foam::fvPatchField, Foam::volMesh> > Foam::meshToMeshNew::interpolate -- GitLab