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,...
const labelListList & featurePointNormals() const
Return the indices of the normals that are adjacent to the.
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.
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().
bool hit() const noexcept
Is there a hit?
Generic templated field type.
messageStream Info
Information stream (stdout output on master, null elsewhere)
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)
void setSize(const label n)
Alias for resize()
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.
Representation of a 3D Cartesian coordinate system as a Vector of row vectors.
const word & name() const noexcept
Return name.
Pointer management similar to std::unique_ptr, with some additional methods and type checking.
const word & system() const
Return system name.
PointIndexHit< point > pointIndexHit
A PointIndexHit for 3D points.
static int myProcNo(const label communicator=worldComm)
Number of this process (starting from masterNo() = 0)
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.
static bool & parRun() noexcept
Test if this a parallel run.
label index() const noexcept
Return the hit index.
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.
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.