54 result[2*i + 1] =
b[i];
106 return a.
layer >
b.layer ? a :
b;
112 return a.
layer <
b.layer ? a :
b;
122 namespace fvMeshStitchers
132 void Foam::fvMeshStitchers::moving::conformCorrectMeshPhi
141 if (isA<nonConformalFvPatch>(phiBf[nccPatchi].patch()))
143 const nonConformalFvPatch& ncFvp =
144 refCast<const nonConformalFvPatch>(phiBf[nccPatchi].patch());
146 const label origPatchi = ncFvp.origPatchIndex();
147 const fvPatch& origFvp = ncFvp.origPatch();
149 for (
label i = 0; i <= phi.nOldTimes(
false); ++ i)
151 phi.oldTimeRef(i).boundaryFieldRef()[origPatchi] +=
154 phi.oldTime(i).boundaryField()[nccPatchi],
160 phi.oldTimeRef(i).boundaryFieldRef()[nccPatchi].clear();
167 void Foam::fvMeshStitchers::moving::createNonConformalCorrectMeshPhiGeometry
175 const labelList origPatchIndices = ncb.allOrigPatchIndices();
176 const labelList errorPatchIndices = ncb.allErrorPatchIndices();
178 forAll(errorPatchIndices, i)
180 const label origPatchi = origPatchIndices[i];
183 const label errorPatchi = errorPatchIndices[i];
185 polyFacesBf[errorPatchi] =
188 SfSf.boundaryFieldRef()[errorPatchi] =
191 (rootVSmall*origPp.faceNormals())(),
192 (-rootVSmall*origPp.faceNormals())()
194 CfSf.boundaryFieldRef()[errorPatchi] =
195 repeat(origPp.faceCentres());
211 if (!isA<nonConformalCoupledFvPatch>(fvp))
continue;
213 const nonConformalCoupledFvPatch& nccFvp =
214 refCast<const nonConformalCoupledFvPatch>(fvp);
216 if (!nccFvp.owner())
continue;
218 forAll(nccFvp, nccPatchFacei)
232 ncb.ownerOrigBoundaryEdgeMeshEdge().size(),
235 forAll(ncb.ownerOrigBoundaryEdgeMeshEdge(), ownerOrigBoundaryEdgei)
237 const label meshEdgei =
238 ncb.ownerOrigBoundaryEdgeMeshEdge()[ownerOrigBoundaryEdgei];
240 forAll(
mesh().edgeFaces()[meshEdgei], edgeFacei)
244 if (
mesh().isInternalFace(facei))
continue;
248 if (bFaceNSet[bFacei])
250 ownerOrigBoundaryEdgeNSet[ownerOrigBoundaryEdgei] += 1;
257 ncb.ownerOrigBoundaryEdgeMeshEdge(),
258 ownerOrigBoundaryEdgeNSet,
266 forAll(ncb.ownerOrigBoundaryEdgeMeshEdge(), ownerOrigBoundaryEdgei)
268 if (ownerOrigBoundaryEdgeNSet[ownerOrigBoundaryEdgei] < 2)
continue;
270 const label meshEdgei =
271 ncb.ownerOrigBoundaryEdgeMeshEdge()[ownerOrigBoundaryEdgei];
273 forAll(
mesh().edgeFaces()[meshEdgei], edgeFacei)
277 set.insert(
mesh().faceOwner()[facei]);
279 if (facei <
mesh().nInternalFaces())
281 set.insert(
mesh().faceNeighbour()[facei]);
290 void Foam::fvMeshStitchers::moving::unconformInternalFaceCorrectMeshPhi
304 boolList bFaceIsOwnerOrig(
mesh().nFaces() -
mesh().nInternalFaces(),
false);
310 if (!isA<nonConformalCoupledFvPatch>(fvp))
continue;
312 const nonConformalCoupledFvPatch& nccFvp =
313 refCast<const nonConformalCoupledFvPatch>(fvp);
315 if (!nccFvp.owner())
continue;
317 forAll(nccFvp, nccPatchFacei)
322 bFaceIsOwnerOrig[bFacei] =
true;
323 bFaceNccMagSf[bFacei] += magSfBf[nccPatchi][nccPatchFacei];
336 fvMeshSubset subsetter(
mesh());
337 subsetter.setLargeCellSubset(ownerCoupledCellSet());
338 const fvMesh& subMesh = subsetter.subMesh();
339 subMesh.deltaCoeffs();
342 const regionSplit subMeshRegions(subMesh);
343 const label subNRegions = subMeshRegions.nRegions();
347 forAll(subsetter.faceMap(), subFacei)
349 const label facei = subsetter.faceMap()[subFacei];
351 if (
mesh().isInternalFace(facei))
continue;
355 bFaceSubRegion[bFacei] =
356 subMeshRegions[subMesh.faceOwner()[subFacei]];
360 labelList subMeshRegionRefCells(subNRegions, -1);
365 forAll(subMeshRegions, subCelli)
367 subMeshRegionRefProcs[subMeshRegions[subCelli]] = proci;
369 reduce(subMeshRegionRefProcs, ListOp<minOp<label>>());
371 forAll(subMeshRegions, subCelli)
375 subMeshRegionRefProcs[subMeshRegions[subCelli]] == proci
376 && subMeshRegionRefCells[subMeshRegions[subCelli]] == -1
379 subMeshRegionRefCells[subMeshRegions[subCelli]] = subCelli;
395 scalarList regionPhiError(subNRegions, scalar(0));
401 if (!isA<nonConformalCoupledFvPatch>(fvp))
continue;
403 const nonConformalCoupledFvPatch& nccFvp =
404 refCast<const nonConformalCoupledFvPatch>(fvp);
406 if (!nccFvp.owner())
continue;
408 forAll(nccFvp, nccPatchFacei)
410 const label subRegioni =
417 regionPhiError[subRegioni] +=
418 syncPhiBf[nccPatchi][nccPatchFacei]
419 - phiBf[nccPatchi][nccPatchFacei];
421 regionMagSf[subRegioni] +=
422 magSfBf[nccPatchi][nccPatchFacei];
425 reduce(regionPhiError, ListOp<sumOp<scalar>>());
426 reduce(regionMagSf, ListOp<sumOp<scalar>>());
434 if (!isA<nonConformalCoupledFvPatch>(fvp))
continue;
436 const nonConformalCoupledFvPatch& nccFvp =
437 refCast<const nonConformalCoupledFvPatch>(fvp);
439 if (!nccFvp.owner())
continue;
441 forAll(nccFvp, nccPatchFacei)
443 const label subRegioni =
450 phiBf[nccPatchi][nccPatchFacei] =
451 syncPhiBf[nccPatchi][nccPatchFacei]
452 - magSfBf[nccPatchi][nccPatchFacei]
453 /regionMagSf[subRegioni]
454 *regionPhiError[subRegioni];
479 const label facei = subsetter.faceMap()[subFacei];
481 subPhi[subFacei] = phi[facei];
483 forAll(subPhi.boundaryField(), subPatchi)
485 const fvPatch& subFvp = subPhi.boundaryField()[subPatchi].patch();
487 forAll(subPhi.boundaryField()[subPatchi], subPatchFacei)
489 const label subFacei = subFvp.start() + subPatchFacei;
490 const label facei = subsetter.faceMap()[subFacei];
492 if (
mesh().isInternalFace(facei))
494 const label s =
sign(subsetter.faceFlipMap()[subFacei]);
496 subPhi.boundaryFieldRef()[subPatchi][subPatchFacei] =
510 subPhi.boundaryFieldRef()[subPatchi][subPatchFacei] +=
511 phiBf[
patches[i]][patchFaces[i]];
521 - (subV - subV0)/subV
528 wordList MeshPhiPatchTypes(subMesh.boundary().size());
531 const fvPatch& subFvp = subMesh.boundary()[
patchi];
532 MeshPhiPatchTypes[
patchi] =
534 && !isA<internalFvPatch>(subFvp)
545 subMesh.time().name(),
553 subMesh.boundaryMesh().types()
556 subMesh.schemes().setFluxRequired(MeshPhi.name());
563 forAll(subMeshRegionRefCells, i)
565 MeshPhiEqn.setReference(subMeshRegionRefCells[i], 0);
582 DynamicList<labelPair> subChangedPatchAndFaces;
583 DynamicList<meshPhiPreCorrectInfo> subChangedFacePci;
584 DynamicList<meshPhiCorrectInfo> subChangedFaceCi;
587 List<meshPhiPreCorrectInfo> subInternalFacePci(subMesh.nInternalFaces());
588 List<List<meshPhiPreCorrectInfo>> subPatchFacePci
590 FvFaceCellWave<meshPhiPreCorrectInfo>::template
591 sizesListList<List<List<meshPhiPreCorrectInfo>>>
593 FvFaceCellWave<meshPhiPreCorrectInfo>::template
594 listListSizes<fvBoundaryMesh>(subMesh.boundary()),
595 meshPhiPreCorrectInfo()
598 List<meshPhiPreCorrectInfo> subCellPci(subMesh.nCells());
601 subChangedPatchAndFaces.clear();
602 subChangedFacePci.clear();
603 forAll(subMesh.boundary(), subPatchi)
605 const fvPatch& subFvp = subMesh.boundary()[subPatchi];
607 forAll(subFvp, subPatchFacei)
609 const label subFacei = subFvp.start() + subPatchFacei;
610 const label facei = subsetter.faceMap()[subFacei];
613 if (bFacei >= 0 && bFaceIsOwnerOrig[bFacei])
615 subChangedPatchAndFaces.append({subPatchi, subPatchFacei});
616 subChangedFacePci.append
618 meshPhiPreCorrectInfo(0, bFaceNccMagSf[bFacei])
625 FvFaceCellWave<meshPhiPreCorrectInfo> preWave
632 preWave.setFaceInfo(subChangedPatchAndFaces, subChangedFacePci);
633 const label nWaveLayers =
634 preWave.iterate(subMesh.globalData().nTotalCells() + 1);
637 List<meshPhiCorrectInfo> subInternalFaceCi(subMesh.nInternalFaces());
638 List<List<meshPhiCorrectInfo>> subPatchFaceCi
640 FvFaceCellWave<meshPhiCorrectInfo>::template
641 sizesListList<List<List<meshPhiCorrectInfo>>>
643 FvFaceCellWave<meshPhiCorrectInfo>::template
644 listListSizes<fvBoundaryMesh>(subMesh.boundary()),
648 List<meshPhiCorrectInfo> subCellCi(subMesh.nCells());
653 (subV - subV0)/subMesh.time().deltaT()
658 meshPhiCorrectInfo::trackData td
669 for (
label waveLayeri = nWaveLayers - 1; waveLayeri >= 0; waveLayeri --)
672 const label faceLayeri = (waveLayeri + 1)*2;
675 subChangedPatchAndFaces.clear();
676 subChangedFaceCi.clear();
677 forAll(subInternalFacePci, subFacei)
679 if (subInternalFacePci[subFacei].layer() == faceLayeri)
681 subChangedPatchAndFaces.append({-1, subFacei});
682 subChangedFaceCi.append
684 subInternalFaceCi[subFacei].
valid(td)
685 ? subInternalFaceCi[subFacei]
690 forAll(subPatchFacePci, subPatchi)
692 forAll(subPatchFacePci[subPatchi], subPatchFacei)
696 subPatchFacePci[subPatchi][subPatchFacei].layer()
700 subChangedPatchAndFaces.append({subPatchi, subPatchFacei});
701 subChangedFaceCi.append
703 subPatchFaceCi[subPatchi][subPatchFacei].
valid(td)
704 ? subPatchFaceCi[subPatchi][subPatchFacei]
712 FvFaceCellWave<meshPhiCorrectInfo, meshPhiCorrectInfo::trackData>
wave
720 wave.setFaceInfo(subChangedPatchAndFaces, subChangedFaceCi);
725 forAll(subInternalFaceCi, subFacei)
727 subDeltaPhi.primitiveFieldRef()[subFacei] +=
728 subInternalFaceCi[subFacei].deltaPhi();
730 forAll(subPatchFaceCi, subPatchi)
732 forAll(subPatchFaceCi[subPatchi], subPatchFacei)
734 subDeltaPhi.boundaryFieldRef()[subPatchi][subPatchFacei] +=
735 subPatchFaceCi[subPatchi][subPatchFacei].deltaPhi();
744 phi[subsetter.faceMap()[subFacei]] =
745 subPhi[subFacei] + subDeltaPhi[subFacei];
756 forAll(subMesh.boundary(), subPatchi)
758 const label patchi = subsetter.patchMap()[subPatchi];
760 if (
patchi == -1)
continue;
762 const fvPatch& subFvp = subMesh.boundary()[subPatchi];
765 const bool coupled = subFvp.coupled();
767 forAll(subMesh.boundary()[subPatchi], subPatchFacei)
770 subsetter.faceMap()[subFvp.start() + subPatchFacei];
772 const label patchFacei = facei - fvp.start();
776 deltaPhiBf[
patchi][patchFacei] =
777 subPhi.boundaryField()[subPatchi][subPatchFacei]
778 + subDeltaPhi.boundaryField()[subPatchi][subPatchFacei]
779 - phiBf[
patchi][patchFacei];
783 deltaPhiBf[
patchi][patchFacei] =
784 subDeltaPhi.boundaryField()[subPatchi][subPatchFacei];
794 if (!isA<nonConformalCoupledFvPatch>(fvp))
continue;
796 const nonConformalCoupledFvPatch& nccFvp =
797 refCast<const nonConformalCoupledFvPatch>(fvp);
799 if (!nccFvp.owner())
continue;
801 const label origPatchi = nccFvp.origPatchIndex();
802 const fvPatch& origFvp = nccFvp.origPatch();
804 forAll(nccFvp, nccPatchFacei)
809 const label origPatchFacei =
810 nccFvp.polyFaces()[nccPatchFacei] - origFvp.start();
812 const scalar deltaPhi =
813 magSfBf[nccPatchi][nccPatchFacei]
814 /bFaceNccMagSf[bFacei]
815 *deltaPhiBf[origPatchi][origPatchFacei];
817 deltaPhiBf[nccPatchi][nccPatchFacei] = deltaPhi;
824 if (!isA<nonConformalCoupledFvPatch>(fvp))
continue;
826 const nonConformalCoupledFvPatch& nccFvp =
827 refCast<const nonConformalCoupledFvPatch>(fvp);
829 if (!nccFvp.owner())
continue;
831 const label origPatchi = nccFvp.origPatchIndex();
832 const fvPatch& origFvp = nccFvp.origPatch();
834 forAll(nccFvp, nccPatchFacei)
836 const label origPatchFacei =
837 nccFvp.polyFaces()[nccPatchFacei] - origFvp.start();
839 deltaPhiBf[origPatchi][origPatchFacei] = 0;
848 void Foam::fvMeshStitchers::moving::unconformErrorFaceCorrectMeshPhi
857 const labelList origPatchIndices = ncb.allOrigPatchIndices();
858 const labelList errorPatchIndices = ncb.allErrorPatchIndices();
862 PtrList<surfaceScalarField::Boundary> phiErrorbs(phi.nOldTimes(
false) + 1);
863 for (
label i = 0; i <= phi.nOldTimes(
false); ++ i)
865 tmp<surfaceScalarField::Boundary> tphib =
868 phi.oldTime(i).boundaryField()
877 phi.oldTime(i).boundaryField()
880 phiErrorbs[i] = phi.oldTime(i).boundaryField() - tphib();
882 phi.oldTimeRef(i).boundaryFieldRef() = tphib;
891 if (isA<nonConformalCoupledFvPatch>(fvp))
893 const nonConformalCoupledFvPatch& nccFvp =
894 refCast<const nonConformalCoupledFvPatch>(fvp);
896 const label origPatchi = nccFvp.origPatchIndex();
899 const label errorPatchi = nccFvp.errorPatchIndex();
901 forAll(nccFvp, nccPatchFacei)
903 const label origPatchFacei =
904 nccFvp.polyFaces()[nccPatchFacei] - origPp.start();
906 const label errorPatchFacei0 = 2*origPatchFacei;
907 const label errorPatchFacei1 = 2*origPatchFacei + 1;
909 for (
label i = 0; i <= phi.nOldTimes(
false); ++ i)
911 fvsPatchField<scalar>& phip =
912 phi.oldTimeRef(i).boundaryFieldRef()[errorPatchi];
913 phip[errorPatchFacei0] +=
914 phiErrorbs[i][nccPatchi][nccPatchFacei]/2;
915 phip[errorPatchFacei1] +=
916 phiErrorbs[i][nccPatchi][nccPatchFacei]/2;
927 tmp<surfaceScalarField> tnccMeshMagUf =
935 tnccMeshMagUf.ref().boundaryFieldRef();
940 if (isA<nonConformalCoupledFvPatch>(fvp))
942 const nonConformalCoupledFvPatch& nccFvp =
943 refCast<const nonConformalCoupledFvPatch>(fvp);
945 const fvPatch& origFvp = nccFvp.origPatch();
947 forAll(nccFvp, nccPatchFacei)
949 const label origPatchFacei =
950 nccFvp.polyFaces()[nccPatchFacei]
954 origFvp.patch().faceCentres()[origPatchFacei];
956 origFvp.patch()[origPatchFacei]
959 tnccMeshMagUfb[nccPatchi][nccPatchFacei] =
968 tnccMeshMagUfb.boundaryNeighbourField()()
975 tnccMeshMagUf.clear();
980 forAll(errorPatchIndices, i)
982 const label origPatchi = origPatchIndices[i];
985 const label errorPatchi = errorPatchIndices[i];
987 forAll(origPp, origPatchFacei)
989 const label errorPatchFacei0 = 2*origPatchFacei;
990 const label errorPatchFacei1 = 2*origPatchFacei + 1;
995 mag(phi.boundaryField()[errorPatchi][errorPatchFacei0])
996 /
max(meshMagUfb[origPatchi][origPatchFacei], vSmall),
997 origPp.magFaceAreas()[origPatchFacei]
999 *origPp.faceNormals()[origPatchFacei];
1001 fvsPatchField<vector>& Sfp =
1002 SfSf.boundaryFieldRef()[errorPatchi];
1003 Sfp[errorPatchFacei0] += errorSf;
1004 Sfp[errorPatchFacei1] -= errorSf;
1010 void Foam::fvMeshStitchers::moving::unconformCorrectMeshPhi
1012 const SurfaceFieldBoundary<label>& polyFacesBf,
1030 for (
label i = 0; i <= phi.nOldTimes(
false); ++ i)
1033 phi.oldTimeRef(i).boundaryFieldRefNoStoreOldTimes();
1035 forAll(polyFacesBf, ncPatchi)
1037 if (!isA<nonConformalFvPatch>(polyFacesBf[ncPatchi].patch()))
1039 phi0Bf[ncPatchi].map
1042 setSizeFieldMapper(polyFacesBf[ncPatchi].size())
1050 for (
label i = 0; i <= phi.nOldTimes(
false); ++ i)
1052 phi.oldTimeRef(i).boundaryFieldRef() =
1055 phi.oldTime(i).boundaryField(),
1056 phi.oldTime(i).boundaryField()
1069 mesh().foundObject<solutionControl>(solutionControl::typeName)
1070 &&
mesh().lookupObject<solutionControl>(solutionControl::typeName)
1071 .
dict().lookup<Switch>(
"correctMeshPhi")
1074 unconformInternalFaceCorrectMeshPhi(phi);
1079 unconformErrorFaceCorrectMeshPhi(polyFacesBf, SfSf, CfSf, phi);
#define forAll(list, i)
Loop across all elements in list.
Macros for easy insertion into run-time selection tables.
static nonConformalBoundary & New(const word &name, const polyMesh &mesh)
Construct and return the named DemandDrivenMeshObject.
static const DimensionedField< Type, GeoMesh, PrimitiveField > & null()
Return a null DimensionedField.
static const char *const typeName
const Boundary & boundaryField() const
Return const-reference to the boundary field.
DimensionedField< Type, GeoMesh, PrimitiveField > Internal
Type of the internal field from which this GeometricField is derived.
GeometricBoundaryField< Type, GeoMesh, PrimitiveField > Boundary
Type of the boundary field.
static tmp< GeometricField< Type, GeoMesh, PrimitiveField > > New(const word &name, const Internal &, const PtrList< Patch > &, const HashPtrTable< Source > &=HashPtrTable< Source >())
Return a temporary field constructed from name,.
An Istream is an abstract base class for all input systems (streams, files, token lists etc)....
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
scalar deltaTValue() const
Return time step value.
label size() const
Return the number of elements in the UList.
static int myProcNo(const label communicator=0)
Number of this process (starting from masterNo() = 0)
const Vector< Cmpt > & centre(const Foam::List< Vector< Cmpt >> &) const
Return *this (used for point which is a typedef to Vector<scalar>.
Mesh manipulator that uses the intersection provided by the cyclic non-conformal poly patches to crea...
Mesh stitcher for moving meshes.
moving(fvMesh &)
Construct from fvMesh.
virtual ~moving()
Destructor.
Mesh data needed to do the Finite Volume discretisation.
const Time & time() const
Return the top-level database.
const fvBoundaryMesh & boundary() const
Return reference to boundary mesh.
const UCompactListList< label > & polyBFacePatches() const
Return poly-bFace-patch addressing.
const GeometricBoundaryField< label, surfaceMesh > & polyFacesBf() const
Return face-poly-face addressing.
const UCompactListList< label > & polyBFacePatchFaces() const
Return poly-bFace-patch-face addressing.
const surfaceScalarField & magSf() const
Return cell face area magnitudes.
void unconform(const GeometricBoundaryField< label, surfaceMesh > &polyFacesBf, const surfaceVectorField &Sf, const surfaceVectorField &Cf, const surfaceScalarField &phi=NullObjectRef< surfaceScalarField >(), const bool sync=true)
Unconform the fvMesh from the polyMesh.
A zero-sized class without any storage. Used, for example, in HashSet.
const polyBoundaryMesh & boundaryMesh() const
Return boundary mesh.
static bool constraintType(const word &pt)
Return true if the given type is a constraint type.
label nInternalFaces() const
const labelListList & edgeFaces() const
Foam::fvMesh mesh(Foam::IOobject(regionName, runTime.name(), runTime, Foam::IOobject::MUST_READ), false)
Calculate the matrix for the laplacian of the field.
gmvFile<< "tracers "<< particles.size()<< nl;forAllConstIter(lagrangian::Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().x()<< " ";}gmvFile<< nl;forAllConstIter(lagrangian::Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().y()<< " ";}gmvFile<< nl;forAllConstIter(lagrangian::Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().z()<< " ";}gmvFile<< nl;forAll(lagrangianScalarNames, i){ word name=lagrangianScalarNames[i];IOField< scalar > s(IOobject(name, runTime.name(), lagrangian::cloud::prefix, mesh, IOobject::MUST_READ, IOobject::NO_WRITE))
const fvPatchList & patches
bool valid(const PtrList< ModelType > &l)
addToRunTimeSelectionTable(fvMeshStitcher, stationary, fvMesh)
defineTypeNameAndDebug(stationary, 0)
label wave(const fvMesh &mesh, const List< labelPair > &changedPatchAndFaces, const label nCorrections, GeometricField< scalar, GeoMesh > &distance, TrackingData &td, GeometricField< DataType, GeoMesh > &... data)
Wave distance (and maybe additional) data from faces. If nCorrections is.
void surfaceIntegrate(Field< Type > &ivf, const SurfaceField< Type > &ssf)
tmp< fvMatrix< Type > > laplacian(const VolField< Type > &vf, const word &name)
List< word > wordList
A List of words.
List< label > labelList
A List of labels.
dimensionedScalar sign(const dimensionedScalar &ds)
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
fvMatrix< scalar > fvScalarMatrix
SurfaceField< scalar > surfaceScalarField
List< bool > boolList
Bool container classes.
List< scalar > scalarList
A List of scalars.
vector point
Point is a vector.
void mag(LagrangianPatchField< scalar > &f, const LagrangianPatchField< Type > &f1)
layerAndWeight min(const layerAndWeight &a, const layerAndWeight &b)
const dimensionSet dimTime
Vector< scalar > vector
A scalar version of the templated Vector.
void reduce(const List< UPstream::commsStruct > &comms, T &Value, const BinaryOp &bop, const int tag, const label comm)
const dimensionSet dimVolume
VolField< scalar > volScalarField
layerAndWeight max(const layerAndWeight &a, const layerAndWeight &b)
HashSet< label, Hash< label > > labelHashSet
A HashSet with label keys.
const dimensionSet dimVelocity
const dimensionSet dimArea
static const label labelMax
SurfaceField< vector > surfaceVectorField
labelList identityMap(const label len)
Create identity map (map[i] == i) of given length.
List< Type > repeat(const UList< Type > &a, const UList< Type > &b)
UList< label > labelUList
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
faceListList boundary(nPatches)
friend Ostream & operator<<(Ostream &os, const layerAndWeight &l)
static const layerAndWeight max
friend bool operator!=(const layerAndWeight &a, const layerAndWeight &b)
friend Istream & operator>>(Istream &is, layerAndWeight &l)
friend bool operator==(const layerAndWeight &a, const layerAndWeight &b)
static const layerAndWeight min