mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
Merge branch 'cvm' of ssh://hunt//home/noisy3/OpenFOAM/OpenFOAM-dev into cvm
This commit is contained in:
@ -401,7 +401,7 @@ polyMeshFiltering
|
||||
|
||||
// Upper limit on how close two dual vertices can be before
|
||||
// being merged, fraction of the local target cell size
|
||||
mergeClosenessCoeff 1e-4;
|
||||
mergeClosenessCoeff 1e-9;
|
||||
|
||||
// To not filter: set maxNonOrtho to 1 (so check fails) and then
|
||||
// set continueFilteringOnBadInitialPolyMesh to false.
|
||||
@ -451,6 +451,11 @@ meshQualityControls
|
||||
// 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 -1E30;
|
||||
|
||||
//- Minimum quality of the tet formed by the
|
||||
// variable base point minimum decomposition triangles and
|
||||
// the cell centre (so not face-centre decomposition).
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -28,13 +28,13 @@ Description
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "argList.H"
|
||||
#include "triSurfaceSearch.H"
|
||||
#include "orientedSurface.H"
|
||||
|
||||
using namespace Foam;
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
// Main program:
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
@ -53,6 +53,11 @@ int main(int argc, char *argv[])
|
||||
"inside",
|
||||
"treat provided point as being inside"
|
||||
);
|
||||
argList::addBoolOption
|
||||
(
|
||||
"usePierceTest",
|
||||
"determine orientation by counting number of intersections"
|
||||
);
|
||||
|
||||
argList args(argc, argv);
|
||||
|
||||
@ -61,9 +66,9 @@ int main(int argc, char *argv[])
|
||||
const fileName outFileName = args[3];
|
||||
|
||||
const bool orientInside = args.optionFound("inside");
|
||||
const bool usePierceTest = args.optionFound("usePierceTest");
|
||||
|
||||
Info<< "Reading surface from " << surfFileName << nl
|
||||
<< "Visible point " << visiblePoint << nl
|
||||
<< "Orienting surface such that visiblePoint " << visiblePoint
|
||||
<< " is ";
|
||||
|
||||
@ -76,19 +81,35 @@ int main(int argc, char *argv[])
|
||||
Info<< "outside" << endl;
|
||||
}
|
||||
|
||||
Info<< "Writing surface to " << outFileName << endl;
|
||||
|
||||
|
||||
// Load surface
|
||||
triSurface surf(surfFileName);
|
||||
|
||||
//orientedSurface normalSurf(surf, visiblePoint, !orientInside);
|
||||
bool anyFlipped = orientedSurface::orient
|
||||
(
|
||||
surf,
|
||||
visiblePoint,
|
||||
!orientInside
|
||||
);
|
||||
|
||||
bool anyFlipped = false;
|
||||
|
||||
if (usePierceTest)
|
||||
{
|
||||
triSurfaceSearch surfSearches(surf);
|
||||
|
||||
anyFlipped = orientedSurface::orient
|
||||
(
|
||||
surf,
|
||||
surfSearches,
|
||||
visiblePoint,
|
||||
!orientInside
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
anyFlipped = orientedSurface::orient
|
||||
(
|
||||
surf,
|
||||
visiblePoint,
|
||||
!orientInside
|
||||
);
|
||||
}
|
||||
|
||||
if (anyFlipped)
|
||||
{
|
||||
|
||||
@ -25,6 +25,7 @@ License
|
||||
|
||||
#include "orientedSurface.H"
|
||||
#include "triSurfaceTools.H"
|
||||
#include "triSurfaceSearch.H"
|
||||
#include "treeBoundBox.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
@ -165,13 +166,6 @@ void Foam::orientedSurface::walkSurface
|
||||
{
|
||||
changedEdges = faceToEdge(s, changedFaces);
|
||||
|
||||
if (debug)
|
||||
{
|
||||
Pout<< "From changedFaces:" << changedFaces.size()
|
||||
<< " to changedEdges:" << changedEdges.size()
|
||||
<< endl;
|
||||
}
|
||||
|
||||
if (changedEdges.empty())
|
||||
{
|
||||
break;
|
||||
@ -179,13 +173,6 @@ void Foam::orientedSurface::walkSurface
|
||||
|
||||
changedFaces = edgeToFace(s, changedEdges, flipState);
|
||||
|
||||
if (debug)
|
||||
{
|
||||
Pout<< "From changedEdges:" << changedEdges.size()
|
||||
<< " to changedFaces:" << changedFaces.size()
|
||||
<< endl;
|
||||
}
|
||||
|
||||
if (changedFaces.empty())
|
||||
{
|
||||
break;
|
||||
@ -251,6 +238,82 @@ void Foam::orientedSurface::propagateOrientation
|
||||
}
|
||||
|
||||
|
||||
// Find side for zoneI only by counting the number of intersections. Determines
|
||||
// if face is oriented consistent with outwards pointing normals.
|
||||
void Foam::orientedSurface::findZoneSide
|
||||
(
|
||||
const triSurfaceSearch& surfSearches,
|
||||
const labelList& faceZone,
|
||||
const label zoneI,
|
||||
const point& outsidePoint,
|
||||
label& zoneFaceI,
|
||||
bool& isOutside
|
||||
)
|
||||
{
|
||||
const triSurface& s = surfSearches.surface();
|
||||
|
||||
zoneFaceI = -1;
|
||||
isOutside = false;
|
||||
|
||||
|
||||
List<pointIndexHit> hits;
|
||||
|
||||
forAll(faceZone, faceI)
|
||||
{
|
||||
if (faceZone[faceI] == zoneI)
|
||||
{
|
||||
const point& fc = s.faceCentres()[faceI];
|
||||
const vector& n = s.faceNormals()[faceI];
|
||||
|
||||
const vector d = fc - outsidePoint;
|
||||
const scalar magD = mag(d);
|
||||
|
||||
// Check if normal different enough to decide upon
|
||||
if (magD > SMALL && (mag(n & d/magD) > 1e-6))
|
||||
{
|
||||
point end = fc + d;
|
||||
|
||||
//Info<< "Zone " << zoneI << " : Shooting ray"
|
||||
// << " from " << outsidePoint
|
||||
// << " to " << end
|
||||
// << " to pierce triangle " << faceI
|
||||
// << " with centre " << fc << endl;
|
||||
|
||||
surfSearches.findLineAll(outsidePoint, end, hits);
|
||||
|
||||
label zoneIndex = -1;
|
||||
forAll(hits, i)
|
||||
{
|
||||
if (hits[i].index() == faceI)
|
||||
{
|
||||
zoneIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (zoneIndex != -1)
|
||||
{
|
||||
zoneFaceI = faceI;
|
||||
|
||||
if ((zoneIndex%2) == 0)
|
||||
{
|
||||
// Odd number of intersections. Check if normal points
|
||||
// in direction of ray
|
||||
isOutside = ((n & d) < 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
isOutside = ((n & d) > 0);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool Foam::orientedSurface::flipSurface
|
||||
(
|
||||
triSurface& s,
|
||||
@ -438,4 +501,56 @@ bool Foam::orientedSurface::orient
|
||||
}
|
||||
|
||||
|
||||
bool Foam::orientedSurface::orient
|
||||
(
|
||||
triSurface& s,
|
||||
const triSurfaceSearch& querySurf,
|
||||
const point& samplePoint,
|
||||
const bool orientOutside
|
||||
)
|
||||
{
|
||||
// Determine disconnected parts of surface
|
||||
boolList borderEdge(s.nEdges(), false);
|
||||
forAll(s.edgeFaces(), edgeI)
|
||||
{
|
||||
if (s.edgeFaces()[edgeI].size() != 2)
|
||||
{
|
||||
borderEdge[edgeI] = true;
|
||||
}
|
||||
}
|
||||
labelList faceZone;
|
||||
label nZones = s.markZones(borderEdge, faceZone);
|
||||
|
||||
// Check intersection with one face per zone.
|
||||
|
||||
labelList flipState(s.size(), UNVISITED);
|
||||
for (label zoneI = 0; zoneI < nZones; zoneI++)
|
||||
{
|
||||
label zoneFaceI = -1;
|
||||
bool isOutside;
|
||||
findZoneSide
|
||||
(
|
||||
querySurf,
|
||||
faceZone,
|
||||
zoneI,
|
||||
samplePoint,
|
||||
|
||||
zoneFaceI,
|
||||
isOutside
|
||||
);
|
||||
|
||||
if (isOutside == orientOutside)
|
||||
{
|
||||
flipState[zoneFaceI] = NOFLIP;
|
||||
}
|
||||
else
|
||||
{
|
||||
flipState[zoneFaceI] = FLIP;
|
||||
}
|
||||
walkSurface(s, zoneFaceI, flipState);
|
||||
}
|
||||
return flipSurface(s, flipState);
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -44,6 +44,7 @@ namespace Foam
|
||||
{
|
||||
|
||||
// Forward declaration of classes
|
||||
class triSurfaceSearch;
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class orientedSurface Declaration
|
||||
@ -111,6 +112,18 @@ class orientedSurface
|
||||
labelList& flipState
|
||||
);
|
||||
|
||||
//- Find a face on zoneI and count number of intersections to determine
|
||||
// orientation
|
||||
static void findZoneSide
|
||||
(
|
||||
const triSurfaceSearch& surfSearches,
|
||||
const labelList& faceZone,
|
||||
const label zoneI,
|
||||
const point& visiblePoint,
|
||||
label& zoneFaceI,
|
||||
bool& isOutside
|
||||
);
|
||||
|
||||
//- Given flipState reverse triangles of *this. Return true if
|
||||
// anything flipped.
|
||||
static bool flipSurface(triSurface& s, const labelList& flipState);
|
||||
@ -127,7 +140,7 @@ public:
|
||||
|
||||
//- Construct from triSurface and sample point which is either
|
||||
// outside (orientOutside = true) or inside (orientOutside = false).
|
||||
// Uses linear search to find nearest.
|
||||
// Uses orient.
|
||||
orientedSurface
|
||||
(
|
||||
const triSurface&,
|
||||
@ -145,8 +158,21 @@ public:
|
||||
//- Flip faces such that normals are consistent with point:
|
||||
// orientOutside=true : point outside surface
|
||||
// orientOutside=false : point inside surface
|
||||
// Bases orientation on normal on nearest point (linear search) and
|
||||
// walks to rest. Surface needs to be manifold.
|
||||
static bool orient(triSurface&, const point&, const bool orientOutside);
|
||||
|
||||
//- Flip faces such that normals are consistent with point:
|
||||
// orientOutside=true : point outside surface
|
||||
// orientOutside=false : point inside surface
|
||||
// Uses intersection count to orient. Handles open surfaces.
|
||||
static bool orient
|
||||
(
|
||||
triSurface& s,
|
||||
const triSurfaceSearch& querySurf,
|
||||
const point& samplePoint,
|
||||
const bool orientOutside
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -188,4 +188,86 @@ const
|
||||
}
|
||||
|
||||
|
||||
void Foam::triSurfaceSearch::findLineAll
|
||||
(
|
||||
const point& start,
|
||||
const point& end,
|
||||
List<pointIndexHit>& hits
|
||||
)
|
||||
const
|
||||
{
|
||||
// See if any intersection between pt and end
|
||||
pointIndexHit inter = tree().findLine(start, end);
|
||||
|
||||
if (inter.hit())
|
||||
{
|
||||
label sz = hits.size();
|
||||
hits.setSize(sz+1);
|
||||
hits[sz] = inter;
|
||||
|
||||
const vector dirVec(end-start);
|
||||
const scalar magSqrDirVec(magSqr(dirVec));
|
||||
const vector smallVec
|
||||
(
|
||||
indexedOctree<treeDataTriSurface>::perturbTol()*dirVec
|
||||
+ vector(ROOTVSMALL,ROOTVSMALL,ROOTVSMALL)
|
||||
);
|
||||
|
||||
|
||||
// Initial perturbation amount
|
||||
vector perturbVec(smallVec);
|
||||
|
||||
while (true)
|
||||
{
|
||||
// Start tracking from last hit.
|
||||
point pt = hits.last().hitPoint() + perturbVec;
|
||||
|
||||
if (((pt-start)&dirVec) > magSqrDirVec)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// See if any intersection between pt and end
|
||||
pointIndexHit inter = tree().findLine(pt, end);
|
||||
|
||||
if (!inter.hit())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if already found this intersection
|
||||
bool duplicateHit = false;
|
||||
forAllReverse(hits, i)
|
||||
{
|
||||
if (hits[i].index() == inter.index())
|
||||
{
|
||||
duplicateHit = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (duplicateHit)
|
||||
{
|
||||
// Hit same triangle again. Increase perturbVec and try again.
|
||||
perturbVec *= 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Proper hit
|
||||
label sz = hits.size();
|
||||
hits.setSize(sz+1);
|
||||
hits[sz] = inter;
|
||||
// Restore perturbVec
|
||||
perturbVec = smallVec;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
hits.clear();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -128,6 +128,15 @@ public:
|
||||
// - hitPoint() : coordinate of nearest point
|
||||
// - index() : surface triangle label
|
||||
pointIndexHit nearest(const point&, const vector& span) const;
|
||||
|
||||
//- Calculate all intersections from start to end
|
||||
void findLineAll
|
||||
(
|
||||
const point& start,
|
||||
const point& end,
|
||||
List<pointIndexHit>&
|
||||
) const;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
40
tutorials/mesh/cvMesh/car/Allrun
Executable file
40
tutorials/mesh/cvMesh/car/Allrun
Executable file
@ -0,0 +1,40 @@
|
||||
#!/bin/sh
|
||||
cd ${0%/*} || exit 1 # run from this directory
|
||||
|
||||
# Source tutorial run functions
|
||||
. $WM_PROJECT_DIR/bin/tools/RunFunctions
|
||||
|
||||
# Orient so point to be meshed is inside surface
|
||||
surfaceOrient \
|
||||
constant/triSurface/m_car01.obj \
|
||||
-inside -usePierceTest '(13 -200 149)' \
|
||||
constant/triSurface/m_car01_orient.obj \
|
||||
> log.surfaceOrient.m_car01 2>&1
|
||||
|
||||
# Same for outside
|
||||
surfaceOrient \
|
||||
constant/triSurface/domain.stl \
|
||||
-inside -usePierceTest '(13 -200 149)' \
|
||||
constant/triSurface/domain_orient.stl \
|
||||
> log.surfaceOrient.domain 2>&1
|
||||
|
||||
# Surface has open edges. Create dummy features for now.
|
||||
runApplication surfaceFeatureExtract \
|
||||
constant/triSurface/m_car01_orient.obj \
|
||||
m_car01 -minElem 10000000
|
||||
mv log.surfaceFeatureExtract log.surfaceFeatureExtract.m_car01
|
||||
|
||||
unset FOAM_SIGFPE
|
||||
runApplication surfaceFeatureExtract \
|
||||
constant/triSurface/domain_orient.stl \
|
||||
domain -includedAngle 125
|
||||
mv log.surfaceFeatureExtract log.surfaceFeatureExtract.domain
|
||||
|
||||
# Generate aligned points (in constant/internalDelaunayVertices) and a
|
||||
# mesh from that.
|
||||
runApplication cvMesh
|
||||
|
||||
# Generate some sets for a bit of mesh inspection
|
||||
runApplication topoSet -constant -time 0:100
|
||||
|
||||
# ----------------------------------------------------------------- end-of-file
|
||||
BIN
tutorials/mesh/cvMesh/car/constant/triSurface/domain.stl
Normal file
BIN
tutorials/mesh/cvMesh/car/constant/triSurface/domain.stl
Normal file
Binary file not shown.
4668
tutorials/mesh/cvMesh/car/constant/triSurface/m_car01.obj
Normal file
4668
tutorials/mesh/cvMesh/car/constant/triSurface/m_car01.obj
Normal file
File diff suppressed because it is too large
Load Diff
54
tutorials/mesh/cvMesh/car/system/controlDict
Normal file
54
tutorials/mesh/cvMesh/car/system/controlDict
Normal file
@ -0,0 +1,54 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: dev |
|
||||
| \\ / A nd | Web: www.OpenFOAM.com |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
|
||||
root "";
|
||||
case "";
|
||||
instance "";
|
||||
local "";
|
||||
|
||||
class dictionary;
|
||||
object controlDict;
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
startFrom latestTime;
|
||||
|
||||
startTime 0;
|
||||
|
||||
stopAt endTime;
|
||||
|
||||
endTime 1; //80;
|
||||
|
||||
deltaT 1;
|
||||
|
||||
writeControl timeStep;
|
||||
|
||||
writeInterval 1000; //10 to see the meshing steps
|
||||
|
||||
purgeWrite 0;
|
||||
|
||||
writeFormat ascii;
|
||||
|
||||
writePrecision 10;
|
||||
|
||||
writeCompression uncompressed;
|
||||
|
||||
timeFormat general;
|
||||
|
||||
timePrecision 6;
|
||||
|
||||
runTimeModifiable yes;
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
477
tutorials/mesh/cvMesh/car/system/cvMeshDict
Normal file
477
tutorials/mesh/cvMesh/car/system/cvMeshDict
Normal file
@ -0,0 +1,477 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: dev |
|
||||
| \\ / A nd | Web: www.OpenFOAM.com |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class dictionary;
|
||||
object cvMeshDict;
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
/*
|
||||
|
||||
Control dictionary for cvMesh - polyhedral mesh generator.
|
||||
|
||||
cvMesh phases:
|
||||
1. fill volume with initial points (initialPoints subdictionary). An option
|
||||
is to reread from previous set of points.
|
||||
|
||||
2. internal point motion (motionControl subdictionary)
|
||||
|
||||
3. every once in a while add point duplets/triplets to conform to
|
||||
surfaces and features (surfaceConformation subdictionary)
|
||||
|
||||
4. back to 2
|
||||
|
||||
5. construct polyMesh.
|
||||
- filter (polyMeshFiltering subdictionary)
|
||||
- check (meshQualityControls subdictionary) and undo filtering
|
||||
|
||||
|
||||
See also cvControls.H in the conformalVoronoiMesh library
|
||||
|
||||
*/
|
||||
|
||||
|
||||
// Important:
|
||||
// ----------
|
||||
// Any scalar with a name <name>Coeff specifies a value that will be implemented
|
||||
// as a faction of the local target cell size
|
||||
// Any scalar with a name <name>Size specifies an absolute size.
|
||||
|
||||
|
||||
// Geometry. Definition of all surfaces. All surfaces are of class
|
||||
// searchableSurface.
|
||||
// Surfaces need to be (almost) closed - use closedTriSurfaceMesh
|
||||
// if they are not topologically closed. Surfaces need to be oriented so
|
||||
// the space to be meshed is always on the inside of all surfaces. Use e.g.
|
||||
// surfaceOrient.
|
||||
geometry
|
||||
{
|
||||
// Internal shape
|
||||
m_car01_orient.obj
|
||||
{
|
||||
//name m_car01;
|
||||
type triSurfaceMesh;
|
||||
}
|
||||
|
||||
m_car01
|
||||
{
|
||||
type searchableSurfaceWithGaps;
|
||||
surface m_car01_orient.obj;
|
||||
gap 1e-2;
|
||||
}
|
||||
|
||||
// Outside of domain
|
||||
domain_orient.stl
|
||||
{
|
||||
name domain;
|
||||
type triSurfaceMesh;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Controls for conforming to the surfaces.
|
||||
surfaceConformation
|
||||
{
|
||||
// A point inside surfaces that is inside mesh.
|
||||
locationInMesh (13 -200 149);
|
||||
|
||||
// How far apart are point-duplets generated. Balance this between
|
||||
// - very low distance: little chance of interference from other
|
||||
// surfaces
|
||||
// - largish distance: less non-orthogonality in final cell
|
||||
// (circumcentre far away from centroid)
|
||||
pointPairDistanceCoeff 0.1;
|
||||
|
||||
// Mixed feature edges - both inside and outside edges. Recreated
|
||||
// by inserting triplets of points to recreate a single edge. Done for
|
||||
// all edges emanating from point. triplets of points get inserted
|
||||
// mixedFeaturePointPPDistanceCoeff distance away from feature point.
|
||||
mixedFeaturePointPPDistanceCoeff 5.0;
|
||||
|
||||
// Distance to a feature point within which surface and edge
|
||||
// conformation points are excluded - fraction of the local target
|
||||
// cell size
|
||||
featurePointExclusionDistanceCoeff 0.4;
|
||||
|
||||
// Distance to an existing feature edge conformation location
|
||||
// within which other edge conformation location are excluded -
|
||||
// fraction of the local target cell size
|
||||
featureEdgeExclusionDistanceCoeff 0.2;
|
||||
|
||||
// Optimisation: do not check for surface intersection (of dual edges)
|
||||
// for points near to surface.
|
||||
surfaceSearchDistanceCoeff 2.5;
|
||||
|
||||
// Maximum allowable protrusion through the surface before
|
||||
// conformation points are added - fraction of the local target
|
||||
// cell size. These small protusions are (hopefully) done by mesh filtering
|
||||
// instead.
|
||||
maxSurfaceProtrusionCoeff 0.1;
|
||||
|
||||
// If feature edge with large angle (so more than 125 degrees) introduce
|
||||
// additional points to create two half angled cells (= mitering).
|
||||
maxQuadAngle 125;
|
||||
|
||||
// Frequency to redo surface conformation (expensive).
|
||||
surfaceConformationRebuildFrequency 10;
|
||||
|
||||
// Initial and intermediate controls
|
||||
coarseConformationControls
|
||||
{
|
||||
// Initial conformation
|
||||
initial
|
||||
{
|
||||
// We've got a point poking through the surface. Don't do any
|
||||
// surface conformation if near feature edge (since feature edge
|
||||
// conformation should have priority)
|
||||
|
||||
// distance to search for near feature edges
|
||||
edgeSearchDistCoeff 1.1;
|
||||
|
||||
// Proximity to a feature edge where a surface hit is
|
||||
// not created, only the edge conformation is created
|
||||
// - fraction of the local target cell size. Coarse
|
||||
// conformation, initial protrusion tests.
|
||||
surfacePtReplaceDistCoeff 0.5;
|
||||
}
|
||||
|
||||
// Same for iterations
|
||||
iteration
|
||||
{
|
||||
edgeSearchDistCoeff 1.25;
|
||||
surfacePtReplaceDistCoeff 0.7;
|
||||
}
|
||||
|
||||
// Stop either at maxIterations or if the number of surface pokes
|
||||
// is very small (iterationToInitialHitRatioLimit * initial number)
|
||||
// Note: perhaps iterationToInitialHitRatioLimit should be absolute
|
||||
// count?
|
||||
maxIterations 15;
|
||||
|
||||
iterationToInitialHitRatioLimit 0.001;
|
||||
}
|
||||
|
||||
// Final (at endTime) controls
|
||||
fineConformationControls
|
||||
{
|
||||
initial
|
||||
{
|
||||
edgeSearchDistCoeff 1.1;
|
||||
surfacePtReplaceDistCoeff 0.5;
|
||||
}
|
||||
|
||||
iteration
|
||||
{
|
||||
edgeSearchDistCoeff 1.25;
|
||||
surfacePtReplaceDistCoeff 0.7;
|
||||
}
|
||||
|
||||
maxIterations 15;
|
||||
|
||||
iterationToInitialHitRatioLimit 0.001;
|
||||
}
|
||||
|
||||
// Geometry to mesh to
|
||||
geometryToConformTo
|
||||
{
|
||||
m_car01
|
||||
{
|
||||
featureMethod extendedFeatureEdgeMesh;
|
||||
extendedFeatureEdgeMesh "m_car01_orient.extendedFeatureEdgeMesh";
|
||||
}
|
||||
|
||||
domain
|
||||
{
|
||||
featureMethod extendedFeatureEdgeMesh;
|
||||
extendedFeatureEdgeMesh "domain_orient.extendedFeatureEdgeMesh";
|
||||
}
|
||||
}
|
||||
|
||||
additionalFeatures {}
|
||||
}
|
||||
|
||||
|
||||
// Controls for seeding initial points and general control of the target
|
||||
// cell size (used everywhere)
|
||||
initialPoints
|
||||
{
|
||||
// Do not place point closer than minimumSurfaceDistanceCoeff
|
||||
// to the surface. Is fraction of local target cell size (see below)
|
||||
minimumSurfaceDistanceCoeff 0.55;
|
||||
|
||||
initialPointsMethod autoDensity;
|
||||
// initialPointsMethod uniformGrid;
|
||||
// initialPointsMethod bodyCentredCubic;
|
||||
// initialPointsMethod pointFile;
|
||||
|
||||
// Take boundbox of all geometry. Samples with this box. If too much
|
||||
// samples (due to target cell size) in box split box.
|
||||
autoDensityCoeffs
|
||||
{
|
||||
// Initial number of refinement levels. Needs to be enough to pick
|
||||
// up features due to size ratio. If not enough it will take longer
|
||||
// to determine point seeding.
|
||||
minLevels 4;
|
||||
// Split box if ratio of min to max cell size larger than maxSizeRatio
|
||||
maxSizeRatio 5.0;
|
||||
// Per box sample 3x3x3 internally
|
||||
sampleResolution 3;
|
||||
// Additionally per face of the box sample 3
|
||||
surfaceSampleResolution 3;
|
||||
}
|
||||
|
||||
uniformGridCoeffs
|
||||
{
|
||||
// Absolute cell size.
|
||||
initialCellSize 0.0015;
|
||||
randomiseInitialGrid yes;
|
||||
randomPerturbationCoeff 0.02;
|
||||
}
|
||||
|
||||
bodyCentredCubicCoeffs
|
||||
{
|
||||
initialCellSize 0.0015;
|
||||
randomiseInitialGrid no;
|
||||
randomPerturbationCoeff 0.1;
|
||||
}
|
||||
|
||||
pointFileCoeffs
|
||||
{
|
||||
// Reads points from file. Still rejects points that are too
|
||||
// close to the surface (minimumSurfaceDistanceCoeff) or on the
|
||||
// wrong side of the surfaces.
|
||||
pointFile "constant/internalDelaunayVertices";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Control size of voronoi cells i.e. distance between points. This
|
||||
// determines the target cell size which is used everywhere.
|
||||
// It determines the cell size given a location. It then uses all
|
||||
// the rules
|
||||
// - defaultCellSize
|
||||
// - cellSizeControlGeometry
|
||||
// to determine target cell size. Rule with highest priority wins. If same
|
||||
// priority smallest cell size wins.
|
||||
motionControl
|
||||
{
|
||||
// Absolute cell size of back ground mesh. This is the maximum cell size.
|
||||
defaultCellSize 10;
|
||||
|
||||
// Assign a priority to all requests for cell sizes, the highest overrules.
|
||||
defaultPriority 0;
|
||||
|
||||
cellSizeControlGeometry
|
||||
{
|
||||
nearCar
|
||||
{
|
||||
// optional name of geometry
|
||||
surface m_car01;
|
||||
priority 1;
|
||||
mode bothSides;
|
||||
cellSizeFunction linearDistance;
|
||||
|
||||
// cellSizeFunctions:
|
||||
// uniform : uniform size
|
||||
// uniformDistance : fixed size for all within distance
|
||||
// linearSpatial : grading in specified direction only
|
||||
// linearDistance : vary linearly as distance to surface
|
||||
// surfaceOffsetLinearDistance : constant close to surface then
|
||||
// fade like linearDistance
|
||||
|
||||
// Vary from surfaceCellSize (close to the surface) to
|
||||
// distanceCellSize (further than 'distance')
|
||||
linearDistanceCoeffs
|
||||
{
|
||||
surfaceCellSize 1; // absolute size
|
||||
distanceCellSize $defaultCellSize;
|
||||
distance 10.0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Underrelaxation for point motion. Simulated annealing: starts off at 1
|
||||
// and lowers to 0 (at simulation endTime) to converge points.
|
||||
// adaptiveLinear is preferred choice.
|
||||
// Points move by e.g. 10% of tet size.
|
||||
relaxationModel adaptiveLinear; //rampHoldFall
|
||||
|
||||
adaptiveLinearCoeffs
|
||||
{
|
||||
relaxationStart 1.0;
|
||||
relaxationEnd 0.0;
|
||||
}
|
||||
|
||||
// Output lots and lots of .obj files
|
||||
objOutput no;
|
||||
|
||||
// Timing and memory usage.
|
||||
timeChecks yes;
|
||||
|
||||
// Number of rays in plane parallel to nearest surface. Used to detect
|
||||
// next closest surfaces. Used to work out alignment (three vectors)
|
||||
// to surface.
|
||||
// Note that only the initial points (from the seeding) calculate this
|
||||
// information so if these are not fine enough the alignment will
|
||||
// not be correct. (any points added during the running will lookup
|
||||
// this information from the nearest initial point since it is
|
||||
// expensive)
|
||||
alignmentSearchSpokes 36;
|
||||
|
||||
// For each delaunay edge (between two vertices, becomes
|
||||
// the Voronoi face normal) snap to the alignment direction if within
|
||||
// alignmentAcceptanceAngle. Slightly > 45 is a good choice - prevents
|
||||
// flipping.
|
||||
alignmentAcceptanceAngle 48;
|
||||
|
||||
// How often to rebuild the alignment info (expensive)
|
||||
sizeAndAlignmentRebuildFrequency 20;
|
||||
|
||||
// When to insert points. Not advisable change to
|
||||
// these settings.
|
||||
pointInsertionCriteria
|
||||
{
|
||||
// If edge larger than 1.75 target cell size
|
||||
// (so tets too large/stretched) insert point
|
||||
cellCentreDistCoeff 1.75;
|
||||
// Do not insert point if voronoi face (on edge) very small.
|
||||
faceAreaRatioCoeff 0.0025;
|
||||
// Insert point only if edge closely aligned to local alignment
|
||||
// direction.
|
||||
acceptanceAngle 21.5;
|
||||
}
|
||||
|
||||
// Opposite: remove point if mesh too compressed. Do not change these
|
||||
// settings.
|
||||
pointRemovalCriteria
|
||||
{
|
||||
cellCentreDistCoeff 0.65;
|
||||
}
|
||||
|
||||
// How to determine the point motion. All edges got some direction.
|
||||
// Sum all edge contributions to determine point motion. Weigh by
|
||||
// face area so motion is preferentially determined by large faces
|
||||
// (or more importantly ignore contribution from small faces).
|
||||
// Do not change these settings.
|
||||
faceAreaWeightModel piecewiseLinearRamp;
|
||||
|
||||
piecewiseLinearRampCoeffs
|
||||
{
|
||||
lowerAreaFraction 0.5;
|
||||
upperAreaFraction 1.0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// After simulation, when converting to polyMesh, filter out small faces/edges.
|
||||
// Do not change. See cvControls.H
|
||||
polyMeshFiltering
|
||||
{
|
||||
// Upper limit on the size of faces to be filtered.
|
||||
// fraction of the local target cell size
|
||||
filterSizeCoeff 0.2;
|
||||
|
||||
// Upper limit on how close two dual vertices can be before
|
||||
// being merged, fraction of the local target cell size
|
||||
mergeClosenessCoeff 1e-9;
|
||||
|
||||
// To not filter: set maxNonOrtho to 1 (so check fails) and then
|
||||
// set continueFilteringOnBadInitialPolyMesh to false.
|
||||
continueFilteringOnBadInitialPolyMesh false; //true;
|
||||
|
||||
// When a face is "bad", what fraction should the filterSizeCoeff be
|
||||
// reduced by. Recursive, so for a filterCount value of fC, the
|
||||
// filterSizeCoeff is reduced by pow(filterErrorReductionCoeff, fC)
|
||||
filterErrorReductionCoeff 0.5;
|
||||
|
||||
// Maximum number of filterCount applications before a face
|
||||
// is not attempted to be filtered
|
||||
filterCountSkipThreshold 4;
|
||||
|
||||
// Maximum number of permissible iterations of the face collapse
|
||||
// algorithm. The value to choose will be related the maximum number
|
||||
// of points on a face that is to be collapsed and how many faces
|
||||
// around it need to be collapsed.
|
||||
maxCollapseIterations 25;
|
||||
|
||||
// Maximum number of times an to allow an equal faceSet to be
|
||||
// returned from the face quality assessment before stopping iterations
|
||||
// to break an infinitie loop.
|
||||
maxConsecutiveEqualFaceSets 5;
|
||||
// Remove little steps (almost perp to surface) by collapsing face.
|
||||
surfaceStepFaceAngle 80;
|
||||
// Do not collapse face to edge if should become edges
|
||||
edgeCollapseGuardFraction 0.3;
|
||||
// Only collapse face to point if high aspect ratio
|
||||
maxCollapseFaceToPointSideLengthCoeff 0.35;
|
||||
}
|
||||
|
||||
|
||||
// Generic mesh quality settings. At any undoable phase these determine
|
||||
// where to undo. Same as in snappyHexMeshDict
|
||||
meshQualityControls
|
||||
{
|
||||
//- Maximum non-orthogonality allowed. Set to 180 to disable.
|
||||
maxNonOrtho 1; //65;
|
||||
|
||||
//- Max skewness allowed. Set to <0 to disable.
|
||||
maxBoundarySkewness 50;
|
||||
maxInternalSkewness 10;
|
||||
|
||||
//- 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 -1E30;
|
||||
|
||||
//- Minimum quality of the tet formed by the
|
||||
// variable base point minimum decomposition triangles and
|
||||
// the cell centre (so not face-centre decomposition).
|
||||
// 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 absolute 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.001;
|
||||
|
||||
//- 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;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
55
tutorials/mesh/cvMesh/car/system/fvSchemes
Normal file
55
tutorials/mesh/cvMesh/car/system/fvSchemes
Normal file
@ -0,0 +1,55 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: dev |
|
||||
| \\ / A nd | Web: www.OpenFOAM.com |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class dictionary;
|
||||
location "system";
|
||||
object fvSchemes;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
d2dt2Schemes
|
||||
{
|
||||
default steadyState;
|
||||
}
|
||||
|
||||
gradSchemes
|
||||
{
|
||||
default Gauss cubic;
|
||||
}
|
||||
|
||||
divSchemes
|
||||
{
|
||||
default Gauss cubic;
|
||||
}
|
||||
|
||||
laplacianSchemes
|
||||
{
|
||||
default Gauss linear uncorrected;
|
||||
}
|
||||
|
||||
interpolationSchemes
|
||||
{
|
||||
default cubic;
|
||||
}
|
||||
|
||||
snGradSchemes
|
||||
{
|
||||
default uncorrected;
|
||||
}
|
||||
|
||||
fluxRequired
|
||||
{
|
||||
default no;
|
||||
D ;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
41
tutorials/mesh/cvMesh/car/system/fvSolution
Normal file
41
tutorials/mesh/cvMesh/car/system/fvSolution
Normal file
@ -0,0 +1,41 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: dev |
|
||||
| \\ / A nd | Web: www.OpenFOAM.com |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class dictionary;
|
||||
location "system";
|
||||
object fvSolution;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
solvers
|
||||
{
|
||||
"(D|Dcorr)"
|
||||
{
|
||||
solver GAMG;
|
||||
tolerance 1e-06;
|
||||
relTol 0.99;
|
||||
smoother GaussSeidel;
|
||||
cacheAgglomeration true;
|
||||
nCellsInCoarsestLevel 6;
|
||||
agglomerator faceAreaPair;
|
||||
mergeLevels 1;
|
||||
}
|
||||
}
|
||||
|
||||
stressAnalysis
|
||||
{
|
||||
nCorrectors 1;
|
||||
D 1e-10;
|
||||
accelerationFactor 2;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
148
tutorials/mesh/cvMesh/car/system/topoSetDict
Normal file
148
tutorials/mesh/cvMesh/car/system/topoSetDict
Normal file
@ -0,0 +1,148 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: dev |
|
||||
| \\ / A nd | Web: www.OpenFOAM.com |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class dictionary;
|
||||
object topoSetDict;
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
actions
|
||||
(
|
||||
{
|
||||
name z;
|
||||
type cellSet;
|
||||
action new;
|
||||
source boxToCell;
|
||||
sourceInfo
|
||||
{
|
||||
box (-100 -100 0)(100 100 100);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
name zf;
|
||||
type faceSet;
|
||||
action new;
|
||||
source cellToFace;
|
||||
sourceInfo
|
||||
{
|
||||
set z;
|
||||
option all;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
name z;
|
||||
type cellSet;
|
||||
action invert;
|
||||
}
|
||||
|
||||
{
|
||||
name zf;
|
||||
type faceSet;
|
||||
action subset;
|
||||
source cellToFace;
|
||||
sourceInfo
|
||||
{
|
||||
set z;
|
||||
option all;
|
||||
}
|
||||
}
|
||||
|
||||
// ~~~~~~~~~~~~~~~~ //
|
||||
|
||||
{
|
||||
name y;
|
||||
type cellSet;
|
||||
action new;
|
||||
source boxToCell;
|
||||
sourceInfo
|
||||
{
|
||||
box (-100 0.1 -100)(100 100 100);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
name yf;
|
||||
type faceSet;
|
||||
action new;
|
||||
source cellToFace;
|
||||
sourceInfo
|
||||
{
|
||||
set y;
|
||||
option all;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
name y;
|
||||
type cellSet;
|
||||
action invert;
|
||||
}
|
||||
|
||||
{
|
||||
name yf;
|
||||
type faceSet;
|
||||
action subset;
|
||||
source cellToFace;
|
||||
sourceInfo
|
||||
{
|
||||
set y;
|
||||
option all;
|
||||
}
|
||||
}
|
||||
|
||||
// ~~~~~~~~~~~~~~~~ //
|
||||
|
||||
{
|
||||
name x;
|
||||
type cellSet;
|
||||
action new;
|
||||
source boxToCell;
|
||||
sourceInfo
|
||||
{
|
||||
box (0.3 -100 -100)(100 100 100);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
name xf;
|
||||
type faceSet;
|
||||
action new;
|
||||
source cellToFace;
|
||||
sourceInfo
|
||||
{
|
||||
set x;
|
||||
option all;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
name x;
|
||||
type cellSet;
|
||||
action invert;
|
||||
}
|
||||
|
||||
{
|
||||
name xf;
|
||||
type faceSet;
|
||||
action subset;
|
||||
source cellToFace;
|
||||
sourceInfo
|
||||
{
|
||||
set x;
|
||||
option all;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// ************************************************************************* //
|
||||
Reference in New Issue
Block a user