CFD Online Logo CFD Online URL
www.cfd-online.com
[Sponsors]
Home > Forums > Software User Forums > OpenFOAM > OpenFOAM Meshing & Mesh Conversion

[snappyHexMesh] Layers don't fully surround surface

Register Blogs Community New Posts Updated Threads Search

Like Tree2Likes
  • 1 Post By kalyangoparaju
  • 1 Post By wyldckat

Reply
 
LinkBack Thread Tools Search this Thread Display Modes
Old   July 10, 2012, 16:44
Default Layers don't fully surround surface
  #1
New Member
 
Eric
Join Date: Jan 2012
Posts: 18
Rep Power: 14
EVBUCF is on a distinguished road
Hello all,

I am using SnappyHexMesh for the first time since the previous cases I have ran seem to give an inaccurate boundary layer and I was hoping to fix this with SHM. I am importing a .stl file which was exported from a SolidWorks CAD model. The problem I seem to be having is that the layers which I have defined do not fully surround the surface. I have attached pictures to show what I mean.

Another problem is that there are small dimples that form on the surface which are undesirable. How can I smooth these bumps out?

Lastly, it seems like SHM likes to refine the mesh a lot on the symmetry line of the aircraft which I am meshing. The image attached should show you what I mean. Is this ok? How do I correct this?

Here is my SHMDict:
Code:
castellatedMesh true;  //create mesh
snap            true;    //cuts mesh at surface interface
addLayers       true;    //creates layers on surface


// 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
{
    FullX48b.stl        //must be stored in triSurfaceMesh
    {
        type triSurfaceMesh;
            //NEW NAME FOR PATCH    
    name FullX48b;

    }


//scales and cleans stl file (run before importing)
// surfaceConvert constant/triSurface/X48b.stl constant/triSurface/X48big.stl -clean -scale 100


    

   /* refinementBox    //some volume not defined as fine region..yet.
    {
        type searchableBox;
        min (-1.0 -0.7 0.0);
        max ( 8.0  0.7 2.5);
    } */
};



// Settings for the castellatedMesh generation.
castellatedMeshControls
{

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

    // If local number of cells is >= maxLocalCells on any processor
    // switches from from refinement followed by balancing
    // (current method) to (weighted) balancing before refinement.
    maxLocalCells 100000;

    // 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;

    // Allow a certain level of imbalance during refining
    // (since balancing is quite expensive)
    // Expressed as fraction of perfect balance (= overall number of cells /
    // nProcs). 0=balance always.
    maxLoadUnbalance 0.10;


    // Number of buffer layers between different levels.
    // 1 means normal 2:1 refinement restriction, larger means slower
    // refinement.
    nCellsBetweenLevels 6; // The minimum amount of cells required between refinement region the more you have the more space needed to reach refinement max to refiement min



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


//If you have special features (sharp angles, trailing edges...) 
//You can isoilate these features with 

//surfaceFeatureExtract -including angle 150 -minElement 10  constant/triSuraface/name.obj
// (any 2 line of cells that make an angle above 150 will be included in this //extractedfeatureset) (outside angle between cells) or feature that have less then 10 elements

    // Specifies a level for any cell intersected by its edges.
    // This is a featureEdgeMesh, read from constant/triSurface for now.
    features
    (
        //{
            //name.obj

        //    file "name.eMesh";
        //    level 2;  //refinement for all extracted surfaces in name.obj files and name.emesh file
        //}
    );



    // 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
    {
        //X48b //patch you want to refine
FullX48b
        {
            // Surface-wise min and max refinement level
        //;level(min ref level, max ref level)
        //which is which is based on the the resolve feature angle below
            level (6 8);
        }
    }

    // Resolve sharp angles
    resolveFeatureAngle 30; //cells above angle use the max ref level, cells below use min


    // 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));
        //say 3 levels away from a surface
        /distance (1e-04 1e-03, 1e-02,1e-01)
        //distance away from surface corresponding to a refinement level (must be in order so OF knows which refinement level) the number of distance dictates how many levels of refinement at a given distance

//levels (max min)  aka anything inside the refinebox (in this case) must have level 4 refiment

        }*/
    }


    // 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 (0 0 0); //importnant only when you have multiple domains
    // point states what is the inner region of the mesh so just make sure it's within the domain and not on or in a surface


    // Whether any faceZones (as specified in the refinementSurfaces)
    // are only on the boundary of corresponding cellZones or also allow
    // free-standing zone faces. Not used if there are no faceZones.
    allowFreeStandingZoneFaces true; //??????? someone find out
}



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

    //- Relative distance for points to be attracted by surface feature point
    //  or edge. True distance is this factor times local
    //  maximum edge length.
    tolerance 5;     //tolerance*cellsize on surface = distance to look for closest cell             distance relative to local cell size to look for adjacent cells

    //- Number of mesh displacement relaxation iterations.
    nSolveIter 0;    //deforms entire mesh to make good quality iterations

    //- Maximum number of snapping relaxation iterations. Should stop
    //  before upon reaching a correct mesh.
    nRelaxIter 5;    //relaxing sharp intersection makes smooth

    //- Highly experimental and wip: number of feature edge snapping
    //  iterations. Leave out altogether to disable.
    //  Do not use here since mesh resolution too low and baffles present
    //nFeatureSnapIter 10;

    //this is iterations to snap solely on the extracted special features
        

}



// Settings for the layer addition.
addLayersControls
{

    //adds boundary layers to a given surface


    // Are the thickness parameters below relative to the undistorted
    // size of the refined cell outside layer (true) or absolute sizes (false).
    relativeSizes true;        //relative to local cell size at surface
    //if this if false you would have to specify in meters the finallayerthickness, with it on we just use a factor of the local cell size
    // Per final patch (so not geometry!) the layer information
    layers
    {

    FullX48b_FullX48B
        //X48b
        {
            nSurfaceLayers 7;
        }
    }

    // Expansion factor for layer mesh
    expansionRatio 1.2; //cells are growing in height by a factor of 1.2 away from the surface

    //- 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.
    //  is the thickness of the layer furthest away from the wall.
    //  See relativeSizes parameter.
    finalLayerThickness 0.3;    //0.3*(local cell size) is the final layer thickness

    //- 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;        //not enforced but seeks to meet this

    //- 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.
    // Note: changed(corrected) w.r.t 17x! (didn't do anything in 17x)
    nGrow 0; //sometimes cells don't extrude away from surface due to cells meeting at a sharp angle this forces the cells to grow a layer away from the surface


    // Advanced settings

    //- When not to extrude surface. 0 is flat surface, 90 is when two faces
    //  make straight angle.
    featureAngle 179;  //this is how OF knows whether to not extrude a layer (nGrow forces this layer to extrude and disregards feature angle

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

    // 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 5;

    // 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
    // Note: changed(corrected) w.r.t 17x! 90 degrees corresponds to 130 in 17x.
    minMedianAxisAngle 90;


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


    // Overall max number of layer addition iterations. The mesher will exit
    // if it reaches this number of iterations; possibly with an illegal
    // mesh.
    nLayerIter 30;
}



// 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 pyramid volume. Is absolute volume of cell pyramid.
    //  Set to a sensible fraction of the smallest cell volume expected.
    //  Set to very negative number (e.g. -1E30) to disable.
    minVol 1e-13;

    //- Minimum quality of the tet formed by the face-centre
    //  and variable base point minimum decomposition triangles and
    //  the cell centre. This has to be a positive number for tracking
    //  to work. Set to very negative number (e.g. -1E30) to
    //  disable.
    //     <0 = inside out tet,
    //      0 = flat tet
    //      1 = regular tet
    minTetQuality 1e-30;

    //- 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; //as 0 it will always show mesh before snapping, after snapping, and after 


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

surface.jpg

LE.jpg

TE.jpg
EVBUCF is offline   Reply With Quote

Old   July 17, 2012, 13:06
Default
  #2
New Member
 
Charlie
Join Date: Aug 2010
Posts: 14
Rep Power: 16
shackman287 is on a distinguished road
I have adjusted many settings and have now been able to get the layers to surround the surface and I have smoothed most of the bumps out of it as well. The only problem I am having now is that my y+ is at an average of 67 and a max of 179. I need to drastically lower these values (below 10 I believe is the criteria). Is there an easy solution to this or tips that anyone might have as to how to lower these values. Thanks!
shackman287 is offline   Reply With Quote

Old   July 17, 2012, 13:50
Default
  #3
New Member
 
Eric
Join Date: Jan 2012
Posts: 18
Rep Power: 14
EVBUCF is on a distinguished road
Sorry, the above post was from me but I was accidentaly logged onto my colleague's account.
EVBUCF is offline   Reply With Quote

Old   July 23, 2012, 09:03
Default
  #4
Member
 
Kalyan
Join Date: Oct 2011
Location: Columbus, Ohio
Posts: 53
Blog Entries: 1
Rep Power: 15
kalyangoparaju is on a distinguished road
Eric,

In my very limited experience, I noticed that getting values of y+ below 10 is not really possible using snappy. I would be really glad if someone has a solution for this but till date, I was not able to find one.

There is a utility called refineWallLayer which can help you split cells at the wall but most often than not, I ran into some kind of weirdness in the mesh after doing the same. ( checked the mesh using checkMesh)

Also, how did you solve your problem ? I am assuming you did some manipulation with featureAngle for layer construction

Kalyan
ancolli likes this.
kalyangoparaju is offline   Reply With Quote

Old   July 24, 2012, 07:27
Default
  #5
Member
 
ms
Join Date: Mar 2009
Location: West London
Posts: 48
Rep Power: 17
anothr_acc is on a distinguished road
Hi Eric,
I'm also interested in your snappyHexMesh file; could you please post it? For your information I've posted a successful snappyHexMesh for a circular cylinder with domed ends at,

http://www.cfd-online.com/Forums/ope...curvature.html

but I'm having troubles with getting a layer to run around sharp edges.

Best regards,

Mark.
anothr_acc is offline   Reply With Quote

Old   July 25, 2012, 10:27
Default
  #6
New Member
 
Eric
Join Date: Jan 2012
Posts: 18
Rep Power: 14
EVBUCF is on a distinguished road
I messed around with a lot of the settings which always would make part of my mesh better and then it would then cause a different problem with the mesh. So to be clear I didn't just change one item. I also introduced the featureEdges to my SHMdict. One parameter that helped to get my layers to fully surround was under the maxFaceThicknessRatio under advanced settings. I had this value too low and therefore would stop the layer growth where there were "highly warped cells."

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

// Which of the steps to run
castellatedMesh true;  //create mesh
snap            true;    //cuts mesh at surface interface
addLayers       true;    //creates layers on surface


// 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
{
    X48B.stl        //must be stored in triSurfaceMesh
    {
        type triSurfaceMesh;
            //NEW NAME FOR PATCH    
    name X48B;

    }


//scales and cleans stl file (run before importing)
// surfaceConvert constant/triSurface/X48b.stl constant/triSurface/X48big.stl -clean -scale 100


    

   /* refinementBox    //some volume not defined as fine region..yet.
    {
        type searchableBox;
        min (-1.0 -0.7 0.0);
        max ( 8.0  0.7 2.5);
    } */
};



// Settings for the castellatedMesh generation.
castellatedMeshControls
{

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

    // If local number of cells is >= maxLocalCells on any processor
    // switches from from refinement followed by balancing
    // (current method) to (weighted) balancing before refinement.
    maxLocalCells 100000;

    // 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;

    // Allow a certain level of imbalance during refining
    // (since balancing is quite expensive)
    // Expressed as fraction of perfect balance (= overall number of cells /
    // nProcs). 0=balance always.
    maxLoadUnbalance 0.10;


    // Number of buffer layers between different levels.
    // 1 means normal 2:1 refinement restriction, larger means slower
    // refinement.
    nCellsBetweenLevels 3; // The minimum amount of cells required between refinement region the more you have the more space needed to reach refinement max to refiement min



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


//If you have special features (sharp angles, trailing edges...) 
//You can isoilate these features with 

///surfaceFeatureExtract -writeObj -includedAngle 150  constant/triSurface/X48B.stl X

// (any 2 line of cells that make an angle above 150 will be included in this //extractedfeatureset) (outside angle between cells) or feature that have less then 10 elements

    // Specifies a level for any cell intersected by its edges.
    // This is a featureEdgeMesh, read from constant/triSurface for now.
    features
   (
       {
            //name.obj

           file "X48B.eMesh";
           level 9;  //refinement for all extracted surfaces in name.obj files and name.emesh file
       }
    );



    // 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
    {
        //X48b //patch you want to refine
X48B
        {
            // Surface-wise min and max refinement level
        //;level(min ref level, max ref level)
        //which is which is based on the the resolve feature angle below
            level (6 8);
        }
    }

    // Resolve sharp angles
    resolveFeatureAngle 30; //cells above angle use the max ref level, cells below use min


    // 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));
        //say 3 levels away from a surface
        /distance (1e-04 1e-03, 1e-02,1e-01)
        //distance away from surface corresponding to a refinement level (must be in order so OF knows which refinement level) the number of distance dictates how many levels of refinement at a given distance

//levels (max min)  aka anything inside the refinebox (in this case) must have level 4 refiment

        }*/
    }


    // 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 (0 0 0); //importnant only when you have multiple domains
    // point states what is the inner region of the mesh so just make sure it's within the domain and not on or in a surface


    // Whether any faceZones (as specified in the refinementSurfaces)
    // are only on the boundary of corresponding cellZones or also allow
    // free-standing zone faces. Not used if there are no faceZones.
    allowFreeStandingZoneFaces true; //??????? someone find out
}



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

    //- Relative distance for points to be attracted by surface feature point
    //  or edge. True distance is this factor times local
    //  maximum edge length.
    tolerance 10;     //tolerance*cellsize on surface = distance to look for closest cell             distance relative to local cell size to look for adjacent cells

    //- Number of mesh displacement relaxation iterations.
    nSolveIter 15;    //deforms entire mesh to make good quality iterations

    //- Maximum number of snapping relaxation iterations. Should stop
    //  before upon reaching a correct mesh.
    nRelaxIter 5;    //relaxing sharp intersection makes smooth

    //- Highly experimental and wip: number of feature edge snapping
    //  iterations. Leave out altogether to disable.
    //  Do not use here since mesh resolution too low and baffles present
    //nFeatureSnapIter 10;

    //this is iterations to snap solely on the extracted special features
        

}



// Settings for the layer addition.
addLayersControls
{

    //adds boundary layers to a given surface


    // Are the thickness parameters below relative to the undistorted
    // size of the refined cell outside layer (true) or absolute sizes (false).
    relativeSizes true;        //relative to local cell size at surface
    //if this if false you would have to specify in meters the finallayerthickness, with it on we just use a factor of the local cell size
    // Per final patch (so not geometry!) the layer information
    layers
    {

    X48B_FullX48B
        //X48b
        {
            nSurfaceLayers 3;
        }
    }

    // Expansion factor for layer mesh
    expansionRatio 1.2; //cells are growing in height by a factor of 1.2 away from the surface

    //- 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.
    //  is the thickness of the layer furthest away from the wall.
    //  See relativeSizes parameter.
    finalLayerThickness 0.2;    //0.3*(local cell size) is the final layer thickness

    //- 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;        //not enforced but seeks to meet this

    //- 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.
    // Note: changed(corrected) w.r.t 17x! (didn't do anything in 17x)
    nGrow 0; //sometimes cells don't extrude away from surface due to cells meeting at a sharp angle this forces the cells to grow a layer away from the surface


    // Advanced settings

    //- When not to extrude surface. 0 is flat surface, 90 is when two faces
    //  make straight angle.
    featureAngle 60;  //this is how OF k  nows whether to not extrude a layer (nGrow forces this layer to extrude and disregards feature angle

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

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

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

    // Smooth layer thickness over surface patches
    nSmoothThickness 30;

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

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

    // Angle used to pick up medial axis points
    // Note: changed(corrected) w.r.t 17x! 90 degrees corresponds to 130 in 17x.
    minMedianAxisAngle 90;


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


    // Overall max number of layer addition iterations. The mesher will exit
    // if it reaches this number of iterations; possibly with an illegal
    // mesh.
    nLayerIter 30;
}



// 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 pyramid volume. Is absolute volume of cell pyramid.
    //  Set to a sensible fraction of the smallest cell volume expected.
    //  Set to very negative number (e.g. -1E30) to disable.
    minVol 1e-13;

    //- Minimum quality of the tet formed by the face-centre
    //  and variable base point minimum decomposition triangles and
    //  the cell centre. This has to be a positive number for tracking
    //  to work. Set to very negative number (e.g. -1E30) to
    //  disable.
    //     <0 = inside out tet,
    //      0 = flat tet
    //      1 = regular tet
    minTetQuality 1e-30;

    //- 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; //as 0 it will always show mesh before snapping, after snapping, and after 


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


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

I have reduced my y+ to an average of 5.2 with a max of 35 (there are still small areas that I haven't resolved).
EVBUCF is offline   Reply With Quote

Old   July 25, 2012, 14:49
Default
  #7
Retired Super Moderator
 
Bruno Santos
Join Date: Mar 2009
Location: Lisbon, Portugal
Posts: 10,982
Blog Entries: 45
Rep Power: 128
wyldckat is a name known to allwyldckat is a name known to allwyldckat is a name known to allwyldckat is a name known to allwyldckat is a name known to allwyldckat is a name known to all
Greetings to all!

For those on this thread that haven't seen this information, I've picked up on this post which should help you with questions about sHM:
Quote:
Originally Posted by elvis View Post
there is a brilliant tutorial (download and untar it "tar -xzf ") I believe it will guide you throught most of your SHM questions
The full link to where the tutorial is: http://www.openfoamworkshop.org/2012...enedeVilliers/

@EVBUCF: I hope you'll be able to figure out what to configure next in your "snappyHexMeshDict" file

Best regards,
Bruno
__________________
wyldckat is offline   Reply With Quote

Old   July 26, 2012, 18:19
Default
  #8
New Member
 
Eric
Join Date: Jan 2012
Posts: 18
Rep Power: 14
EVBUCF is on a distinguished road
Thanks for the link Bruno! It does clear up a lot of questions I had. It seems like my only problem is having high y+ near the nose of the aircraft I am modelling. I attached an image to show what I mean. It looks like the layers are partially formed but not quite. No matter what the featureAngle is I cannot seem to get the layers to continue over this region. Any ideas?
Attached Images
File Type: jpg nose.jpg (77.2 KB, 546 views)
File Type: jpg y.jpg (21.1 KB, 464 views)
EVBUCF is offline   Reply With Quote

Old   July 27, 2012, 17:05
Default
  #9
Retired Super Moderator
 
Bruno Santos
Join Date: Mar 2009
Location: Lisbon, Portugal
Posts: 10,982
Blog Entries: 45
Rep Power: 128
wyldckat is a name known to allwyldckat is a name known to allwyldckat is a name known to allwyldckat is a name known to allwyldckat is a name known to allwyldckat is a name known to all
Hi Eric,

Try not to confuse snappyHexMesh You've boosted the mesh resolution at the roundest area, which makes snappy wary of doing layers in that super-refined zone.

I would try to do the mesh in two independent passes:
  1. Uniform mesh with the desired boundary layer all around the surface.
  2. Only increase resolution in that rounded area
edit: by two passes I mean: run snappyHexMesh twice, once with each dictionary.

Good luck!
Bruno
__________________

Last edited by wyldckat; July 27, 2012 at 17:06. Reason: see "edit:"
wyldckat is offline   Reply With Quote

Old   July 28, 2012, 06:20
Default Thanks
  #10
Member
 
ms
Join Date: Mar 2009
Location: West London
Posts: 48
Rep Power: 17
anothr_acc is on a distinguished road
Hi Eric. Thanks for posting your changed snappyHexMeshDict.

Hello again Bruno. Thanks for posting the link! Slowly but surely,
snappy (and openFoam) is starting to work for me.
anothr_acc is offline   Reply With Quote

Old   July 30, 2012, 17:45
Default
  #11
New Member
 
Eric
Join Date: Jan 2012
Posts: 18
Rep Power: 14
EVBUCF is on a distinguished road
Thanks for the feedback Bruno that was my problem! It was too refined in the nose region so it halted the layers from being formed there. Everything looks to be as smooth as I can get it but if I have any updates past this point I will update. Here is my final SHMdict:

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

// Which of the steps to run
castellatedMesh true;  //create mesh
snap            true;    //cuts mesh at surface interface
addLayers       true;    //creates layers on surface


// 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
{
    X48B.stl        //must be stored in triSurfaceMesh
    {
        type triSurfaceMesh;
            //NEW NAME FOR PATCH    
    name X48B;

    }


//scales and cleans stl file (run before importing)
// surfaceConvert constant/triSurface/X48b.stl constant/triSurface/X48big.stl -clean -scale 100


    

   /* refinementBox    //some volume not defined as fine region..yet.
    {
        type searchableBox;
        min (-1.0 -0.7 0.0);
        max ( 8.0  0.7 2.5);
    } */
};



// Settings for the castellatedMesh generation.
castellatedMeshControls
{

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

    // If local number of cells is >= maxLocalCells on any processor
    // switches from from refinement followed by balancing
    // (current method) to (weighted) balancing before refinement.
    maxLocalCells 100000;

    // 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;

    // Allow a certain level of imbalance during refining
    // (since balancing is quite expensive)
    // Expressed as fraction of perfect balance (= overall number of cells /
    // nProcs). 0=balance always.
    maxLoadUnbalance 0.10;


    // Number of buffer layers between different levels.
    // 1 means normal 2:1 refinement restriction, larger means slower
    // refinement.
    nCellsBetweenLevels 3; // The minimum amount of cells required between refinement region the more you have the more space needed to reach refinement max to refiement min



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


//If you have special features (sharp angles, trailing edges...) 
//You can isoilate these features with 

///surfaceFeatureExtract -writeObj -includedAngle 150  constant/triSurface/X48B.stl X

// (any 2 line of cells that make an angle above 150 will be included in this //extractedfeatureset) (outside angle between cells) or feature that have less then 10 elements

    // Specifies a level for any cell intersected by its edges.
    // This is a featureEdgeMesh, read from constant/triSurface for now.
    features
   (
       /*{
            //name.obj

           file "X48B.eMesh";
           level 9;  //refinement for all extracted surfaces in name.obj files and name.emesh file
       }*/
    );



    // 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
    {
        //X48b //patch you want to refine
X48B
        {
            // Surface-wise min and max refinement level
        //;level(min ref level, max ref level)
        //which is which is based on the the resolve feature angle below
            level (6 8);
        }
    }

    // Resolve sharp angles
    resolveFeatureAngle 105; //cells above angle use the max ref level, cells below use min


    // 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));
        //say 3 levels away from a surface
        /distance (1e-04 1e-03, 1e-02,1e-01)
        //distance away from surface corresponding to a refinement level (must be in order so OF knows which refinement level) the number of distance dictates how many levels of refinement at a given distance

//levels (max min)  aka anything inside the refinebox (in this case) must have level 4 refiment

        }*/
    }


    // 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 (0 0 0); //importnant only when you have multiple domains
    // point states what is the inner region of the mesh so just make sure it's within the domain and not on or in a surface


    // Whether any faceZones (as specified in the refinementSurfaces)
    // are only on the boundary of corresponding cellZones or also allow
    // free-standing zone faces. Not used if there are no faceZones.
    allowFreeStandingZoneFaces true; //??????? someone find out
}



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

    //- Relative distance for points to be attracted by surface feature point
    //  or edge. True distance is this factor times local
    //  maximum edge length.
    tolerance 10;     //tolerance*cellsize on surface = distance to look for closest cell             distance relative to local cell size to look for adjacent cells

    //- Number of mesh displacement relaxation iterations.
    nSolveIter 300;    //deforms entire mesh to make good quality iterations

    //- Maximum number of snapping relaxation iterations. Should stop
    //  before upon reaching a correct mesh.
    nRelaxIter 5;    //relaxing sharp intersection makes smooth

    //- Highly experimental and wip: number of feature edge snapping
    //  iterations. Leave out altogether to disable.
    //  Do not use here since mesh resolution too low and baffles present
    //nFeatureSnapIter 10;

    //this is iterations to snap solely on the extracted special features
        

}



// Settings for the layer addition.
addLayersControls
{

    //adds boundary layers to a given surface


    // Are the thickness parameters below relative to the undistorted
    // size of the refined cell outside layer (true) or absolute sizes (false).
    relativeSizes true;        //relative to local cell size at surface
    //if this if false you would have to specify in meters the finallayerthickness, with it on we just use a factor of the local cell size
    // Per final patch (so not geometry!) the layer information
    layers
    {

    X48B_FullX48B
        //X48b
        {
            nSurfaceLayers 3;
        }
    }

    // Expansion factor for layer mesh
    expansionRatio 1.15; //cells are growing in height by a factor of 1.2 away from the surface

    //- 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.
    //  is the thickness of the layer furthest away from the wall.
    //  See relativeSizes parameter.
    finalLayerThickness 0.2;    //0.3*(local cell size) is the final layer thickness

    //- 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.01;        //not enforced but seeks to meet this

    //- 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.
    // Note: changed(corrected) w.r.t 17x! (didn't do anything in 17x)
    nGrow 0; //sometimes cells don't extrude away from surface due to cells meeting at a sharp angle this forces the cells to grow a layer away from the surface


    // Advanced settings

    //- When not to extrude surface. 0 is flat surface, 90 is when two faces
    //  make straight angle.
    featureAngle 180;  //this is how OF k  nows whether to not extrude a layer (nGrow forces this layer to extrude and disregards feature angle

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

    // 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.3;

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

    // Angle used to pick up medial axis points
    // Note: changed(corrected) w.r.t 17x! 90 degrees corresponds to 130 in 17x.
    minMedianAxisAngle 80;


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


    // Overall max number of layer addition iterations. The mesher will exit
    // if it reaches this number of iterations; possibly with an illegal
    // mesh.
    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 pyramid volume. Is absolute volume of cell pyramid.
    //  Set to a sensible fraction of the smallest cell volume expected.
    //  Set to very negative number (e.g. -1E30) to disable.
    minVol 1e-13;

    //- Minimum quality of the tet formed by the face-centre
    //  and variable base point minimum decomposition triangles and
    //  the cell centre. This has to be a positive number for tracking
    //  to work. Set to very negative number (e.g. -1E30) to
    //  disable.
    //     <0 = inside out tet,
    //      0 = flat tet
    //      1 = regular tet
    minTetQuality 1e-30;

    //- 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.05;

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

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

    //- 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; //as 0 it will always show mesh before snapping, after snapping, and after 


// 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 A.jpg (97.8 KB, 525 views)
File Type: jpg B.jpg (93.2 KB, 504 views)
File Type: jpg C.jpg (81.1 KB, 430 views)
File Type: jpg D.jpg (99.1 KB, 432 views)
File Type: jpg E.jpg (98.7 KB, 453 views)
EVBUCF is offline   Reply With Quote

Old   July 30, 2012, 18:06
Default
  #12
Retired Super Moderator
 
Bruno Santos
Join Date: Mar 2009
Location: Lisbon, Portugal
Posts: 10,982
Blog Entries: 45
Rep Power: 128
wyldckat is a name known to allwyldckat is a name known to allwyldckat is a name known to allwyldckat is a name known to allwyldckat is a name known to allwyldckat is a name known to all
Hi Eric,

A valuable advice when analyzing a section cut of a mesh in OpenFOAM: use "Extract Cells By Region" and the polyhedral option should be active as well! Example: http://www.cfd-online.com/Forums/ope...tml#post372605

Best regards,
Bruno
__________________
wyldckat is offline   Reply With Quote

Old   August 17, 2012, 08:04
Default
  #13
Senior Member
 
Eloïse
Join Date: Jul 2012
Location: Trondheim, Norway
Posts: 113
Rep Power: 14
Eloise is on a distinguished road
Hi Bruno,
Thanks for the nice tips! However, the link to the tutorial (which looks recent) seems to be dead. Could you update it?
Thanks
Eloise is offline   Reply With Quote

Old   August 18, 2012, 06:42
Default
  #14
Retired Super Moderator
 
Bruno Santos
Join Date: Mar 2009
Location: Lisbon, Portugal
Posts: 10,982
Blog Entries: 45
Rep Power: 128
wyldckat is a name known to allwyldckat is a name known to allwyldckat is a name known to allwyldckat is a name known to allwyldckat is a name known to allwyldckat is a name known to all
Hi Eloise,

I went a step beyond that and added a new page to the openfoamwiki.net: http://openfoamwiki.net/index.php/SnappyHexMesh
There you'll find a link to a copy of that priceless presentation

Best regards,
Bruno
M.W.G. likes this.
__________________
wyldckat is offline   Reply With Quote

Old   August 20, 2012, 05:31
Default
  #15
Senior Member
 
Eloïse
Join Date: Jul 2012
Location: Trondheim, Norway
Posts: 113
Rep Power: 14
Eloise is on a distinguished road
Thanks Bruno, it is indeed a very good presentation.
Eloise is offline   Reply With Quote

Reply

Tags
shm, snappyhexmesh


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 Off
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
Add layers on the whole surface Emanueledes OpenFOAM 10 December 19, 2017 15:40
Remeshing 2d surface for layers Grigoriy_Ermolaev ANSA 2 July 19, 2016 08:50
Cluster ID's not contiguous in compute-nodes domain. ??? Shogan FLUENT 1 May 28, 2014 16:03
[snappyHexMesh] Effect of adding layers with sHM Nucleophobe OpenFOAM Meshing & Mesh Conversion 4 August 20, 2012 17:45
[Gmsh] boundaries with gmshToFoam‏ ouafa OpenFOAM Meshing & Mesh Conversion 7 May 21, 2010 13:43


All times are GMT -4. The time now is 01:36.