40 const Foam::scalar Foam::twoDPointCorrector::edgeOrthogonalityTol = 1.0 - 1e-4;
45 void Foam::twoDPointCorrector::calcAddressing()
const 48 planeNormalPtr_ =
new vector(0, 0, 0);
49 vector& pn = *planeNormalPtr_;
58 const polyBoundaryMesh& patches = mesh_.boundaryMesh();
62 if (isA<wedgePolyPatch>(patches[patchi]))
66 const wedgePolyPatch& wp =
67 refCast<const wedgePolyPatch>(patches[
patchi]);
69 pn = wp.centreNormal();
71 wedgeAxis_ = wp.axis();
72 wedgeAngle_ =
mag(
acos(wp.cosAngle()));
76 Pout<<
"Found normal from wedge patch " <<
patchi;
88 if (isA<emptyPolyPatch>(patches[patchi]) && patches[patchi].size())
90 pn = patches[
patchi].faceAreas()[0];
94 Pout<<
"Found normal from empty patch " <<
patchi;
103 if (
mag(pn) < vSmall)
106 <<
"Cannot determine normal vector from patches." 116 Pout<<
" twoDPointCorrector normal: " << pn <<
endl;
120 normalEdgeIndicesPtr_ =
new labelList(mesh_.nEdges());
121 labelList& neIndices = *normalEdgeIndicesPtr_;
123 const edgeList& meshEdges = mesh_.edges();
125 const pointField& meshPoints = mesh_.points();
127 label nNormalEdges = 0;
131 const edge& e = meshEdges[edgeI];
133 vector edgeVector = e.vec(meshPoints)/(e.mag(meshPoints) + vSmall);
135 if (
mag(edgeVector & pn) > edgeOrthogonalityTol)
138 neIndices[nNormalEdges++] = edgeI;
142 neIndices.setSize(nNormalEdges);
149 if (meshPoints.size() % 2 != 0)
152 <<
"the number of vertices in the geometry " 153 <<
"is odd - this should not be the case for a 2-D case. " 154 <<
"Please check the geometry." 158 if (2*nNormalEdges != meshPoints.size())
161 <<
"The number of points in the mesh is " 162 <<
"not equal to twice the number of edges normal to the plane " 163 <<
"- this may be OK only for wedge geometries.\n" 164 <<
" Please check the geometry or adjust " 165 <<
"the orthogonality tolerance.\n" <<
endl 166 <<
"Number of normal edges: " << nNormalEdges
167 <<
" number of points: " << meshPoints.size()
174 void Foam::twoDPointCorrector::clearAddressing()
const 181 void Foam::twoDPointCorrector::snapToWedge
188 scalar ADash =
mag(A - wedgeAxis_*(wedgeAxis_ & A));
189 vector pDash = ADash*
tan(wedgeAngle_)*planeNormal();
191 p = A +
sign(n & p)*pDash;
200 required_(mesh_.nGeometricD() == 2),
201 planeNormalPtr_(nullptr),
202 normalEdgeIndicesPtr_(nullptr),
224 if (
mag(pn.
x()) >= edgeOrthogonalityTol)
228 else if (
mag(pn.
y()) >= edgeOrthogonalityTol)
232 else if (
mag(pn.
z()) >= edgeOrthogonalityTol)
239 <<
"Plane normal not aligned with the coordinate system" <<
nl 250 if (!planeNormalPtr_)
255 return *planeNormalPtr_;
261 if (!normalEdgeIndicesPtr_)
266 return *normalEdgeIndicesPtr_;
272 if (!required_)
return;
287 point& pStart = p[meshEdges[neIndices[edgeI]].start()];
289 point& pEnd = p[meshEdges[neIndices[edgeI]].
end()];
292 point A = 0.5*(pStart + pEnd);
297 snapToWedge(pn, A, pStart);
298 snapToWedge(pn, A, pEnd);
303 pStart = A + pn*(pn & (pStart - A));
304 pEnd = A + pn*(pn & (pEnd - A));
316 if (!required_)
return;
331 const edge& e = meshEdges[neIndices[edgeI]];
334 point pStart = p[startPointi] + disp[startPointi];
337 point pEnd = p[endPointi] + disp[endPointi];
340 point A = 0.5*(pStart + pEnd);
345 snapToWedge(pn, A, pStart);
346 snapToWedge(pn, A, pEnd);
347 disp[startPointi] = pStart - p[startPointi];
348 disp[endPointi] = pEnd - p[endPointi];
353 disp[startPointi] = (A + pn*(pn & (pStart - A))) - p[startPointi];
354 disp[endPointi] = (A + pn*(pn & (pEnd - A))) - p[endPointi];
dimensionedScalar sign(const dimensionedScalar &ds)
dimensionedScalar acos(const dimensionedScalar &ds)
#define forAll(list, i)
Loop across all elements in list.
Class containing mesh-to-mesh mapping information after a mesh distribution where we send parts of me...
FvWallInfoData< WallInfo, label > label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
const labelList & normalEdgeIndices() const
Return indices of normal edges.
Ostream & endl(Ostream &os)
Add newline and flush stream.
virtual void distribute(const polyDistributionMap &)
Redistribute or update using the given distribution map.
Vector< scalar > vector
A scalar version of the templated Vector.
iterator end()
Return an iterator to end traversing the UList.
twoDPointCorrector(const polyMesh &mesh)
Construct from components.
void correctPoints(pointField &p) const
Correct motion points.
Templated abstract base-class for optional mesh objects used to automate their allocation to the mesh...
void correctDisplacement(const pointField &p, vectorField &disp) const
Correct motion displacements.
vectorField pointField
pointField is a vectorField.
An edge is a list of two point labels. The functionality it provides supports the discretisation on a...
Class applies a two-dimensional correction to mesh motion point field.
Class containing mesh-to-mesh mapping information after a change in polyMesh topology.
virtual void topoChange(const polyTopoChangeMap &)
Update topology.
List< label > labelList
A List of labels.
errorManip< error > abort(error &err)
const vector & planeNormal() const
Return plane normal.
defineTypeNameAndDebug(combustionModel, 0)
const edgeList & edges() const
Return mesh edges. Uses calcEdges.
vector point
Point is a vector.
#define WarningInFunction
Report a warning using Foam::Warning.
virtual bool movePoints()
Correct weighting factors for moving mesh.
label end() const
Return end vertex label.
prefixOSstream Pout(cout, "Pout")
direction normalDir() const
Return direction normal to plane.
virtual void mapMesh(const polyMeshMap &)
Update from another mesh using the given map.
dimensioned< scalar > mag(const dimensioned< Type > &)
Mesh consisting of general polyhedral cells.
~twoDPointCorrector()
Destructor.
Class containing mesh-to-mesh mapping information.
dimensionedScalar tan(const dimensionedScalar &ds)
void deleteDemandDrivenData(DataPtr &dataPtr)
label start() const
Return start vertex label.