58 <<
"addressing (" << addr.
size()
59 <<
") and field (" << pf.
size() <<
") are different sizes" <<
endl
65 intf[addr[facei]] += pf[facei];
79 addToInternalField(addr, tpf(), intf);
96 <<
"addressing (" << addr.
size()
97 <<
") and field (" << pf.
size() <<
") are different sizes" <<
endl
103 intf[addr[facei]] -= pf[facei];
117 subtractFromInternalField(addr, tpf(), intf);
129 for (label fieldi = 0; fieldi < nMatrices(); ++fieldi)
131 const auto& bpsi = this->
psi(fieldi).boundaryField();
135 const label patchi = globalPatchID(fieldi, ptfi);
141 lduAddr().patchAddr(patchi),
142 internalCoeffs_[patchi].
component(solveCmpt),
154 for (label fieldi = 0; fieldi < nMatrices(); fieldi++)
156 const auto& bpsi = this->
psi(fieldi).boundaryField();
160 const label patchi = globalPatchID(fieldi, ptfi);
165 lduAddr().patchAddr(patchi),
166 cmptAv(internalCoeffs_[patchi]),
182 for (label fieldi = 0; fieldi < nMatrices(); fieldi++)
184 const auto& bpsi = this->
psi(fieldi).boundaryField();
190 const label patchi = globalPatchID(fieldi, ptfi);
200 lduAddr().patchAddr(patchi),
210 const labelUList& addr = lduAddr().patchAddr(patchi);
214 source[addr[facei]] +=
225template<
template<
class>
class ListType>
229 const ListType<Type>& values
247 const label celli = cellLabels[i];
248 const Type& value = values[i];
251 source_[celli] = value*Diag[celli];
253 if (symmetric() || asymmetric())
255 for (
const label facei :
cells[celli])
257 if (
mesh.isInternalFace(facei))
261 if (celli == own[facei])
263 source_[nei[facei]] -= upper()[facei]*value;
267 source_[own[facei]] -= upper()[facei]*value;
270 upper()[facei] = 0.0;
274 if (celli == own[facei])
276 source_[nei[facei]] -= lower()[facei]*value;
280 source_[own[facei]] -= upper()[facei]*value;
283 upper()[facei] = 0.0;
284 lower()[facei] = 0.0;
289 const label patchi =
mesh.boundaryMesh().whichPatch(facei);
291 if (internalCoeffs_[patchi].size())
293 const label patchFacei =
294 mesh.boundaryMesh()[patchi].whichFace(facei);
296 internalCoeffs_[patchi][patchFacei] = Zero;
297 boundaryCoeffs_[patchi][patchFacei] = Zero;
309 const auto& bpsi = this->
psi(fieldi).boundaryField();
314 if (bpsi[patchi].useImplicit())
318 Pout<<
"fvMatrix<Type>::checkImplicit "
319 <<
" field:" << this->
psi(fieldi).name()
321 << this->
psi(fieldi).mesh().name()
322 <<
" patch:" << bpsi[patchi].patch().name()
333 lduAssemblyName_ =
word(
"lduAssembly") + idName;
336 return !idName.empty();
355 source_(
psi.size(), Zero),
358 faceFluxCorrectionPtr_(nullptr)
361 <<
"Constructing fvMatrix<Type> for field " << psi_.
name() <<
endl;
380 auto& psiRef = this->
psi(0);
381 const label currentStatePsi = psiRef.eventNo();
382 psiRef.boundaryFieldRef().updateCoeffs();
383 psiRef.eventNo() = currentStatePsi;
392 useImplicit_(fvm.useImplicit_),
393 lduAssemblyName_(fvm.lduAssemblyName_),
394 nMatrix_(fvm.nMatrix_),
395 dimensions_(fvm.dimensions_),
396 source_(fvm.source_),
397 internalCoeffs_(fvm.internalCoeffs_),
398 boundaryCoeffs_(fvm.boundaryCoeffs_),
399 faceFluxCorrectionPtr_(nullptr)
402 <<
"Copying fvMatrix<Type> for field " << psi_.
name() <<
endl;
404 if (fvm.faceFluxCorrectionPtr_)
406 faceFluxCorrectionPtr_ =
409 *(fvm.faceFluxCorrectionPtr_)
418 lduMatrix(tmat.constCast(), tmat.movable()),
420 useImplicit_(tmat().useImplicit_),
421 lduAssemblyName_(tmat().lduAssemblyName_),
422 nMatrix_(tmat().nMatrix_),
423 dimensions_(tmat().dimensions_),
424 source_(tmat.constCast().source_, tmat.movable()),
425 internalCoeffs_(tmat.constCast().internalCoeffs_, tmat.movable()),
426 boundaryCoeffs_(tmat.constCast().boundaryCoeffs_, tmat.movable()),
427 faceFluxCorrectionPtr_(nullptr)
430 <<
"Copy/move fvMatrix<Type> for field " << psi_.
name() <<
endl;
432 if (tmat().faceFluxCorrectionPtr_)
436 faceFluxCorrectionPtr_ = tmat().faceFluxCorrectionPtr_;
437 tmat().faceFluxCorrectionPtr_ =
nullptr;
441 faceFluxCorrectionPtr_ =
444 *(tmat().faceFluxCorrectionPtr_)
459 <<
"Destroying fvMatrix<Type> for field " << psi_.name() <<
endl;
462 subMatrices_.clear();
475 interfaces.
setSize(internalCoeffs_.size());
476 for (label fieldi = 0; fieldi < nMatrices(); fieldi++)
481 forAll (fieldInterfaces, patchi)
483 label globalPatchID = lduMeshPtr()->patchMap()[fieldi][patchi];
485 if (globalPatchID != -1)
487 if (fieldInterfaces.
set(patchi))
489 if (isA<cyclicLduInterfaceField>(bpsi[patchi]))
495 refCast<const fvPatch>
497 lduMeshPtr()->interfaces()[globalPatchID]
499 bpsi[patchi].internalField()
502 interfaces.
set(globalPatchID, &newInterfaces.
last());
505 else if (isA<cyclicAMILduInterfaceField>(bpsi[patchi]))
511 refCast<const fvPatch>
513 lduMeshPtr()->interfaces()[globalPatchID]
515 bpsi[patchi].internalField()
518 interfaces.
set(globalPatchID, &newInterfaces.
last());
520 else if (isA<cyclicACMILduInterfaceField>(bpsi[patchi]))
526 refCast<const fvPatch>
528 lduMeshPtr()->interfaces()[globalPatchID]
530 bpsi[patchi].internalField()
533 interfaces.
set(globalPatchID, &newInterfaces.
last());
537 interfaces.
set(globalPatchID, &fieldInterfaces[patchi]);
561 const label globalPtchId = patchMap[patchi];
563 if (globalPtchId != -1)
566 const Field<Type> saveContrib(fluxContrib[globalPtchId]);
567 contrib[patchi].
setSize(psi_.boundaryField()[patchi].size()),
576 psi_.boundaryField()[patchi].patchInternalField()
581 if (this->
psi(fieldi).boundaryField()[patchi].
coupled())
587 psi_.boundaryField()[patchi].patchNeighbourField()
592 else if (globalPtchId == -1)
595 this->
psi(fieldi).
mesh().boundaryMesh()[patchi];
605 const Field<Type> saveContrib(fluxContrib[virtualPatch]);
610 coeffs.
setSize(psi_.boundaryField()[patchi].size());
611 nbrCoeffs.
setSize(psi_.boundaryField()[nbrPatchId].size());
626 forAll(saveContrib, subFaceI)
630 const label nbrFaceId =
633 const label nbrCellId = nbrCellIds[subFaceI];
634 const label
cellId = cellIds[subFaceI];
641 nbrCoeffs[nbrFaceId] +=
649 nbrCoeffs[nbrFaceId] +=
667 for (label fieldi = 0; fieldi < nMatrices(); fieldi++)
669 const auto&
psi = this->
psi(fieldi);
676 internalCoeffs_.setSize(interfaceI);
677 boundaryCoeffs_.setSize(interfaceI);
680 for (label fieldi = 0; fieldi < nMatrices(); fieldi++)
682 const auto&
psi = this->
psi(fieldi);
702 for (label i=0; i < nMatrices(); ++i)
713 label globalPatchId = lduMeshPtr()->patchMap()[i][patchI];
714 if (globalPatchId == -1)
719 matrix(i).boundaryCoeffs()[patchI].clone()
724 matrix(i).internalCoeffs()[patchI].clone()
733 label globalPatchId = lduMeshPtr()->patchMap()[i][patchI];
734 if (globalPatchId != -1)
736 if (matrix(i).internalCoeffs().set(patchI))
741 matrix(i).internalCoeffs()[patchI].clone()
745 if (matrix(i).boundaryCoeffs().set(patchI))
750 matrix(i).boundaryCoeffs()[patchI].clone()
760 label globalPatchId = lduMeshPtr()->patchMap()[i][patchI];
761 if (globalPatchId == -1)
763 const label implicitPatchId =
764 lduMeshPtr()->patchLocalToGlobalMap()[i][patchI];
768 implicitPatchId, internal[implicit].clone()
772 implicitPatchId,
boundary[implicit].clone()
792 for (label i=0; i < nMatrices(); ++i)
796 label globalPatchId = lduMeshPtr()->patchMap()[i][patchI];
798 if (globalPatchId == -1)
816 const labelList& cellMap = lduMeshPtr()->cellOffsets();
818 label newFaces = lduMeshPtr()->lduAddr().upperAddr().
size();
819 label newCells = lduMeshPtr()->lduAddr().size();
826 bool asymmetricAssemby =
false;
827 for (label i=0; i < nMatrices(); ++i)
829 if (matrix(i).asymmetric())
831 asymmetricAssemby =
true;
835 for (label i=0; i < nMatrices(); ++i)
837 if (asymmetricAssemby)
842 lowerAssemb[
faceMap[i][facei]] = lowerSub[facei];
852 upperAssemb[
faceMap[i][facei]] = upperSub[facei];
857 const label globalCelli = cellMap[i] + celli;
858 diagAssemb[globalCelli] = diagSub[celli];
859 sourceAssemb[globalCelli] = sourceSub[celli];
863 if (asymmetricAssemby)
865 lower().setSize(newFaces,
Zero);
866 lower() = lowerAssemb;
868 upper().setSize(newFaces,
Zero);
869 upper() = upperAssemb;
875 source() = sourceAssemb;
883 psi_.
mesh().
thisDb().objectRegistry::template findObject
886 > (lduAssemblyName_);
897 psi_.mesh().thisDb().objectRegistry::template cfindObject
913 psi_.mesh().time().timeName(),
922 uFieldPtr(nMatrices());
924 for (label fieldi = 0; fieldi < nMatrices(); fieldi++)
930 &
const_cast<fvMesh&
>(meshi)
932 uFieldPtr.
set(fieldi, &this->
psi(fieldi));
940 lduAssemMeshPtr->
store();
941 lduAssemMeshPtr->
update(uFieldPtr);
944 <<
"Creating lduPrimitiveAssembly: " << lduAssemblyName_ <<
endl;
948 psi_.mesh().changing() && !psi_.mesh().upToDatePoints(*ptr)
954 psi_.mesh().setUpToDatePoints(*ptr);
957 <<
"Updating lduPrimitiveAssembly: " << lduAssemblyName_ <<
endl;
962 <<
"Using lduPrimitiveAssembly: " << lduAssemblyName_ <<
endl;
985 this->setValuesFromList(cellLabels, values);
996 this->setValuesFromList(cellLabels, values);
1005 const bool forceReference
1008 if ((forceReference || psi_.needReference()) && celli >= 0)
1010 source()[celli] +=
diag()[celli]*value;
1021 const bool forceReference
1024 if (forceReference || psi_.needReference())
1026 forAll(cellLabels, celli)
1028 const label
cellId = cellLabels[celli];
1044 const bool forceReference
1047 if (forceReference || psi_.needReference())
1049 forAll(cellLabels, celli)
1051 const label
cellId = cellLabels[celli];
1065 subMatrices_.append(matrix.
clone());
1071 <<
"incompatible dimensions for matrix addition "
1073 <<
"[" << dimensions_ <<
" ] "
1078 for (label fieldi = 0; fieldi < nMatrices(); fieldi++)
1080 if (checkImplicit(fieldi))
1086 internalCoeffs_.clear();
1087 boundaryCoeffs_.clear();
1100 <<
"Relaxing " << psi_.name() <<
" by " <<
alpha <<
endl;
1110 sumMagOffDiag(sumOff);
1113 forAll(psi_.boundaryField(), patchi)
1119 const labelUList& pa = lduAddr().patchAddr(patchi);
1124 const Field<Type>& pCoeffs = boundaryCoeffs_[patchi];
1151 scalar maxNon = 0.0;
1152 scalar sumNon = 0.0;
1155 scalar d = (sumOff[celli] -
D[celli])/
mag(
D[celli]);
1160 maxNon =
max(maxNon, d);
1189 <<
"Matrix dominance test for " << psi_.name() <<
nl
1190 <<
" number of non-dominant cells : " << nNon <<
nl
1191 <<
" maximum relative non-dominance : " << maxNon <<
nl
1192 <<
" average relative non-dominance : " << sumNon <<
nl
1201 D[celli] =
max(
mag(
D[celli]), sumOff[celli]);
1208 forAll(psi_.boundaryField(), patchi)
1214 const labelUList& pa = lduAddr().patchAddr(patchi);
1235 S += (
D - D0)*psi_.primitiveField();
1244 psi_.mesh().data::template getOrDefault<bool>
1245 (
"finalIteration",
false)
1248 if (psi_.mesh().relaxEquation(
name))
1250 relax(psi_.mesh().equationRelaxationFactor(
name));
1264 bFields[patchi].manipulateMatrix(*
this);
1273 addCmptAvBoundaryDiag(tdiag.
ref());
1283 forAll(psi_.boundaryField(), patchi)
1291 lduAddr().patchAddr(patchi),
1292 internalCoeffs_[patchi],
1311 "A("+psi_.name()+
')',
1318 dimensions_/psi_.dimensions()/
dimVol,
1319 extrapolatedCalculatedFvPatchScalarField::typeName
1323 tAphi.
ref().primitiveFieldRef() =
D()/psi_.mesh().V();
1324 tAphi.
ref().correctBoundaryConditions();
1340 "H("+psi_.name()+
')',
1348 extrapolatedCalculatedFvPatchScalarField::typeName
1354 for (
direction cmpt=0; cmpt<Type::nComponents; cmpt++)
1356 scalarField psiCmpt(psi_.primitiveField().component(cmpt));
1359 addBoundaryDiag(boundaryDiagCmpt, cmpt);
1360 boundaryDiagCmpt.
negate();
1361 addCmptAvBoundaryDiag(boundaryDiagCmpt);
1372 typename Type::labelType validComponents
1374 psi_.mesh().template validComponents<Type>()
1377 for (
direction cmpt=0; cmpt<Type::nComponents; cmpt++)
1379 if (validComponents[cmpt] == -1)
1409 dimensions_/(
dimVol*psi_.dimensions()),
1410 extrapolatedCalculatedFvPatchScalarField::typeName
1417 forAll(psi_.boundaryField(), patchi)
1425 lduAddr().patchAddr(patchi),
1445 if (!psi_.mesh().fluxRequired(psi_.name()))
1448 <<
"flux requested but " << psi_.name()
1449 <<
" not specified in the fluxRequired sub-dictionary"
1454 if (nMatrices() > 1)
1457 <<
"Flux requested but " << psi_.name()
1458 <<
" can't handle multiple fvMatrix."
1469 "flux("+psi_.name()+
')',
1484 for (
direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
1498 forAll(InternalContrib, patchi)
1500 InternalContrib[patchi] =
1503 InternalContrib[patchi],
1504 psi_.boundaryField()[patchi].patchInternalField()
1512 mapContributions(fieldi, fluxInternalContrib, InternalContrib,
true);
1519 forAll(NeighbourContrib, patchi)
1521 if (psi_.boundaryField()[patchi].coupled())
1523 NeighbourContrib[patchi] =
1526 NeighbourContrib[patchi],
1527 psi_.boundaryField()[patchi].patchNeighbourField()
1536 mapContributions(fieldi, fluxBoundaryContrib, NeighbourContrib,
false);
1544 ffbf[patchi] = InternalContrib[patchi] - NeighbourContrib[patchi];
1548 if (faceFluxCorrectionPtr_)
1550 fieldFlux += *faceFluxCorrectionPtr_;
1560 return psi_.mesh().solverDict
1564 psi_.mesh().data::template getOrDefault<bool>
1565 (
"finalIteration",
false)
1581 if (&psi_ != &(fvmv.psi_))
1584 <<
"different fields"
1588 dimensions_ = fvmv.dimensions_;
1590 source_ = fvmv.source_;
1591 internalCoeffs_ = fvmv.internalCoeffs_;
1592 boundaryCoeffs_ = fvmv.boundaryCoeffs_;
1594 if (faceFluxCorrectionPtr_ && fvmv.faceFluxCorrectionPtr_)
1596 *faceFluxCorrectionPtr_ = *fvmv.faceFluxCorrectionPtr_;
1598 else if (fvmv.faceFluxCorrectionPtr_)
1600 faceFluxCorrectionPtr_ =
1602 (*fvmv.faceFluxCorrectionPtr_);
1605 useImplicit_ = fvmv.useImplicit_;
1606 lduAssemblyName_ = fvmv.lduAssemblyName_;
1623 internalCoeffs_.negate();
1624 boundaryCoeffs_.negate();
1626 if (faceFluxCorrectionPtr_)
1628 faceFluxCorrectionPtr_->negate();
1638 dimensions_ += fvmv.dimensions_;
1640 source_ += fvmv.source_;
1641 internalCoeffs_ += fvmv.internalCoeffs_;
1642 boundaryCoeffs_ += fvmv.boundaryCoeffs_;
1644 useImplicit_ = fvmv.useImplicit_;
1645 lduAssemblyName_ = fvmv.lduAssemblyName_;
1646 nMatrix_ = fvmv.nMatrix_;
1648 if (faceFluxCorrectionPtr_ && fvmv.faceFluxCorrectionPtr_)
1650 *faceFluxCorrectionPtr_ += *fvmv.faceFluxCorrectionPtr_;
1652 else if (fvmv.faceFluxCorrectionPtr_)
1654 faceFluxCorrectionPtr_ =
new
1657 *fvmv.faceFluxCorrectionPtr_
1666 operator+=(tfvmv());
1676 dimensions_ -= fvmv.dimensions_;
1678 source_ -= fvmv.source_;
1679 internalCoeffs_ -= fvmv.internalCoeffs_;
1680 boundaryCoeffs_ -= fvmv.boundaryCoeffs_;
1682 useImplicit_ = fvmv.useImplicit_;
1683 lduAssemblyName_ = fvmv.lduAssemblyName_;
1684 nMatrix_ = fvmv.nMatrix_;
1686 if (faceFluxCorrectionPtr_ && fvmv.faceFluxCorrectionPtr_)
1688 *faceFluxCorrectionPtr_ -= *fvmv.faceFluxCorrectionPtr_;
1690 else if (fvmv.faceFluxCorrectionPtr_)
1692 faceFluxCorrectionPtr_ =
1694 (-*fvmv.faceFluxCorrectionPtr_);
1702 operator-=(tfvmv());
1714 source() -= su.mesh().V()*su.field();
1747 source() += su.mesh().V()*su.field();
1779 source() -=
psi().
mesh().V()*su;
1789 source() +=
psi().
mesh().V()*su;
1809 dimensions_ *= dsf.dimensions();
1811 source_ *= dsf.field();
1813 forAll(boundaryCoeffs_, patchi)
1817 dsf.mesh().boundary()[patchi].patchInternalField(dsf.field())
1820 internalCoeffs_[patchi] *= pisf;
1821 boundaryCoeffs_[patchi] *= pisf;
1824 if (faceFluxCorrectionPtr_)
1827 <<
"cannot scale a matrix containing a faceFluxCorrection"
1861 dimensions_ *= ds.dimensions();
1863 source_ *= ds.value();
1864 internalCoeffs_ *= ds.value();
1865 boundaryCoeffs_ *= ds.value();
1867 if (faceFluxCorrectionPtr_)
1869 *faceFluxCorrectionPtr_ *= ds.value();
1884 if (&mat1.
psi() != &mat2.
psi())
1887 <<
"Incompatible fields for operation\n "
1888 <<
"[" << mat1.
psi().name() <<
"] "
1890 <<
" [" << mat2.
psi().name() <<
"]"
1901 <<
"Incompatible dimensions for operation\n "
1925 <<
"Incompatible dimensions for operation\n "
1928 <<
" [" <<
fld.name() <<
fld.dimensions() <<
" ]"
1949 <<
"Incompatible dimensions for operation\n "
1961 fvMatrix<Type>& fvm,
1962 const dictionary& solverControls
1965 return fvm.solve(solverControls);
1971 const tmp<fvMatrix<Type>>& tmat,
1972 const dictionary& solverControls
1975 SolverPerformance<Type> solverPerf(tmat.constCast().solve(solverControls));
1992 SolverPerformance<Type> solverPerf(tmat.constCast().solve());
2003 const fvMatrix<Type>&
A
2006 tmp<Foam::fvMatrix<Type>> tAcorr =
A - (
A &
A.psi());
2019 const tmp<fvMatrix<Type>>& tA
2022 tmp<Foam::fvMatrix<Type>> tAcorr = tA - (tA() & tA().psi());
2037 const fvMatrix<Type>&
A,
2038 const fvMatrix<Type>&
B
2048 const tmp<fvMatrix<Type>>& tA,
2049 const fvMatrix<Type>&
B
2059 const fvMatrix<Type>&
A,
2060 const tmp<fvMatrix<Type>>& tB
2070 const tmp<fvMatrix<Type>>& tA,
2071 const tmp<fvMatrix<Type>>& tB
2081 const fvMatrix<Type>&
A,
2082 const DimensionedField<Type, volMesh>& su
2086 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2087 tC.ref().source() += su.mesh().V()*su.field();
2094 const fvMatrix<Type>&
A,
2095 const tmp<DimensionedField<Type, volMesh>>& tsu
2099 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2100 tC.ref().source() += tsu().mesh().V()*tsu().field();
2108 const fvMatrix<Type>&
A,
2109 const tmp<GeometricField<Type, fvPatchField, volMesh>>& tsu
2113 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2114 tC.ref().source() += tsu().mesh().V()*tsu().primitiveField();
2122 const tmp<fvMatrix<Type>>& tA,
2123 const DimensionedField<Type, volMesh>& su
2127 tmp<fvMatrix<Type>> tC(tA.ptr());
2128 tC.ref().source() += su.mesh().V()*su.field();
2135 const tmp<fvMatrix<Type>>& tA,
2136 const tmp<DimensionedField<Type, volMesh>>& tsu
2140 tmp<fvMatrix<Type>> tC(tA.ptr());
2141 tC.ref().source() += tsu().mesh().V()*tsu().field();
2149 const tmp<fvMatrix<Type>>& tA,
2150 const tmp<GeometricField<Type, fvPatchField, volMesh>>& tsu
2154 tmp<fvMatrix<Type>> tC(tA.ptr());
2155 tC.ref().source() += tsu().mesh().V()*tsu().primitiveField();
2163 const fvMatrix<Type>&
A,
2164 const dimensioned<Type>& su
2168 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2169 tC.ref().source() +=
A.psi().mesh().V()*su.value();
2176 const tmp<fvMatrix<Type>>& tA,
2177 const dimensioned<Type>& su
2181 tmp<fvMatrix<Type>> tC(tA.ptr());
2182 tC.ref().source() += tC().psi().mesh().V()*su.value();
2189 const fvMatrix<Type>&
A,
2200 const tmp<fvMatrix<Type>>& tA,
2211 const fvMatrix<Type>&
A
2214 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2222 const tmp<fvMatrix<Type>>& tA
2225 tmp<fvMatrix<Type>> tC(tA.ptr());
2234 const fvMatrix<Type>&
A,
2235 const fvMatrix<Type>&
B
2239 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2247 const tmp<fvMatrix<Type>>& tA,
2248 const fvMatrix<Type>&
B
2252 tmp<fvMatrix<Type>> tC(tA.
ptr());
2260 const fvMatrix<Type>&
A,
2261 const tmp<fvMatrix<Type>>& tB
2265 tmp<fvMatrix<Type>> tC(tB.ptr());
2273 const tmp<fvMatrix<Type>>& tA,
2274 const tmp<fvMatrix<Type>>& tB
2278 tmp<fvMatrix<Type>> tC(tA.
ptr());
2287 const fvMatrix<Type>&
A,
2288 const DimensionedField<Type, volMesh>& su
2292 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2293 tC.ref().source() -= su.mesh().V()*su.field();
2300 const fvMatrix<Type>&
A,
2301 const tmp<DimensionedField<Type, volMesh>>& tsu
2305 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2306 tC.ref().source() -= tsu().mesh().V()*tsu().field();
2314 const fvMatrix<Type>&
A,
2315 const tmp<GeometricField<Type, fvPatchField, volMesh>>& tsu
2319 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2320 tC.ref().source() -= tsu().mesh().V()*tsu().primitiveField();
2328 const tmp<fvMatrix<Type>>& tA,
2329 const DimensionedField<Type, volMesh>& su
2333 tmp<fvMatrix<Type>> tC(tA.
ptr());
2334 tC.ref().source() -= su.mesh().V()*su.field();
2341 const tmp<fvMatrix<Type>>& tA,
2342 const tmp<DimensionedField<Type, volMesh>>& tsu
2346 tmp<fvMatrix<Type>> tC(tA.
ptr());
2347 tC.ref().source() -= tsu().mesh().V()*tsu().field();
2355 const tmp<fvMatrix<Type>>& tA,
2356 const tmp<GeometricField<Type, fvPatchField, volMesh>>& tsu
2360 tmp<fvMatrix<Type>> tC(tA.
ptr());
2361 tC.ref().source() -= tsu().mesh().V()*tsu().primitiveField();
2369 const DimensionedField<Type, volMesh>& su,
2370 const fvMatrix<Type>&
A
2374 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2375 tC.ref().source() -= su.mesh().V()*su.field();
2382 const tmp<DimensionedField<Type, volMesh>>& tsu,
2383 const fvMatrix<Type>&
A
2387 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2388 tC.ref().source() -= tsu().mesh().V()*tsu().field();
2396 const tmp<GeometricField<Type, fvPatchField, volMesh>>& tsu,
2397 const fvMatrix<Type>&
A
2401 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2402 tC.ref().source() -= tsu().mesh().V()*tsu().primitiveField();
2410 const DimensionedField<Type, volMesh>& su,
2411 const tmp<fvMatrix<Type>>& tA
2415 tmp<fvMatrix<Type>> tC(tA.
ptr());
2416 tC.ref().source() -= su.mesh().V()*su.field();
2423 const tmp<DimensionedField<Type, volMesh>>& tsu,
2424 const tmp<fvMatrix<Type>>& tA
2428 tmp<fvMatrix<Type>> tC(tA.
ptr());
2429 tC.ref().source() -= tsu().mesh().V()*tsu().field();
2437 const tmp<GeometricField<Type, fvPatchField, volMesh>>& tsu,
2438 const tmp<fvMatrix<Type>>& tA
2442 tmp<fvMatrix<Type>> tC(tA.
ptr());
2443 tC.ref().source() -= tsu().mesh().V()*tsu().primitiveField();
2452 const fvMatrix<Type>&
A,
2453 const fvMatrix<Type>&
B
2457 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2465 const tmp<fvMatrix<Type>>& tA,
2466 const fvMatrix<Type>&
B
2470 tmp<fvMatrix<Type>> tC(tA.
ptr());
2478 const fvMatrix<Type>&
A,
2479 const tmp<fvMatrix<Type>>& tB
2483 tmp<fvMatrix<Type>> tC(tB.ptr());
2492 const tmp<fvMatrix<Type>>& tA,
2493 const tmp<fvMatrix<Type>>& tB
2497 tmp<fvMatrix<Type>> tC(tA.
ptr());
2506 const fvMatrix<Type>&
A,
2507 const DimensionedField<Type, volMesh>& su
2511 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2512 tC.ref().source() += su.mesh().V()*su.field();
2519 const fvMatrix<Type>&
A,
2520 const tmp<DimensionedField<Type, volMesh>>& tsu
2524 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2525 tC.ref().source() += tsu().mesh().V()*tsu().field();
2533 const fvMatrix<Type>&
A,
2534 const tmp<GeometricField<Type, fvPatchField, volMesh>>& tsu
2538 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2539 tC.ref().source() += tsu().mesh().V()*tsu().primitiveField();
2547 const tmp<fvMatrix<Type>>& tA,
2548 const DimensionedField<Type, volMesh>& su
2552 tmp<fvMatrix<Type>> tC(tA.
ptr());
2553 tC.ref().source() += su.mesh().V()*su.field();
2560 const tmp<fvMatrix<Type>>& tA,
2561 const tmp<DimensionedField<Type, volMesh>>& tsu
2565 tmp<fvMatrix<Type>> tC(tA.
ptr());
2566 tC.ref().source() += tsu().mesh().V()*tsu().field();
2574 const tmp<fvMatrix<Type>>& tA,
2575 const tmp<GeometricField<Type, fvPatchField, volMesh>>& tsu
2579 tmp<fvMatrix<Type>> tC(tA.
ptr());
2580 tC.ref().source() += tsu().mesh().V()*tsu().primitiveField();
2588 const DimensionedField<Type, volMesh>& su,
2589 const fvMatrix<Type>&
A
2593 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2595 tC.ref().source() -= su.mesh().V()*su.field();
2602 const tmp<DimensionedField<Type, volMesh>>& tsu,
2603 const fvMatrix<Type>&
A
2607 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2609 tC.ref().source() -= tsu().mesh().V()*tsu().field();
2617 const tmp<GeometricField<Type, fvPatchField, volMesh>>& tsu,
2618 const fvMatrix<Type>&
A
2622 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2624 tC.ref().source() -= tsu().mesh().V()*tsu().primitiveField();
2632 const DimensionedField<Type, volMesh>& su,
2633 const tmp<fvMatrix<Type>>& tA
2637 tmp<fvMatrix<Type>> tC(tA.
ptr());
2639 tC.ref().source() -= su.mesh().V()*su.field();
2646 const tmp<DimensionedField<Type, volMesh>>& tsu,
2647 const tmp<fvMatrix<Type>>& tA
2651 tmp<fvMatrix<Type>> tC(tA.
ptr());
2653 tC.ref().source() -= tsu().mesh().V()*tsu().field();
2661 const tmp<GeometricField<Type, fvPatchField, volMesh>>& tsu,
2662 const tmp<fvMatrix<Type>>& tA
2666 tmp<fvMatrix<Type>> tC(tA.
ptr());
2668 tC.ref().source() -= tsu().mesh().V()*tsu().primitiveField();
2676 const fvMatrix<Type>&
A,
2677 const dimensioned<Type>& su
2681 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2682 tC.ref().source() -= su.value()*
A.psi().mesh().V();
2689 const tmp<fvMatrix<Type>>& tA,
2690 const dimensioned<Type>& su
2694 tmp<fvMatrix<Type>> tC(tA.
ptr());
2695 tC.ref().source() -= su.value()*tC().psi().mesh().V();
2702 const dimensioned<Type>& su,
2703 const fvMatrix<Type>&
A
2707 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2708 tC.ref().source() -= su.value()*
A.psi().mesh().V();
2715 const dimensioned<Type>& su,
2716 const tmp<fvMatrix<Type>>& tA
2720 tmp<fvMatrix<Type>> tC(tA.
ptr());
2721 tC.ref().source() -= su.value()*tC().psi().mesh().V();
2728 const fvMatrix<Type>&
A,
2729 const dimensioned<Type>& su
2733 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2734 tC.ref().source() += su.value()*tC().psi().mesh().V();
2741 const tmp<fvMatrix<Type>>& tA,
2742 const dimensioned<Type>& su
2746 tmp<fvMatrix<Type>> tC(tA.
ptr());
2747 tC.ref().source() += su.value()*tC().psi().mesh().V();
2754 const dimensioned<Type>& su,
2755 const fvMatrix<Type>&
A
2759 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2761 tC.ref().source() -= su.value()*
A.psi().mesh().V();
2768 const dimensioned<Type>& su,
2769 const tmp<fvMatrix<Type>>& tA
2773 tmp<fvMatrix<Type>> tC(tA.
ptr());
2775 tC.ref().source() -= su.value()*tC().psi().mesh().V();
2784 const fvMatrix<Type>&
A
2787 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2795 const tmp<volScalarField::Internal>& tdsf,
2796 const fvMatrix<Type>&
A
2799 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2807 const tmp<volScalarField>& tvsf,
2808 const fvMatrix<Type>&
A
2811 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2820 const tmp<fvMatrix<Type>>& tA
2823 tmp<fvMatrix<Type>> tC(tA.
ptr());
2831 const tmp<volScalarField::Internal>& tdsf,
2832 const tmp<fvMatrix<Type>>& tA
2835 tmp<fvMatrix<Type>> tC(tA.
ptr());
2843 const tmp<volScalarField>& tvsf,
2844 const tmp<fvMatrix<Type>>& tA
2847 tmp<fvMatrix<Type>> tC(tA.
ptr());
2855 const dimensioned<scalar>& ds,
2856 const fvMatrix<Type>&
A
2859 tmp<fvMatrix<Type>> tC(
new fvMatrix<Type>(
A));
2867 const dimensioned<scalar>& ds,
2868 const tmp<fvMatrix<Type>>& tA
2871 tmp<fvMatrix<Type>> tC(tA.
ptr());
2881 const fvMatrix<Type>&
M,
2882 const DimensionedField<Type, volMesh>&
psi
2885 tmp<GeometricField<Type, fvPatchField, volMesh>> tMphi
2887 new GeometricField<Type, fvPatchField, volMesh>
2899 extrapolatedCalculatedFvPatchScalarField::typeName
2902 GeometricField<Type, fvPatchField, volMesh>& Mphi = tMphi.ref();
2907 for (
direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
2911 M.addBoundaryDiag(boundaryDiagCmpt, cmpt);
2912 Mphi.primitiveFieldRef().replace(cmpt, -boundaryDiagCmpt*psiCmpt);
2917 Mphi.primitiveFieldRef() =
Zero;
2920 Mphi.primitiveFieldRef() +=
M.lduMatrix::H(
psi.
field()) +
M.source();
2921 M.addBoundarySource(Mphi.primitiveFieldRef());
2923 Mphi.primitiveFieldRef() /= -
psi.
mesh().V();
2924 Mphi.correctBoundaryConditions();
2933 const fvMatrix<Type>&
M,
2934 const tmp<DimensionedField<Type, volMesh>>& tpsi
2937 tmp<GeometricField<Type, fvPatchField, volMesh>> tMpsi =
M & tpsi();
2946 const fvMatrix<Type>&
M,
2947 const tmp<GeometricField<Type, fvPatchField, volMesh>>& tpsi
2950 tmp<GeometricField<Type, fvPatchField, volMesh>> tMpsi =
M & tpsi();
2959 const tmp<fvMatrix<Type>>& tM,
2960 const DimensionedField<Type, volMesh>&
psi
2963 tmp<GeometricField<Type, fvPatchField, volMesh>> tMpsi = tM() &
psi;
2972 const tmp<fvMatrix<Type>>& tM,
2973 const tmp<DimensionedField<Type, volMesh>>& tpsi
2976 tmp<GeometricField<Type, fvPatchField, volMesh>> tMpsi = tM() & tpsi();
2986 const tmp<fvMatrix<Type>>& tM,
2987 const tmp<GeometricField<Type, fvPatchField, volMesh>>& tpsi
2990 tmp<GeometricField<Type, fvPatchField, volMesh>> tMpsi = tM() & tpsi();
3002 os << static_cast<const lduMatrix&>(fvm) <<
nl
3003 << fvm.dimensions_ <<
nl
3004 << fvm.source_ <<
nl
3005 << fvm.internalCoeffs_ <<
nl
3006 << fvm.boundaryCoeffs_ <<
endl;
static const Foam::dimensionedScalar A("", Foam::dimPressure, 611.21)
static const Foam::dimensionedScalar B("", Foam::dimless, 18.678)
Info<< nl<< "Wrote faMesh in vtk format: "<< writer.output().name()<< nl;}{ vtk::lineWriter writer(aMesh.points(), aMesh.edges(), fileName(aMesh.mesh().time().globalPath()/"finiteArea-edges"));writer.writeGeometry();writer.beginCellData(4);writer.writeProcIDs();{ Field< scalar > fld(faMeshTools::flattenEdgeField(aMesh.magLe(), true))
Field with dimensions and associated with geometry type GeoMesh which is used to size the field and a...
const dimensionSet & dimensions() const
Return dimensions.
const Mesh & mesh() const
Return mesh.
void setOriented(const bool oriented=true) noexcept
Set the oriented flag.
const Field< Type > & field() const
Return field.
A field of fields is a PtrList of fields with reference counting.
Generic templated field type.
void replace(const direction, const UList< cmptType > &)
Replace a component field of the field.
void negate()
Inplace negate this field (negative).
Generic GeometricField class.
DimensionedField< scalar, volMesh > Internal
The internal field type from which this GeometricField is derived.
void replace(const direction d, const GeometricField< cmptType, PatchField, GeoMesh > &gcf)
Replace specified field component with content from another field.
Internal::FieldType & primitiveFieldRef(const bool updateAccessTime=true)
Return a reference to the internal field.
Boundary & boundaryFieldRef(const bool updateAccessTime=true)
Return a reference to the boundary field.
const Boundary & boundaryField() const
Return const-reference to the boundary field.
void correctBoundaryConditions()
Correct boundary field.
Defines the attributes of an object for which implicit objectRegistry management is supported,...
const word & name() const noexcept
Return the object name.
const fileName & instance() const noexcept
Read access to instance path component.
virtual bool check(const char *operation) const
Check IOstream status for given operation.
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.
void setSize(const label n)
Alias for resize()
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
A dynamically resizable PtrList with allocation management.
void append(T *ptr)
Append an element to the end of the list.
void setSize(const label newLen)
Same as resize()
A List with indirect addressing. Like IndirectList but does not store addressing.
void size(const label n)
Older name for setAddressableSize.
static int & msgType() noexcept
Message tag of standard messages.
const T * set(const label i) const
void setSize(const label n)
Alias for resize()
label size() const noexcept
The number of elements in the list.
T & last()
Return reference to the last element of the list.
This boundary condition enforces a cyclic condition between a pair of boundaries, whereby communicati...
This boundary condition enforces a cyclic condition between a pair of boundaries, whereby communicati...
This boundary condition enforces a cyclic condition between a pair of boundaries.
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
Dimension set for the base types, which can be used to implement rigorous dimension checking for alge...
static bool checking() noexcept
True if dimension checking is enabled (the usual default)
Generic dimensioned Type class.
const dimensionSet & dimensions() const
Return const reference to dimensions.
const Type & value() const
Return const reference to value.
const word & name() const
Return const reference to name.
tmp< GeometricField< Type, faPatchField, areaMesh > > H() const
Return the H operation source.
const faBoundaryMesh & boundary() const noexcept
Return constant reference to boundary mesh.
A face is a list of labels corresponding to mesh vertices.
A special matrix type and solver, designed for finite volume solutions of scalar equations....
void operator-=(const fvMatrix< Type > &)
tmp< Field< Type > > DD() const
Return the matrix Type diagonal.
tmp< GeometricField< Type, fvsPatchField, surfaceMesh > > flux() const
Return the face-flux field from the matrix.
tmp< volScalarField > A() const
Return the central coefficient.
void manipulateMatrix(direction cmp)
Manipulate matrix.
void addToInternalField(const labelUList &addr, const Field< Type2 > &pf, Field< Type2 > &intf) const
Add patch contribution to internal field.
void mapContributions(label fieldi, const FieldField< Field, Type > &fluxContrib, FieldField< Field, Type > &contrib, bool internal) const
Add internal and boundary contribution to local patches.
void setReferences(const labelUList &cellLabels, const Type &value, const bool forceReference=false)
Set reference level for solution.
void transferFvMatrixCoeffs()
Transfer lower, upper, diag and source to this fvMatrix.
void relax()
Relax matrix (for steady-state solution).
tmp< volScalarField > H1() const
Return H(1)
void operator+=(const fvMatrix< Type > &)
void createOrUpdateLduPrimitiveAssembly()
Create or update ldu assembly.
virtual ~fvMatrix()
Destructor.
void setValues(const labelUList &cellLabels, const Type &value)
const dimensionSet & dimensions() const noexcept
void addCmptAvBoundaryDiag(scalarField &diag) const
void addBoundarySource(Field< Type > &source, const bool couples=true) const
void setReference(const label celli, const Type &value, const bool forceReference=false)
Set reference level for solution.
void boundaryManipulate(typename GeometricField< Type, fvPatchField, volMesh >::Boundary &values)
Manipulate based on a boundary field.
void setInterfaces(lduInterfaceFieldPtrsList &, PtrDynList< lduInterfaceField > &newInterfaces)
Set interfaces.
tmp< GeometricField< Type, fvPatchField, volMesh > > H() const
Return the H operation source.
void addBoundaryDiag(scalarField &diag, const direction cmpt) const
void negate()
Inplace negate.
tmp< fvMatrix< Type > > clone() const
Construct and return a clone.
void addFvMatrix(fvMatrix< Type > &matrix)
Add fvMatrix.
tmp< scalarField > D() const
Return the matrix scalar diagonal.
void subtractFromInternalField(const labelUList &addr, const Field< Type2 > &pf, Field< Type2 > &intf) const
Subtract patch contribution from internal field.
const GeometricField< Type, fvPatchField, volMesh > & psi(const label i=0) const
Return psi.
bool checkImplicit(const label fieldi=0)
Name the implicit assembly addressing.
lduPrimitiveMeshAssembly * lduMeshPtr()
Access to lduPrimitiveMeshAssembly.
void operator=(const fvMatrix< Type > &)
void setValuesFromList(const labelUList &cellLabels, const ListType< Type > &values)
Set solution in given cells to the specified values.
const dictionary & solverDict() const
Return the solver dictionary taking into account finalIteration.
void setBounAndInterCoeffs()
Manipulate boundary/internal coeffs for coupling.
Mesh data needed to do the Finite Volume discretisation.
Abstract base class with a fat-interface to all derived classes covering all possible ways in which t...
virtual tmp< Field< Type > > patchNeighbourField() const
Return patchField on the opposite patch of a coupled patch.
virtual bool coupled() const
Return true if this patch field is coupled.
void clearOut()
Clear additional addressing.
lduMatrix is a general matrix class in which the coefficients are stored as three arrays,...
tmp< scalarField > H1() const
void operator=(const lduMatrix &)
tmp< Field< Type > > faceH(const Field< Type > &) const
void operator*=(const scalarField &)
void operator+=(const lduMatrix &)
void operator-=(const lduMatrix &)
virtual const objectRegistry & thisDb() const
Return the object registry.
An assembly of lduMatrix that is specific inter-region coupling through mapped patches.
const labelListListList & cellBoundMap() const
Return patch local sub-face to nbrCellId map.
const labelListList & patchMap() const
Return patchMap.
const labelListListList & facePatchFaceMap() const
Return patch local sub-face to local patch face map.
const labelListList & patchLocalToGlobalMap() const
Return patchLocalToGlobalMap.
void update(UPtrList< GeometricField< Type, fvPatchField, volMesh > > &psis)
Update mappings.
static const lduMesh & mesh(const lduMesh &mesh0, const PtrList< lduPrimitiveMesh > &otherMeshes, const label meshI)
Select either mesh0 (meshI is 0) or otherMeshes[meshI-1].
virtual const lduAddressing & lduAddr() const
Return ldu addressing.
A class representing the concept of 1 (one) that can be used to avoid manipulating objects known to b...
A patch is a list of labels that address the faces in the global face list.
virtual label neighbPolyPatchID() const
Return nbr patchID.
virtual bool masterImplicit() const
Return implicit master.
A class for managing temporary objects.
void clear() const noexcept
T * ptr() const
Return managed pointer for reuse, or clone() the object reference.
A class for handling words, derived from Foam::string.
A class representing the concept of 0 (zero) that can be used to avoid manipulating objects known to ...
const volScalarField & psi
bool coupled(solutionDict.getOrDefault("coupledEnergyField", false))
Template functions to aid in the implementation of demand driven data.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
OBJstream os(runTime.globalPath()/outputName)
IOobject io("surfaceFilmProperties", mesh.time().constant(), mesh, IOobject::READ_IF_PRESENT, IOobject::NO_WRITE, false)
#define DebugInFunction
Report an information message using Foam::Info.
#define InfoInFunction
Report an information message using Foam::Info.
void checkMethod(const faMatrix< Type > &, const faMatrix< Type > &, const char *)
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
Pair< int > faceMap(const label facePi, const face &faceP, const label faceNi, const face &faceN)
label max(const labelHashSet &set, label maxValue=labelMin)
Find the max value in labelHashSet, optionally limited by second argument.
void component(FieldField< Field, typename FieldField< Field, Type >::cmptType > &sf, const FieldField< Field, Type > &f, const direction d)
void cmptMin(FieldField< Field, typename FieldField< Field, Type >::cmptType > &cf, const FieldField< Field, Type > &f)
messageStream Info
Information stream (stdout output on master, null elsewhere)
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
Ostream & operator<<(Ostream &, const boundaryPatch &p)
Write boundaryPatch as dictionary entries (without surrounding braces)
Ostream & endl(Ostream &os)
Add newline and flush stream.
dimensioned< typename typeOfMag< Type >::type > mag(const dimensioned< Type > &dt)
void reduce(const List< UPstream::commsStruct > &comms, T &value, const BinaryOp &bop, const int tag, const label comm)
errorManip< error > abort(error &err)
void cmptMax(FieldField< Field, typename FieldField< Field, Type >::cmptType > &cf, const FieldField< Field, Type > &f)
static constexpr const zero Zero
Global zero (0)
dimensioned< Type > cmptMultiply(const dimensioned< Type > &, const dimensioned< Type > &)
tmp< fvMatrix< Type > > correction(const fvMatrix< Type > &)
const dimensionSet dimVolume(pow3(dimLength))
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for INVALID.
void cmptMag(FieldField< Field, Type > &cf, const FieldField< Field, Type > &f)
T returnReduce(const T &value, const BinaryOp &bop, const int tag=UPstream::msgType(), const label comm=UPstream::worldComm)
Reduce (copy) and return value.
prefixOSstream Pout
OSstream wrapped stdout (std::cout) with parallel prefix.
tmp< DimensionedField< typename DimensionedField< Type, GeoMesh >::cmptType, GeoMesh > > cmptAv(const DimensionedField< Type, GeoMesh > &df)
void diag(pointPatchField< vector > &, const pointPatchField< tensor > &)
void deleteDemandDrivenData(DataPtr &dataPtr)
const dimensionSet dimVol(dimVolume)
Older spelling for dimVolume.
constexpr char nl
The newline '\n' character (0x0a)
SolverPerformance< Type > solve(faMatrix< Type > &, const dictionary &)
Solve returning the solution statistics given convergence tolerance.
const dimensionedScalar & D
#define forAll(list, i)
Loop across all elements in list.
A non-counting (dummy) refCount.
conserve primitiveFieldRef()+