59 scalar maxAreaSqr = -great;
63 scalar areaSqr =
magSqr(faces[facei].area(points));
65 if (areaSqr > maxAreaSqr)
84 half0Areas[facei] = half0[facei].area(half0.
points());
92 half1Areas[facei] = half1[facei].area(half1.
points());
116 if (debug && owner())
121 Pout<<
"cyclicPolyPatch::calcTransforms : Writing " <<
name()
122 <<
" faces to OBJ file " << nm0 <<
endl;
128 Pout<<
"cyclicPolyPatch::calcTransforms : Writing " << half1.
name()
129 <<
" faces to OBJ file " << nm1 <<
endl;
130 writeOBJ(nm1, half1, half1.points());
133 OFstream str(casePath/
name()+
"_to_" + half1.name() +
".obj");
135 Pout<<
"cyclicPolyPatch::calcTransforms :" 136 <<
" Writing coupled face centres as lines to " << str.
name()
140 const point& p0 = half0Ctrs[i];
141 str <<
"v " << p0.
x() <<
' ' << p0.
y() <<
' ' << p0.
z() <<
nl;
143 const point& p1 = half1Ctrs[i];
144 str <<
"v " << p1.
x() <<
' ' << p1.
y() <<
' ' << p1.
z() <<
nl;
146 str <<
"l " << vertI-1 <<
' ' << vertI <<
nl;
154 if (half0Ctrs.
size() != half1Ctrs.
size())
157 <<
"For patch " <<
name()
158 <<
" there are " << half0Ctrs.
size()
159 <<
" face centres, for the neighbour patch " << neighbPatch().name()
160 <<
" there are " << half1Ctrs.
size()
167 <<
"Patch " <<
name()
168 <<
" has transform type " << transformTypeNames[
transform()]
169 <<
", neighbour patch " << neighbPatchName()
170 <<
" has transform type " 171 << neighbPatch().transformTypeNames[neighbPatch().transform()]
178 if (half0Ctrs.
size() > 0)
183 scalar maxAreaDiff = -great;
184 label maxAreaFacei = -1;
188 scalar magSf =
mag(half0Areas[facei]);
189 scalar nbrMagSf =
mag(half1Areas[facei]);
190 scalar avSf = (magSf + nbrMagSf)/2.0;
192 if (magSf < rootVSmall && nbrMagSf < rootVSmall)
197 half0Normals[facei] =
point(1, 0, 0);
198 half1Normals[facei] = half0Normals[facei];
202 scalar areaDiff =
mag(magSf - nbrMagSf)/avSf;
204 if (areaDiff > maxAreaDiff)
206 maxAreaDiff = areaDiff;
207 maxAreaFacei = facei;
210 if (areaDiff > matchTolerance())
214 <<
" area does not match neighbour by " 216 <<
"% -- possible face ordering problem." <<
endl 217 <<
"patch:" <<
name()
218 <<
" my area:" << magSf
219 <<
" neighbour area:" << nbrMagSf
220 <<
" matching tolerance:" << matchTolerance()
222 <<
"Mesh face:" << start()+facei
223 <<
" fc:" << half0Ctrs[facei]
225 <<
"Neighbour fc:" << half1Ctrs[facei]
227 <<
"If you are certain your matching is correct" 228 <<
" you can increase the 'matchTolerance' setting" 229 <<
" in the patch dictionary in the boundary file." 231 <<
"Rerun with cyclic debug flag set" 236 half0Normals[facei] = half0Areas[facei] / magSf;
237 half1Normals[facei] = half1Areas[facei] / nbrMagSf;
246 Pout<<
"cyclicPolyPatch::calcTransforms :" 247 <<
" patch:" <<
name()
248 <<
" Max area error:" << 100*maxAreaDiff <<
"% at face:" 249 << maxAreaFacei <<
" at:" << half0Ctrs[maxAreaFacei]
250 <<
" coupled face at:" << half1Ctrs[maxAreaFacei]
261 vector n0 = findFaceMaxRadius(half0Ctrs);
262 vector n1 = -findFaceMaxRadius(half1Ctrs);
263 n0 /=
mag(n0) + vSmall;
264 n1 /=
mag(n1) + vSmall;
270 Pout<<
"cyclicPolyPatch::calcTransforms :" 271 <<
" patch:" <<
name()
272 <<
" Specified rotation :" 273 <<
" n0:" << n0 <<
" n1:" << n1
274 <<
" swept angle: " << theta <<
" [deg]" 283 (n0 ^ rotationAxis_),
289 (-n1 ^ rotationAxis_),
292 const tensor revT(E1.
T() & E0);
314 static_cast<const pointField&>(half0Ctrs),
315 static_cast<const pointField&>(half1Ctrs),
328 Pout<<
"cyclicPolyPatch::calcTransforms :" 329 <<
" patch:" <<
name()
330 <<
" Specified separation vector : " 331 << separationVector_ <<
endl;
335 const scalar avgTol =
average(half0Tols);
338 mag(separationVector_ + neighbPatch().separationVector_)
343 <<
"Specified separation vector " << separationVector_
344 <<
" differs by that of neighbouring patch " 345 << neighbPatch().separationVector_
346 <<
" by more than tolerance " << avgTol <<
endl 347 <<
"patch:" <<
name()
348 <<
" neighbour:" << neighbPatchName()
356 separation().size() != 1
357 ||
mag(separation()[0] - separationVector_) > avgTol
361 <<
"Specified separationVector " << separationVector_
362 <<
" differs from computed separation vector " 363 << separation() <<
endl 364 <<
"This probably means your geometry is not consistent" 365 <<
" with the specified separation and might lead" 366 <<
" to problems." <<
endl 367 <<
"Continuing with specified separation vector " 368 << separationVector_ <<
endl 369 <<
"patch:" <<
name()
370 <<
" neighbour:" << neighbPatchName()
389 void Foam::cyclicPolyPatch::getCentresAndAnchors
407 Pout<<
"cyclicPolyPatch::getCentresAndAnchors :" 408 <<
" patch:" <<
name() <<
nl 409 <<
"half0 untransformed faceCentres (avg) : " 411 <<
"half1 untransformed faceCentres (avg) : " 415 if (half0Ctrs.
size())
421 vector n0 = findFaceMaxRadius(half0Ctrs);
422 vector n1 = -findFaceMaxRadius(half1Ctrs);
423 n0 /=
mag(n0) + vSmall;
424 n1 /=
mag(n1) + vSmall;
430 Pout<<
"cyclicPolyPatch::getCentresAndAnchors :" 431 <<
" patch:" <<
name()
432 <<
" Specified rotation :" 433 <<
" n0:" << n0 <<
" n1:" << n1
434 <<
" swept angle: " << theta <<
" [deg]" 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 const label max0I = findMaxArea(pp0.
points(), pp0);
504 const label max1I = findMaxArea(pp1.
points(), pp1);
507 if (
mag(n0 & n1) < 1-matchTolerance())
511 Pout<<
"cyclicPolyPatch::getCentresAndAnchors :" 512 <<
" patch:" <<
name()
513 <<
" Detected rotation :" 514 <<
" n0:" << n0 <<
" n1:" << n1 <<
endl;
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_);
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)
669 ) <<
"No \"neighbourPatch\" provided." <<
endl 670 <<
"Is your mesh uptodate with split cyclics?" <<
endl 671 <<
"Run foamUpgradeCyclics to convert mesh and fields" 675 if (neighbPatchName_ == name)
678 <<
"Neighbour patch name " << neighbPatchName_
679 <<
" cannot be the same as this patch " << name
687 dict.
lookup(
"rotationAxis") >> rotationAxis_;
688 dict.
lookup(
"rotationCentre") >> rotationCentre_;
690 scalar magRot =
mag(rotationAxis_);
694 <<
"Illegal rotationAxis " << rotationAxis_ <<
endl 695 <<
"Please supply a non-zero vector." 698 rotationAxis_ /= magRot;
704 dict.
lookup(
"separationVector") >> separationVector_;
725 neighbPatchName_(pp.neighbPatchName_),
726 coupleGroup_(pp.coupleGroup_),
728 rotationAxis_(pp.rotationAxis_),
729 rotationCentre_(pp.rotationCentre_),
730 separationVector_(pp.separationVector_),
731 coupledPointsPtr_(
nullptr),
732 coupledEdgesPtr_(
nullptr)
745 const label newStart,
746 const word& neighbName
750 neighbPatchName_(neighbName),
751 coupleGroup_(pp.coupleGroup_),
753 rotationAxis_(pp.rotationAxis_),
754 rotationCentre_(pp.rotationCentre_),
755 separationVector_(pp.separationVector_),
756 coupledPointsPtr_(
nullptr),
757 coupledEdgesPtr_(
nullptr)
759 if (neighbName ==
name())
762 <<
"Neighbour patch name " << neighbName
763 <<
" cannot be the same as this patch " <<
name()
782 neighbPatchName_(pp.neighbPatchName_),
783 coupleGroup_(pp.coupleGroup_),
785 rotationAxis_(pp.rotationAxis_),
786 rotationCentre_(pp.rotationCentre_),
787 separationVector_(pp.separationVector_),
788 coupledPointsPtr_(
nullptr),
789 coupledEdgesPtr_(
nullptr)
806 if (neighbPatchName_.empty())
809 label patchID = coupleGroup_.findOtherPatchID(*
this);
813 return neighbPatchName_;
819 if (neighbPatchID_ == -1)
821 neighbPatchID_ = this->
boundaryMesh().findPatchID(neighbPatchName());
823 if (neighbPatchID_ == -1)
826 <<
"Illegal neighbourPatch name " << neighbPatchName()
827 <<
endl <<
"Valid patch names are " 841 <<
"Patch " <<
name()
842 <<
" specifies neighbour patch " << neighbPatchName()
843 <<
endl <<
" but that in return specifies " 848 return neighbPatchID_;
867 else if (separated())
894 forwardT().size() == 1
908 else if (separated())
912 separation().size() == 1
914 : separation()[facei]
968 neighbPatch().faceCentres(),
969 neighbPatch().faceAreas(),
970 neighbPatch().faceCellCentres()
1012 if (!coupledPointsPtr_)
1014 const faceList& nbrLocalFaces = neighbPatch().localFaces();
1015 const labelList& nbrMeshPoints = neighbPatch().meshPoints();
1024 forAll(*
this, patchFacei)
1026 const face& fA = localFaces()[patchFacei];
1027 const face& fB = nbrLocalFaces[patchFacei];
1031 label patchPointA = fA[indexA];
1033 if (coupledPoint[patchPointA] == -1)
1038 if (meshPoints()[patchPointA] != nbrMeshPoints[fB[indexB]])
1040 coupledPoint[patchPointA] = fB[indexB];
1047 edgeList& connected = *coupledPointsPtr_;
1050 label connectedI = 0;
1054 if (coupledPoint[i] != -1)
1056 connected[connectedI++] =
edge(i, coupledPoint[i]);
1060 connected.
setSize(connectedI);
1067 /
name() +
"_coupledPoints.obj" 1071 Pout<<
"Writing file " << str.
name() <<
" with coordinates of " 1072 <<
"coupled points" <<
endl;
1076 const point& a =
points()[meshPoints()[connected[i][0]]];
1077 const point&
b =
points()[nbrMeshPoints[connected[i][1]]];
1079 str<<
"v " << a.
x() <<
' ' << a.
y() <<
' ' << a.
z() <<
nl;
1080 str<<
"v " << b.
x() <<
' ' << b.
y() <<
' ' << b.
z() <<
nl;
1083 str<<
"l " << vertI-1 <<
' ' << vertI <<
nl;
1087 return *coupledPointsPtr_;
1093 if (!coupledEdgesPtr_)
1095 const edgeList& pointCouples = coupledPoints();
1102 const edge&
e = pointCouples[i];
1104 aToB.insert(e[0], e[1]);
1110 forAll(*
this, patchFacei)
1112 const labelList& fEdges = faceEdges()[patchFacei];
1116 label edgeI = fEdges[i];
1118 const edge&
e = edges()[edgeI];
1122 if (fnd0 != aToB.
end())
1125 if (fnd1 != aToB.
end())
1142 edgeList& coupledEdges = *coupledEdgesPtr_;
1145 forAll(neighbPatch, patchFacei)
1151 label edgeI = fEdges[i];
1158 if (iter != edgeMap.
end())
1160 label edgeA = iter();
1161 const edge& eA = edges()[edgeA];
1166 edge(mp[eA[0]], mp[eA[1]])
1167 !=
edge(nbrMp[e[0]], nbrMp[e[1]])
1170 coupledEdges[coupleI++] =
edge(edgeA, edgeI);
1174 edgeMap.
erase(iter);
1178 coupledEdges.setSize(coupleI);
1185 const edge&
e = coupledEdges[i];
1187 if (e[0] < 0 || e[1] < 0)
1190 <<
"Problem : at position " << i
1191 <<
" illegal couple:" << e
1201 /
name() +
"_coupledEdges.obj" 1205 Pout<<
"Writing file " << str.
name() <<
" with centres of " 1206 <<
"coupled edges" <<
endl;
1210 const edge&
e = coupledEdges[i];
1212 const point& a = edges()[e[0]].
centre(localPoints());
1218 str<<
"v " << a.
x() <<
' ' << a.
y() <<
' ' << a.
z() <<
nl;
1219 str<<
"v " << b.
x() <<
' ' << b.
y() <<
' ' << b.
z() <<
nl;
1222 str<<
"l " << vertI-1 <<
' ' << vertI <<
nl;
1226 return *coupledEdgesPtr_;
1240 ownerPatchPtr_.reset
1262 Pout<<
"order : of " << pp.size()
1263 <<
" faces of patch:" <<
name()
1264 <<
" neighbour:" << neighbPatchName()
1283 forAll(faceMap, patchFacei)
1285 faceMap[patchFacei] = patchFacei;
1298 getCentresAndAnchors
1311 Pout<<
"half0 transformed faceCentres (avg) : " 1313 <<
"half1 untransformed faceCentres (avg) : " 1327 if (!matchedAll || debug)
1333 /neighbPatch().
name()+
"_faces.obj" 1335 Pout<<
"cyclicPolyPatch::order : Writing neighbour" 1336 <<
" faces to OBJ file " << nm0 <<
endl;
1342 /
name()+
"_faces.obj" 1344 Pout<<
"cyclicPolyPatch::order : Writing my" 1345 <<
" faces to OBJ file " << nm1 <<
endl;
1351 /
name() +
"_faceCentres.obj" 1353 Pout<<
"cyclicPolyPatch::order : " 1354 <<
"Dumping currently found cyclic match as lines between" 1355 <<
" corresponding face centres to file " << ccStr.
name()
1365 if (faceMap[i] != -1)
1368 const point& c0 = half0Ctrs[faceMap[i]];
1369 const point&
c1 = half1Ctrs[i];
1378 <<
"Patch:" <<
name() <<
" : " 1379 <<
"Cannot match vectors to faces on both sides of patch" 1381 <<
" Perhaps your faces do not match?" 1382 <<
" The obj files written contain the current match." <<
endl 1383 <<
" Continuing with incorrect face ordering from now on!" 1391 forAll(faceMap, oldFacei)
1397 label newFacei = faceMap[oldFacei];
1399 const point& wantedAnchor = anchors0[newFacei];
1401 rotation[newFacei] = getRotation
1409 if (rotation[newFacei] == -1)
1412 <<
"in patch " <<
name()
1414 <<
"Cannot find point on face " << pp[oldFacei]
1415 <<
" with vertices " 1417 <<
" that matches point " << wantedAnchor
1418 <<
" when matching the halves of processor patch " <<
name()
1419 <<
"Continuing with incorrect face ordering from now on!" 1426 ownerPatchPtr_.clear();
1432 if (faceMap[facei] != facei || rotation[facei] != 0)
1446 if (!neighbPatchName_.empty())
1451 coupleGroup_.write(os);
1464 os.
writeKeyword(
"separationVector") << separationVector_
virtual void initGeometry(PstreamBuffers &)
Initialise the calculation of the patch geometry.
virtual void write(Ostream &) const
Write the polyPatch data as a dictionary.
virtual const fileName & name() const
Return the name of the stream.
label nPoints() const
Return number of points supporting patch faces.
static bool valid(char)
Is this character valid for a word.
dimensionedScalar acos(const dimensionedScalar &ds)
#define forAll(list, i)
Loop across all elements in list.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
scalar radToDeg(const scalar rad)
Conversion from radians to degrees.
A class for handling file names.
errorManipArg< error, int > exit(error &err, const int errNo=1)
const edgeList & coupledPoints() const
Return connected points (from patch local to neighbour patch local)
static iteratorEnd end()
iteratorEnd set to beyond the end of any HashTable
A face is a list of labels corresponding to mesh vertices.
A list of keyword definitions, which are a keyword followed by any number of values (e...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
virtual void initUpdateMesh(PstreamBuffers &)
Initialise the update of the patch topology.
Unit conversion functions.
void size(const label)
Override size to be inconsistent with allocated storage.
Tensor< Cmpt > T() const
Return transpose.
virtual void calcGeometry(PstreamBuffers &)
Calculate the patch geometry.
Addressing for all faces on surface of mesh. Can either be read from polyMesh or from triSurface...
dimensionedScalar sqrt(const dimensionedScalar &ds)
Ostream & endl(Ostream &os)
Add newline and flush stream.
virtual void updateMesh(PstreamBuffers &)
Update of the patch topology.
virtual void initMovePoints(PstreamBuffers &, const pointField &)
Initialise the patches for moving 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.
const Field< PointType > & faceCentres() const
Return face centres for patch.
The coupledPolyPatch is an abstract base class for patches that couple regions of the computational d...
tensor rotationTensor(const vector &n1, const vector &n2)
Rotational transformation tensor from vector n1 to n2.
virtual void initMovePoints(PstreamBuffers &, const pointField &)
Initialise the patches for moving points.
const edgeList & coupledEdges() const
Return connected edges (from patch local to neighbour patch local).
const fileName & name() const
Return the name of the stream.
virtual bool order(PstreamBuffers &, const primitivePatch &, labelList &faceMap, labelList &rotation) const
Return new ordering for primitivePatch.
label size() const
Return number of elements in table.
Determine correspondence between points. See below.
Macros for easy insertion into run-time selection tables.
const labelList & meshPoints() const
Return labelList of mesh points in patch. They are constructed.
dimensioned< Type > sum(const DimensionedField< Type, GeoMesh > &df)
bool erase(const iterator &)
Erase a hashedEntry specified by given iterator.
virtual void movePoints(PstreamBuffers &, const pointField &p)
Correct patches after moving points.
#define SeriousErrorInFunction
Report an error message using Foam::SeriousError.
List< bool > boolList
Bool container classes.
bool insert(const Key &, const T &newElmt)
Insert a new hashedEntry.
iterator find(const Key &)
Find and return an iterator set at the hashedEntry.
virtual void initUpdateMesh(PstreamBuffers &)
Initialise the update of the patch topology.
const Vector< Cmpt > & centre(const Foam::List< Vector< Cmpt >> &) const
Return *this (used for point which is a typedef to Vector<scalar>.
points setSize(newPointi)
A list of faces which address into the list of points.
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.
gmvFile<< "tracers "<< particles.size()<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().x()<< " ";}gmvFile<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().y()<< " ";}gmvFile<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().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))
vectorField pointField
pointField is a vectorField.
An edge is a list of two point labels. The functionality it provides supports the discretisation on a...
const dimensionedScalar b
Wien displacement law constant: default SI units: [m.K].
A class for handling words, derived from string.
word name() const
Return file name (part beyond last /)
const Field< PointType > & points() const
Return reference to global points.
static const word null
An empty word.
virtual void movePoints(PstreamBuffers &, const pointField &)
Correct patches after moving points.
const edgeList & edges() const
Return list of edges, address into LOCAL point list.
virtual void updateMesh(PstreamBuffers &)
Update of the patch topology.
dimensioned< Type > average(const DimensionedField< Type, GeoMesh > &df)
errorManip< error > abort(error &err)
A 1D vector of objects of type <T>, where the size of the vector is known and can be used for subscri...
label findMax(const ListType &, const label start=0)
Find index of max element (and larger than given element).
dimensioned< scalar > magSqr(const dimensioned< Type > &)
An Ostream is an abstract base class for all output systems (streams, files, token lists...
const Field< PointType > & localPoints() const
Return pointField of points in patch.
addToRunTimeSelectionTable(ensightPart, ensightPartCells, istream)
fileName path(UMean.rootPath()/UMean.caseName()/"graphs"/UMean.instance())
defineTypeNameAndDebug(combustionModel, 0)
virtual void write(Ostream &) const
Write the polyPatch data as a dictionary.
Ostream & writeKeyword(const keyType &)
Write the keyword followed by an appropriate indentation.
Buffers for inter-processor communications streams (UOPstream, UIPstream).
void T(FieldField< Field, Type > &f1, const FieldField< Field, Type > &f2)
word name(const complex &)
Return a string representation of a complex.
virtual void initGeometry(PstreamBuffers &)
Initialise the calculation of the patch geometry.
Field< tensor > tensorField
Specialisation of Field<T> for tensor.
void setSize(const label)
Reset size of List.
Template functions to aid in the implementation of demand driven data.
virtual void transformPosition(pointField &l) const
Transform a patch-based position from other side to this side.
virtual ~cyclicPolyPatch()
Destructor.
vector point
Point is a vector.
T lookupOrDefault(const word &, const T &, bool recursive=false, bool patternMatch=true) const
Find and return a T,.
#define WarningInFunction
Report a warning using Foam::Warning.
#define FatalIOErrorInFunction(ios)
Report an error message using Foam::FatalIOError.
Type gAverage(const FieldField< Field, Type > &f)
prefixOSstream Pout(cout, "Pout")
virtual label neighbPatchID() const
Neighbour patchID.
const word & neighbPatchName() const
Neighbour patch name.
const dimensionedScalar c1
First radiation constant: default SI units: [W/m2].
const labelListList & faceEdges() const
Return face-edge addressing.
dimensioned< scalar > mag(const dimensioned< Type > &)
virtual void initOrder(PstreamBuffers &, const primitivePatch &) const
Initialize ordering for primitivePatch. Does not.
const doubleScalar e
Elementary charge.
void deleteDemandDrivenData(DataPtr &dataPtr)
A List with indirect addressing.
const dimensionedScalar mp
Proton mass.
virtual void calcTransforms()
Recalculate the transformation tensors.
dimensionSet transform(const dimensionSet &)
ITstream & lookup(const word &, bool recursive=false, bool patternMatch=true) const
Find and return an entry data stream.
const vectorField::subField faceCentres() const
Return face centres.