diff --git a/src/fvOptions/fvOptions/fvOption.C b/src/fvOptions/fvOptions/fvOption.C index 4a66ded16eb078f867aff5bcf169581a76aacab1..6cd5c770f4e90b95e03c88ca66479d186f45a86a 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 9344f75ba0efe37ea62afc15edc311a49d99e079..b99c0629ccb2fc5646367c3732da84bf33a78fcb 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 b71e768f428c7dfea79b1dc15d3210009ef087ec..9ecda6cb4fb537e1cd349501d775e055edccad30 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 6b5211ef43da846289f3a274ff7e5bbc3f4e7ae8..85f0c1332e9e5857008d54553a6fe38a0b6ff7f8 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 4587b8ea60a0be63cc6cfcf467403ce4209eed13..69bbc69667b466985a055d3c424b925eec0ca38f 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