diff --git a/src/dynamicMesh/dynamicFvMesh/dynamicTopoFvMesh/dynamicTopoFvMesh.C b/src/dynamicMesh/dynamicFvMesh/dynamicTopoFvMesh/dynamicTopoFvMesh.C index 0b95f162c..91426b865 100644 --- a/src/dynamicMesh/dynamicFvMesh/dynamicTopoFvMesh/dynamicTopoFvMesh.C +++ b/src/dynamicMesh/dynamicFvMesh/dynamicTopoFvMesh/dynamicTopoFvMesh.C @@ -1197,10 +1197,12 @@ void dynamicTopoFvMesh::readOptionalParameters(bool reRead) // Read from disk dict_.readIfModified(); + const dictionary& meshSubDict = dict_.subDict("dynamicTopoFvMesh"); + // Enable/disable run-time debug level - if (dict_.found("debug") || mandatory_) + if (meshSubDict.found("debug") || mandatory_) { - debug = readLabel(dict_.lookup("debug")); + debug = readLabel(meshSubDict.lookup("debug")); } else { @@ -1216,8 +1218,6 @@ void dynamicTopoFvMesh::readOptionalParameters(bool reRead) polyMesh::debug = true; } - const dictionary& meshSubDict = dict_.subDict("dynamicTopoFvMesh"); - // Re-read edge-refinement options, if necessary if (edgeRefinement_ && reRead) { diff --git a/src/dynamicMesh/dynamicFvMesh/dynamicTopoFvMesh/dynamicTopoFvMeshMapping.C b/src/dynamicMesh/dynamicFvMesh/dynamicTopoFvMesh/dynamicTopoFvMeshMapping.C index b562a6c53..648c0a63d 100644 --- a/src/dynamicMesh/dynamicFvMesh/dynamicTopoFvMesh/dynamicTopoFvMeshMapping.C +++ b/src/dynamicMesh/dynamicFvMesh/dynamicTopoFvMesh/dynamicTopoFvMeshMapping.C @@ -58,7 +58,47 @@ void dynamicTopoFvMesh::computeMapping const label cellSize ) { + // Compute cell mapping + for (label cellI = cellStart; cellI < (cellStart + cellSize); cellI++) + { + label cIndex = cellsFromCells_[cellI].index(); + if (skipMapping) + { + // Set empty mapping parameters + const labelList& mo = cellParents_[cIndex]; + + cellsFromCells_[cellI].masterObjects() = mo; + cellWeights_[cellI].setSize(mo.size(), (1.0/(mo.size() + VSMALL))); + cellCentres_[cellI].setSize(mo.size(), vector::zero); + } + } + + // Compute face mapping + for (label faceI = faceStart; faceI < (faceStart + faceSize); faceI++) + { + label fIndex = facesFromFaces_[faceI].index(); + label patchIndex = whichPatch(fIndex); + + // Skip mapping for internal faces. + if (patchIndex == -1) + { + // Set dummy masters, so that the conventional + // faceMapper doesn't incur a seg-fault. + facesFromFaces_[faceI].masterObjects() = labelList(1, 0); + continue; + } + + if (skipMapping) + { + // Set empty mapping parameters + const labelList& mo = faceParents_[fIndex]; + + facesFromFaces_[faceI].masterObjects() = mo; + faceWeights_[faceI].setSize(mo.size(), (1.0/(mo.size() + VSMALL))); + faceCentres_[faceI].setSize(mo.size(), vector::zero); + } + } } diff --git a/tutorials/mesh/moveDynamicMesh/circCylinder3d/constant/dynamicMeshDict b/tutorials/mesh/moveDynamicMesh/circCylinder3d/constant/dynamicMeshDict index 7ff03f1b3..bbf3dcf1b 100644 --- a/tutorials/mesh/moveDynamicMesh/circCylinder3d/constant/dynamicMeshDict +++ b/tutorials/mesh/moveDynamicMesh/circCylinder3d/constant/dynamicMeshDict @@ -16,29 +16,27 @@ FoamFile // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -// Select the type of dynamicFvMesh, and load custom library -dynamicFvMesh dynamicMotionSolverFvMesh; - -// Load custom libraries -motionSolverLibs ("libmesquiteMotionSolver.so"); +//- Select the type of dynamicFvMesh +dynamicFvMesh dynamicTopoFvMesh; +//- Select the type of motionSolver solver mesquiteMotionSolver; mesquiteOptions { - // Optimization metric + //- Optimization metric optMetric AspectRatioGamma; - // Objective function + //- Objective function objFunction LPtoP; - // Optimization algorithm + //- Optimization algorithm optAlgorithm FeasibleNewton; - // Termination criteria sub-dictionary - // (takes default values if not specified) - // Specifying an empty sub-dictionary - // terminates with available options + //- Termination criteria sub-dictionaries + //- (takes default values if not specified) + //- Specifying an empty sub-dictionary + //- terminates with available options tcInner { absGradL2 1e-4; @@ -48,34 +46,35 @@ mesquiteOptions // tcOuter // {} - // For composite functions, two objectives need to be specified + //- For composite functions, two objectives need to be specified // firstFunction LPtoP; // secondFunction LInf; - // For scaled functions, scale and objective needs to be specified + //- For scaled functions, scale and objective needs to be specified // scaleFunction PMeanP; // scale 1.5; - // Power value for the LPtoP objective function + //- Power value for the LPtoP objective function pValue 2; power 2; - // Specify a tolerance for the surface-smoothing CG solver + //- Specify a tolerance for the surface-smoothing CG solver tolerance 1e-2; - // Specify number of CG sweeps for surface-smoothing + //- Specify number of CG sweeps for surface-smoothing nSweeps 2; - // Specify slip patches for the motionSolver + //- Specify slip patches for the motionSolver slipPatches { sideWall; topWall; } + //- Constrain surface mesh-motion on a specified cylinder cylindricalConstraints { - // Specify options per slip patch + //- Specify options per slip patch sideWall { axisPoint (0.0 0.0 0.0); @@ -84,15 +83,15 @@ mesquiteOptions } } - // Specify fixedValue patches for the motionSolver + //- Specify fixedValue patches for the motionSolver fixedValuePatches { topWall { - //type angularOscillatingDisplacement; - //amplitude -0.0125; - type oscillatingDisplacement; - amplitude (0 0 -0.01); + type angularOscillatingDisplacement; + amplitude -0.0125; + //type oscillatingDisplacement; + //amplitude (0 0 -0.01); axis (1 0 0); origin (0 0 3); angle0 0.0; @@ -101,9 +100,99 @@ mesquiteOptions } } - // Specify interval for surface smoothing + //- Specify interval for surface smoothing surfInterval 1; } +//- Options for dynamicTopoFvMesh +dynamicTopoFvMesh +{ + //- Should all options be made mandatory? + //- Useful for first-time use. + allOptionsMandatory no; + + //- Set run-time debug level [0-5] + // debug 0; + + //- Specify the number of threads + threads 1; + + //- Specify re-meshing interval + //- Negative value implies no re-meshing + interval 1; + + //- Specify whether the length-scale field + //- should be dumped to disk + dumpLengthScale false; + + //- sliverThreshold specifies the + //- quality criteria for sliver removal. + sliverThreshold 0.35; + + //- Should the tool attempt to remove slivers + //- that fall below the sliverThreshold value? + removeSlivers false; + + //- Skip mapping step. Useful while using + //- this tool as a pre-processor + skipMapping true; + + // Toggle edgeRefinement on/off + edgeRefinement yes; + + //- Options for edge-bisection/collapse. + //- The edgeRefinement flag must be set for + //- the following options to have effect + refinementOptions + { + collapseRatio 0.5; + bisectionRatio 1.5; + growthFactor 1.03; + + //- By default, existing boundary edge-lengths + //- are used for length-scales. + //- Length-scale can be fixed for certain patches. + fixedLengthScalePatches + { + topWall 0.2; + bottomWall 0.2; + sideWall 0.2; + outlet 0.2; + } + + //- Avoid refinement on certain patches, if necessary + noModificationPatches + {} + + //- Set floating length-scale values on certain patches + freeLengthScalePatches + {} + + //- Limit lengthScales to specified values, if necessary + // minLengthScale 0.1; + // maxLengthScale 0.3; + + //- Field-based refinement options + // fieldRefinement gamma; + // fieldLengthScale 0.005; + // lowerRefineLevel 0.001; + // upperRefineLevel 0.999; + // maxRefineLevel 4; + // meanScale 0.015; + } + + //- If the number of modifications are to be limited, set this option + // maxModifications 1000; + + //- Load custom libraries for metrics + // tetMetricLibs ("libtetMetrics.so"); + + //- Tetrahedral mesh quality metric + tetMetric Knupp; + + //- Avoid 2-2 swapping on certain patches + noSwapPatches + {} +} // ************************************************************************* //