CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM Meshing & Mesh Conversion (https://www.cfd-online.com/Forums/openfoam-meshing/)
-   -   [snappyHexMesh] Improving mesh quality + inlet too coarse (https://www.cfd-online.com/Forums/openfoam-meshing/156813-improving-mesh-quality-inlet-too-coarse.html)

MartinBlx July 13, 2015 12:16

Improving mesh quality + inlet too coarse
 
Hi everybody,

I have used sHM to create a mesh that I use for flow simulations inside a channel, principally with simpleFoam, icoFoam and pisoFoam.

I would like to improve the quality of my mesh. If my current mesh looks ok and seems to give acceptable results when solving, when looking at the quality of the mesh on ParaView, the mesh doesn't look so good ( a lot of weird triangles):

https://drive.google.com/file/d/0B_T...ew?usp=sharinghttps://drive.google.com/file/d/0B_T...Mm8/view?pli=1

https://drive.google.com/file/d/0B_T...ew?usp=sharing

My snappyHexMeshDict is:

Code:

castellatedMesh true;   
snap        true;   
addLayers  false; 


geometry
{
    coil.stl
    {
 type triSurfaceMesh;
 regions
 {
 inlet
 {
 name Inlet;
 }
 outlet
 {
 name Outlet;
 }
 channel
 {
 name Channel;
 }
 }
    }
};

castellatedMeshControls
{
maxLocalCells 1000000; 
maxGlobalCells 2000000;
minRefinementCells 10; 
maxLoadUnbalance 0.10;
nCellsBetweenLevels 1; 
features
(
);
refinementSurfaces
{
coil.stl
{
 level (3 3);
 regions
 {
inlet
 {
 level (3 3);
 }
outlet
 {
 level (3 3);
 }
channel
 {
 level (3 3);
 }
 }
}

resolveFeatureAngle 80;
refinementRegions  {}
locationInMesh (4.60 0 -0.1); 
allowFreeStandingZoneFaces true;
}

snapControls
{
nSmoothPatch 3;
tolerance 4.0;
nSolveIter 30;
nRelaxIter 5;
nFeatureSnapIter 15;
implicitFeatureSnap false;
explicitFeatureSnap true;
multiRegionFeatureSnap false;
}


addLayersControls
{
}

meshQualityControls
{
maxNonOrtho 65;
maxBoundarySkewness 20;
maxInternalSkewness 4;
maxConcave 80;
minFlatness 0.5;
minVol 1e-13;
minTetQuality 1e-9;
minArea -1;
minTwist 0.02;
minDeterminant 0.001;
minFaceWeight 0.02;
minVolRatio 0.01;
minTriangleTwist -1;
nSmoothScale 4;
errorReduction 0.75;
}

debug 0;

mergeTolerance 1E-6;


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

Here's the results of checkMesh:

Code:

Create time

Create polyMesh for time = 0

Time = 0

Mesh stats
    points:          384847
    faces:            899461
    internal faces:  784170
    cells:            270062
    faces per cell:  6.2342388
    boundary patches: 3
    point zones:      0
    face zones:      0
    cell zones:      0

Overall number of cells of each type:
    hexahedra:    176939
    prisms:        17694
    wedges:        0
    pyramids:      0
    tet wedges:    361
    tetrahedra:    0
    polyhedra:    75068
    Breakdown of polyhedra by number of faces:
        faces  number of cells
            4  26111
            5  13529
            6  7818
            9  13278
          12  7411
          15  6642
          18  279

Checking topology...
    Boundary definition OK.
    Cell to face addressing OK.
    Point usage OK.
    Upper triangular ordering OK.
    Face vertices OK.
    Number of regions: 1 (OK).

Checking patch topology for multiply connected surfaces...
                  Patch    Faces  Points                  Surface topology
                  Inlet      472      490  ok (non-closed singly connected)
                  Outlet      477      496  ok (non-closed singly connected)
                Channel  114342  139344  ok (non-closed singly connected)

Checking geometry...
    Overall domain bounding box (-4.8993775 -0.29861881 -4.8996497) (4.8999494 1.6490441 4.899462)
    Mesh (non-empty, non-wedge) directions (1 1 1)
    Mesh (non-empty) directions (1 1 1)
    Boundary openness (2.1939305e-17 -7.0482654e-17 -1.0274938e-16) OK.
    Max cell openness = 3.6825096e-16 OK.
    Max aspect ratio = 5.7538098 OK.
    Minimum face area = 0.00014774862. Maximum face area = 0.010235913.  Face area magnitudes OK.
    Min volume = 1.8909542e-06. Max volume = 0.0010082752.  Total volume = 12.200188.  Cell volumes OK.
    Mesh non-orthogonality Max: 47.158213 average: 15.388555
    Non-orthogonality check OK.
    Face pyramids OK.
    Max skewness = 0.85600618 OK.
    Coupled point location match (average 0) OK.

Mesh OK.

End

I tried to play with the different features of sHMDict but I didn't manage to improve my mesh and obtaining a good-looking one.

Besides, I think I have a problem with the meshing of my patches (an inlet and an outlet). They are supposed to be perfect disks but, when checking their shape on ParaView, it's not so good:

https://drive.google.com/file/d/0B_T...bHM/view?pli=1

https://drive.google.com/file/d/0B_T...ew?usp=sharing

Any suggestions how I could increase the quality of my mesh and if there is any solution for obtaining a better inlet?

Martin

danielpiaget July 15, 2015 09:19

Hello Martin, I have notice that you are using the ExpliciteFeatureSnap method to project the Castellated mesh on to the surface geometry STL file. But you are missing a file that needs to be generated with the surfaceFeatureExtract utility.This file needs to be defined in the castellatedMeshControls dictionary.The surfaceFeatureExtract utility will output a folder name extendedFeatureEdgeMesh.It will be located in the constant/ directory.To be able to generate the file, you will need a file (another dictionary file !) named surfaceFeatureExtractDict to be located in the system/ folder.I have added a copy below. You only need to copy in any text editor and save the file as surfaceFeatureExtractDict. 1) Create surfaceFeatureExtractDict file with text editor ?????????????????????????????????????????????????? ???????? copy of surfaceFeatureExtractDict ?????????????????????????????????????????????????? ?????? ------------------------------------------------------------------------- /*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: 2.3.0 | | \\ / A nd | Web: www.OpenFOAM.org | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class dictionary; object surfaceFeatureExtractDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // coil.stl { // How to obtain raw features (extractFromFile || extractFromSurface) extractionMethod extractFromSurface; extractFromSurfaceCoeffs { // Mark edges whose adjacent surface normals are at an angle less // than includedAngle as features // - 0 : selects no edges // - 180: selects all edges includedAngle 180; } // Write options // Write features to obj format for postprocessing writeObj yes; } // ************************************************** *********************** // ?????????????????????????????????????????????????? ???????? 2)At the Linux command line, type the following command: surfaceFeatureExtract 3) In the snappyHexMeshdict add the following code in the castellatedMeshControls under the feature function: features ( { file "coil.extendedFeatureEdgeMesh"; level 3; } ); 4) Run snappyHexMesh again. Good luck, Daniel

MartinBlx July 28, 2015 07:50

Hi, sorry for the late feedback to your answer Daniel!

Indeed, in my snapControls dictionary I had the following code lines;

Code:

snapControls
    nFeatureSnapIter 15;
    implicitFeatureSnap false;
    explicitFeatureSnap true;
    multiRegionFeatureSnap false;
}

since I don't use SurfaceFeatureExtract, you're right there is no point using "explicitFeatureSnap" so I changed it to false and turned "impliciFeatureSnap" to true:

Code:

snapControls
    //nFeatureSnapIter 15;
    implicitFeatureSnap true;
    explicitFeatureSnap false;
    multiRegionFeatureSnap false;
}

I don't use SurfaceFeatureExtract since I have just one .stl file where my 3 regions are defined in it. As far I have understood, I should use SurfaceFeatureExtract if I chose to create my mesh with every regions in a seperate .stl file (so 3 files).

So when executing sHM with these new settings, the obtained mesh has still the same not so good-looking shape that the mesh linked in my first post...

Is it possible to to better do you think? or I should consider my mesh acceptable?

I'll try to create a mesh by SurafceExtracting and will go back to you as well.

MartinBlx July 28, 2015 08:32

So I've just created a new mesh but this time with the surface extraction.

My snappyHexMeshDict, surfaceFeatureExtractDict and results from checkMesh are the following:

Code:

castellatedMesh true;   
snap            true;   
addLayers      false; 

geometry
{
    inlet.stl {type triSurfaceMesh; name inlet;}
    outlet.stl {type triSurfaceMesh; name outlet;}
    channel.stl {type triSurfaceMesh; name channel;}
    coil.stl {type triSurfaceMesh; name coil;}
};

castellatedMeshControls
{
    maxLocalCells 1000000; 
    maxGlobalCells 2000000;
    minRefinementCells 10;  //0 means no bad cells are allowed during refinement stages
    maxLoadUnbalance 0.10;
    nCellsBetweenLevels 1;  // expansion factor between each high & low refinement zone
    features
    (
        {file "inlet.eMesh"; level 3;}
        {file "outlet.eMesh"; level 3;}
        {file "channel.eMesh"; level 3;}
        {file "coil.eMesh"; level 3;}
    );
    refinementSurfaces
    {
    inlet {level (3 3);}
        outlet {level (3 3);}
    channel {level (3 3);}
    } 
    resolveFeatureAngle 80;  // resolve sharp angles - default 30
    refinementRegions        // In descending levels of fine-ness
    {
    channel
        {
        mode distance;
        levels ((0.0006 4) (0.002 3) (0.01 2));
        }
    }
    locationInMesh (4.60 0 -0.1); 
    allowFreeStandingZoneFaces true;
}

snapControls
{
    nSmoothPatch 3;
    tolerance 4.0;
    nSolveIter 30;
    nRelaxIter 5;
    nFeatureSnapIter 15; // default is 10
    implicitFeatureSnap false; //detects without doing surfaceFeatureExtract
    explicitFeatureSnap true;
    multiRegionFeatureSnap false; //detects features between multiple surfaces
}

addLayersControls
{
    relativeSizes false; // was true
    layers
    {
    channel
            {nSurfaceLayers 3;} // was 3
    }
    expansionRatio 1.3;
    finalLayerThickness 0.00016; //was 0.00016
    minThickness 0.00008; //was 0.00008
    nGrow 0; // was 1
    // Advanced settings
    featureAngle 80; // was 70 //- When not to extrude surface. 0 is flat, 90 is right angle.
    nRelaxIter 3;  //- Max# of snapping relaxation iter. Should stop before upon reaching a correct mesh.
    nSmoothSurfaceNormals 1;  // Number of smoothing iterations of surface normals
    nSmoothNormals 3; // Number of smoothing iterations of interior mesh movement direction
    nSmoothThickness 10;  // Smooth layer thickness over surface patches
    maxFaceThicknessRatio 0.5; // Stop layer growth on highly warped cells
    maxThicknessToMedialRatio 0.3; // Reduce layer growth where ratio thickness to medial distance is large
    minMedianAxisAngle 130;  // Angle used to pick up medial axis points
    nBufferCellsNoExtrude 0;  // Create buffer region for new layer terminations
    nLayerIter 50; // Overall max number of layer addition iterations
}

meshQualityControls
{
    maxNonOrtho 65;
    maxBoundarySkewness 20;
    maxInternalSkewness 4;
    maxConcave 80;
    minFlatness 0.5;
    minVol 1e-13;
    minTetQuality 1e-9;
    minArea -1;
    minTwist 0.02;
    minDeterminant 0.001;
    minFaceWeight 0.02;
    minVolRatio 0.01;
    minTriangleTwist -1;
    nSmoothScale 4;
    errorReduction 0.75;
}

debug 0;

mergeTolerance 1E-6;

Code:

inlet.stl
{
    extractionMethod    extractFromSurface; // extractFromFile or extractFromSurface
    extractFromSurfaceCoeffs
    {includedAngle  150;}
    writeObj                yes;    // Write options
}

outlet.stl
{
    extractionMethod    extractFromSurface; // extractFromFile or extractFromSurface
    extractFromSurfaceCoeffs
    {includedAngle  150;}
    writeObj                yes;    // Write options
}

channel.stl
{
    extractionMethod    extractFromSurface; // extractFromFile or extractFromSurface
    extractFromSurfaceCoeffs
    {includedAngle  150;}
    writeObj                yes;    // Write options
}

coil.stl
{
    extractionMethod    extractFromSurface; // extractFromFile or extractFromSurface
    extractFromSurfaceCoeffs
    {includedAngle  150;}
    writeObj                yes;    // Write options
}

Code:

Create time

Create polyMesh for time = 0

Time = 0

Mesh stats
    points:          603300
    faces:            1318613
    internal faces:  1155723
    cells:            386176
    faces per cell:  6.4072754
    boundary patches: 9
    point zones:      0
    face zones:      0
    cell zones:      0

Overall number of cells of each type:
    hexahedra:    202624
    prisms:        21820
    wedges:        0
    pyramids:      0
    tet wedges:    5208
    tetrahedra:    348
    polyhedra:    156176
    Breakdown of polyhedra by number of faces:
        faces  number of cells
            4  26732
            5  19037
            6  49240
            7  6954
            8  4682
            9  24637
          10  1024
          11  519
          12  15592
          13  32
          14  51
          15  6833
          16  2
          18  841

Checking topology...
    Boundary definition OK.
    Cell to face addressing OK.
    Point usage OK.
    Upper triangular ordering OK.
    Face vertices OK.
    Number of regions: 1 (OK).

Checking patch topology for multiply connected surfaces...
                  Patch    Faces  Points                  Surface topology
                    maxY        0        0                        ok (empty)
                    minX        0        0                        ok (empty)
                    maxX        0        0                        ok (empty)
                    minY        0        0                        ok (empty)
                    minZ        0        0                        ok (empty)
                    maxZ        0        0                        ok (empty)
                  inlet      472      490  ok (non-closed singly connected)
                  outlet      493      519  ok (non-closed singly connected)
                channel  161925  216991  ok (non-closed singly connected)

Checking geometry...
    Overall domain bounding box (-4.8993783 -0.29930061 -4.89965) (4.8999584 1.6548865 4.8997751)
    Mesh (non-empty, non-wedge) directions (1 1 1)
    Mesh (non-empty) directions (1 1 1)
    Boundary openness (-3.318191e-16 -4.8856613e-16 -3.47991e-16) OK.
    Max cell openness = 3.4562049e-16 OK.
    Max aspect ratio = 6.1466887 OK.
    Minimum face area = 3.6696844e-05. Maximum face area = 0.010194678.  Face area magnitudes OK.
    Min volume = 2.6245674e-07. Max volume = 0.0010016498.  Total volume = 12.203286.  Cell volumes OK.
    Mesh non-orthogonality Max: 62.229585 average: 16.554294
    Non-orthogonality check OK.
    Face pyramids OK.
    Max skewness = 1.8968828 OK.
    Coupled point location match (average 0) OK.

Mesh OK.

End

So, for the same geometry, this technic takes 2.5 more time than the implicit one (mesh obtained in 390s compared to 143s), for a mesh with more cells (386176 vs 270062). However, I can't see any improvements in the quality of the mesh:

https://drive.google.com/file/d/0B_T...ew?usp=sharing

I'm sure it's possible to obtain a better resolution but I really don't know with which parameters from the sHMDict to play with..

Any help will be welcomed ;)

MartinBlx July 31, 2015 06:41

Last attempt to have help :)

After playing with the features of the castellatedMeshDict, and a bit with the snapDict ones, I didn't obtain anything good-looking for my mesh...

danielpiaget August 2, 2015 22:09

Hello Martin,

In my experience, you should be able to generate a good quality mesh for a cylinder channel.

Try using the .surfaceFeatureExtract files and not the emesh files.

Also, I have noticed that you set the tolerance to 4 in the Snap dictionary. Try it with a value of 1.

Thanks,

Daniel


All times are GMT -4. The time now is 18:02.