diff --git a/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.C b/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.C index a6a6545e9f3ee6bffdd39a53a3dc83665d312dd9..0af332a336de54520688e2108e15e03c61dd7b7d 100644 --- a/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.C +++ b/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.C @@ -186,7 +186,16 @@ void Foam::dynamicRefineFvMesh::readDict() ).subDict(typeName + "Coeffs") ); - correctFluxes_ = List<Pair<word> >(refineDict.lookup("correctFluxes")); + List<Pair<word> > fluxVelocities = List<Pair<word> > + ( + refineDict.lookup("correctFluxes") + ); + // Rework into hashtable. + correctFluxes_.resize(fluxVelocities.size()); + forAll(fluxVelocities, i) + { + correctFluxes_.insert(fluxVelocities[i][0], fluxVelocities[i][1]); + } dumpLevel_ = Switch(refineDict.lookup("dumpLevel")); } @@ -289,23 +298,46 @@ Foam::dynamicRefineFvMesh::refine << " split faces " << endl; } - forAll(correctFluxes_, i) + HashTable<const surfaceScalarField*> fluxes + ( + lookupClass<surfaceScalarField>() + ); + forAllConstIter(HashTable<const surfaceScalarField*>, fluxes, iter) { + if (!correctFluxes_.found(iter.key())) + { + WarningIn("dynamicRefineFvMesh::refine(const labelList&)") + << "Cannot find surfaceScalarField " << iter.key() + << " in user-provided flux mapping table " + << correctFluxes_ << endl + << " The flux mapping table is used to recreate the" + << " flux on newly created faces." << endl + << " Either add the entry if it is a flux or use (" + << iter.key() << " none) to suppress this warning." + << endl; + continue; + } + + const word& UName = correctFluxes_[iter.key()]; + + if (UName == "none") + { + continue; + } + if (debug) { - Info<< "Mapping flux " << correctFluxes_[i][0] - << " using interpolated flux " << correctFluxes_[i][1] + Info<< "Mapping flux " << iter.key() + << " using interpolated flux " << UName << endl; } - surfaceScalarField& phi = const_cast<surfaceScalarField&> - ( - lookupObject<surfaceScalarField>(correctFluxes_[i][0]) - ); + + surfaceScalarField& phi = const_cast<surfaceScalarField&>(*iter()); const surfaceScalarField phiU ( fvc::interpolate ( - lookupObject<volVectorField>(correctFluxes_[i][1]) + lookupObject<volVectorField>(UName) ) & Sf() ); @@ -482,27 +514,51 @@ Foam::dynamicRefineFvMesh::unrefine const labelList& reversePointMap = map().reversePointMap(); const labelList& reverseFaceMap = map().reverseFaceMap(); - forAll(correctFluxes_, i) + HashTable<const surfaceScalarField*> fluxes + ( + lookupClass<surfaceScalarField>() + ); + forAllConstIter(HashTable<const surfaceScalarField*>, fluxes, iter) { + if (!correctFluxes_.found(iter.key())) + { + WarningIn("dynamicRefineFvMesh::refine(const labelList&)") + << "Cannot find surfaceScalarField " << iter.key() + << " in user-provided flux mapping table " + << correctFluxes_ << endl + << " The flux mapping table is used to recreate the" + << " flux on newly created faces." << endl + << " Either add the entry if it is a flux or use (" + << iter.key() << " none) to suppress this warning." + << endl; + continue; + } + + const word& UName = correctFluxes_[iter.key()]; + + if (UName == "none") + { + continue; + } + if (debug) { - Info<< "Mapping flux " << correctFluxes_[i][0] - << " using interpolated flux " << correctFluxes_[i][1] + Info<< "Mapping flux " << iter.key() + << " using interpolated flux " << UName << endl; } - surfaceScalarField& phi = const_cast<surfaceScalarField&> - ( - lookupObject<surfaceScalarField>(correctFluxes_[i][0]) - ); - surfaceScalarField phiU + + surfaceScalarField& phi = const_cast<surfaceScalarField&>(*iter()); + const surfaceScalarField phiU ( fvc::interpolate ( - lookupObject<volVectorField>(correctFluxes_[i][1]) + lookupObject<volVectorField>(UName) ) & Sf() ); + forAllConstIter(Map<label>, faceToSplitPoint, iter) { label oldFaceI = iter.key(); diff --git a/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.H b/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.H index 06dfbd666d107ae2c1557908928210e94151deb4..2dfe09d07554706ef6246eca8d3a904f82fc0fdd 100644 --- a/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.H +++ b/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.H @@ -64,7 +64,7 @@ protected: Switch dumpLevel_; //- Fluxes to map - List<Pair<word> > correctFluxes_; + HashTable<word> correctFluxes_; //- Number of refinement/unrefinement steps done so far. label nRefinementIterations_; diff --git a/tutorials/multiphase/interDyMFoam/ras/damBreakWithObstacle/constant/dynamicMeshDict b/tutorials/multiphase/interDyMFoam/ras/damBreakWithObstacle/constant/dynamicMeshDict index 91232bba6fd17de29ef21790acdbcdbfa6c3c903..105d0818dd5d21194c8f8ff5ebcc27b01ab597cf 100644 --- a/tutorials/multiphase/interDyMFoam/ras/damBreakWithObstacle/constant/dynamicMeshDict +++ b/tutorials/multiphase/interDyMFoam/ras/damBreakWithObstacle/constant/dynamicMeshDict @@ -35,13 +35,14 @@ dynamicRefineFvMeshCoeffs // Stop refinement if maxCells reached maxCells 200000; // Flux field and corresponding velocity field. Fluxes on changed - // faces get recalculated by interpolating the velocity. + // faces get recalculated by interpolating the velocity. Use 'none' + // on surfaceScalarFields that do not need to be reinterpolated. correctFluxes ( - ( - phi - U - ) + (phi U) + (nHatf none) + (rho*phi none) + (ghf none) ); // Write the refinement level as a volScalarField dumpLevel true;