CFD Online Logo CFD Online URL
www.cfd-online.com
[Sponsors]
Home > Forums > OpenFOAM

problemes modelling surfaces with snappyhexmesh

Register Blogs Members List Search Today's Posts Mark Forums Read

Reply
 
LinkBack Thread Tools Display Modes
Old   June 23, 2010, 11:30
Default problemes modelling surfaces with snappyhexmesh
  #1
New Member
 
Silvia Di Francesco
Join Date: Jun 2010
Posts: 9
Rep Power: 7
gija79 is on a distinguished road
Hi everybody,
i'm trying to build a mesh with the snappyhexmesh utility.
I want to model the flow over a submerged island, but snappyhex seems to fail in snapping to island surface.
I want to use the InterFoam solver.

Maybe I did'nt prepare the dict file well, but the resulting mesh is very poor.
I prepared the background mesh with blockmesh.
This is my blockmesh file:

/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: 1.6 |
| \\ / A nd | Web: http://www.OpenFOAM.org |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object blockMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

convertToMeters 1;

vertices
(
(0 0 0)//0
(300 0 0)//1
(300 85 0)
(-170 85 0)//3
(-170 0 1)
(300 0 1)//5
(300 85 1)
(-170 85 1)//7


);

blocks
(
hex (0 1 2 3 4 5 6 7) (300 85 1) simpleGrading (1 1 1)

);

edges


);

patches
(
patch inlet
(
(0 4 7 3)
)
patch outlet
(
(1 5 6 2)
)
wall bottom
(
(0 4 5 1)
)
patch atmosphere
(
(3 7 6 2)
)
);

mergePatchPairs
(
);

// ************************************************** *********************** //

This is the snappyhex dict file:


/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: 1.6 |
| \\ / A nd | Web: http://www.OpenFOAM.org |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object snappyHexMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

// Which of the steps to run
castellatedMesh true;
snap true;
addLayers true;


// Geometry. Definition of all surfaces. All surfaces are of class
// searchableSurface.
// Surfaces are used
// - to specify refinement for any mesh cell intersecting it
// - to specify refinement for any mesh cell inside/outside/near
// - to 'snap' the mesh boundary to the surface
geometry
{
coral.stl
{
type triSurfaceMesh;
name coral;
}

refinementBox
{
type searchableBox;
min (60 20 -0.1);
max (98 27 1.1);
}
};



// Settings for the castellatedMesh generation.
castellatedMeshControls
{

// Refinement parameters
// ~~~~~~~~~~~~~~~~~~~~~

// While refining maximum number of cells per processor. This is basically
// the number of cells that fit on a processor. If you choose this too small
// it will do just more refinement iterations to obtain a similar mesh.
maxLocalCells 1000000;

// Overall cell limit (approximately). Refinement will stop immediately
// upon reaching this number so a refinement level might not complete.
// Note that this is the number of cells before removing the part which
// is not 'visible' from the keepPoint. The final number of cells might
// actually be a lot less.
maxGlobalCells 2000000;

// The surface refinement loop might spend lots of iterations refining just a
// few cells. This setting will cause refinement to stop if <= minimumRefine
// are selected for refinement. Note: it will at least do one iteration
// (unless the number of cells to refine is 0)
minRefinementCells 10;

// Number of buffer layers between different levels.
// 1 means normal 2:1 refinement restriction, larger means slower
// refinement.
nCellsBetweenLevels 3;



// Explicit feature edge refinement
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// Specifies a level for any cell intersected by its edges.
// This is a featureEdgeMesh, read from constant/triSurface for now.
features
(
//{
// file "someLine.eMesh";
// level 2;
//}
);



// Surface based refinement
// ~~~~~~~~~~~~~~~~~~~~~~~~

// Specifies two levels for every surface. The first is the minimum level,
// every cell intersecting a surface gets refined up to the minimum level.
// The second level is the maximum level. Cells that 'see' multiple
// intersections where the intersections make an
// angle > resolveFeatureAngle get refined up to the maximum level.

refinementSurfaces
{
coral
{
// Surface-wise min and max refinement level
level (5 6);
}
}

// Resolve sharp angles
resolveFeatureAngle 30;


// Region-wise refinement
// ~~~~~~~~~~~~~~~~~~~~~~

// Specifies refinement level for cells in relation to a surface. One of
// three modes
// - distance. 'levels' specifies per distance to the surface the
// wanted refinement level. The distances need to be specified in
// descending order.
// - inside. 'levels' is only one entry and only the level is used. All
// cells inside the surface get refined up to the level. The surface
// needs to be closed for this to be possible.
// - outside. Same but cells outside.

refinementRegions
{
coral
{
mode distance;
levels ((0.01 6)(0.1 5) (0.5 4) (1 2));
}

}


// Mesh selection
// ~~~~~~~~~~~~~~

// After refinement patches get added for all refinementSurfaces and
// all cells intersecting the surfaces get put into these patches. The
// section reachable from the locationInMesh is kept.
// NOTE: This point should never be on a face, always inside a cell, even
// after refinement.
locationInMesh (75 35 0.5);
}



// Settings for the snapping.
snapControls
{
//- Number of patch smoothing iterations before finding correspondence
// to surface
nSmoothPatch 5;

//- Relative distance for points to be attracted by surface feature point
// or edge. True distance is this factor times local
// maximum edge length.
tolerance 3.0;

//- Number of mesh displacement relaxation iterations.
nSolveIter 30;

//- Maximum number of snapping relaxation iterations. Should stop
// before upon reaching a correct mesh.
nRelaxIter 5;
}



// Settings for the layer addition.
addLayersControls
{
relativeSizes true;

// Per final patch (so not geometry!) the layer information
layers
{
coral_bottom
{
nSurfaceLayers 1;

}
}

// Expansion factor for layer mesh
expansionRatio 1.0;

//- Wanted thickness of final added cell layer. If multiple layers
// is the
// thickness of the layer furthest away from the wall.
// Relative to undistorted size of cell outside layer.
finalLayerThickness 0.3;

//- Minimum thickness of cell layer. If for any reason layer
// cannot be above minThickness do not add layer.
// Relative to undistorted size of cell outside layer.
minThickness 0.1;

//- If points get not extruded do nGrow layers of connected faces that are
// also not grown. This helps convergence of the layer addition process
// close to features.
nGrow 1;


// Advanced settings

//- When not to extrude surface. 0 is flat surface, 90 is when two faces
// make straight angle.
featureAngle 30;

//- Maximum number of snapping relaxation iterations. Should stop
// before upon reaching a correct mesh.
nRelaxIter 3;

// Number of smoothing iterations of surface normals
nSmoothSurfaceNormals 1;

// Number of smoothing iterations of interior mesh movement direction
nSmoothNormals 3;

// Smooth layer thickness over surface patches
nSmoothThickness 10;

// Stop layer growth on highly warped cells
maxFaceThicknessRatio 0.5;

// Reduce layer growth where ratio thickness to medial
// distance is large
maxThicknessToMedialRatio 0.3;

// Angle used to pick up medial axis points
minMedianAxisAngle 130;

// Create buffer region for new layer terminations
nBufferCellsNoExtrude 0;

// Overall max number of layer addition iterations
nLayerIter 50;
}



// Generic mesh quality settings. At any undoable phase these determine
// where to undo.
meshQualityControls
{
//- Maximum non-orthogonality allowed. Set to 180 to disable.
maxNonOrtho 65;

//- Max skewness allowed. Set to <0 to disable.
maxBoundarySkewness 20;
maxInternalSkewness 4;

//- Max concaveness allowed. Is angle (in degrees) below which concavity
// is allowed. 0 is straight face, <0 would be convex face.
// Set to 180 to disable.
maxConcave 80;

//- Minimum projected area v.s. actual area. Set to -1 to disable.
minFlatness 0.5;

//- Minimum pyramid volume. Is absolute volume of cell pyramid.
// Set to very negative number (e.g. -1E30) to disable.
minVol 1e-13;

//- Minimum face area. Set to <0 to disable.
minArea -1;

//- Minimum face twist. Set to <-1 to disable. dot product of face normal
//- and face centre triangles normal
minTwist 0.02;

//- minimum normalised cell determinant
//- 1 = hex, <= 0 = folded or flattened illegal cell
minDeterminant 0.001;

//- minFaceWeight (0 -> 0.5)
minFaceWeight 0.02;

//- minVolRatio (0 -> 1)
minVolRatio 0.01;

//must be >0 for Fluent compatibility
minTriangleTwist -1;


// Advanced

//- Number of error distribution iterations
nSmoothScale 4;
//- amount to scale back displacement at error points
errorReduction 0.75;
}


// Advanced

// Flags for optional output
// 0 : only write final meshes
// 1 : write intermediate meshes
// 2 : write volScalarField with cellLevel for postprocessing
// 4 : write current intersections as .obj files
debug 0;


// Merge tolerance. Is fraction of overall bounding box of initial mesh.
// Note: the write tolerance needs to be higher than this.
mergeTolerance 1E-6;


// ************************************************** *********************** //
and finally in attachment the stl file (in binary and ascii).
Can anybody help me?
I also tried to use gmsh to build the mesh but I'm not able to do a 2D case .
I make a 3D case but the mesh is too irregular for OpenFoam.
Thank you in advance
Silvia
Attached Images
File Type: jpg Schermata.jpg (36.6 KB, 201 views)
Attached Files
File Type: zip triSurface.zip (4.7 KB, 25 views)
gija79 is offline   Reply With Quote

Old   June 24, 2010, 01:36
Default
  #2
Member
 
Alan Russell
Join Date: Aug 2009
Location: Boise, Idaho USA
Posts: 61
Rep Power: 7
AlanR is on a distinguished road
Sylvia,

I see a few problems with your setup. In the blockMeshDict you have not defined the sides of your domain. These either need to be empty for 2D or defined patches for 3D. The motorbike tutorial blockMeshDict is a good example of a 3D blockMesh, or use the cavity tutorial for 2D.

For your snappyHexMesh setup, I would suggest commenting out the refinementBox, in refinementSurfaces setting the level to (2 2) will make things faster. You can refine it later if needed, after you get things working. Also comment out everything in refinementRegions and set the expansion ratio to 2 in addLayerControls (again, you can adjust this later).

If you have a good 3D surface .stl file, I would setup a 3D blockMesh - If you want to run a 3D model (flow over a submerged island sounds like a 3D model to me). Finally, I had a lot of mesh problems when I started from the motorBike tutorial. I suggest using the system directory files (fvSolution and fvSchemes) from the moveDynamicMesh tutorial. The solvers for cellDisplacement and cellMotion made things work better for me. I suggest running blockMesh separately, then run paraFoam to look at the mesh. If it looks OK, then run snappyHexMesh. It may take some time to get your setup right, but snappy generates very good meshes when you get everything working. You won't need to use gmesh unless you want to.

Good luck,

Alan

Good luck,
AlanR is offline   Reply With Quote

Old   June 24, 2010, 03:28
Default
  #3
New Member
 
Silvia Di Francesco
Join Date: Jun 2010
Posts: 9
Rep Power: 7
gija79 is on a distinguished road
Hi Alan , thank you for your suggestions.
I did'nt realize that snappy hex requires 3D geometry.....
By now I extend the 2D geometry to obtain a 3D stl file.
This is the resulting mesh I obtained (pdf file...).
I notice that changing the refinement level the results do not change very much.
Do you think is it possible to refine mesh in order not to have a discontinuous surface?

PS: This is the blockmesh file i used:


/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: 1.6 |
| \\ / A nd | Web: http://www.OpenFOAM.org |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object blockMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

convertToMeters 1;

vertices
(
(-120 0 0)//0
(280 0 0)//1
(280 85 0)
(-120 85 0)//3
(-120 0 40)
(280 0 40)//5
(280 85 40)
(-120 85 40)//7


);

blocks
(
hex (0 1 2 3 4 5 6 7) (80 20 8) simpleGrading (1 1 1)

);

edges
(

);

patches
(
patch inlet
(
(0 4 7 3)
)
patch outlet
(
(1 5 6 2)
)
wall bottom
(
(0 4 5 1)
)
patch atmosphere
(
(3 7 6 2)
)

patch rightwall
(
(4 5 6 7))
patch leftwall
(
(0 1 2 3))
);
mergePatchPairs
(
);

// ************************************************** *********************** //
Attached Files
File Type: pdf mesh.pdf (15.9 KB, 88 views)
File Type: zip system.zip (6.3 KB, 16 views)
gija79 is offline   Reply With Quote

Old   June 25, 2010, 01:40
Default
  #4
Member
 
Alan Russell
Join Date: Aug 2009
Location: Boise, Idaho USA
Posts: 61
Rep Power: 7
AlanR is on a distinguished road
Sylvia,

Your blockMeshDict looks good. 2D or 3D is up to you, snappy will do either one. I thought it sounded like a 3D problem. If you do 2D, you need to have empty front and back patches in your blockMesh. I used the Coral.stl file you sent in the first message and got the snapping to work. Here's the snappyHexMeshDict file I used - I commented out the refinement box in two places, changed the level to (4 4), in mesh controls changed min volume to 1e-3 and min vol ratio to 0.1. You will need to adjust the blockMesh to fit the stl, but this snappyHexMeshDict should work.

Once you have something reasonable, experiment with the size of the cells in blockMesh, making them smaller to refine the overall mesh. The level control will refine the mesh toward the surface. Hope this works for you,

Alan



/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: 1.6 |
| \\ / A nd | Web: http://www.OpenFOAM.org |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object snappyHexMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Which of the steps to run
castellatedMesh true;
snap true;
addLayers true;


// Geometry. Definition of all surfaces. All surfaces are of class
// searchableSurface.
// Surfaces are used
// - to specify refinement for any mesh cell intersecting it
// - to specify refinement for any mesh cell inside/outside/near
// - to 'snap' the mesh boundary to the surface
geometry
{
coral.stl
{
type triSurfaceMesh;
name coral;
}

/* refinementBox
{
type searchableBox;
min (64 0 0);
max (96 22 40);
} *
};



// Settings for the castellatedMesh generation.
castellatedMeshControls
{

// Refinement parameters
// ~~~~~~~~~~~~~~~~~~~~~

// While refining maximum number of cells per processor. This is basically
// the number of cells that fit on a processor. If you choose this too small
// it will do just more refinement iterations to obtain a similar mesh.
maxLocalCells 1000000;

// Overall cell limit (approximately). Refinement will stop immediately
// upon reaching this number so a refinement level might not complete.
// Note that this is the number of cells before removing the part which
// is not 'visible' from the keepPoint. The final number of cells might
// actually be a lot less.
maxGlobalCells 2000000;

// The surface refinement loop might spend lots of iterations refining just a
// few cells. This setting will cause refinement to stop if <= minimumRefine
// are selected for refinement. Note: it will at least do one iteration
// (unless the number of cells to refine is 0)
minRefinementCells 10;

// Number of buffer layers between different levels.
// 1 means normal 2:1 refinement restriction, larger means slower
// refinement.
nCellsBetweenLevels 3;



// Explicit feature edge refinement
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// Specifies a level for any cell intersected by its edges.
// This is a featureEdgeMesh, read from constant/triSurface for now.
features
(
//{
// file "someLine.eMesh";
// level 2;
//}
);



// Surface based refinement
// ~~~~~~~~~~~~~~~~~~~~~~~~

// Specifies two levels for every surface. The first is the minimum level,
// every cell intersecting a surface gets refined up to the minimum level.
// The second level is the maximum level. Cells that 'see' multiple
// intersections where the intersections make an
// angle > resolveFeatureAngle get refined up to the maximum level.

refinementSurfaces
{
coral
{
// Surface-wise min and max refinement level
level (4 4);
}
}

// Resolve sharp angles
resolveFeatureAngle 30;


// Region-wise refinement
// ~~~~~~~~~~~~~~~~~~~~~~

// Specifies refinement level for cells in relation to a surface. One of
// three modes
// - distance. 'levels' specifies per distance to the surface the
// wanted refinement level. The distances need to be specified in
// descending order.
// - inside. 'levels' is only one entry and only the level is used. All
// cells inside the surface get refined up to the level. The surface
// needs to be closed for this to be possible.
// - outside. Same but cells outside.

refinementRegions
{
/* refinementBox
{
mode inside;
levels ((1E15 4));
} */

}


// Mesh selection
// ~~~~~~~~~~~~~~

// After refinement patches get added for all refinementSurfaces and
// all cells intersecting the surfaces get put into these patches. The
// section reachable from the locationInMesh is kept.
// NOTE: This point should never be on a face, always inside a cell, even
// after refinement.
locationInMesh (80 23 0.5);
}



// Settings for the snapping.
snapControls
{
//- Number of patch smoothing iterations before finding correspondence
// to surface
nSmoothPatch 5;

//- Relative distance for points to be attracted by surface feature point
// or edge. True distance is this factor times local
// maximum edge length.
tolerance 3.0;

//- Number of mesh displacement relaxation iterations.
nSolveIter 30;

//- Maximum number of snapping relaxation iterations. Should stop
// before upon reaching a correct mesh.
nRelaxIter 5;
}



// Settings for the layer addition.
addLayersControls
{
relativeSizes true;

// Per final patch (so not geometry!) the layer information
layers
{
coral_bottom
{
nSurfaceLayers 1;

}
}

// Expansion factor for layer mesh
expansionRatio 1.0;

//- Wanted thickness of final added cell layer. If multiple layers
// is the
// thickness of the layer furthest away from the wall.
// Relative to undistorted size of cell outside layer.
finalLayerThickness 0.3;

//- Minimum thickness of cell layer. If for any reason layer
// cannot be above minThickness do not add layer.
// Relative to undistorted size of cell outside layer.
minThickness 0.1;

//- If points get not extruded do nGrow layers of connected faces that are
// also not grown. This helps convergence of the layer addition process
// close to features.
nGrow 1;


// Advanced settings

//- When not to extrude surface. 0 is flat surface, 90 is when two faces
// make straight angle.
featureAngle 30;

//- Maximum number of snapping relaxation iterations. Should stop
// before upon reaching a correct mesh.
nRelaxIter 3;

// Number of smoothing iterations of surface normals
nSmoothSurfaceNormals 1;

// Number of smoothing iterations of interior mesh movement direction
nSmoothNormals 3;

// Smooth layer thickness over surface patches
nSmoothThickness 10;

// Stop layer growth on highly warped cells
maxFaceThicknessRatio 0.5;

// Reduce layer growth where ratio thickness to medial
// distance is large
maxThicknessToMedialRatio 0.3;

// Angle used to pick up medial axis points
minMedianAxisAngle 130;

// Create buffer region for new layer terminations
nBufferCellsNoExtrude 0;

// Overall max number of layer addition iterations
nLayerIter 50;
}



// Generic mesh quality settings. At any undoable phase these determine
// where to undo.
meshQualityControls
{
//- Maximum non-orthogonality allowed. Set to 180 to disable.
maxNonOrtho 65;

//- Max skewness allowed. Set to <0 to disable.
maxBoundarySkewness 20;
maxInternalSkewness 4;

//- Max concaveness allowed. Is angle (in degrees) below which concavity
// is allowed. 0 is straight face, <0 would be convex face.
// Set to 180 to disable.
maxConcave 80;

//- Minimum projected area v.s. actual area. Set to -1 to disable.
minFlatness 0.5;

//- Minimum pyramid volume. Is absolute volume of cell pyramid.
// Set to very negative number (e.g. -1E30) to disable.
minVol 1e-3;

//- Minimum face area. Set to <0 to disable.
minArea -1;

//- Minimum face twist. Set to <-1 to disable. dot product of face normal
//- and face centre triangles normal
minTwist 0.02;

//- minimum normalised cell determinant
//- 1 = hex, <= 0 = folded or flattened illegal cell
minDeterminant 0.001;

//- minFaceWeight (0 -> 0.5)
minFaceWeight 0.02;

//- minVolRatio (0 -> 1)
minVolRatio 0.1;

//must be >0 for Fluent compatibility
minTriangleTwist -1;


// Advanced

//- Number of error distribution iterations
nSmoothScale 4;
//- amount to scale back displacement at error points
errorReduction 0.75;
}


// Advanced

// Flags for optional output
// 0 : only write final meshes
// 1 : write intermediate meshes
// 2 : write volScalarField with cellLevel for postprocessing
// 4 : write current intersections as .obj files
debug 0;


// Merge tolerance. Is fraction of overall bounding box of initial mesh.
// Note: the write tolerance needs to be higher than this.
mergeTolerance 1E-6;
Attached Images
File Type: jpg IslandMeshSample.jpg (100.6 KB, 151 views)
AlanR is offline   Reply With Quote

Old   June 28, 2010, 05:16
Default
  #5
New Member
 
Silvia Di Francesco
Join Date: Jun 2010
Posts: 9
Rep Power: 7
gija79 is on a distinguished road
Thanks Alan.
The strange thing is that the visualization using only parafoam and using foamtoVTK command is different.
Changing to VTK the mesh looks pretty good....
Now could you help me setting the boundary conditions?
I'd like to have a dominion with an outlet condition free and an inlet condition with a velocity changing along the vertical.
As I said I'd like to use the interFoam solver, or do you think that another solver is better?
gija79 is offline   Reply With Quote

Old   June 30, 2010, 13:50
Default
  #6
Member
 
Alan Russell
Join Date: Aug 2009
Location: Boise, Idaho USA
Posts: 61
Rep Power: 7
AlanR is on a distinguished road
Silvia,

I suggest looking at the pitzDailyExptInlet tutorial to see how inlet profiles work. The tutorial boundary conditions should work well for your model. I haven't used interFoam - it's designed to model two incompressible fluids and the interface between them, like in the dam break tutorial. If you want to model water flow over an object, simpleFoam should work. If the water/air interface is important, then you need interFoam. Searching this forum is a good way to find answers - someone has probably set up a model similar to yours.

Alan
AlanR is offline   Reply With Quote

Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
snappyHexMesh not refining surfaces Hydro1004 OpenFOAM 3 August 29, 2012 11:56
SnappyHexMesh and 2 Phase Modelling alexm OpenFOAM Mesh Utilities 19 June 18, 2009 18:07
SnappyHexMesh and planar STL surfaces hannes OpenFOAM Bugs 1 August 1, 2008 08:47
Modelling Free Surfaces Using Fluent 6 M Fortey FLUENT 3 October 4, 2003 09:09
Modelling thin surfaces in 5.6 Louwrens CFX 0 August 16, 2003 10:47


All times are GMT -4. The time now is 07:43.