Professional Documents
Culture Documents
Disclaimer
OPENFOAM is a trademark of OpenCFD
(ESI Group). This presentation is not
approved or endorsed by OpenCFD or ESI
Group, the owner of the OPENFOAM
trademark.
Contents
snappyHexMesh (40 Minutes)
Description
Background
Methodology Overview
HELYX-OS GUI
Initial Setup
Snapping
Layer Addition
Description
Utility snappyHexMesh is used to create high quality
hex-dominant meshes based on arbitrary geometry
Controlled by dictionary system/snappyHexMeshDict
This utility has the following key features:
Contents
snappyHexMesh (40 Minutes)
Description
Background
Methodology Overview
HELYX-OS GUI
Initial Setup
Snapping
Layer Addition
HELYX
HELYX-OS
ELEMENTS
Background | Evolution
Open Source Preprocessors that Drive snappyHexMesh
swiftSnap
Developer: Engys
Released: 2012
Version: 1.0.2 for OpenFOAM-2.2.x
Language: JAVA + VTK
http://engys.com/products
Copyright 2013 Engys LLC. All rights reserved.
CFD-Online Forums
snappyWiki
Standard Tutorials
Copyright 2013 Engys LLC. All rights reserved.
Contents
snappyHexMesh (40 Minutes)
Description
Background
Methodology Overview
HELYX-OS GUI
Initial Setup
Snapping
Layer Addition
Manually
Scripted
Graphical User
Interface
Note: Cells should be close to unit Aspect Ratio for optimum behaviour
STL or Nastran
(constant/triSurface)
NOTE: File names must not
contain any spaces, unusual
characters or begin with a
number. The same applies to the
names of the parts and regions
defined within the geometry
files.
Hexahedral base
mesh level 0 size
Copyright 2013 Engys LLC. All rights reserved.
Castellated mesh
Snapped Edge
Copyright 2013 Engys LLC. All rights reserved.
Snapped Surface
Output to file
Contents
snappyHexMesh (40 Minutes)
Description
Background
Methodology Overview
HELYX-OS GUI
Initial Setup
Snapping
Layer Addition
Running Solvers
Geometries in
stereolithography format (STL)
Running Solvers
Using the snappyHexMesh utility
Copyright 2013 Engys LLC. All rights reserved.
Running Solvers
Running Solvers
Currently in v1.0.2
OPENFOAM is a trademark of OpenCFD (ESI). These products are not approved or endorsed by OpenCFD.
Copyright 2013 Engys LLC. All rights reserved.
Meshing
Parent folder definition
and case directories are
setup.
Dictionaries are defined
Meshing
Meshing
Contents
snappyHexMesh (40 Minutes)
Description
Background
Methodology Overview
HELYX-OS GUI
Initial Setup
Snapping
Layer Addition
Skills Obtained
Importing STL surfaces into HELYX-OS
Defining and meshing a specific region of the domain
Parallel Cases
CSTR
Serial Cases
-0.155
-0.05
0.155
0.155
0.35
15
15
20
Min Level
Max Level
Impeller
Inlet
Outlet
Shaft
Vessel
Surface
# of Layers
Relative?
Impeller
Yes
1.6
0.2
1.2
Vessel
yes
1.6
0.2
1.2
0.0
0.0
0.07
Skills Obtained
Learning how to set a base mesh around portions
Extracting eMesh files and using them
Troubleshooting the snapping step
2. Create a user defined base mesh with the same level 0 spacing as our
original CSTR mesh using the values below.
X- Direction
Y-Direction
Z-Direction
Min Value
-0.07
-0.07
0.07
Max Value
0.07
0.07
0.14
# of Elements
Patches
Min Level
Max Level
Impeller
Shaft
6.
7.
8.
9.
0.0
0.0
0.07
Y-Direction
Z-Direction
Min Value
-0.07
-0.07
0.07
Max Value
0.07
0.07
0.14
# of Elements
70
70
30
Skills Obtained
Generate layers more reliably
More fine-tuning of layer additions
Troubleshooting the layer addition
2. Create a user defined base mesh with the same level 0 spacing as our
original CSTR mesh using the values below.
X- Direction
Y-Direction
Z-Direction
Min Value
0.03
0.03
0.27
Max Value
0.1
0.1
0.35
# of Elements
30
30
40
0.05
0.05
0.28
8. Use the extract cells by region filter and surface and edges selected
Copyright 2013 Engys LLC. All rights reserved.
We have better boundary layers, but because we used relative layer measures and
there are differences in cell level around edges, we have various sizes of layer cells
We want more uniform BL cells for a more uniform y+
Copyright 2013 Engys LLC. All rights reserved.
Closure
Overall
Closure
Snapping
Increasing min and max for a particular surface has the same
affect as decreasing level 0 size
eMeshes can help fully resolve edges, only if base mesh is
sufficiently fine
We can further increase snapping if we increase snapping
iterations see appendix
Layer Addition
Questions?
Thank You
www.engys.com
Copyright 2013 Engys LLC. All rights reserved.
A1: snappyHexMeshDict
Appendix A1: References for snappyHexMeshDict
Andrew Jackson. A Comprehensive Tour of
snappyHexMesh. 7th OpenFOAM Workshop.
June 25 2013. Darmstadt Germany.
A1: snappyHexMeshDict
Dictionary file consists of five main sections:
geometry
Prescribe geometry entities for meshing
castellatedMeshControls
Prescribe feature, surface and volume mesh refinements
snapControls
Control mesh surface snapping
addLayersControls
Control boundary layer mesh growth
meshQualityControls
Control mesh quality metrics
Copyright 2013 Engys LLC. All rights reserved.
File header
Keywords
Switch on/off mesh steps
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: geometry
FoamFile
{
version 2.0;
format ascii;
class
dictionary;
object autoHexMeshDict;
}
castellatedMesh true;
snap
true;
addLayers
false;
geometry
{
flange.stl
{
type triSurfaceMesh;
name flange;
}
sphereA
{
type searchableSphere;
centre (0 0 -0.012);
radius 0.003;
}
}
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
triSurfaceMesh;
geomA;
geomB.stl
{
type
distributedTriSurfaceMesh;
distributionType follow;
name
geomB;
}
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
sphere
{
type searchableSphere;
centre (3 3 0);
radius 4;
}
cylinder
{
type
point1
point2
radius
}
searchableCylinder;
(0 0 0);
(1 0 0);
0.1;
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
searchablePlane;
planeType
pointAndNormal;
pointAndNormalDict
{
basePoint
(0 0 0);
normalVector (0 1 0);
}
}
plate
{
type
origin
span
}
searchablePlate;
(0 0 0);
(0.5 0.5 0);
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
}
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: Refinement
The first meshing stage is called
Refinement. This is where the initial
block mesh is refined based on surface
and volumetric refinement settings in the
castellatedMeshControls subdictionary
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: castellatedMesh
castellatedMeshControls
{
maxGlobalCells 2000000;
minRefinementCells 0;
nCellsBetweenLevels 1;
features();
refinementSurfaces
{
flange
{
level (2 3);
regions{*.inlet|*.outlet{level(3,4);}}
}
sphereA
{
level (3 3);
faceZone zoneA; cellZone zoneA; cellZoneInside
inside;
}
}
resolveFeatureAngle 30;
refinementRegions
{
sphereA
{
mode inside;
levels ((1E15 3));
}
}
locationInMesh (-9.23149e-05 -0.0025 -0.0025);
allowFreeStandingZoneFaces true;
nCellsBetweenLevels 3
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: castellatedMesh
castellatedMeshControls
{
maxGlobalCells 2000000;
minRefinementCells 0;
nCellsBetweenLevels 1;
features();
refinementSurfaces
{
flange
{
level (2 3);
regions{*.inlet|*.outlet{level(3,4);}}
}
sphereA
{
level (3 3);
faceZone zoneA; cellZone zoneA; cellZoneInside
inside;
}
}
resolveFeatureAngle 30;
refinementRegions
{
sphereA
{
mode inside;
levels ((1E15 3));
}
}
locationInMesh (-9.23149e-05 -0.0025 -0.0025);
allowFreeStandingZoneFaces true;
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: castellatedMesh
castellatedMeshControls
{
maxGlobalCells 2000000;
minRefinementCells 0;
nCellsBetweenLevels 1;
features();
refinementSurfaces
{
flange
{
level (2 3);
regions{*.inlet|*.outlet{level(3,4);}}
}
sphereA
{
level (3 3);
faceZone zoneA; cellZone zoneA; cellZoneInside
inside;
}
}
Level 0
Level 1
Level 1
Level 2
resolveFeatureAngle 30;
refinementRegions
{
sphereA
{
mode inside;
levels ((1E15 3));
}
}
locationInMesh (-9.23149e-05 -0.0025 -0.0025);
allowFreeStandingZoneFaces true;
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: castellatedMesh
castellatedMeshControls
{
maxGlobalCells 2000000;
minRefinementCells 0;
nCellsBetweenLevels 1;
features();
refinementSurfaces
{
flange
{
level (2 3);
regions{*.inlet|*.outlet{level(3,4);}}
}
sphereA
{
level (3 3);
faceZone zoneA; cellZone zoneA; cellZoneInside
inside;
}
}
resolveFeatureAngle 30;
refinementRegions
{
sphereA
{
mode inside;
levels ((1E15 3));
}
}
locationInMesh (-9.23149e-05 -0.0025 -0.0025);
allowFreeStandingZoneFaces true;
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: castellatedMesh
castellatedMeshControls
{
maxGlobalCells 2000000;
minRefinementCells 0;
nCellsBetweenLevels 1;
features();
refinementSurfaces
{
flange
{
level (2 3);
regions{*.inlet|*.outlet{level(3,4);}}
}
sphereA
{
level (3 3);
faceZone zoneA; cellZone zoneA; cellZoneInside
inside;
}
}
resolveFeatureAngle 30;
refinementRegions
{
sphereA
{
mode inside;
levels ((1E15 3));
}
}
locationInMesh (-9.23149e-05 -0.0025 -0.0025);
allowFreeStandingZoneFaces true;
Mesh Zones
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: castellatedMesh
castellatedMeshControls
{
maxGlobalCells 2000000;
minRefinementCells 0;
nCellsBetweenLevels 1;
features();
refinementSurfaces
{
flange
{
level (2 3);
regions{*.inlet|*.outlet{level(3,4);}}
}
sphereA
{
level (3 3);
faceZone zoneA; cellZone zoneA; cellZoneInside
inside;
}
}
Level 1
Level 1 Level 2
Level 2
resolveFeatureAngle 30;
refinementRegions
{
sphereA
{
mode inside;
levels ((1E15 3));
}
}
locationInMesh (-9.23149e-05 -0.0025 -0.0025);
allowFreeStandingZoneFaces true;
}
Level 3 Local
curvature
refinement
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: castellatedMesh
castellatedMeshControls
{
maxGlobalCells 2000000;
minRefinementCells 0;
nCellsBetweenLevels 1;
features();
Volume refinements
inside (outside)
distance
refinementSurfaces
{
flange
{
level (2 3);
regions{*.inlet|*.outlet{level(3,4);}}
}
sphereA
{
level (3 3);
faceZone zoneA; cellZone zoneA; cellZoneInside
inside;
}
}
resolveFeatureAngle 30;
refinementRegions
{
sphereA
{
mode inside;
levels ((1E15 3));
}
}
locationInMesh (-9.23149e-05 -0.0025 -0.0025);
allowFreeStandingZoneFaces true;
mode inside;
levels ((1E15 3));
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: castellatedMesh
castellatedMeshControls
{
maxGlobalCells 2000000;
minRefinementCells 0;
nCellsBetweenLevels 1;
features();
refinementSurfaces
{
flange
{
level (2 3);
regions{*.inlet|*.outlet{level(3,4);}}
}
sphereA
{
level (3 3);
faceZone zoneA; cellZone zoneA; cellZoneInside
inside;
}
}
Level 1
Level 1
Level 2
Level 2
resolveFeatureAngle 30;
refinementRegions
{
sphereA
{
mode inside;
levels ((1E15 3));
}
}
locationInMesh (-9.23149e-05 -0.0025 -0.0025);
allowFreeStandingZoneFaces true;
}
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: castellatedMesh
castellatedMeshControls
{
refinementSurfaces
{
flange
{
level (2 3);
faceZone flange;
faceType boundary;
cellZone flange;
cellZoneInside inside;
}
}
boundary
Creates a pair of faces that do not
match one-to-one. Less constraint
on meshing to create more highquality meshes.
internal
keeps faces of faceZone as
internal faces.
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: snapControls
snapControls
{
nSmoothPatch 3;
tolerance 1.0;
nSolverIter 300;
nRelaxIter 5;
nFeatureSnapIter 10;
implicitFeatureSnap false;
explicitFeatureSnap true;
multiRegionFeatureSnap false;
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: snapControls
snapControls
{
nSmoothPatch 3;
tolerance 1.0;
nSolverIter 300;
nRelaxIter 5;
nFeatureSnapIter 10;
implicitFeatureSnap false;
explicitFeatureSnap true;
multiRegionFeatureSnap false;
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: snapControls
snapControls
{
nSmoothPatch 3;
tolerance 1.0;
nSolverIter 300;
nRelaxIter 5;
nFeatureSnapIter 10;
implicitFeatureSnap false;
explicitFeatureSnap true;
multiRegionFeatureSnap false;
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: snapControls
snapControls
{
nSmoothPatch 3;
tolerance 1.0;
nSolverIter 300;
nRelaxIter 5;
nFeatureSnapIter 10;
implicitFeatureSnap false;
explicitFeatureSnap true;
multiRegionFeatureSnap false;
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: snapControls
snapControls
{
nSmoothPatch 3;
tolerance 1.0;
nSolverIter 300;
nRelaxIter 5;
nFeatureSnapIter 10;
implicitFeatureSnap false;
explicitFeatureSnap true;
multiRegionFeatureSnap false;
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: snapControls
snapControls
{
nSmoothPatch 3;
tolerance 1.0;
nSolverIter 300;
nRelaxIter 5;
nFeatureSnapIter 10;
implicitFeatureSnap false;
explicitFeatureSnap true;
multiRegionFeatureSnap false;
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: snapControls
snapControls
{
nSmoothPatch 3;
tolerance 1.0;
nSolverIter 300;
nRelaxIter 5;
nFeatureSnapIter 10;
implicitFeatureSnap false;
explicitFeatureSnap true;
multiRegionFeatureSnap false;
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: snapControls
snapControls
{
nSmoothPatch 3;
tolerance 1.0;
nSolverIter 300;
nRelaxIter 5;
nFeatureSnapIter 10;
implicitFeatureSnap false;
explicitFeatureSnap true;
multiRegionFeatureSnap false;
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: Layers
The final meshing stage is called Layer
addition where a layer of cells is added to
a specified set of boundary patches. This
stage is controlled by the settings in the
addLayersControls sub-dictionary
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: addLayersControls
addLayersControls
{
layers
{
"flange_.*"{nSurfaceLayers 1;}
}
finalLayerThickness 0.4;
expansionRatio 1.15;
minThickness 0.2;
relativeSizes true;
// Advanced settings
featureAngle 30;
slipFeatureAngle 30;
nSmoothSurfaceNormals 1;
nSmoothNormals 3;
nSmoothThickness 10;
minMedianAxisAngle 80;
maxThicknessToMedialRatio 0.3;
maxFaceThicknessRatio 0.5;
nLayerIter 50;
meshQualityControls::relaxed.
nRelaxedIter 20;
nRelaxIter 5;
}
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: addLayersControls
addLayersControls
{
layers
{
"flange_.*"{nSurfaceLayers 1;}
}
finalLayerThickness 0.4;
expansionRatio 1.15;
minThickness 0.2;
relativeSizes true;
// Advanced settings
featureAngle 30;
slipFeatureAngle 30;
nSmoothSurfaceNormals 1;
nSmoothNormals 3;
nSmoothThickness 10;
minMedianAxisAngle 80;
maxThicknessToMedialRatio 0.3;
maxFaceThicknessRatio 0.5;
nLayerIter 50;
meshQualityControls::relaxed.
nRelaxedIter 20;
nRelaxIter 5;
}
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: addLayersControls
addLayersControls
{
layers
{
"flange_.*"{nSurfaceLayers 1;}
}
finalLayerThickness 0.4;
expansionRatio 1.15;
minThickness 0.2;
relativeSizes true;
// Advanced settings
featureAngle 30;
slipFeatureAngle 30;
nSmoothSurfaceNormals 1;
nSmoothNormals 3;
nSmoothThickness 10;
minMedianAxisAngle 80;
maxThicknessToMedialRatio 0.3;
maxFaceThicknessRatio 0.5;
nLayerIter 50;
meshQualityControls::relaxed.
nRelaxedIter 20;
nRelaxIter 5;
}
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: addLayersControls
addLayersControls
{
layers
{
"flange_.*"{nSurfaceLayers 1;}
}
finalLayerThickness 0.4;
expansionRatio 1.15;
minThickness 0.2;
relativeSizes true;
// Advanced settings
featureAngle 30;
slipFeatureAngle 30;
nSmoothSurfaceNormals 1;
nSmoothNormals 3;
nSmoothThickness 10;
minMedianAxisAngle 80;
maxThicknessToMedialRatio 0.3;
maxFaceThicknessRatio 0.5;
nLayerIter 50;
meshQualityControls::relaxed.
nRelaxedIter 20;
nRelaxIter 5;
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: addLayersControls
addLayersControls
{
layers
{
"flange_.*"{nSurfaceLayers 1;}
}
finalLayerThickness 0.4;
expansionRatio 1.15;
minThickness 0.2;
relativeSizes true;
featureAngle 45;
// Advanced settings
featureAngle 30;
slipFeatureAngle 30;
nSmoothSurfaceNormals 1;
nSmoothNormals 3;
nSmoothThickness 10;
minMedianAxisAngle 80;
maxThicknessToMedialRatio 0.3;
maxFaceThicknessRatio 0.5;
nLayerIter 50;
meshQualityControls::relaxed.
nRelaxedIter 20;
nRelaxIter 5;
}
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
featureAngle 180;
A1: addLayersControls
addLayersControls
{
layers
{
"flange_.*"{nSurfaceLayers 1;}
}
finalLayerThickness 0.4;
expansionRatio 1.15;
minThickness 0.2;
relativeSizes true;
// Advanced settings
featureAngle 30;
slipFeatureAngle 30;
nSmoothSurfaceNormals 1;
nSmoothNormals 3;
nSmoothThickness 10;
minMedianAxisAngle 80;
maxThicknessToMedialRatio 0.3;
maxFaceThicknessRatio 0.5;
nLayerIter 50;
meshQualityControls::relaxed.
nRelaxedIter 20;
nRelaxIter 5;
}
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: addLayersControls
addLayersControls
{
layers
{
"flange_.*"{nSurfaceLayers 1;}
}
finalLayerThickness 0.4;
expansionRatio 1.15;
minThickness 0.2;
relativeSizes true;
// Advanced settings
featureAngle 30;
slipFeatureAngle 30;
nSmoothSurfaceNormals 1;
nSmoothNormals 3;
nSmoothThickness 10;
minMedianAxisAngle 80;
maxThicknessToMedialRatio 0.3;
maxFaceThicknessRatio 0.5;
nLayerIter 50;
meshQualityControls::relaxed.
nRelaxedIter 20;
nRelaxIter 5;
}
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: addLayersControls
addLayersControls
{
layers
{
"flange_.*"{nSurfaceLayers 1;}
}
finalLayerThickness 0.4;
expansionRatio 1.15;
minThickness 0.2;
relativeSizes true;
nSurfaceLayers >0
// Advanced settings
featureAngle 30;
slipFeatureAngle 30;
nSmoothSurfaceNormals 1;
nSmoothNormals 3;
nSmoothThickness 10;
minMedianAxisAngle 80;
maxThicknessToMedialRatio 0.3;
maxFaceThicknessRatio 0.5;
nLayerIter 50;
meshQualityControls::relaxed.
nRelaxedIter 20;
nRelaxIter 5;
Medial Axis
nSurfaceLayers =0
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: addLayersControls
addLayersControls
{
layers
{
"flange_.*"{nSurfaceLayers 1;}
}
finalLayerThickness 0.4;
expansionRatio 1.15;
minThickness 0.2;
relativeSizes true;
nSurfaceLayers >0
// Advanced settings
featureAngle 30;
slipFeatureAngle 30;
nSmoothSurfaceNormals 1;
nSmoothNormals 3;
nSmoothThickness 10;
minMedianAxisAngle 80;
maxThicknessToMedialRatio 0.3;
maxFaceThicknessRatio 0.5;
nLayerIter 50;
meshQualityControls::relaxed.
nRelaxedIter 20;
nRelaxIter 5;
Medial Axis
nSurfaceLayers =0
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.
A1: addLayersControls
addLayersControls
{
layers
{
"flange_.*"{nSurfaceLayers 1;}
}
finalLayerThickness 0.4;
expansionRatio 1.15;
minThickness 0.2;
relativeSizes true;
// Advanced settings
featureAngle 30;
slipFeatureAngle 30;
nSmoothSurfaceNormals 1;
nSmoothNormals 3;
nSmoothThickness 10;
minMedianAxisAngle 80;
maxThicknessToMedialRatio 0.3;
maxFaceThicknessRatio 0.5;
nLayerIter 50;
meshQualityControls::relaxed.
nRelaxedIter 20;
nRelaxIter 5;
}
Copyright 2012 Engys. OPENFOAM and OpenCFD are registered trademarks of ESI Group.