diff --git a/tutorials/mesh/snappyHexMesh/gap_detection/Allclean b/tutorials/mesh/snappyHexMesh/gap_detection/Allclean new file mode 100644 index 0000000000..8bfe3dc5d7 --- /dev/null +++ b/tutorials/mesh/snappyHexMesh/gap_detection/Allclean @@ -0,0 +1,7 @@ +#!/bin/sh + +# Source tutorial clean functions +. $WM_PROJECT_DIR/bin/tools/CleanFunctions + +\rm -f constant/polyMesh/boundary > /dev/null 2>&1 +cleanCase diff --git a/tutorials/mesh/snappyHexMesh/gap_detection/Allrun b/tutorials/mesh/snappyHexMesh/gap_detection/Allrun new file mode 100644 index 0000000000..c2975fc527 --- /dev/null +++ b/tutorials/mesh/snappyHexMesh/gap_detection/Allrun @@ -0,0 +1,15 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # Run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +runApplication blockMesh + +runApplication decomposePar + +runParallel snappyHexMesh 8 -overwrite + +runApplication reconstructParMesh -constant + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/mesh/snappyHexMesh/gap_detection/README.txt b/tutorials/mesh/snappyHexMesh/gap_detection/README.txt new file mode 100644 index 0000000000..883972db8b --- /dev/null +++ b/tutorials/mesh/snappyHexMesh/gap_detection/README.txt @@ -0,0 +1,7 @@ +Testcase for automatic gap refinement. The geometry is two nested boxes +with a single small pipe between them. + +- 1 cell initial mesh +- consistent normal orientation of surface so + specify a 'gapMode' to limit refinement only to + gaps on the 'outside' of the surface diff --git a/tutorials/mesh/snappyHexMesh/gap_detection/constant/polyMesh/blockMeshDict b/tutorials/mesh/snappyHexMesh/gap_detection/constant/polyMesh/blockMeshDict new file mode 100644 index 0000000000..94bddf09d3 --- /dev/null +++ b/tutorials/mesh/snappyHexMesh/gap_detection/constant/polyMesh/blockMeshDict @@ -0,0 +1,102 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object blockMeshDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +convertToMeters 1; + +vertices +( + (-400 -100 -400) + ( 400 -100 -400) + ( 400 700 -400) + (-400 700 -400) + (-400 -100 400) + ( 400 -100 400) + ( 400 700 400) + (-400 700 400) +); + +blocks +( + hex (0 1 2 3 4 5 6 7) (1 1 1) simpleGrading (1 1 1) +); + +edges +( +); + +boundary +( + maxY + { + type patch; + faces + ( + (3 7 6 2) + ); + } + + minX + { + type patch; + faces + ( + (0 4 7 3) + ); + } + + maxX + { + type patch; + faces + ( + (2 6 5 1) + ); + } + + minY + { + type patch; + faces + ( + (1 5 4 0) + ); + } + + ground + { + type patch; + faces + ( + (0 3 2 1) + ); + } + + maxZ + { + type patch; + faces + ( + (4 5 6 7) + ); + } +); + +mergePatchPairs +( +); + +// ************************************************************************* // diff --git a/tutorials/mesh/snappyHexMesh/gap_detection/constant/triSurface/mech_test.obj b/tutorials/mesh/snappyHexMesh/gap_detection/constant/triSurface/mech_test.obj new file mode 100644 index 0000000000..d078954dc0 --- /dev/null +++ b/tutorials/mesh/snappyHexMesh/gap_detection/constant/triSurface/mech_test.obj @@ -0,0 +1,124 @@ +# Wavefront OBJ file +# Regions: +# 0 patch0 +# +# points : 40 +# triangles : 76 +# +v 80 20 -20 +v -80 20 -20 +v 100 0 0 +v -100 0 0 +v 80 20 -280 +v -80 20 -280 +v 80 280 -100 +v -80 280 -100 +v 100 0 -300 +v -100 0 -300 +v 100 300 -120 +v -100 300 -120 +v 80 280 -280 +v -80 280 -280 +v 100 300 -300 +v -100 300 -300 +v 0 445 0 +v 0 445 -20 +v 3.53538 446.464 0 +v -3.53538 446.464 0 +v -3.53538 446.464 -20 +v 3.53538 446.464 -20 +v 5 450 0 +v -5 450 0 +v -5 450 -20 +v 5 450 -20 +v -3.53538 453.536 0 +v 3.53538 453.536 0 +v -3.53538 453.536 -20 +v 3.53538 453.536 -20 +v 0 455 0 +v 0 455 -20 +v 80 580 -20 +v -80 580 -20 +v 80 580 -100 +v -80 580 -100 +v 100 600 0 +v -100 600 0 +v 100 600 -120 +v -100 600 -120 +g patch0 +f 39 37 3 +f 4 3 37 +f 11 39 3 +f 15 11 3 +f 9 15 3 +f 10 9 3 +f 10 3 4 +f 40 37 39 +f 19 4 37 +f 38 37 40 +f 27 37 38 +f 23 19 37 +f 28 23 37 +f 31 28 37 +f 27 31 37 +f 40 39 11 +f 16 11 15 +f 12 11 16 +f 40 11 12 +f 16 15 9 +f 16 9 10 +f 12 10 4 +f 38 12 4 +f 24 38 4 +f 20 24 4 +f 17 20 4 +f 19 17 4 +f 12 16 10 +f 38 40 12 +f 27 38 24 +f 25 24 20 +f 29 27 24 +f 29 24 25 +f 21 20 17 +f 21 25 20 +f 18 17 19 +f 21 17 18 +f 22 19 23 +f 18 19 22 +f 26 23 28 +f 22 23 26 +f 30 28 31 +f 26 28 30 +f 32 31 27 +f 30 31 32 +f 32 27 29 +f 7 5 1 +f 2 1 5 +f 33 7 1 +f 26 33 1 +f 34 1 2 +f 21 1 34 +f 22 26 1 +f 18 22 1 +f 21 18 1 +f 7 13 5 +f 6 5 13 +f 6 2 5 +f 14 13 7 +f 6 13 14 +f 33 35 7 +f 8 7 35 +f 14 7 8 +f 34 35 33 +f 36 35 34 +f 8 35 36 +f 30 34 33 +f 26 30 33 +f 36 34 2 +f 8 36 2 +f 14 8 2 +f 6 14 2 +f 29 25 34 +f 21 34 25 +f 32 29 34 +f 30 32 34 diff --git a/tutorials/mesh/snappyHexMesh/gap_detection/system/controlDict b/tutorials/mesh/snappyHexMesh/gap_detection/system/controlDict new file mode 100644 index 0000000000..2d847ac651 --- /dev/null +++ b/tutorials/mesh/snappyHexMesh/gap_detection/system/controlDict @@ -0,0 +1,49 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev s | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +application snappyHexMesh; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 2000; + +deltaT 1; + +writeControl timeStep; + +writeInterval 100; + +purgeWrite 0; + +writeFormat binary; + +writePrecision 6; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable true; + + +// ************************************************************************* // diff --git a/tutorials/mesh/snappyHexMesh/gap_detection/system/decomposeParDict b/tutorials/mesh/snappyHexMesh/gap_detection/system/decomposeParDict new file mode 100644 index 0000000000..773056e68b --- /dev/null +++ b/tutorials/mesh/snappyHexMesh/gap_detection/system/decomposeParDict @@ -0,0 +1,41 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object decomposeParDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 8; + +method hierarchical; + +simpleCoeffs +{ + n ( 4 1 1 ); + delta 0.001; +} + +hierarchicalCoeffs +{ + n ( 2 2 2 ); + delta 0.001; + order xyz; +} + +manualCoeffs +{ + dataFile "cellDecomposition"; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/snappyHexMesh/gap_detection/system/fvSchemes b/tutorials/mesh/snappyHexMesh/gap_detection/system/fvSchemes new file mode 100644 index 0000000000..bba4ac8e0c --- /dev/null +++ b/tutorials/mesh/snappyHexMesh/gap_detection/system/fvSchemes @@ -0,0 +1,63 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default steadyState; +} + +gradSchemes +{ + default Gauss linear; +} + +divSchemes +{ + default none; + + div(phi,U) bounded Gauss upwind; + div(phi,T) bounded Gauss upwind; + div(phi,k) bounded Gauss upwind; + div(phi,epsilon) bounded Gauss upwind; + div(phi,R) bounded Gauss upwind; + div(R) Gauss linear; + div((nuEff*dev(T(grad(U))))) Gauss linear; +} + +laplacianSchemes +{ + default Gauss linear limited corrected 0.333; +} + +interpolationSchemes +{ + default linear; +} + +snGradSchemes +{ + default limited corrected 0.333; +} + +fluxRequired +{ + default no; + p_rgh ; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/snappyHexMesh/gap_detection/system/fvSolution b/tutorials/mesh/snappyHexMesh/gap_detection/system/fvSolution new file mode 100644 index 0000000000..627615c534 --- /dev/null +++ b/tutorials/mesh/snappyHexMesh/gap_detection/system/fvSolution @@ -0,0 +1,69 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + p_rgh + { + solver PCG; + preconditioner DIC; + tolerance 1e-08; + relTol 0.01; + } + + "(U|T|k|epsilon)" + { + solver PBiCG; + preconditioner DILU; + tolerance 1e-07; + relTol 0.1; + } +} + +SIMPLE +{ + nNonOrthogonalCorrectors 2; + pRefCell 0; + pRefValue 0; + + residualControl + { + p_rgh 1e-2; + U 1e-4; + T 1e-3; + + // possibly check turbulence fields + "(k|epsilon|omega)" 1e-3; + } +} + +relaxationFactors +{ + fields + { + p_rgh 0.7; + } + equations + { + U 0.2; + T 0.5; + "(k|epsilon)" 0.7; + } +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/snappyHexMesh/gap_detection/system/meshQualityDict b/tutorials/mesh/snappyHexMesh/gap_detection/system/meshQualityDict new file mode 100644 index 0000000000..fd0701a01c --- /dev/null +++ b/tutorials/mesh/snappyHexMesh/gap_detection/system/meshQualityDict @@ -0,0 +1,21 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object meshQualityDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Include defaults parameters from master dictionary +#include "$WM_PROJECT_DIR/etc/caseDicts/meshQualityDict" + + +// ************************************************************************* // diff --git a/tutorials/mesh/snappyHexMesh/gap_detection/system/snappyHexMeshDict b/tutorials/mesh/snappyHexMesh/gap_detection/system/snappyHexMeshDict new file mode 100644 index 0000000000..6da20c38ca --- /dev/null +++ b/tutorials/mesh/snappyHexMesh/gap_detection/system/snappyHexMeshDict @@ -0,0 +1,297 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / 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; +snap false; +addLayers false; + + +// 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 +{ + mech_test.obj + { + type triSurfaceMesh; + } + all + { + type searchableBox; + min (-1000 -1000 -1000); + max (1000 1000 1000); + } + +}; + + + +// 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 0; + + // Number of buffer layers between different levels. + // 1 means normal 2:1 refinement restriction, larger means slower + // refinement. + nCellsBetweenLevels 1; + + + + // 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 + ( + ); + + + + // 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 + { + mech_test.obj + { + // Surface-wise min and max refinement level + level (0 0); + } + } + + // Resolve sharp angles + resolveFeatureAngle 60; + + + // 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 + { + all + { + mode inside; + + // Dummy base level + levels ((10000 0)); + + // If cells + // - have level 0..9 + // - and are in a gap < 3 cell sizes across + // - with the gap on the inside ('inside'), outside ('outside') + // or both ('mixed') of the surface + // refine them + gapLevel (4 0 10); + gapMode outside; + } + } + + + // 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 (-100 -5 -300); + + + // 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 false; +} + + + +// 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 2.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; + + + // Feature snapping + + //- Number of feature edge snapping iterations. + // Leave out altogether to disable. + nFeatureSnapIter 10; + + //- Detect (geometric) features by sampling the surface (default=false) + implicitFeatureSnap true; + + //- Use castellatedMeshControls::features (default = true) + explicitFeatureSnap false; +} + + + +// Settings for the layer addition. +addLayersControls +{ + // Are the thickness parameters below relative to the undistorted + // size of the refined cell outside layer (true) or absolute sizes (false). + relativeSizes true; + + // Per final patch (so not geometry!) the layer information + layers + { + } + + // 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. + // is the thickness of the layer furthest away from the wall. + // See relativeSizes parameter. + finalLayerThickness 0.5; + + // 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. + // See relativeSizes parameter. + minThickness 0.25; + + // 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; + + + // Advanced settings + + // When not to extrude surface. 0 is flat surface, 90 is when two faces + // are perpendicular + featureAngle 60; + + // 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.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 16x! 90 degrees corresponds to 130 in 16x. + 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 50; +} + + + +// Generic mesh quality settings. At any undoable phase these determine +// where to undo. +meshQualityControls +{ + #include "meshQualityDict" + + // Advanced + + //- Number of error distribution iterations + nSmoothScale 4; + //- amount to scale back displacement at error points + errorReduction 0.75; +} + + +// Advanced + +// Merge tolerance. Is fraction of overall bounding box of initial mesh. +// Note: the write tolerance needs to be higher than this. +mergeTolerance 1e-6; + +// ************************************************************************* //