47 <<
"sizes of addressing and field are different" 53 intf[addr[facei]] += pf[facei];
67 addToInternalField(addr, tpf(), intf);
84 <<
"sizes of addressing and field are different" 90 intf[addr[facei]] -= pf[facei];
104 subtractFromInternalField(addr, tpf(), intf);
120 lduAddr().patchAddr(
patchi),
135 lduAddr().patchAddr(
patchi),
157 addToInternalField(lduAddr().patchAddr(
patchi), pbc, source);
168 source[addr[facei]] +=
cmptMultiply(pbc[facei], pnf[facei]);
176 template<
template<
class>
class ListType>
180 const ListType<Type>& values
198 const label celli = cellLabels[i];
199 const Type& value = values[i];
202 source_[celli] = value*Diag[celli];
204 if (symmetric() || asymmetric())
206 const cell&
c = cells[celli];
210 const label facei = c[j];
216 if (celli == own[facei])
218 source_[nei[facei]] -= upper()[facei]*value;
222 source_[own[facei]] -= upper()[facei]*value;
225 upper()[facei] = 0.0;
229 if (celli == own[facei])
231 source_[nei[facei]] -= lower()[facei]*value;
235 source_[own[facei]] -= upper()[facei]*value;
238 upper()[facei] = 0.0;
239 lower()[facei] = 0.0;
246 if (internalCoeffs_[patchi].size())
251 internalCoeffs_[
patchi][patchFacei] =
254 boundaryCoeffs_[
patchi][patchFacei] =
277 internalCoeffs_(psi.
mesh().boundary().size()),
278 boundaryCoeffs_(psi.
mesh().boundary().size()),
279 faceFluxCorrectionPtr_(
nullptr)
284 <<
"Constructing fvMatrix<Type> for field " << psi_.name() <<
endl;
317 psiRef.
eventNo() = currentStatePsi;
327 dimensions_(fvm.dimensions_),
328 source_(fvm.source_),
329 internalCoeffs_(fvm.internalCoeffs_),
330 boundaryCoeffs_(fvm.boundaryCoeffs_),
331 faceFluxCorrectionPtr_(nullptr)
336 <<
"Copying fvMatrix<Type> for field " << psi_.name() <<
endl;
339 if (fvm.faceFluxCorrectionPtr_)
341 faceFluxCorrectionPtr_ =
new 344 *(fvm.faceFluxCorrectionPtr_)
350 #ifndef NoConstructFromTmp 356 const_cast<
fvMatrix<Type>&>(tfvm()),
360 dimensions_(tfvm().dimensions_),
363 const_cast<
fvMatrix<Type>&>(tfvm()).source_,
368 const_cast<
fvMatrix<Type>&>(tfvm()).internalCoeffs_,
373 const_cast<
fvMatrix<Type>&>(tfvm()).boundaryCoeffs_,
376 faceFluxCorrectionPtr_(nullptr)
381 <<
"Copying fvMatrix<Type> for field " << psi_.name() <<
endl;
384 if (tfvm().faceFluxCorrectionPtr_)
388 faceFluxCorrectionPtr_ = tfvm().faceFluxCorrectionPtr_;
389 tfvm().faceFluxCorrectionPtr_ =
nullptr;
393 faceFluxCorrectionPtr_ =
new 396 *(tfvm().faceFluxCorrectionPtr_)
417 internalCoeffs_(psi.
mesh().boundary().size()),
418 boundaryCoeffs_(psi.
mesh().boundary().size()),
419 faceFluxCorrectionPtr_(
nullptr)
424 <<
"Constructing fvMatrix<Type> for field " << psi_.name() <<
endl;
472 <<
"Destroying fvMatrix<Type> for field " << psi_.name() <<
endl;
475 if (faceFluxCorrectionPtr_)
477 delete faceFluxCorrectionPtr_;
511 const bool forceReference
514 if ((forceReference || psi_.needReference()) && celli >= 0)
533 <<
"Relaxing " << psi_.name() <<
" by " << alpha <<
endl;
589 scalar d = (sumOff[celli] - D[celli])/
mag(D[celli]);
594 maxNon =
max(maxNon, d);
623 <<
"Matrix dominance test for " << psi_.name() <<
nl 624 <<
" number of non-dominant cells : " << nNon <<
nl 625 <<
" maximum relative non-dominance : " << maxNon <<
nl 626 <<
" average relative non-dominance : " << sumNon <<
nl 635 D[celli] =
max(
mag(D[celli]), sumOff[celli]);
669 S += (D - D0)*psi_.primitiveField();
678 psi_.mesh().data::template lookupOrDefault<bool>
679 (
"finalIteration",
false)
682 if (psi_.mesh().relaxEquation(name))
684 relax(psi_.mesh().equationRelaxationFactor(name));
698 bFields[
patchi].manipulateMatrix(*
this);
745 "A("+psi_.name()+
')',
752 dimensions_/psi_.dimensions()/
dimVol,
753 extrapolatedCalculatedFvPatchScalarField::typeName
757 tAphi.
ref().primitiveFieldRef() =
D()/psi_.mesh().V();
758 tAphi.
ref().correctBoundaryConditions();
774 "H("+psi_.name()+
')',
782 extrapolatedCalculatedFvPatchScalarField::typeName
788 for (
direction cmpt=0; cmpt<Type::nComponents; cmpt++)
790 scalarField psiCmpt(psi_.primitiveField().component(cmpt));
794 boundaryDiagCmpt.negate();
806 typename Type::labelType validComponents
808 psi_.mesh().template validComponents<Type>()
811 for (
direction cmpt=0; cmpt<Type::nComponents; cmpt++)
813 if (validComponents[cmpt] == -1)
843 dimensions_/(
dimVol*psi_.dimensions()),
844 extrapolatedCalculatedFvPatchScalarField::typeName
866 H1_.primitiveFieldRef() /= psi_.mesh().V();
867 H1_.correctBoundaryConditions();
878 if (!psi_.mesh().fluxRequired(psi_.name()))
881 <<
"flux requested but " << psi_.name()
882 <<
" not specified in the fluxRequired sub-dictionary" 894 "flux("+psi_.name()+
')',
907 for (
direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
924 psi_.boundaryField()[
patchi].patchInternalField()
932 if (psi_.boundaryField()[
patchi].coupled())
934 NeighbourContrib[
patchi] =
938 psi_.boundaryField()[
patchi].patchNeighbourField()
951 if (faceFluxCorrectionPtr_)
953 fieldFlux += *faceFluxCorrectionPtr_;
968 <<
"attempted assignment to self" 972 if (&psi_ != &(fvmv.psi_))
975 <<
"different fields" 979 dimensions_ = fvmv.dimensions_;
981 source_ = fvmv.source_;
982 internalCoeffs_ = fvmv.internalCoeffs_;
983 boundaryCoeffs_ = fvmv.boundaryCoeffs_;
985 if (faceFluxCorrectionPtr_ && fvmv.faceFluxCorrectionPtr_)
987 *faceFluxCorrectionPtr_ = *fvmv.faceFluxCorrectionPtr_;
989 else if (fvmv.faceFluxCorrectionPtr_)
991 faceFluxCorrectionPtr_ =
993 (*fvmv.faceFluxCorrectionPtr_);
1006 template<
class Type>
1011 internalCoeffs_.negate();
1012 boundaryCoeffs_.negate();
1014 if (faceFluxCorrectionPtr_)
1016 faceFluxCorrectionPtr_->negate();
1021 template<
class Type>
1026 dimensions_ += fvmv.dimensions_;
1028 source_ += fvmv.source_;
1029 internalCoeffs_ += fvmv.internalCoeffs_;
1030 boundaryCoeffs_ += fvmv.boundaryCoeffs_;
1032 if (faceFluxCorrectionPtr_ && fvmv.faceFluxCorrectionPtr_)
1034 *faceFluxCorrectionPtr_ += *fvmv.faceFluxCorrectionPtr_;
1036 else if (fvmv.faceFluxCorrectionPtr_)
1038 faceFluxCorrectionPtr_ =
new 1041 *fvmv.faceFluxCorrectionPtr_
1047 template<
class Type>
1055 template<
class Type>
1060 dimensions_ -= fvmv.dimensions_;
1062 source_ -= fvmv.source_;
1063 internalCoeffs_ -= fvmv.internalCoeffs_;
1064 boundaryCoeffs_ -= fvmv.boundaryCoeffs_;
1066 if (faceFluxCorrectionPtr_ && fvmv.faceFluxCorrectionPtr_)
1068 *faceFluxCorrectionPtr_ -= *fvmv.faceFluxCorrectionPtr_;
1070 else if (fvmv.faceFluxCorrectionPtr_)
1072 faceFluxCorrectionPtr_ =
1074 (-*fvmv.faceFluxCorrectionPtr_);
1079 template<
class Type>
1087 template<
class Type>
1088 void Foam::fvMatrix<Type>::operator+=
1094 source() -= su.mesh().V()*su.field();
1098 template<
class Type>
1099 void Foam::fvMatrix<Type>::operator+=
1109 template<
class Type>
1110 void Foam::fvMatrix<Type>::operator+=
1120 template<
class Type>
1121 void Foam::fvMatrix<Type>::operator-=
1127 source() += su.mesh().V()*su.field();
1131 template<
class Type>
1132 void Foam::fvMatrix<Type>::operator-=
1142 template<
class Type>
1143 void Foam::fvMatrix<Type>::operator-=
1153 template<
class Type>
1154 void Foam::fvMatrix<Type>::operator+=
1163 template<
class Type>
1164 void Foam::fvMatrix<Type>::operator-=
1173 template<
class Type>
1174 void Foam::fvMatrix<Type>::operator+=
1181 template<
class Type>
1182 void Foam::fvMatrix<Type>::operator-=
1189 template<
class Type>
1190 void Foam::fvMatrix<Type>::operator*=
1195 dimensions_ *= dsf.dimensions();
1197 source_ *= dsf.field();
1203 dsf.mesh().boundary()[
patchi].patchInternalField(dsf.field())
1206 internalCoeffs_[
patchi] *= pisf;
1207 boundaryCoeffs_[
patchi] *= pisf;
1210 if (faceFluxCorrectionPtr_)
1213 <<
"cannot scale a matrix containing a faceFluxCorrection" 1219 template<
class Type>
1220 void Foam::fvMatrix<Type>::operator*=
1230 template<
class Type>
1231 void Foam::fvMatrix<Type>::operator*=
1241 template<
class Type>
1242 void Foam::fvMatrix<Type>::operator*=
1247 dimensions_ *= ds.dimensions();
1249 source_ *= ds.value();
1250 internalCoeffs_ *= ds.value();
1251 boundaryCoeffs_ *= ds.value();
1253 if (faceFluxCorrectionPtr_)
1255 *faceFluxCorrectionPtr_ *= ds.value();
1262 template<
class Type>
1270 if (&fvm1.
psi() != &fvm2.
psi())
1273 <<
"incompatible fields for operation " 1275 <<
"[" << fvm1.
psi().name() <<
"] " 1277 <<
" [" << fvm2.
psi().name() <<
"]" 1284 <<
"incompatible dimensions for operation " 1294 template<
class Type>
1314 template<
class Type>
1325 <<
"incompatible dimensions for operation " 1335 template<
class Type>
1342 return fvm.
solve(solverControls);
1345 template<
class Type>
1361 template<
class Type>
1367 template<
class Type>
1379 template<
class Type>
1390 && A.
psi().mesh().fluxRequired(A.
psi().name())
1393 tAcorr().faceFluxCorrectionPtr() = (-A.
flux()).ptr();
1400 template<
class Type>
1413 (A.hasUpper() || A.hasLower())
1414 && A.psi().mesh().fluxRequired(A.psi().name())
1417 tAcorr.
ref().faceFluxCorrectionPtr() = (-A.flux()).ptr();
1426 template<
class Type>
1437 template<
class Type>
1448 template<
class Type>
1459 template<
class Type>
1470 template<
class Type>
1479 tC.
ref().source() += su.mesh().V()*su.field();
1483 template<
class Type>
1492 tC.
ref().source() += tsu().mesh().V()*tsu().field();
1497 template<
class Type>
1506 tC.
ref().source() += tsu().mesh().V()*tsu().primitiveField();
1511 template<
class Type>
1520 tC.
ref().source() += su.mesh().V()*su.field();
1524 template<
class Type>
1533 tC.
ref().source() += tsu().mesh().V()*tsu().field();
1538 template<
class Type>
1547 tC.
ref().source() += tsu().mesh().V()*tsu().primitiveField();
1552 template<
class Type>
1561 tC.
ref().source() += A.
psi().mesh().V()*su.value();
1565 template<
class Type>
1574 tC.
ref().source() += tC().psi().mesh().V()*su.value();
1578 template<
class Type>
1589 template<
class Type>
1600 template<
class Type>
1611 template<
class Type>
1623 template<
class Type>
1636 template<
class Type>
1649 template<
class Type>
1662 template<
class Type>
1676 template<
class Type>
1685 tC.
ref().source() -= su.mesh().V()*su.field();
1689 template<
class Type>
1698 tC.
ref().source() -= tsu().mesh().V()*tsu().field();
1703 template<
class Type>
1712 tC.
ref().source() -= tsu().mesh().V()*tsu().primitiveField();
1717 template<
class Type>
1726 tC.
ref().source() -= su.mesh().V()*su.field();
1730 template<
class Type>
1739 tC.
ref().source() -= tsu().mesh().V()*tsu().field();
1744 template<
class Type>
1753 tC.
ref().source() -= tsu().mesh().V()*tsu().primitiveField();
1758 template<
class Type>
1767 tC.
ref().source() -= su.mesh().V()*su.field();
1771 template<
class Type>
1780 tC.
ref().source() -= tsu().mesh().V()*tsu().field();
1785 template<
class Type>
1794 tC.
ref().source() -= tsu().mesh().V()*tsu().primitiveField();
1799 template<
class Type>
1808 tC.
ref().source() -= su.mesh().V()*su.field();
1812 template<
class Type>
1821 tC.
ref().source() -= tsu().mesh().V()*tsu().field();
1826 template<
class Type>
1835 tC.
ref().source() -= tsu().mesh().V()*tsu().primitiveField();
1841 template<
class Type>
1854 template<
class Type>
1867 template<
class Type>
1881 template<
class Type>
1895 template<
class Type>
1904 tC.
ref().source() += su.mesh().V()*su.field();
1908 template<
class Type>
1917 tC.
ref().source() += tsu().mesh().V()*tsu().field();
1922 template<
class Type>
1931 tC.
ref().source() += tsu().mesh().V()*tsu().primitiveField();
1936 template<
class Type>
1945 tC.
ref().source() += su.mesh().V()*su.field();
1949 template<
class Type>
1958 tC.
ref().source() += tsu().mesh().V()*tsu().field();
1963 template<
class Type>
1972 tC.
ref().source() += tsu().mesh().V()*tsu().primitiveField();
1977 template<
class Type>
1987 tC.
ref().source() -= su.mesh().V()*su.field();
1991 template<
class Type>
2001 tC.
ref().source() -= tsu().mesh().V()*tsu().field();
2006 template<
class Type>
2016 tC.
ref().source() -= tsu().mesh().V()*tsu().primitiveField();
2021 template<
class Type>
2031 tC.ref().source() -= su.mesh().V()*su.field();
2035 template<
class Type>
2045 tC.ref().source() -= tsu().mesh().V()*tsu().field();
2050 template<
class Type>
2060 tC.ref().source() -= tsu().mesh().V()*tsu().primitiveField();
2065 template<
class Type>
2074 tC.
ref().source() -= su.value()*A.psi().mesh().V();
2078 template<
class Type>
2087 tC.
ref().source() -= su.value()*tC().psi().mesh().V();
2091 template<
class Type>
2100 tC.
ref().source() -= su.value()*A.psi().mesh().V();
2104 template<
class Type>
2113 tC.
ref().source() -= su.value()*tC().psi().mesh().V();
2117 template<
class Type>
2126 tC.
ref().source() += su.value()*tC().psi().mesh().V();
2130 template<
class Type>
2139 tC.
ref().source() += su.value()*tC().psi().mesh().V();
2143 template<
class Type>
2153 tC.
ref().source() -= su.value()*A.psi().mesh().V();
2157 template<
class Type>
2167 tC.ref().source() -= su.value()*tC().psi().mesh().V();
2172 template<
class Type>
2184 template<
class Type>
2196 template<
class Type>
2208 template<
class Type>
2220 template<
class Type>
2232 template<
class Type>
2244 template<
class Type>
2256 template<
class Type>
2269 template<
class Type>
2291 extrapolatedCalculatedFvPatchScalarField::typeName
2299 for (
direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
2303 M.addBoundaryDiag(boundaryDiagCmpt, cmpt);
2321 template<
class Type>
2334 template<
class Type>
2347 template<
class Type>
2360 template<
class Type>
2374 template<
class Type>
2391 template<
class Type>
2392 Foam::Ostream& Foam::operator<<(Ostream& os, const fvMatrix<Type>& fvm)
2394 os << static_cast<const lduMatrix&>(fvm) <<
nl 2395 << fvm.dimensions_ <<
nl 2396 << fvm.source_ <<
nl 2397 << fvm.internalCoeffs_ <<
nl 2398 << fvm.boundaryCoeffs_ <<
endl;
2400 os.
check(
"Ostream& operator<<(Ostream&, fvMatrix<Type>&");
const polyBoundaryMesh & boundaryMesh() const
Return boundary mesh.
void addToInternalField(const labelUList &addr, const Field< Type2 > &pf, Field< Type2 > &intf) const
Add patch contribution to internal field.
void replace(const direction, const GeometricField< cmptType, PatchField, GeoMesh > &)
tmp< fvMatrix< Type > > correction(const fvMatrix< Type > &)
Return the correction form of the given matrix.
tmp< Field< Type > > faceH(const Field< Type > &) const
void cmptMax(FieldField< Field, typename FieldField< Field, Type >::cmptType > &cf, const FieldField< Field, Type > &f)
#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.
const word & name() const
Return name.
void clear() const
If object pointer points to valid object:
void addBoundaryDiag(scalarField &diag, const direction cmpt) const
A face is a list of labels corresponding to mesh vertices.
Reference counter for various OpenFOAM components.
void relax()
Relax matrix (for steady-state solution).
A list of keyword definitions, which are a keyword followed by any number of values (e...
dimensioned< Type > max(const dimensioned< Type > &, const dimensioned< Type > &)
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
virtual bool check(const char *operation) const
Check IOstream status for given operation.
tmp< DimensionedField< typename DimensionedField< Type, GeoMesh >::cmptType, GeoMesh >> cmptAv(const DimensionedField< Type, GeoMesh > &df)
lduMatrix(const lduMesh &)
Construct given an LDU addressed mesh.
T & ref() const
Return non-const reference or generate a fatal error.
const GeometricField< Type, fvPatchField, volMesh > & psi() const
void addCmptAvBoundaryDiag(scalarField &diag) const
An Istream is an abstract base class for all input systems (streams, files, token lists etc)...
void size(const label)
Override size to be inconsistent with allocated storage.
void setReference(const label celli, const Type &value, const bool forceReference=false)
Set reference level for solution.
Ostream & endl(Ostream &os)
Add newline and flush stream.
tmp< GeometricField< Type, fvPatchField, volMesh > > H() const
Return the H operation source.
Traits class for primitives.
void operator-=(const fvMatrix< Type > &)
Abstract base class with a fat-interface to all derived classes covering all possible ways in which t...
const dimensionSet dimVol(dimVolume)
const cellList & cells() const
Generic GeometricField class.
static int & msgType()
Message tag of standard messages.
Generic dimensioned Type class.
tmp< volScalarField > H1() const
Return H(1)
void subtractFromInternalField(const labelUList &addr, const Field< Type2 > &pf, Field< Type2 > &intf) const
Subtract patch contribution from internal field.
tmp< scalarField > H1() const
void sumMagOffDiag(scalarField &sumOff) const
conserve primitiveFieldRef()+
tmp< scalarField > D() const
Return the matrix scalar diagonal.
void operator=(const fvMatrix< Type > &)
const labelUList & neighbour() const
Internal face neighbour.
const dimensionSet dimVolume(pow3(dimLength))
const dimensionSet & dimensions() const
Return dimensions.
Dimension set for the base types.
void diag(pointPatchField< vector > &, const pointPatchField< tensor > &)
Pre-declare SubField and related Field type.
A class for handling words, derived from string.
SolverPerformance< Type > solve(fvMatrix< Type > &, const dictionary &)
Solve returning the solution statistics given convergence tolerance.
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
virtual tmp< Field< Type > > patchNeighbourField() const
Return patchField on the opposite patch of a coupled patch.
void setValues(const labelUList &cells, const UList< Type > &values)
Set solution in given cells to the specified values.
virtual const labelUList & patchAddr(const label patchNo) const =0
Return patch to internal addressing given patch number.
virtual ~fvMatrix()
Destructor.
virtual bool coupled() const
Return true if this patch field is coupled.
A special matrix type and solver, designed for finite volume solutions of scalar equations. Face addressing is used to make all matrix assembly and solution loops vectorise.
label eventNo() const
Event number at last update.
errorManip< error > abort(error &err)
void operator=(const lduMatrix &)
A 1D vector of objects of type <T>, where the size of the vector is known and can be used for subscri...
dimensioned< Type > cmptMultiply(const dimensioned< Type > &, const dimensioned< Type > &)
bool isInternalFace(const label faceIndex) const
Return true if given face label is internal to the mesh.
void cmptMag(FieldField< Field, Type > &cf, const FieldField< Field, Type > &f)
tmp< fvMatrix< Type > > clone() const
Clone.
An Ostream is an abstract base class for all output systems (streams, files, token lists...
Internal::FieldType & primitiveFieldRef()
Return a reference to the internal field.
SolverPerformance< Type > solve(const dictionary &)
Solve segregated or coupled returning the solution statistics.
void operator*=(const scalarField &)
const Mesh & mesh() const
Return mesh.
void operator*=(const volScalarField::Internal &)
const word & name() const
Return const reference to name.
const Field< Type > & field() const
void reduce(const List< UPstream::commsStruct > &comms, T &Value, const BinaryOp &bop, const int tag, const label comm)
word name(const complex &)
Return a string representation of a complex.
const labelUList & owner() const
Internal face owner.
Internal & ref()
Return a reference to the dimensioned internal field.
void operator+=(const fvMatrix< Type > &)
tmp< Field< Type > > DD() const
Return the matrix Type diagonal.
lduMatrix is a general matrix class in which the coefficients are stored as three arrays...
const fileName & instance() const
tmp< volScalarField > A() const
Return the central coefficient.
const lduAddressing & lduAddr() const
Return the LDU addressing.
Boundary & boundaryFieldRef()
Return a reference to the boundary field.
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
A cell is defined as a list of faces with extra functionality.
Mesh data needed to do the Finite Volume discretisation.
A List with indirect addressing.
const dimensionedScalar c
Speed of light in a vacuum.
Field with dimensions and associated with geometry type GeoMesh which is used to size the field and a...
const dimensionSet & dimensions() const
Return const reference to dimensions.
void setValuesFromList(const labelUList &cells, const ListType< Type > &values)
Set solution in given cells to the specified values.
void correctBoundaryConditions()
Correct boundary field.
void checkMethod(const fvMatrix< Type > &, const fvMatrix< Type > &, const char *)
A class representing the concept of 0 used to avoid unnecessary manipulations for objects that are kn...
dimensioned< scalar > mag(const dimensioned< Type > &)
void addBoundarySource(Field< Type > &source, const bool couples=true) const
T returnReduce(const T &Value, const BinaryOp &bop, const int tag=Pstream::msgType(), const label comm=UPstream::worldComm)
tmp< GeometricField< Type, fvsPatchField, surfaceMesh > > flux() const
Return the face-flux field from the matrix.
void boundaryManipulate(typename GeometricField< Type, fvPatchField, volMesh >::Boundary &values)
Manipulate based on a boundary field.
tmp< Field< Type > > H(const Field< Type > &) const
void operator-=(const lduMatrix &)
void operator+=(const lduMatrix &)
T * ptr() const
Return tmp pointer for reuse.
A class for managing temporary objects.
void cmptMin(FieldField< Field, typename FieldField< Field, Type >::cmptType > &cf, const FieldField< Field, Type > &f)
label size() const
Return the number of elements in the UList.
const dimensionedScalar alpha
Fine-structure constant: default SI units: [].
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
void component(FieldField< Field, typename FieldField< Field, Type >::cmptType > &sf, const FieldField< Field, Type > &f, const direction d)
fvMatrix(const GeometricField< Type, fvPatchField, volMesh > &, const dimensionSet &)
Construct given a field to solve for.
label whichPatch(const label faceIndex) const
Return patch index for a given face label.
SolverPerformance< Type > solve()
Solve returning the solution statistics.
#define InfoInFunction
Report an information message using Foam::Info.
const dimensionSet & dimensions() const