Dikkeunit |
February 3, 2020 10:46 |
createpatch not working when using layer addition in snappyHexMesh
I am running a CFD simulation of a fan that is located inside a box. To do this I use snappyHexMesh to generate a baffle that is edited in createpatch to make it cyclic. Before this, I used cyclicAMI which worked fine. Now I would like to use cyclic as that will enable me to use the fan BC. When I only have the fan patch in a domain with the fan BC it works fine. When I then load another part in the simulation, without running layer addition in snappyHexMesh, it works fine as well. However, when I turn on the layer addition for the other part, even if it is not near the fan patch, createPatch does not work anymore giving the following error:
Code:
/*---------------------------------------------------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1812 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
Build : v1812 OPENFOAM=1812
Arch : "LSB;label=32;scalar=64"
Exec : createPatch -parallel -decomposeParDict system/decomposeParDict.6 -overwrite
Date : Feb 03 2020
Time : 15:01:40
Host : urepower8
PID : 59302
I/O : uncollated
Case : /home/URE14/OpenFOAM/URE14-v1812/run/Max/Experiment_Fancurve
nProcs : 50
Hosts :
(
(urepower8 50)
)
Pstream initialized with:
floatTransfer : 0
nProcsSimpleSum : 0
commsType : nonBlocking
polling iterations : 0
trapFpe: Floating point exception trapping enabled (FOAM_SIGFPE).
fileModificationChecking : Monitoring run-time modified files using timeStampMaster (fileModificationSkew 10)
allowSystemOperations : Allowing user-supplied system call operations
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Create time
Create polyMesh for time = 0
Reading "system/createPatchDict"
Adding new patch fan_in as patch 8 from
{
type cyclic;
neighbourPatch fan_out;
}
Adding new patch fan_out as patch 9 from
{
type cyclic;
neighbourPatch fan_in;
}
Moving faces from patch fan to patch 8
Moving faces from patch fan_slave to patch 9
Doing topology modification to order faces.
[19] Cannot find point in pts1 matching point 6 coord:(-0.26609 0.000615407 0.193233) in pts0 when using tolerance 7.7534e-08
[19] Searching started from:0 in pts1
[19] Cannot find point in pts1 matching point 20 coord:(-0.266101 0.00184115 0.193226) in pts0 when using tolerance 7.7501e-08
[19] Searching started from:0 in pts1
[19] Cannot find point in pts1 matching point 18 coord:(-0.266099 0.00308022 0.193227) in pts0 when using tolerance 7.69666e-08
[19] Searching started from:0 in pts1
[19] Cannot find point in pts1 matching point 4 coord:(-0.266091 0.00431021 0.193232) in pts0 when using tolerance 7.67744e-08
[19] Searching started from:0 in pts1
[19] Cannot find point in pts1 matching point 0 coord:(-0.266108 0.00554009 0.193221) in pts0 when using tolerance 7.81904e-08
etc......
This is the code for snappyHexMesh:
Code:
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1812 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ 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
{
fan.stl
{
type triSurfaceMesh;
name fan;
}
fanbox.stl
{
type triSurfaceMesh;
name fanbox;
}
}
// Settings for the castellatedMesh generation.
castellatedMeshControls
{
// Refinement parameters
maxLocalCells 1000000;
maxGlobalCells 80000000;
minRefinementCells 3000;
maxLoadUnbalance 0.10;
nCellsBetweenLevels 4;
allowFreeStandingZoneFaces true;
resolveFeatureAngle 30;
planarAngle 30;
features
(
{ file "fan.eMesh"; level 4; }
{ file "fanbox.eMesh"; level 4; }
);
// Surface based refinement
// ~~~~~~~~~~~~~~~~~~~~~~~~
refinementSurfaces
{
fanbox
{
// Surface-wise min and max refinement level
level (6 6);
// Optional specification of patch type (default is wall). No
// constraint types (cyclic, symmetry) etc. are allowed.
patchInfo
{
type wall;
inGroups (URE14Group);
}
}
fan
{
level (7 7);
faceZone fanFaces;
faceType baffle;
}
}
refinementRegions
{
}
locationInMesh (3.0001 3.0001 0.43);
}
// Settings for the snapping.
snapControls
{
nSmoothPatch 5;
tolerance 2.0;
nSolveIter 150;
nRelaxIter 5;
nFeatureSnapIter 15;
implicitFeatureSnap false;
explicitFeatureSnap true;
multiRegionFeatureSnap 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
{
"(fanbox).*"
{
nSurfaceLayers 6;
}
}
// Expansion factor for layer mesh
expansionRatio 1.2;
// 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.
// 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.
minThickness 0.001;
// 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 1.7.x! (didn't do anything in 1.7.x)
nGrow 0;
// Advanced settings
// When not to extrude surface. 0 is flat surface, 90 is when two faces
// are perpendicular
featureAngle 180;
// At non-patched sides allow mesh to slip if extrusion direction makes
// angle larger than slipFeatureAngle.
slipFeatureAngle 75;
// Maximum number of snapping relaxation iterations. Should stop
// before upon reaching a correct mesh.
nRelaxIter 5;
// Number of smoothing iterations of surface normals
nSmoothSurfaceNormals 3;
// Number of smoothing iterations of interior mesh movement direction
nSmoothNormals 4;
// 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 1.7.x! 90 degrees corresponds to 130
// in 1.7.x.
minMedialAxisAngle 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 300;
}
// 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
// Write flags
writeFlags
(
scalarLevels
layerSets
layerFields // write volScalarField for layer coverage
);
// 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 this is the code for createPatch:
Code:
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: 4.1.0 |
| \\ / A nd | Web: www.OpenFOAM.org |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object createPatchDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// This application/dictionary controls:
// - optional: create new patches from boundary faces (either given as
// a set of patches or as a faceSet)
// - always: order faces on coupled patches such that they are opposite. This
// is done for all coupled faces, not just for any patches created.
// - optional: synchronise points on coupled patches.
// 1. Create cyclic:
// - specify where the faces should come from
// - specify the type of cyclic. If a rotational specify the rotationAxis
// and centre to make matching easier
// - always create both halves in one invocation with correct 'neighbourPatch'
// setting.
// - optionally pointSync true to guarantee points to line up.
// 2. Correct incorrect cyclic:
// This will usually fail upon loading:
// "face 0 area does not match neighbour 2 by 0.0100005%"
// " -- possible face ordering problem."
// - in polyMesh/boundary file:
// - loosen matchTolerance of all cyclics to get case to load
// - or change patch type from 'cyclic' to 'patch'
// and regenerate cyclic as above
// Do a synchronisation of coupled points after creation of any patches.
// Note: this does not work with points that are on multiple coupled patches
// with transformations (i.e. cyclics).
pointSync true;
// Patches to create.
patches
(
{
// Name of new patch
name fan_in;
// Dictionary to construct new patch from
patchInfo
{
type cyclic;
neighbourPatch fan_out;
// Optional: explicitly set transformation tensor.
// Used when matching and synchronising points.
//transform rotational;
//rotationAxis (1 0 0);
//rotationCentre (0 0 0);
// transform translational;
// separationVector (1 0 0);
// Optional non-default tolerance to be able to define cyclics
// on bad meshes
//matchTolerance 0.000000000001;
}
// How to construct: either from 'patches' or 'set'
constructFrom patches;
// If constructFrom = patches : names of patches. Wildcards allowed.
patches (fan);
// If constructFrom = set : name of faceSet
//set fan;
}
{
// Name of new patch
name fan_out;
// Dictionary to construct new patch from
patchInfo
{
type cyclic;
neighbourPatch fan_in;
// Optional: explicitly set transformation tensor.
// Used when matching and synchronising points.
//transform rotational;
//rotationAxis ( 0 0 1 );
//rotationCentre ( 0.3 0 0 );
}
// How to construct: either from 'patches' or 'set'
constructFrom patches;
// If constructFrom = patches : names of patches. Wildcards allowed.
patches (fan_slave);
// If constructFrom = set : name of faceSet
//set fan_slave;
}
);
Would anyone know what the problem is? I can supply more information if needed.
Many thanks,
Max
|