Go to the documentation of this file.
31 #include "surfaceInterpolate.H"
56 if (protectedCell_.empty())
58 unrefineableCell.
clear();
62 const labelList& cellLevel = meshCutter_.cellLevel();
64 unrefineableCell = protectedCell_;
67 labelList neiLevel(nFaces()-nInternalFaces());
69 for (label facei = nInternalFaces(); facei < nFaces(); ++facei)
71 neiLevel[facei-nInternalFaces()] = cellLevel[faceOwner()[facei]];
73 syncTools::swapBoundaryFaceList(*
this, neiLevel);
84 for (label facei = 0; facei < nInternalFaces(); ++facei)
86 const label own = faceOwner()[facei];
87 const label nei = faceNeighbour()[facei];
93 unrefineableCell.
test(own)
94 && (cellLevel[nei] > cellLevel[own])
99 unrefineableCell.
test(nei)
100 && (cellLevel[own] > cellLevel[nei])
107 for (label facei = nInternalFaces(); facei < nFaces(); facei++)
109 const label own = faceOwner()[facei];
115 unrefineableCell.
test(own)
116 && (neiLevel[facei-nInternalFaces()] > cellLevel[own])
128 bool hasExtended =
false;
130 for (label facei = 0; facei < nInternalFaces(); ++facei)
132 if (seedFace.
test(facei))
134 if (unrefineableCell.
set(faceOwner()[facei]))
138 if (unrefineableCell.
set(faceNeighbour()[facei]))
144 for (label facei = nInternalFaces(); facei < nFaces(); ++facei)
146 if (seedFace.
test(facei))
148 const label own = faceOwner()[facei];
150 if (unrefineableCell.
set(own))
187 for (
const auto& pr : fluxVelocities)
211 bitSet masterFaces(nFaces());
215 const label oldFacei =
faceMap[facei];
219 const label masterFacei = reverseFaceMap[oldFacei];
224 <<
"Problem: should not have removed faces"
226 <<
nl <<
"face:" << facei <<
endl
229 else if (masterFacei != facei)
231 masterFaces.
set(masterFacei);
238 Pout<<
"Found " << masterFaces.
count() <<
" split faces " <<
endl;
243 lookupClass<surfaceScalarField>()
247 if (!correctFluxes_.found(iter.key()))
250 <<
"Cannot find surfaceScalarField " << iter.key()
251 <<
" in user-provided flux mapping table "
252 << correctFluxes_ <<
endl
253 <<
" The flux mapping table is used to recreate the"
254 <<
" flux on newly created faces." <<
endl
255 <<
" Either add the entry if it is a flux or use ("
256 << iter.key() <<
" none) to suppress this warning."
261 const word& UName = correctFluxes_[iter.key()];
272 Pout<<
"Setting surfaceScalarField " << iter.key()
273 <<
" to NaN" <<
endl;
282 Pout<<
"Mapping flux " << iter.key()
283 <<
" using interpolated flux " << UName
291 lookupObject<volVectorField>(UName)
297 for (label facei = 0; facei < nInternalFaces(); ++facei)
299 const label oldFacei =
faceMap[facei];
304 phi[facei] = phiU[facei];
306 else if (reverseFaceMap[oldFacei] != facei)
309 phi[facei] = phiU[facei];
326 const label oldFacei =
faceMap[facei];
331 patchPhi[i] = patchPhiU[i];
333 else if (reverseFaceMap[oldFacei] != facei)
336 patchPhi[i] = patchPhiU[i];
344 for (
const label facei : masterFaces)
346 if (isInternalFace(facei))
348 phi[facei] = phiU[facei];
360 patchPhi[i] = patchPhiU[i];
372 mapNewInternalFaces<scalar>(this->Sf(), this->magSf(),
faceMap);
373 mapNewInternalFaces<vector>(this->Sf(), this->magSf(),
faceMap);
376 mapNewInternalFaces<sphericalTensor>(
faceMap);
377 mapNewInternalFaces<symmTensor>(
faceMap);
378 mapNewInternalFaces<tensor>(
faceMap);
394 meshCutter_.setRefinement(cellsToRefine, meshMod);
400 Info<<
"Refined from "
402 <<
" to " << globalData().nTotalCells() <<
" cells." <<
endl;
407 for (label facei = 0; facei < nInternalFaces(); ++facei)
409 const label oldFacei = map().faceMap()[facei];
411 if (oldFacei >= nInternalFaces())
414 <<
"New internal face:" << facei
415 <<
" fc:" << faceCentres()[facei]
416 <<
" originates from boundary oldFace:" << oldFacei
448 meshCutter_.updateMesh(*map);
451 if (protectedCell_.size())
453 bitSet newProtectedCell(nCells());
455 forAll(newProtectedCell, celli)
457 const label oldCelli = map().cellMap()[celli];
458 if (protectedCell_.test(oldCelli))
460 newProtectedCell.
set(celli);
463 protectedCell_.transfer(newProtectedCell);
467 meshCutter_.checkRefinementLevels(-1,
labelList());
482 meshCutter_.setUnrefinement(splitPoints, meshMod);
491 Map<label> faceToSplitPoint(3*splitPoints.size());
494 for (
const label pointi : splitPoints)
496 const labelList& pEdges = pointEdges()[pointi];
498 for (
const label edgei : pEdges)
500 const label otherPointi = edges()[edgei].otherVertex(pointi);
504 for (
const label facei :
pFaces)
506 faceToSplitPoint.insert(facei, otherPointi);
517 Info<<
"Unrefined from "
519 <<
" to " << globalData().nTotalCells() <<
" cells."
542 const labelList& reversePointMap = map().reversePointMap();
543 const labelList& reverseFaceMap = map().reverseFaceMap();
547 lookupClass<surfaceScalarField>()
551 if (!correctFluxes_.found(iter.key()))
554 <<
"Cannot find surfaceScalarField " << iter.key()
555 <<
" in user-provided flux mapping table "
556 << correctFluxes_ <<
endl
557 <<
" The flux mapping table is used to recreate the"
558 <<
" flux on newly created faces." <<
endl
559 <<
" Either add the entry if it is a flux or use ("
560 << iter.key() <<
" none) to suppress this warning."
565 const word& UName = correctFluxes_[iter.key()];
573 <<
"Mapping flux " << iter.key()
574 <<
" using interpolated flux " << UName
579 surfaceScalarField::Boundary& phiBf =
586 lookupObject<volVectorField>(UName)
594 const label oldFacei = iter.key();
595 const label oldPointi = iter.val();
597 if (reversePointMap[oldPointi] < 0)
600 const label facei = reverseFaceMap[oldFacei];
604 if (isInternalFace(facei))
606 phi[facei] = phiU[facei];
616 patchPhi[i] = patchPhiU[i];
626 meshCutter_.updateMesh(*map);
629 if (protectedCell_.size())
631 bitSet newProtectedCell(nCells());
633 forAll(newProtectedCell, celli)
635 const label oldCelli = map().cellMap()[celli];
636 if (protectedCell_.test(oldCelli))
638 newProtectedCell.
set(celli);
641 protectedCell_.transfer(newProtectedCell);
645 meshCutter_.checkRefinementLevels(-1,
labelList());
660 for (
const label celli : pCells)
662 vFld[celli] =
max(vFld[celli], pFld[pointi]);
678 for (
const label celli : pCells)
680 pFld[pointi] =
max(pFld[pointi], vFld[celli]);
697 for (
const label celli : pCells)
701 pFld[pointi] =
sum/pCells.size();
710 const scalar minLevel,
711 const scalar maxLevel
718 scalar err =
min(
fld[i]-minLevel, maxLevel-
fld[i]);
731 const scalar lowerRefineLevel,
732 const scalar upperRefineLevel,
755 if (cellError[celli] > 0)
757 candidateCell.
set(celli);
765 const label maxCells,
766 const label maxRefinement,
767 const bitSet& candidateCell
771 label nTotToRefine = (maxCells - globalData().nTotalCells()) / 7;
773 const labelList& cellLevel = meshCutter_.cellLevel();
778 calculateProtectedCells(unrefineableCell);
781 label nLocalCandidates = candidateCell.
count();
787 if (nCandidates < nTotToRefine)
789 for (
const label celli : candidateCell)
793 (!unrefineableCell.
test(celli))
794 && cellLevel[celli] < maxRefinement
804 for (label level = 0; level < maxRefinement; ++level)
806 for (
const label celli : candidateCell)
810 (!unrefineableCell.
test(celli))
811 && cellLevel[celli] == level
828 meshCutter_.consistentRefinement
836 <<
" cells for refinement out of " << globalData().nTotalCells()
839 return consistentSet;
845 const scalar unrefineLevel,
851 const labelList splitPoints(meshCutter_.getSplitPoints());
861 if (protectedCell_.size())
868 if (protectedCell_.test(celli))
870 protectedPoint.
set(pointi);
886 <<
" protected cells found "
888 <<
" protected points." <<
endl;
894 for (
const label pointi : splitPoints)
896 if (!protectedPoint[pointi] && pFld[pointi] < unrefineLevel)
899 bool hasMarked =
false;
903 if (markedCell.
test(celli))
912 newSplitPoints.
append(pointi);
918 newSplitPoints.shrink();
923 meshCutter_.consistentUnrefinement
930 <<
" split points out of a possible "
934 return consistentSet;
944 bitSet markedFace(nFaces());
946 for (
const label celli : markedCell)
954 for (label facei = 0; facei < nInternalFaces(); ++facei)
956 if (markedFace.
test(facei))
958 markedCell.set(faceOwner()[facei]);
959 markedCell.set(faceNeighbour()[facei]);
962 for (label facei = nInternalFaces(); facei < nFaces(); ++facei)
964 if (markedFace.
test(facei))
966 markedCell.set(faceOwner()[facei]);
977 const labelList& cellLevel = meshCutter_.cellLevel();
978 const labelList& pointLevel = meshCutter_.pointLevel();
982 forAll(pointLevel, pointi)
986 for (
const label celli : pCells)
988 if (pointLevel[pointi] <= cellLevel[celli])
991 if (nAnchorPoints[celli] == 8)
993 protectedCell.
set(celli);
996 if (!protectedCell.
test(celli))
998 ++nAnchorPoints[celli];
1005 forAll(protectedCell, celli)
1007 if (nAnchorPoints[celli] != 8)
1009 protectedCell.
set(celli);
1017 Foam::dynamicRefineFvMesh::dynamicRefineFvMesh(
const IOobject& io)
1021 protectedCell_(nCells()),
1022 nRefinementIterations_(0),
1046 for (
const label celli : pCells)
1050 if (pointLevel[pointi] <= cellLevel[celli])
1054 if (nAnchors[celli] > 8)
1078 neiLevel[facei] = cellLevel[
faceOwner()[facei]];
1087 const label faceLevel =
max
1097 for (
const label pointi :
f)
1099 if (pointLevel[pointi] <= faceLevel)
1105 protectedFace.
set(facei);
1116 if (protectedFace.
test(facei))
1124 if (protectedFace.
test(facei))
1135 if (cFaces.size() < 6)
1141 for (
const label cfacei : cFaces)
1171 <<
" cells that are protected from refinement."
1172 <<
" Writing these to cellSet "
1173 << protectedCells.
name()
1176 protectedCells.
write();
1201 ).optionalSubDict(typeName +
"Coeffs")
1204 const label refineInterval = refineDict.
get<label>(
"refineInterval");
1206 bool hasChanged =
false;
1208 if (refineInterval == 0)
1210 topoChanging(hasChanged);
1214 else if (refineInterval < 0)
1217 <<
"Illegal refineInterval " << refineInterval <<
nl
1218 <<
"The refineInterval setting in the dynamicMeshDict should"
1219 <<
" be >= 1." <<
nl
1229 const label maxCells = refineDict.
get<label>(
"maxCells");
1234 <<
"Illegal maximum number of cells " << maxCells <<
nl
1235 <<
"The maxCells setting in the dynamicMeshDict should"
1240 const label maxRefinement = refineDict.
get<label>(
"maxRefinement");
1242 if (maxRefinement <= 0)
1245 <<
"Illegal maximum refinement level " << maxRefinement <<
nl
1246 <<
"The maxCells setting in the dynamicMeshDict should"
1251 const word fieldName(refineDict.
get<
word>(
"field"));
1253 const volScalarField& vFld = lookupObject<volScalarField>(fieldName);
1255 const scalar lowerRefineLevel =
1256 refineDict.
get<scalar>(
"lowerRefineLevel");
1257 const scalar upperRefineLevel =
1258 refineDict.
get<scalar>(
"upperRefineLevel");
1259 const scalar unrefineLevel = refineDict.
getOrDefault<scalar>
1264 const label nBufferLayers = refineDict.
get<label>(
"nBufferLayers");
1270 selectRefineCandidates
1278 if (globalData().nTotalCells() < maxCells)
1297 if (nCellsToRefine > 0)
1305 const labelList& cellMap = map().cellMap();
1306 const labelList& reverseCellMap = map().reverseCellMap();
1308 bitSet newRefineCell(cellMap.size());
1312 const label oldCelli = cellMap[celli];
1317 || (reverseCellMap[oldCelli] != celli)
1321 newRefineCell.
set(celli);
1329 for (label i = 0; i < nBufferLayers; ++i)
1343 selectUnrefinePoints
1353 pointsToUnrefine.size(),
1357 if (nSplitPoints > 0)
1360 unrefine(pointsToUnrefine);
1367 if ((nRefinementIterations_ % 10) == 0)
1373 nRefinementIterations_++;
1376 topoChanging(hasChanged);
1395 const_cast<hexRef8&
>(meshCutter_).setInstance(time().timeName());
1400 && meshCutter_.write(valid)
1420 const labelList& cellLevel = meshCutter_.cellLevel();
1424 scalarCellLevel[celli] = cellLevel[celli];
1427 writeOk = writeOk && scalarCellLevel.write();
int debug
Static debugging option.
addToRunTimeSelectionTable(decompositionMethod, kahipDecomp, dictionary)
List< label > labelList
A List of labels.
IOdictionary is derived from dictionary and IOobject to give the dictionary automatic IO functionalit...
label size() const noexcept
The number of elements in table.
void reset()
Clear all bits but do not adjust the addressable size.
Defines the attributes of an object for which implicit objectRegistry management is supported,...
scalarField error(const scalarField &fld, const scalar minLevel, const scalar maxLevel) const
const dimensionSet dimless(0, 0, 0, 0, 0, 0, 0)
Dimensionless.
Pair< int > faceMap(const label facePi, const face &faceP, const label faceNi, const face &faceN)
const word & name() const
Return name.
void extendMarkedCells(bitSet &markedCell) const
Extend markedCell with cell-face-cell.
A class for handling words, derived from Foam::string.
const labelIOList & cellLevel() const
T returnReduce(const T &Value, const BinaryOp &bop, const int tag=Pstream::msgType(), const label comm=UPstream::worldComm)
A bitSet stores bits (elements with only two states) in packed internal format and supports a variety...
bitSet protectedCell_
Protected cells (usually since not hexes)
static constexpr const zero Zero
Global zero (0)
autoPtr< mapPolyMesh > changeMesh(polyMesh &mesh, const bool inflate, const bool syncParallel=true, const bool orderCells=false, const bool orderPoints=false)
Inplace changes mesh without change of patches.
virtual label start() const
Return start label of this patch in the polyMesh face list.
label nInternalFaces() const
Number of internal faces.
label nFaces() const
Number of mesh faces.
bool any() const
True if any bits in this bitset are set.
virtual void mapFields(const mapPolyMesh &mpm)
Map all fields in time using given map.
const cellList & cells() const
An abstract base class with a fat-interface to all derived classes covering all possible ways in whic...
Direct mesh changes based on v1.3 polyTopoChange syntax.
Abstract base class for geometry and/or topology changing fvMesh.
hexRef8 meshCutter_
Mesh cutting engine.
virtual void mapFields(const mapPolyMesh &mpm)
Map all fields in time using given map.
virtual bool update()
Update the mesh for both mesh motion and topology change.
virtual labelList selectRefineCells(const label maxCells, const label maxRefinement, const bitSet &candidateCell) const
Subset candidate cells for refinement.
void set(const bitSet &bitset)
Set specified bits from another bitset.
Ostream & endl(Ostream &os)
Add newline and flush stream.
HashTable< word > correctFluxes_
Fluxes to map.
T get(const word &keyword, enum keyType::option matchOpt=keyType::REGEX) const
prefixOSstream Pout
An Ostream wrapper for parallel output to std::cout.
bool test(const label pos) const
Test value at specified position, never auto-vivify entries.
DynamicList< T, SizeMin > & shrink()
Shrink the allocated space to the number of elements used.
void resize(const label nElem, const unsigned int val=0u)
Reset addressable list size, does not shrink the allocated size.
unsigned int count(const bool on=true) const
Count number of bits set.
void readDict()
Read the projection parameters from dictionary.
label min(const labelHashSet &set, label minValue=labelMax)
Find the min value in labelHashSet, optionally limited by second argument.
#define forAll(list, i)
Loop across all elements in list.
virtual bool writeObject(IOstreamOption streamOpt, const bool valid) const
Write using stream options.
All refinement history. Used in unrefinement.
void checkEightAnchorPoints(bitSet &protectedCell) const
Check all cells have 8 anchor points.
label nCells() const
Number of mesh cells.
Info<< "Finished reading KIVA file"<< endl;cellShapeList cellShapes(nPoints);labelList cellZoning(nPoints, -1);const cellModel &hex=cellModel::ref(cellModel::HEX);labelList hexLabels(8);label activeCells=0;labelList pointMap(nPoints);forAll(pointMap, i){ pointMap[i]=i;}for(label i=0;i< nPoints;i++){ if(f[i] > 0.0) { hexLabels[0]=i;hexLabels[1]=i1tab[i];hexLabels[2]=i3tab[i1tab[i]];hexLabels[3]=i3tab[i];hexLabels[4]=i8tab[i];hexLabels[5]=i1tab[i8tab[i]];hexLabels[6]=i3tab[i1tab[i8tab[i]]];hexLabels[7]=i3tab[i8tab[i]];cellShapes[activeCells]=cellShape(hex, hexLabels);edgeList edges=cellShapes[activeCells].edges();forAll(edges, ei) { if(edges[ei].mag(points)< SMALL) { label start=pointMap[edges[ei].start()];while(start !=pointMap[start]) { start=pointMap[start];} label end=pointMap[edges[ei].end()];while(end !=pointMap[end]) { end=pointMap[end];} label minLabel=min(start, end);pointMap[start]=pointMap[end]=minLabel;} } cellZoning[activeCells]=idreg[i];activeCells++;}}cellShapes.setSize(activeCells);cellZoning.setSize(activeCells);forAll(cellShapes, celli){ cellShape &cs=cellShapes[celli];forAll(cs, i) { cs[i]=pointMap[cs[i]];} cs.collapse();}label bcIDs[11]={-1, 0, 2, 4, -1, 5, -1, 6, 7, 8, 9};const label nBCs=12;const word *kivaPatchTypes[nBCs]={ &wallPolyPatch::typeName, &wallPolyPatch::typeName, &wallPolyPatch::typeName, &wallPolyPatch::typeName, &symmetryPolyPatch::typeName, &wedgePolyPatch::typeName, &polyPatch::typeName, &polyPatch::typeName, &polyPatch::typeName, &polyPatch::typeName, &symmetryPolyPatch::typeName, &oldCyclicPolyPatch::typeName};enum patchTypeNames{ PISTON, VALVE, LINER, CYLINDERHEAD, AXIS, WEDGE, INFLOW, OUTFLOW, PRESIN, PRESOUT, SYMMETRYPLANE, CYCLIC};const char *kivaPatchNames[nBCs]={ "piston", "valve", "liner", "cylinderHead", "axis", "wedge", "inflow", "outflow", "presin", "presout", "symmetryPlane", "cyclic"};List< SLList< face > > pFaces[nBCs]
virtual bool write(const bool valid=true) const
Write using setting from DB.
static void fillNan(UList< scalar > &list)
Fill data block with NaN values.
messageStream Info
Information stream (uses stdout - output is on the master only)
DynamicList< T, SizeMin > & append(const T &val)
Append an element to the end of this list.
virtual const labelList & faceOwner() const
Return face owner.
virtual void selectRefineCandidates(const scalar lowerRefineLevel, const scalar upperRefineLevel, const scalarField &vFld, bitSet &candidateCell) const
Select candidate cells for refinement.
The IOstreamOption is a simple container for options an IOstream can normally have.
bool readEntry(const word &keyword, T &val, enum keyType::option matchOpt=keyType::REGEX, bool mandatory=true) const
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
scalarField maxCellField(const volScalarField &) const
Get point max of connected cell.
label max(const labelHashSet &set, label maxValue=labelMin)
Find the max value in labelHashSet, optionally limited by second argument.
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;for(const word &name :lagrangianScalarNames){ IOField< scalar > fld(IOobject(name, runTime.timeName(), cloud::prefix, mesh, IOobject::MUST_READ, IOobject::NO_WRITE))
#define forAllIters(container, iter)
Iterate across all elements in the container object.
virtual autoPtr< mapPolyMesh > refine(const labelList &)
Refine cells. Update mesh and fields.
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
Macros for easy insertion into run-time selection tables.
errorManip< error > abort(error &err)
static tmp< GeometricField< Type, fvsPatchField, surfaceMesh > > interpolate(const GeometricField< Type, fvPatchField, volMesh > &tvf, const surfaceScalarField &faceFlux, Istream &schemeData)
Interpolate field onto faces using scheme given by Istream.
A collection of cell labels.
virtual labelList selectUnrefinePoints(const scalar unrefineLevel, const bitSet &markedCell, const scalarField &pFld) const
Select points that can be unrefined.
errorManipArg< error, int > exit(error &err, const int errNo=1)
Internal::FieldType & primitiveFieldRef(const bool updateAccessTime=true)
Return a reference to the internal field.
A HashTable similar to std::unordered_map.
const labelList & reverseFaceMap() const
Reverse face map.
Pointer management similar to std::unique_ptr, with some additional methods and type checking.
void calculateProtectedCells(bitSet &unrefineableCell) const
Calculate cells that cannot be refined since would trigger.
Container with cells to refine. Refinement given as single direction.
virtual const faceList & faces() const
Return raw faces.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
#define DebugInfo
Report an information message using Foam::Info.
forAllConstIters(mixture.phases(), phase)
const fvPatch & patch() const
Return patch.
Refinement of (split) hexes using polyTopoChange.
Boundary & boundaryFieldRef(const bool updateAccessTime=true)
Return a reference to the boundary field.
const labelIOList & pointLevel() const
labelHashSet used(const bitSet &select)
Convert a bitset to a labelHashSet of the indices used.
bool dumpLevel_
Dump cellLevel for post-processing.
const labelListList & pointCells() const
dimensioned< Type > sum(const DimensionedField< Type, GeoMesh > &df)
const labelList & faceMap() const
Old face map.
const dictionary & optionalSubDict(const word &keyword, enum keyType::option matchOpt=keyType::REGEX) const
Find and return a sub-dictionary, otherwise return this dictionary.
std::enable_if< std::is_same< bool, TypeT >::value, bool >::type set(const label i, bool val=true)
A bitSet::set() method for a list of bool.
Class containing mesh-to-mesh mapping information after a change in polyMesh topology.
const dimensionedScalar c
Speed of light in a vacuum.
const Time & time() const
Return the top-level database.
Addressing for all faces on surface of mesh. Can either be read from polyMesh or from triSurface....
virtual autoPtr< mapPolyMesh > unrefine(const labelList &)
Unrefine cells. Gets passed in centre points of cells to combine.
scalarField cellToPoint(const scalarField &vFld) const
A face is a list of labels corresponding to mesh vertices.
Smooth ATC in cells having a point to a set of patches supplied by type.
T getOrDefault(const word &keyword, const T &deflt, enum keyType::option matchOpt=keyType::REGEX) const
constant condensation/saturation model.
defineTypeNameAndDebug(combustionModel, 0)
scalarField maxPointField(const scalarField &) const
Get per cell max of connected point.
#define WarningInFunction
Report a warning using Foam::Warning.
A cell is defined as a list of faces with extra functionality.
Class to handle errors and exceptions in a simple, consistent stream-based manner.
virtual const labelList & faceNeighbour() const
Return face neighbour.
void clear()
Clear the list, i.e. set addressable size to zero.
const Boundary & boundaryField() const
Return const-reference to the boundary field.
virtual bool writeObject(IOstreamOption streamOpt, const bool valid) const
Write the underlying polyMesh and other data.