Go to the documentation of this file.
55 Foam::label Foam::cyclicPolyPatch::findMaxArea
62 scalar maxAreaSqr = -GREAT;
66 scalar areaSqr =
magSqr(faces[facei].areaNormal(
points));
68 if (maxAreaSqr < areaSqr)
87 half0Areas[facei] = half0[facei].areaNormal(half0.
points());
95 half1Areas[facei] = half1[facei].areaNormal(half1.
points());
119 if (
debug && owner())
124 Pout<<
"cyclicPolyPatch::calcTransforms : Writing " <<
name()
125 <<
" faces to OBJ file " << nm0 <<
endl;
128 const cyclicPolyPatch& half1 = neighbPatch();
130 fileName nm1(casePath/half1.name()+
"_faces.obj");
131 Pout<<
"cyclicPolyPatch::calcTransforms : Writing " << half1.
name()
132 <<
" faces to OBJ file " << nm1 <<
endl;
133 writeOBJ(nm1, half1, half1.points());
136 OFstream str(casePath/
name()+
"_to_" + half1.name() +
".obj");
138 Pout<<
"cyclicPolyPatch::calcTransforms :"
139 <<
" Writing coupled face centres as lines to " << str.
name()
143 const point&
p0 = half0Ctrs[i];
144 str <<
"v " <<
p0.x() <<
' ' <<
p0.y() <<
' ' <<
p0.z() <<
nl;
146 const point& p1 = half1Ctrs[i];
147 str <<
"v " << p1.x() <<
' ' << p1.y() <<
' ' << p1.z() <<
nl;
149 str <<
"l " << vertI-1 <<
' ' << vertI <<
nl;
157 if (half0Ctrs.size() != half1Ctrs.size())
160 <<
"For patch " <<
name()
161 <<
" there are " << half0Ctrs.size()
162 <<
" face centres, for the neighbour patch " << neighbPatch().name()
163 <<
" there are " << half1Ctrs.size()
170 <<
"Patch " <<
name()
171 <<
" has transform type " << transformTypeNames[
transform()]
172 <<
", neighbour patch " << neighbPatchName()
173 <<
" has transform type "
174 << neighbPatch().transformTypeNames[neighbPatch().transform()]
181 if (half0Ctrs.size() > 0)
186 scalar maxAreaDiff = -GREAT;
187 label maxAreaFacei = -1;
191 scalar magSf =
mag(half0Areas[facei]);
192 scalar nbrMagSf =
mag(half1Areas[facei]);
193 scalar avSf = (magSf + nbrMagSf)/2.0;
195 if (magSf < ROOTVSMALL && nbrMagSf < ROOTVSMALL)
200 half0Normals[facei] =
point(1, 0, 0);
201 half1Normals[facei] = half0Normals[facei];
205 scalar areaDiff =
mag(magSf - nbrMagSf)/avSf;
207 if (areaDiff > maxAreaDiff)
209 maxAreaDiff = areaDiff;
210 maxAreaFacei = facei;
213 if (areaDiff > matchTolerance())
217 <<
" area does not match neighbour by "
219 <<
"% -- possible face ordering problem." <<
endl
220 <<
"patch:" <<
name()
221 <<
" my area:" << magSf
222 <<
" neighbour area:" << nbrMagSf
223 <<
" matching tolerance:" << matchTolerance()
225 <<
"Mesh face:" << start()+facei
226 <<
" fc:" << half0Ctrs[facei]
228 <<
"Neighbour fc:" << half1Ctrs[facei]
230 <<
"If you are certain your matching is correct"
231 <<
" you can increase the 'matchTolerance' setting"
232 <<
" in the patch dictionary in the boundary file."
234 <<
"Rerun with cyclic debug flag set"
239 half0Normals[facei] = half0Areas[facei] / magSf;
240 half1Normals[facei] = half1Areas[facei] / nbrMagSf;
249 Pout<<
"cyclicPolyPatch::calcTransforms :"
250 <<
" patch:" <<
name()
251 <<
" Max area error:" << 100*maxAreaDiff <<
"% at face:"
252 << maxAreaFacei <<
" at:" << half0Ctrs[maxAreaFacei]
253 <<
" coupled face at:" << half1Ctrs[maxAreaFacei]
264 vector n0 = findFaceMaxRadius(half0Ctrs);
265 vector n1 = -findFaceMaxRadius(half1Ctrs);
271 Pout<<
"cyclicPolyPatch::calcTransforms :"
272 <<
" patch:" <<
name()
273 <<
" Specified rotation :"
274 <<
" n0:" << n0 <<
" n1:" << n1
284 (n0 ^ rotationAxis_),
290 (-n1 ^ rotationAxis_),
293 const tensor revT(E1.T() & E0);
329 Pout<<
"cyclicPolyPatch::calcTransforms :"
330 <<
" patch:" <<
name()
331 <<
" Specified separation vector : "
332 << separationVector_ <<
endl;
336 const scalar avgTol =
average(half0Tols);
339 mag(separationVector_ + neighbPatch().separationVector_)
344 <<
"Specified separation vector " << separationVector_
345 <<
" differs by that of neighbouring patch "
346 << neighbPatch().separationVector_
347 <<
" by more than tolerance " << avgTol <<
endl
348 <<
"patch:" <<
name()
349 <<
" neighbour:" << neighbPatchName()
357 separation().size() != 1
358 ||
mag(separation()[0] - separationVector_) > avgTol
362 <<
"Specified separationVector " << separationVector_
363 <<
" differs from computed separation vector "
364 << separation() <<
endl
365 <<
"This probably means your geometry is not consistent"
366 <<
" with the specified separation and might lead"
367 <<
" to problems." <<
endl
368 <<
"Continuing with specified separation vector "
369 << separationVector_ <<
endl
370 <<
"patch:" <<
name()
371 <<
" neighbour:" << neighbPatchName()
390 void Foam::cyclicPolyPatch::getCentresAndAnchors
402 half0Ctrs = pp0.faceCentres();
403 anchors0 = getAnchorPoints(pp0, pp0.points(),
transform());
404 half1Ctrs = pp1.faceCentres();
408 Pout<<
"cyclicPolyPatch::getCentresAndAnchors :"
409 <<
" patch:" <<
name() <<
nl
410 <<
"half0 untransformed faceCentres (avg) : "
412 <<
"half1 untransformed faceCentres (avg) : "
416 if (half0Ctrs.size())
422 vector n0 = findFaceMaxRadius(half0Ctrs);
423 vector n1 = -findFaceMaxRadius(half1Ctrs);
429 Pout<<
"cyclicPolyPatch::getCentresAndAnchors :"
430 <<
" patch:" <<
name()
431 <<
" Specified rotation :"
432 <<
" n0:" << n0 <<
" n1:" << n1
443 (n0 ^ rotationAxis_),
449 (-n1 ^ rotationAxis_),
452 const tensor revT(E1.T() & E0);
461 half0Ctrs[facei] - rotationCentre_
468 anchors0[facei] - rotationCentre_
481 Pout<<
"cyclicPolyPatch::getCentresAndAnchors :"
482 <<
" patch:" <<
name()
483 <<
"Specified translation : " << separationVector_
490 half0Ctrs -= separationVector_;
491 anchors0 -= separationVector_;
501 label max0I = findMaxArea(pp0.points(), pp0);
502 const vector n0 = pp0[max0I].unitNormal(pp0.points());
504 label max1I = findMaxArea(pp1.points(), pp1);
505 const vector n1 = pp1[max1I].unitNormal(pp1.points());
507 if (
mag(n0 & n1) < 1-matchTolerance())
511 Pout<<
"cyclicPolyPatch::getCentresAndAnchors :"
512 <<
" patch:" <<
name()
513 <<
" Detected rotation :"
514 <<
" n0:" << n0 <<
" n1:" << n1 <<
endl;
539 const point ctr0(
sum(pp0.localPoints())/pp0.nPoints());
540 const point ctr1(
sum(pp1.localPoints())/pp1.nPoints());
544 Pout<<
"cyclicPolyPatch::getCentresAndAnchors :"
545 <<
" patch:" <<
name()
546 <<
" Detected translation :"
547 <<
" n0:" << n0 <<
" n1:" << n1
548 <<
" ctr0:" << ctr0 <<
" ctr1:" << ctr1 <<
endl;
551 half0Ctrs += ctr1 - ctr0;
552 anchors0 += ctr1 - ctr0;
560 tols = matchTolerance()*calcFaceTol(pp1, pp1.points(), half1Ctrs);
571 const vectorField n((faceCentres - rotationCentre_) ^ rotationAxis_);
575 label facei =
findMax(magRadSqr);
579 Info<<
"findFaceMaxRadius(const pointField&) : patch: " <<
name() <<
nl
580 <<
" rotFace = " << facei <<
nl
581 <<
" point = " << faceCentres[facei] <<
nl
582 <<
" distance = " <<
Foam::sqrt(magRadSqr[facei])
599 const word& patchType,
607 rotationCentre_(
Zero),
608 separationVector_(
Zero),
609 coupledPointsPtr_(
nullptr),
610 coupledEdgesPtr_(
nullptr)
624 const word& neighbPatchName,
626 const vector& rotationAxis,
627 const point& rotationCentre,
628 const vector& separationVector
632 neighbPatchName_(neighbPatchName),
634 rotationAxis_(rotationAxis),
635 rotationCentre_(rotationCentre),
636 separationVector_(separationVector),
637 coupledPointsPtr_(
nullptr),
638 coupledEdgesPtr_(
nullptr)
651 const word& patchType
659 rotationCentre_(
Zero),
660 separationVector_(
Zero),
661 coupledPointsPtr_(
nullptr),
662 coupledEdgesPtr_(
nullptr)
667 <<
"No \"neighbourPatch\" provided." <<
endl
668 <<
"Is your mesh uptodate with split cyclics?" <<
endl
669 <<
"Run foamUpgradeCyclics to convert mesh and fields"
673 if (neighbPatchName_ ==
name)
676 <<
"Neighbour patch name " << neighbPatchName_
677 <<
" cannot be the same as this patch " <<
name
688 scalar magRot =
mag(rotationAxis_);
692 <<
"Illegal rotationAxis " << rotationAxis_ <<
endl
693 <<
"Please supply a non-zero vector."
696 rotationAxis_ /= magRot;
723 neighbPatchName_(pp.neighbPatchName_),
724 coupleGroup_(pp.coupleGroup_),
726 rotationAxis_(pp.rotationAxis_),
727 rotationCentre_(pp.rotationCentre_),
728 separationVector_(pp.separationVector_),
729 coupledPointsPtr_(
nullptr),
730 coupledEdgesPtr_(
nullptr)
743 const label newStart,
744 const word& neighbName
748 neighbPatchName_(neighbName),
749 coupleGroup_(pp.coupleGroup_),
751 rotationAxis_(pp.rotationAxis_),
752 rotationCentre_(pp.rotationCentre_),
753 separationVector_(pp.separationVector_),
754 coupledPointsPtr_(
nullptr),
755 coupledEdgesPtr_(
nullptr)
757 if (neighbName ==
name())
760 <<
"Neighbour patch name " << neighbName
761 <<
" cannot be the same as this patch " <<
name()
780 neighbPatchName_(pp.neighbPatchName_),
781 coupleGroup_(pp.coupleGroup_),
783 rotationAxis_(pp.rotationAxis_),
784 rotationCentre_(pp.rotationCentre_),
785 separationVector_(pp.separationVector_),
786 coupledPointsPtr_(
nullptr),
787 coupledEdgesPtr_(
nullptr)
804 if (neighbPatchName_.empty())
807 label
patchID = coupleGroup_.findOtherPatchID(*
this);
811 return neighbPatchName_;
817 if (neighbPatchID_ == -1)
819 neighbPatchID_ = this->
boundaryMesh().findPatchID(neighbPatchName());
821 if (neighbPatchID_ == -1)
824 <<
"Illegal neighbourPatch name " << neighbPatchName()
825 <<
endl <<
"Valid patch names are "
839 <<
"Patch " <<
name()
840 <<
" specifies neighbour patch " << neighbPatchName()
841 <<
endl <<
" but that in return specifies "
846 return neighbPatchID_;
865 else if (separated())
892 forwardT().size() == 1
906 else if (separated())
910 separation().size() == 1
912 : separation()[facei]
966 neighbPatch().faceCentres(),
967 neighbPatch().faceAreas(),
968 neighbPatch().faceCellCentres()
1010 if (!coupledPointsPtr_)
1012 const faceList& nbrLocalFaces = neighbPatch().localFaces();
1013 const labelList& nbrMeshPoints = neighbPatch().meshPoints();
1022 forAll(*
this, patchFacei)
1024 const face& fA = localFaces()[patchFacei];
1025 const face& fB = nbrLocalFaces[patchFacei];
1029 label patchPointA = fA[indexA];
1031 if (coupledPoint[patchPointA] == -1)
1033 label indexB = (fB.size() - indexA) % fB.size();
1036 if (meshPoints()[patchPointA] != nbrMeshPoints[fB[indexB]])
1038 coupledPoint[patchPointA] = fB[indexB];
1045 edgeList& connected = *coupledPointsPtr_;
1048 label connectedI = 0;
1052 if (coupledPoint[i] != -1)
1054 connected[connectedI++] =
edge(i, coupledPoint[i]);
1058 connected.
setSize(connectedI);
1065 /
name() +
"_coupledPoints.obj"
1069 Pout<<
"Writing file " << str.
name() <<
" with coordinates of "
1070 <<
"coupled points" <<
endl;
1074 const point& a =
points()[meshPoints()[connected[i][0]]];
1075 const point&
b =
points()[nbrMeshPoints[connected[i][1]]];
1077 str<<
"v " << a.
x() <<
' ' << a.
y() <<
' ' << a.
z() <<
nl;
1078 str<<
"v " <<
b.x() <<
' ' <<
b.y() <<
' ' <<
b.z() <<
nl;
1081 str<<
"l " << vertI-1 <<
' ' << vertI <<
nl;
1085 return *coupledPointsPtr_;
1091 if (!coupledEdgesPtr_)
1093 const edgeList& pointCouples = coupledPoints();
1098 for (
const edge&
e : pointCouples)
1100 aToB.insert(
e[0],
e[1]);
1106 forAll(*
this, patchFacei)
1108 const labelList& fEdges = faceEdges()[patchFacei];
1110 for (
const label edgeI : fEdges)
1112 const edge&
e = edges()[edgeI];
1115 const auto fnd0 = aToB.cfind(
e[0]);
1118 const auto fnd1 = aToB.cfind(
e[1]);
1135 edgeList& coupledEdges = *coupledEdgesPtr_;
1138 forAll(neighbPatch, patchFacei)
1142 for (
const label edgeI : fEdges)
1147 auto iter = edgeMap.
find(
e);
1151 const label edgeA = iter.val();
1152 const edge& eA = edges()[edgeA];
1158 !=
edge(nbrMp[
e[0]], nbrMp[
e[1]])
1161 coupledEdges[coupleI++] =
edge(edgeA, edgeI);
1165 edgeMap.
erase(iter);
1169 coupledEdges.setSize(coupleI);
1176 const edge&
e = coupledEdges[i];
1178 if (
e[0] < 0 ||
e[1] < 0)
1181 <<
"Problem : at position " << i
1182 <<
" illegal couple:" <<
e
1192 /
name() +
"_coupledEdges.obj"
1196 Pout<<
"Writing file " << str.
name() <<
" with centres of "
1197 <<
"coupled edges" <<
endl;
1199 for (
const edge&
e : coupledEdges)
1207 str<<
"v " << a.
x() <<
' ' << a.
y() <<
' ' << a.
z() <<
nl;
1208 str<<
"v " <<
b.x() <<
' ' <<
b.y() <<
' ' <<
b.z() <<
nl;
1211 str<<
"l " << vertI-1 <<
' ' << vertI <<
nl;
1215 return *coupledEdgesPtr_;
1229 ownerPatchPtr_.reset
1251 Pout<<
"order : of " << pp.size()
1252 <<
" faces of patch:" <<
name()
1253 <<
" neighbour:" << neighbPatchName()
1274 faceMap[patchFacei] = patchFacei;
1287 getCentresAndAnchors
1300 Pout<<
"half0 transformed faceCentres (avg) : "
1302 <<
"half1 untransformed faceCentres (avg) : "
1316 if (!matchedAll ||
debug)
1322 /neighbPatch().
name()+
"_faces.obj"
1324 Pout<<
"cyclicPolyPatch::order : Writing neighbour"
1325 <<
" faces to OBJ file " << nm0 <<
endl;
1331 /
name()+
"_faces.obj"
1333 Pout<<
"cyclicPolyPatch::order : Writing my"
1334 <<
" faces to OBJ file " << nm1 <<
endl;
1340 /
name() +
"_faceCentres.obj"
1342 Pout<<
"cyclicPolyPatch::order : "
1343 <<
"Dumping currently found cyclic match as lines between"
1344 <<
" corresponding face centres to file " << ccStr.
name()
1358 const point&
c1 = half1Ctrs[i];
1367 <<
"Patch:" <<
name() <<
" : "
1368 <<
"Cannot match vectors to faces on both sides of patch"
1370 <<
" Perhaps your faces do not match?"
1371 <<
" The obj files written contain the current match." <<
endl
1372 <<
" Continuing with incorrect face ordering from now on!"
1386 label newFacei =
faceMap[oldFacei];
1388 const point& wantedAnchor = anchors0[newFacei];
1390 rotation[newFacei] = getRotation
1398 if (rotation[newFacei] == -1)
1401 <<
"in patch " <<
name()
1403 <<
"Cannot find point on face " << pp[oldFacei]
1404 <<
" with vertices "
1406 <<
" that matches point " << wantedAnchor
1407 <<
" when matching the halves of processor patch " <<
name()
1408 <<
"Continuing with incorrect face ordering from now on!"
1415 ownerPatchPtr_.clear();
1421 if (
faceMap[facei] != facei || rotation[facei] != 0)
1435 if (!neighbPatchName_.empty())
1437 os.
writeEntry(
"neighbourPatch", neighbPatchName_);
1439 coupleGroup_.
write(os);
1444 os.
writeEntry(
"rotationAxis", rotationAxis_);
1445 os.
writeEntry(
"rotationCentre", rotationCentre_);
1450 os.
writeEntry(
"separationVector", separationVector_);
int debug
Static debugging option.
addToRunTimeSelectionTable(decompositionMethod, kahipDecomp, dictionary)
vectorField pointField
pointField is a vectorField.
label size() const noexcept
The number of elements in table.
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
points setSize(newPointi)
const dimensionedScalar mp
Proton mass.
const Cmpt & x() const
Access to the vector x component.
Pair< int > faceMap(const label facePi, const face &faceP, const label faceNi, const face &faceN)
virtual void updateMesh(PstreamBuffers &)
Update of the patch topology.
virtual void initMovePoints(PstreamBuffers &, const pointField &)
Initialise the patches for moving points.
List< edge > edgeList
A List of edges.
A class for handling words, derived from Foam::string.
A class for handling file names.
gmvFile<< "tracers "<< particles.size()<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().x()<< " ";}gmvFile<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().y()<< " ";}gmvFile<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().z()<< " ";}gmvFile<< nl;forAll(lagrangianScalarNames, i){ word name=lagrangianScalarNames[i];IOField< scalar > s(IOobject(name, runTime.timeName(), cloud::prefix, mesh, IOobject::MUST_READ, IOobject::NO_WRITE))
virtual void movePoints(PstreamBuffers &, const pointField &p)
Correct patches after moving points.
A polyBoundaryMesh is a polyPatch list with additional search methods and registered IO.
const edgeList & edges() const
Return list of edges, address into LOCAL point list.
virtual const fileName & name() const
Read/write access to the name of the stream.
static constexpr const zero Zero
Global zero (0)
Type gAverage(const FieldField< Field, Type > &f)
virtual void initGeometry(PstreamBuffers &)
Initialise the calculation of the patch geometry.
virtual bool order(PstreamBuffers &, const primitivePatch &, labelList &faceMap, labelList &rotation) const
Return new ordering for primitivePatch.
Template functions to aid in the implementation of demand driven data.
Buffers for inter-processor communications streams (UOPstream, UIPstream).
An edge is a list of two point labels. The functionality it provides supports the discretisation on a...
Field< tensor > tensorField
Specialisation of Field<T> for tensor.
bool insert(const Key &key, const T &obj)
Copy insert a new entry, not overwriting existing entries.
Unit conversion functions.
List< bool > boolList
A List of bools.
virtual void initUpdateMesh(PstreamBuffers &)
Initialise the update of the patch topology.
Ostream & endl(Ostream &os)
Add newline and flush stream.
The coupledPolyPatch is an abstract base class for patches that couple regions of the computational d...
const labelListList & faceEdges() const
Return face-edge addressing.
prefixOSstream Pout
An Ostream wrapper for parallel output to std::cout.
dimensionSet transform(const dimensionSet &ds)
Return the argument; transformations do not change the dimensions.
virtual void updateMesh(PstreamBuffers &)
Update of the patch topology.
const Cmpt & z() const
Access to the vector z component.
#define forAll(list, i)
Loop across all elements in list.
Field< vector > vectorField
Specialisation of Field<T> for vector.
dimensioned< typename typeOfMag< Type >::type > magSqr(const dimensioned< Type > &dt)
const edgeList & coupledPoints() const
Return connected points (from patch local to neighbour patch local)
void deleteDemandDrivenData(DataPtr &dataPtr)
Determine correspondence between points. See below.
virtual void initUpdateMesh(PstreamBuffers &)
Initialise the update of the patch topology.
const dimensionedScalar c1
First radiation constant: default SI units: [W/m2].
const dimensionedScalar b
Wien displacement law constant: default SI units: [m.K].
virtual void initMovePoints(PstreamBuffers &, const pointField &)
Initialise the patches for moving points.
bool erase(const iterator &iter)
Erase an entry specified by given iterator.
messageStream Info
Information stream (uses stdout - output is on the master only)
virtual void calcGeometry(PstreamBuffers &)
Calculate the patch geometry.
word name(const complex &c)
Return string representation of complex.
virtual const fileName & name() const
Return the name of the stream.
const Vector< Cmpt > & centre(const Foam::List< Vector< Cmpt >> &) const
Return *this (used for point which is a typedef to Vector<scalar>.
void T(FieldField< Field, Type > &f1, const FieldField< Field, Type > &f2)
#define SeriousErrorInFunction
Report an error message using Foam::SeriousError.
bool readEntry(const word &keyword, T &val, enum keyType::option matchOpt=keyType::REGEX, bool mandatory=true) const
constexpr scalar radToDeg(const scalar rad) noexcept
Conversion from radians to degrees.
virtual void initGeometry(PstreamBuffers &)
Initialise the calculation of the patch geometry.
virtual void write(Ostream &) const
Write the polyPatch data as a dictionary.
const edgeList & coupledEdges() const
Return connected edges (from patch local to neighbour patch local).
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
static bool valid(char c)
Is this character valid for a word?
virtual void transformPosition(pointField &l) const
Transform a patch-based position from other side to this side.
const Field< point_type > & points() const
Return reference to global points.
Macros for easy insertion into run-time selection tables.
virtual ~cyclicPolyPatch()
Destructor.
virtual bool write(const token &tok)=0
Write token to stream or otherwise handle it.
errorManip< error > abort(error &err)
Vector< scalar > vector
A scalar version of the templated Vector.
iterator find(const Key &key)
Find and return an iterator set at the hashed entry.
errorManipArg< error, int > exit(error &err, const int errNo=1)
const Field< point_type > & localPoints() const
Return pointField of points in patch.
Output to file stream, using an OSstream.
virtual void movePoints(PstreamBuffers &, const pointField &)
Correct patches after moving points.
const Cmpt & y() const
Access to the vector y component.
virtual void initOrder(PstreamBuffers &, const primitivePatch &) const
Initialize ordering for primitivePatch. Does not.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
const vectorField::subField faceCentres() const
Return face centres.
virtual void write(Ostream &) const
Write the polyPatch data as a dictionary.
List< face > faceList
A List of faces.
Templated 3D Vector derived from VectorSpace adding construction from 3 components,...
label findMax(const ListType &input, label start=0)
dimensionedScalar sqrt(const dimensionedScalar &ds)
dimensionedScalar acos(const dimensionedScalar &ds)
dimensioned< typename typeOfMag< Type >::type > mag(const dimensioned< Type > &dt)
const dimensionedScalar e
Elementary charge.
dimensioned< Type > sum(const DimensionedField< Type, GeoMesh > &df)
fileName path(UMean.rootPath()/UMean.caseName()/"graphs"/UMean.instance())
static const word null
An empty word.
virtual void calcTransforms()
Recalculate the transformation tensors.
Ostream & writeEntry(const keyType &key, const T &value)
Write a keyword/value entry.
A List with indirect addressing.
Addressing for all faces on surface of mesh. Can either be read from polyMesh or from triSurface....
PrimitivePatch< SubList< face >, const pointField & > primitivePatch
A PrimitivePatch with a SubList addressing for the faces, const reference for the point field.
A face is a list of labels corresponding to mesh vertices.
#define FatalIOErrorInFunction(ios)
Report an error message using Foam::FatalIOError.
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
const volScalarField & p0
tensor rotationTensor(const vector &n1, const vector &n2)
Rotational transformation tensor from vector n1 to n2.
vector point
Point is a vector.
const labelList & meshPoints() const
Return labelList of mesh points in patch.
void setSize(const label newSize)
Alias for resize(const label)
T getOrDefault(const word &keyword, const T &deflt, enum keyType::option matchOpt=keyType::REGEX) const
defineTypeNameAndDebug(combustionModel, 0)
virtual label neighbPatchID() const
Neighbour patchID.
bool matchPoints(const UList< point > &pts0, const UList< point > &pts1, const UList< scalar > &matchDistance, const bool verbose, labelList &from0To1, const point &origin=point::zero)
Determine correspondence between pointFields. Gets passed.
#define WarningInFunction
Report a warning using Foam::Warning.
const word & neighbPatchName() const
Neighbour patch name.
Tensor< scalar > tensor
Tensor of scalars, i.e. Tensor<scalar>.
dimensioned< Type > average(const DimensionedField< Type, GeoMesh > &df)
A list of faces which address into the list of points.
cyclicPolyPatch(const word &name, const label size, const label start, const label index, const polyBoundaryMesh &bm, const word &patchType, const transformType transform=UNKNOWN)
Construct from components.