Go to the documentation of this file.
36 #include "indexedVertex.H"
60 template<
class Triangulation,
class Type>
63 const Triangulation&
mesh,
75 typename Triangulation::Finite_vertices_iterator vit =
76 mesh.finite_vertices_begin();
77 vit !=
mesh.finite_vertices_end();
89 newField.resize(added);
108 typename T::Finite_vertices_iterator vit =
mesh.finite_vertices_begin();
109 vit !=
mesh.finite_vertices_end();
118 std::list<typename T::Vertex_handle> adjVerts;
119 mesh.finite_adjacent_vertices(vit, std::back_inserter(adjVerts));
125 typename std::list<typename T::Vertex_handle>::const_iterator
126 adjVertI = adjVerts.begin();
127 adjVertI != adjVerts.end();
131 typename T::Vertex_handle vh = *adjVertI;
137 globalIndexing.toGlobal(vh->procIndex(), vh->index())
142 pointPoints[vit->index()].
transfer(indices);
167 typename T::Finite_vertices_iterator vit =
mesh.finite_vertices_begin();
168 vit !=
mesh.finite_vertices_end();
177 alignments[vit->index()] = vit->alignment();
195 typename T::Finite_vertices_iterator vit =
mesh.finite_vertices_begin();
196 vit !=
mesh.finite_vertices_end();
216 const label maxRefinementIterations,
217 const scalar defaultCellSize
220 for (label iter = 0; iter < maxRefinementIterations; ++iter)
226 CellSizeDelaunay::Finite_cells_iterator cit =
227 mesh.finite_cells_begin();
228 cit !=
mesh.finite_cells_end();
232 const point newPoint =
237 cit->vertex(0)->point(),
238 cit->vertex(1)->point(),
239 cit->vertex(2)->point(),
240 cit->vertex(3)->point()
244 if (geometryToConformTo.
inside(newPoint))
246 ptsToInsert.
append(newPoint);
267 int main(
int argc,
char *argv[])
274 label maxRefinementIterations = 2;
275 label maxSmoothingIterations = 200;
276 scalar minResidual = 0;
277 scalar defaultCellSize = 0.001;
278 scalar nearFeatDistSqrCoeff = 1
e-8;
306 "cvSearchableSurfaces",
313 foamyHexMeshDict.subDict(
"geometry"),
314 foamyHexMeshDict.getOrDefault(
"singleRegionName",
true)
322 foamyHexMeshDict.subDict(
"surfaceConformation")
335 foamyHexMeshDict.subDict(
"backgroundMeshDecomposition")
351 const label surfI = geometryToConformTo.
surfaces()[sI];
354 geometryToConformTo.
geometry()[surfI];
356 Info<<
nl <<
"Inserting points from surface " << surface.
name()
357 <<
" (" << surface.type() <<
")" <<
endl;
375 nearFeatDistSqrCoeff,
386 geometryToConformTo.
features()[infoFeature];
394 pointAlignment() += norms[nI];
397 pointAlignment().normalize();
398 pointAlignment().orthogonalize();
405 nearFeatDistSqrCoeff,
413 geometryToConformTo.
features()[infoFeature];
421 pointAlignment() += norms[nI];
424 pointAlignment().normalize();
425 pointAlignment().orthogonalize();
438 pointAlignment.
set(
new triad(normals[0]));
446 CellSizeDelaunay::Vertex_handle vh =
mesh.
insert
451 Vb::vtInternalNearBoundary
457 CellSizeDelaunay::Vertex_handle vh =
mesh.
insert
462 Vb::vtInternalNearBoundary
474 maxRefinementIterations,
500 CellSizeDelaunay::Finite_vertices_iterator vit =
501 mesh.finite_vertices_begin();
502 vit !=
mesh.finite_vertices_end();
506 if (vit->nearBoundary())
508 fixedAlignments[vit->index()] = vit->alignment();
514 for (label iter = 0; iter < maxSmoothingIterations; iter++)
516 Info<<
"Iteration " << iter;
518 meshDistributor().distribute(
points);
519 meshDistributor().distribute(alignments);
527 const labelList& pPoints = pointPoints[pI];
534 const triad& oldTriad = alignments[pI];
535 triad& newTriad = triadAv[pI];
538 const triad& fixedAlignment = fixedAlignments[pI];
540 forAll(pPoints, adjPointi)
542 const label adjPointIndex = pPoints[adjPointi];
548 triad tmpTriad = alignments[adjPointIndex];
552 if (tmpTriad.
set(dir))
554 tmpTriad[dir] *= (1.0/dist);
558 newTriad += tmpTriad;
567 forAll(fixedAlignment, dirI)
569 if (fixedAlignment.
set(dirI))
577 forAll(fixedAlignment, dirI)
579 if (fixedAlignment.
set(dirI))
581 newTriad.
align(fixedAlignment[dirI]);
585 else if (nFixed == 2)
587 forAll(fixedAlignment, dirI)
589 if (fixedAlignment.
set(dirI))
591 newTriad[dirI] = fixedAlignment[dirI];
601 else if (nFixed == 3)
603 forAll(fixedAlignment, dirI)
605 if (fixedAlignment.
set(dirI))
607 newTriad[dirI] = fixedAlignment[dirI];
621 scalar dotProd = (oldTriad[dir] & newTriad[dir]);
622 scalar
diff =
mag(dotProd) - 1.0;
631 alignments[pI] = triadAv[pI].sortxyz();
636 Info<<
", Residual = " << residual <<
endl;
638 if (residual <= minResidual)
650 const triad& tri = alignments[pI];
687 filterFarPoints(
mesh, sizes)
700 filterFarPoints(
mesh, alignments)
705 alignmentsIO.write();
static autoPtr< T > New(Args &&... args)
Construct autoPtr of T with forwarding arguments.
vectorField pointField
pointField is a vectorField.
IOdictionary is derived from dictionary and IOobject to give the dictionary automatic IO functionalit...
Defines the attributes of an object for which implicit objectRegistry management is supported,...
label index() const
Return index.
const labelListList & featurePointNormals() const
Return the indices of the normals that are adjacent to the.
const word & name() const
Return name.
A primitive field of type <T> with automated input and output.
T returnReduce(const T &Value, const BinaryOp &bop, const int tag=Pstream::msgType(), const label comm=UPstream::worldComm)
virtual void getNormal(const List< pointIndexHit > &, vectorField &normal) const =0
From a set of points and indices get the normal.
A class for managing temporary objects.
static bool & parRun()
Is this a parallel run?
bool hit() const
Is there a hit.
bool insert(const Key &key, const T &obj)
Copy insert a new entry, not overwriting existing entries.
void normalize()
Normalize each set axis vector to have a unit magnitude.
Ostream & endl(Ostream &os)
Add newline and flush stream.
Field< triad > triadField
Specialisation of Field<T> for triad.
pointFromPoint topoint(const Point &P)
#define forAll(list, i)
Loop across all elements in list.
scalar diff(const triad &A, const triad &B)
Return a quantity of the difference between two triads.
Ostream & printExecutionTime(OSstream &os) const
Print the elapsed ExecutionTime (cpu-time), ClockTime.
void reduce(const List< UPstream::commsStruct > &comms, T &Value, const BinaryOp &bop, const int tag, const label comm)
This class describes the interaction of (usually) a face and a point. It carries the info of a succes...
void set(T *p) noexcept
Deprecated(2018-02) Identical to reset().
Generic templated field type.
messageStream Info
Information stream (uses stdout - output is on the master only)
virtual tmp< pointField > points() const =0
Get the points that define the surface.
PrimitivePatch< List< face >, const pointField > bMesh
Holder of faceList and points. (v.s. e.g. primitivePatch which references points)
DynamicList< T, SizeMin > & append(const T &val)
Append an element to the end of this list.
Base class of (analytical or triangulated) surface. Encapsulates all the search routines....
void transfer(List< T > &list)
void orthogonalize()
Orthogonalize this triad so that it is ortho-normal.
void T(FieldField< Field, Type > &f1, const FieldField< Field, Type > &f2)
void align(const vector &v)
Align this triad with the given vector v.
const labelListList & edgeNormals() const
Return the indices of the normals that are adjacent to the.
virtual void findNearest(const pointField &sample, const scalarField &nearestDistSqr, List< pointIndexHit > &) const =0
Calculates a unique integer (label so might not have enough room - 2G max) for processor + local inde...
Output to file stream, using an OSstream.
static int myProcNo(const label communicator=0)
Number of this process (starting from masterNo() = 0)
Representation of a 3D Cartesian coordinate system as a Vector of row vectors.
Pointer management similar to std::unique_ptr, with some additional methods and type checking.
const word & system() const
Return system name.
PointIndexHit< point > pointIndexHit
Ostream & printInfo(Ostream &os) const
Print information.
fileName path() const
Return path.
unsigned int count(const UList< bool > &bools, const bool val=true)
Count number of 'true' entries.
Container for searchableSurfaces. The collection is specified as a dictionary. For example,...
dimensioned< typename typeOfMag< Type >::type > mag(const dimensioned< Type > &dt)
Store a background polyMesh to use for the decomposition of space and queries for parallel conformalV...
const dimensionedScalar e
Elementary charge.
vector point
Point is a vector.
void setSize(const label newSize)
Alias for resize(const label)
const word & constant() const
Return constant name.
bool set(const direction d) const
Is the vector in the direction d set.
A list of faces which address into the list of points.