snappyHexMesh is a meshing engine that has been developed specifically for quality CFD hex(-dominant) mesh generation. It is included with OpenFOAM and requires that the environment has been properly set. On a default installation, this can be done by executing the following command in the working terminal:
. /usr/lib/openfoam/openfoam2006/etc/bashrc
Mesh generation with snappyHexMesh involves three steps:
The tutorial available here provides an excellent visualization of how these three steps are applied to a 2D shape.
snappyHexMesh requires a purely hexahedral base mesh, which can be created with another Promesh tool such as blockMesh.
Generic code for snappyHexMesh:
{
"Program Type": "Mesh Generation",
"Mesh File Options": {
"Input Geometry File": "geometry.stl"
"Output Mesh File": "meshed_geometry.vtu"
},
"Mesh Generation Options": {
"Mesh Generation Engine": "snappyHexMesh",
"snappyHexMesh Parameters": {
"Castellated Mesh": true,
"Snapping": true,
"Layer Addition": false,
"mergeTolerance": 1e-06,
"Geometry Definition": {
"Enable Multi Patches": true | false
"Input Patch Name": "patch_name"
"Custom Patches": [
{
"Custom Patch Name": "box_patch_name",
"Searchable Shape": "searchableBox",
"minimum bound": [-0.5, -0.5, -0.5],
"maximmum bound": [0.5, 0.5, 0.5]
},
{
"Custom Patch Name": "cylinder_patch_name",
"Searchable Shape": "searchableCylinder",
"Radius": 0.5,
"Axis Point 1": [-0.5, 0., 0.],
"Axis Point 2": [0.5, 0., 0.]
},
{
"Custom Patch Name": "sphere_patch_name",
"Searchable Shape": "searchableSphere",
"Radius": 0.5,
"Center": [0., 0., 0.]
}
]
},
"Castellated Mesh Controls": {
"CellZones": true | false,
"maxLocalCells": 2000000,
"maxGlobalCells": 4000000,
"minRefCells": 0,
"General GapLevelIncrement": 1,
"nCellsBetweenLevels": 3,
"surfaceRefinementLvlMin": 0,
"surfaceRefinementLvlMax": 0,
"resolveFeatureAngle": 60,
"gapLevelIncrement": 1,
"planarAngle": 30,
"locationInMesh": [0., 0., 0.],
"allowFreeStandingZoneFaces": true | false,
"Feature File": {
"File Name": "geometry_feature_edge_file.eMesh",
"MinLevel": 1,
"MaxLevel": 3
},
"SurfaceRefinementRegions": {
"Patch Name": "patch_name_from_stl",
"Patch Type": "patch" | "wall",
"MinLevel": 1,
"MaxLevel": 3
},
"GeomRefinementRegions": {
"Patch Name": "custom_patch_name_from_geometry_def",
"Mode": "inside" | "outside",
"MinLevel": 1,
"MaxLevel": 3
}
},
"Snapping Controls": {
"nSmoothPatch": 4,
"tolerance": 0.5,
"snapSolveIter": 200,
"snapRelaxIter": 6,
"nFeatureSnapIter": 10,
"implicitFeatureSnap": true | false,
"explicitFeatureSnap": true | false,
"multiRegionFeatureSnap": true | false,
},
"Mesh Layer Controls": {
"relativeSizes": true | false,
"expansionRatio": 1.3,
"finalLayerThickness": 1,
"minThickness": 0.1,
"firstLayerThickness": 0.1,
"thickness": 0.2,
"nGrow": 0,
"featureAngle": 30,
"nRelaxIter": 3,
"nSmoothSurfaceNormals": 1,
"nSmoothNormals": 3,
"nSmoothThickness": 2,
"maxFaceThicknessRatio": 0.5,
"maxThicknessToMedialRatio": 1,
"minMedialAxisAngle": 90,
"nBufferCellsNoExtrude": 0,
"nLayerIter": 50,
"nRelaxedIter": 20,
"slipFeatureAngle": 30,
"nMedialAxisIter": 1,
"nSmoothDisplacement": 1,
"Layers": [
{
"Patch Name": "custom_patch_combo_1",
"nSurfaceLayers": 1,
"minThickness": 0.1,
"expansionRatio": 1,
"finalLayerThickness": 1
},
{
"Patch Name": "custom_patch_combo_2",
"nSurfaceLayers": 1,
"minThickness": 0.1,
"expansionRatio": 1,
"firstLayerThickness": 0.1
},
{
"Patch Name": "custom_patch_combo_3",
"nSurfaceLayers": 1,
"minThickness": 0.1,
"thickness": 1,
"finalLayerThickness": 1
},
{
"Patch Name": "custom_patch_combo_4",
"nSurfaceLayers": 1,
"minThickness": 0.1,
"thickness": 1,
"firstLayerThickness": 0.1
},
{
"Patch Name": "custom_patch_combo_5",
"nSurfaceLayers": 1,
"minThickness": 0.1,
"expansionRatio": 1,
"thickness": 1
}
]
},
"Mesh Quality Controls": {
"maxNonOrtho": 65,
"maxBoundarySkewness": 20,
"maxInternalSkewness": 4,
"maxConcave": 80,
"minVol": 1e-13,
"minTetQuality": 1e-15,
"minArea": -1,
"minTwist": 0.02,
"minFaceWeight": 0.05,
"minVolRatio": 0.01,
"minDeterminant": 0.001,
"minTriangleTwist": -1,
"qcnSmoothScale": 5,
"errorReduction": 0.75
}
}
}
}
Castellated Mesh: If true, enables castellated mesh option. RequiredSnapping: If true, enables surface snapping option. RequiredLayer Addition: If true, enables adding layers. RequiredmergeTolerance: If specified, specifies a merge tolerance as a fraction of the bounding box of the initial mesh. Default is 1e-06Enable Multi Patches: Should be enabled if the geometry file has more than one patch. RequiredInput Patch Name: If specified, will be assigned to the entire surface of the provided geometry. Optional; should only be specified if entire .stl is one solidCustom Patches: Array of custom patches defined with primitive shapes. OptionalCustom Patch Name: User provided name given to the custom patchSearchable Shape: One of "searchable<SHAPE>", where <SHAPE> is Box, Cylinder, or Sphere.minimum bound: An array of coordinates specifying the minimum corner of a searchableBox. For example, [-35, -35, -35]maximum bound: An array of coordinates specifying the maximum corner of a searchableBox (the opposite diagonal from the minimum bound). For example, [-50, 35, 52]Axis Point 1: An array of coordinates specifying the center of the base of a searchableCylinder. For example, [0, 0, 0]Axis Point 2: An array of coordinates specifying the center of the top of a searchableCylinder. For example, [0, 0, 35]Radius: The radius of a searchableCylinder or a searchableSphere.Center: An array of coordinates specifying the center of a searchableSphere.Refinement in snappyHexMesh happens via splitting cells in half. For a 2 cm background mesh, the first level of refinement will refine it to a 1 cm mesh. The second level of refinement will further refine it to a 0.5 cm mesh.
Each level of refinement splits cells in half in each dimension. The general formula is \(N(2^d)^R\), where \(N\) is the number of cells being split, \(d\) is the number of dimensions (2 or 3), and \(R\) is the levels of refinement being applied. For example, in a 2D cell, the first level of refinement splits it into \((2^2)^1 = 4\) cells. The fifth level of refinement would produce \((2^2)^5 = 1024 \) cells, each \(2^{(-5)}\) the size. Similarly, for a 3D cell, the first level of refinement splits it into \((2^3)^1 = 8\) cells. The fifth level of refinement would produce \((2^3)^5 = 32768\) cells.
CellZones: If true, indicates that there will be multiple disconnected regions within the mesh. RequiredmaxLocalCells: Specifies the maximum number of cells per processor. Optional; default is 2000000maxGlobalCells: Specifies the global maximum number of cells. Optional; default is 4000000minRefCells: Specifies the minimum number of refinement cells. Optional; default is 0GeneralGapLevelIncrement: Optional; default is 1nCellsBetweenLevels: Sets the number of buffer layers between different levels of refinement. Optional; default is 3surfaceRefinementLvlMin: Sets the minimum level of surface refinement. Optional; default is 0surfaceRefinementLvlMax: Sets the maximum level of surface refinement. Optional; default is 0resolveFeatureAngle: Sets the maximum intersection angle a cell can see—any higher, and the maximum level of refinement will be applied. Note that this is the inverse of the corresponding feature in cfMesh. Optional; default is 60 degreesgapLevelIncrement: Optional; default is 1planarAngle: Optional; default is 30 degreeslocationInMesh: Specifies where meshing will occur. If this point falls within a volume, that inner volume will be meshed. If it falls outside the volume, the outer volume will be meshed. Optional; default is [0, 0, 0]allowFreeStandingZoneFaces: Should be set to true if the faceZones (specified in the SurfaceRefinementRegions section) can be free-standing rather than restricted to the boundary of the corresponding cellZones. Optional; default is trueFeature File: OptionalFile Name: Name of the geometry feature edge file (.eMesh format), if it exists. RequiredMinLevel: Sets the minimum level of refinement at feature edges. Optional; default is 1MaxLevel: Sets the maximum level of refinement at feature edges. RequiredSurfaceRefinementRegions: OptionalPatch Name: Name (taken from the stl file) of the patch. RequiredPatch Type: Type of patch; can be either "patch" or "wall". Optional; default is "NO"MinLevel: Sets the minimum level of refinement for the surface patch. Optional; default is 1MaxLevel: Sets the maximum level of refinement for the surface patch. RequiredGeomRefinementRegions: OptionalPatch Name: One of the custom patch names defined in the Geometry Definition section.Mode: Indicates whether refinement should take place inside or outside the patch.MinLevel: Sets the minimum level of refinement for the geometry.MaxLevel: Sets the maximum level of refinement for the geometry.nSmoothPatch: Specifies the number of smoothing iterations to conform the mesh to the geometry surface. Optional; default is 4tolerance: Sets how far the algorithm will search for a point to snap to. Specifically, the ratio of the distance between a point and the surface feature to the local maximum edge length. Optional; default is 0.5snapSolveIter: Number of iterations for the snapping algorithm solver. Optional; default is 200snapRelaxIter: Number of iterations for the snapping algorithm relaxation. Optional; default is 6nFeatureSnapIter: Number of iterations for feature snapping Optional; default is 10implicitFeatureSnap: If true, enables snapping based on sharp edges in the geometry. Optional; default is falseexplicitFeatureSnap: If true, enables snapping based on feature edges defined in the Feature File, specified in the Castellated Mesh Controls section. Optional; default is falsemultiRegionFeatureSnap: If true (and explicitFeatureSnap is enabled), features between multiple surfaces will be captured. Optional; default is falserelativeSizes: Enables relative sizes option during layer addition. Allows the thickness of layers to be specified relative to the undistorted cell size rather than in absolute terms. Optional; default is trueexpansionRatio: Expansion ratio for layer addition. Optional; default is 1.3finalLayerThickness: Thickness (relative or absolute) of the layer furthest from the wall. Optional; default is 1.minThickness: Minimum overall thickness of the layers. Optional; default is 0.1firstLayerThickness: Thickness (relative or absolute) of the layer closest to the wall. Optional; default is -1.thickness: Overall thickness of the cells. Ignored if finalLayerThickness or firstLayerThickness are specified. Optional; default is -1.nGrow: Sets the number of layers that should not be grown if points are not extruded. Used to delay layer growth close to features. Optional; default is 0featureAngle: The angle in degrees above which surfaces are not extruded for layer addition. Optional; default is 30 degrees. If layers at corner edges are desired, set to 180nRelaxIter: Number of relaxation steps. Optional; default is 3nSmoothSurfaceNormals: Number of patch normal smoothing operations. Optional; default is 1nSmoothNormals: Number of smoothing iterations of interior mesh movement directions. Optional; default is 3nSmoothThickness: Smooth layer thickness over the surface patches. Optional; default is 2maxFaceThicknessRatio: Sets a maximum face to thickness ratio to stop layer growth on highly warped cells. Optional; default is 0.5maxThicknessToMedialRatio: Sets a maximum thickness to medial distance ratio to reduce layer growth, typically in narrow cavities. Optional; default is 1minMedialAxisAngle: Minimum angle to select the medial axis points. Optional; default is 90 degreesnBufferCellsNoExtrude: Sets the number of cells in a buffer region to gradually step down the number of layers. Optional; default is 0nLayerIter: Maximum number of layer addition iterations. Optional; default is 50nRelaxedIter: Number of iterations after which relaxed mesh quality controls are used. Optional; default is 20slipFeatureAngle: Allows the sliding of points on the patch without the layer grown if angle to the patch extrusion direction is larger than the one specified. Optional; default is 30 degreesnMedialAxisIter: Limits number of steps walking away from the surface. Optional; default is -1nSmoothDisplacement: Smoothing displacement of the mesh after the medial axis is determined. Optional; default is -1Layers: . OptionalPatch Name: Name of the patch, defined in the Geometry Definition section.nSurfaceLayers: Number of layers per patch. Optional; default is 1expansionRatio: Expansion ratio. Optional; default is 1.finalLayerThickness: Thickness (relative or absolute) of the layer furthest from the wall. Optional; default is 1.firstLyrThickness: Thickness (relative or absolute) of the layer closest to the wall. Optional; default is -1.thickness: Overall thickness of the cells. Optional; default is -1minThickness: Minimum overall thickness of the layers. Optional; default is 1Only certain combinations of layer options can be used:
"expansionRatio" and "finalLayerThickness""expansionRatio" and "firstLayerThickness""thickness" and "finalLayerThickness""thickness" and "firstLayerThickness""expansionRatio" and "thickness"maxNonOrtho: Specifies the maximum allowable angle made by the vector between adjacent cell centers across the common face and face normal. Optional; default is 65maxBoundarySkewness: Sets the maximum allowable skewness in the boundaries. Optional; default is 20.maxInternalSkewness: Sets the maximum allowable internal skewness. Optional; default is 4.maxConcave: Sets the maximum concavity. Optional; default is 80.minVol: Sets the minimum cell volume in cubic meters. Optional; default is 1e-13minTetQuality: Sets the minimum tetrahedral element quality. Set to a small positive number (1e-15), it enables tracking. Set to a large negative number (-1e30) it enables optimal layer insertion. Optional; default is 1e-15minArea: Sets the minimum area for a cell face, in square meters. Optional; default is -1. (no minimum)minTwist: Sets the minimum value for twist. Optional; default is 0.02minFaceWeight: Sets the minimum face interpolation weight. Optional; default is 0.05minVolRatio: Sets the minimum volume ratio. Optional; default is 0.01minDeterminant: Sets the minimum cell determinant. Optional; default is 0.001minTriangleTwist: Sets the minimum triangle twist. Optional; default is -1. (no minimum)qcnSmoothScale: Smoothing iterations, used in conjunction with errorReduction. Optional; default is 5errorReduction: Error reduction, used in conjunction with qcnSmoothScale. Sets the amount to scale back displacement at points of error. Optional; default is 0.75