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_(NULL)
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_(NULL)
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_(NULL)
381 <<
"Copying fvMatrix<Type> for field " << psi_.name() <<
endl;
384 if (tfvm().faceFluxCorrectionPtr_)
388 faceFluxCorrectionPtr_ = tfvm().faceFluxCorrectionPtr_;
389 tfvm().faceFluxCorrectionPtr_ = NULL;
393 faceFluxCorrectionPtr_ =
new 396 *(tfvm().faceFluxCorrectionPtr_)
417 internalCoeffs_(psi.
mesh().boundary().size()),
418 boundaryCoeffs_(psi.
mesh().boundary().size()),
419 faceFluxCorrectionPtr_(NULL)
424 <<
"Constructing fvMatrix<Type> for field " << psi_.name() <<
endl;
460 <<
"Destroying fvMatrix<Type> for field " << psi_.name() <<
endl;
463 if (faceFluxCorrectionPtr_)
465 delete faceFluxCorrectionPtr_;
499 const bool forceReference
502 if ((forceReference || psi_.needReference()) && celli >= 0)
521 <<
"Relaxing " << psi_.name() <<
" by " << alpha <<
endl;
577 scalar d = (sumOff[celli] - D[celli])/
mag(D[celli]);
582 maxNon =
max(maxNon, d);
611 <<
"Matrix dominance test for " << psi_.name() <<
nl 612 <<
" number of non-dominant cells : " << nNon <<
nl 613 <<
" maximum relative non-dominance : " << maxNon <<
nl 614 <<
" average relative non-dominance : " << sumNon <<
nl 623 D[celli] =
max(
mag(D[celli]), sumOff[celli]);
657 S += (D - D0)*psi_.primitiveField();
666 psi_.mesh().data::template lookupOrDefault<bool>
667 (
"finalIteration",
false)
670 if (psi_.mesh().relaxEquation(name))
672 relax(psi_.mesh().equationRelaxationFactor(name));
686 bFields[
patchi].manipulateMatrix(*
this);
733 "A("+psi_.name()+
')',
740 dimensions_/psi_.dimensions()/
dimVol,
741 extrapolatedCalculatedFvPatchScalarField::typeName
745 tAphi.
ref().primitiveFieldRef() =
D()/psi_.mesh().V();
746 tAphi.
ref().correctBoundaryConditions();
762 "H("+psi_.name()+
')',
770 extrapolatedCalculatedFvPatchScalarField::typeName
776 for (
direction cmpt=0; cmpt<Type::nComponents; cmpt++)
778 scalarField psiCmpt(psi_.primitiveField().component(cmpt));
782 boundaryDiagCmpt.negate();
794 typename Type::labelType validComponents
796 psi_.mesh().template validComponents<Type>()
799 for (
direction cmpt=0; cmpt<Type::nComponents; cmpt++)
801 if (validComponents[cmpt] == -1)
831 dimensions_/(
dimVol*psi_.dimensions()),
832 extrapolatedCalculatedFvPatchScalarField::typeName
854 H1_.primitiveFieldRef() /= psi_.mesh().V();
855 H1_.correctBoundaryConditions();
866 if (!psi_.mesh().fluxRequired(psi_.name()))
869 <<
"flux requested but " << psi_.name()
870 <<
" not specified in the fluxRequired sub-dictionary" 882 "flux("+psi_.name()+
')',
895 for (
direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
912 psi_.boundaryField()[
patchi].patchInternalField()
920 if (psi_.boundaryField()[
patchi].coupled())
922 NeighbourContrib[
patchi] =
926 psi_.boundaryField()[
patchi].patchNeighbourField()
939 if (faceFluxCorrectionPtr_)
941 fieldFlux += *faceFluxCorrectionPtr_;
956 <<
"attempted assignment to self" 960 if (&psi_ != &(fvmv.psi_))
963 <<
"different fields" 967 dimensions_ = fvmv.dimensions_;
969 source_ = fvmv.source_;
970 internalCoeffs_ = fvmv.internalCoeffs_;
971 boundaryCoeffs_ = fvmv.boundaryCoeffs_;
973 if (faceFluxCorrectionPtr_ && fvmv.faceFluxCorrectionPtr_)
975 *faceFluxCorrectionPtr_ = *fvmv.faceFluxCorrectionPtr_;
977 else if (fvmv.faceFluxCorrectionPtr_)
979 faceFluxCorrectionPtr_ =
981 (*fvmv.faceFluxCorrectionPtr_);
999 internalCoeffs_.negate();
1000 boundaryCoeffs_.negate();
1002 if (faceFluxCorrectionPtr_)
1004 faceFluxCorrectionPtr_->negate();
1009 template<
class Type>
1014 dimensions_ += fvmv.dimensions_;
1016 source_ += fvmv.source_;
1017 internalCoeffs_ += fvmv.internalCoeffs_;
1018 boundaryCoeffs_ += fvmv.boundaryCoeffs_;
1020 if (faceFluxCorrectionPtr_ && fvmv.faceFluxCorrectionPtr_)
1022 *faceFluxCorrectionPtr_ += *fvmv.faceFluxCorrectionPtr_;
1024 else if (fvmv.faceFluxCorrectionPtr_)
1026 faceFluxCorrectionPtr_ =
new 1029 *fvmv.faceFluxCorrectionPtr_
1035 template<
class Type>
1043 template<
class Type>
1048 dimensions_ -= fvmv.dimensions_;
1050 source_ -= fvmv.source_;
1051 internalCoeffs_ -= fvmv.internalCoeffs_;
1052 boundaryCoeffs_ -= fvmv.boundaryCoeffs_;
1054 if (faceFluxCorrectionPtr_ && fvmv.faceFluxCorrectionPtr_)
1056 *faceFluxCorrectionPtr_ -= *fvmv.faceFluxCorrectionPtr_;
1058 else if (fvmv.faceFluxCorrectionPtr_)
1060 faceFluxCorrectionPtr_ =
1062 (-*fvmv.faceFluxCorrectionPtr_);
1067 template<
class Type>
1075 template<
class Type>
1076 void Foam::fvMatrix<Type>::operator+=
1082 source() -= su.mesh().V()*su.field();
1086 template<
class Type>
1087 void Foam::fvMatrix<Type>::operator+=
1097 template<
class Type>
1098 void Foam::fvMatrix<Type>::operator+=
1108 template<
class Type>
1109 void Foam::fvMatrix<Type>::operator-=
1115 source() += su.mesh().V()*su.field();
1119 template<
class Type>
1120 void Foam::fvMatrix<Type>::operator-=
1130 template<
class Type>
1131 void Foam::fvMatrix<Type>::operator-=
1141 template<
class Type>
1142 void Foam::fvMatrix<Type>::operator+=
1151 template<
class Type>
1152 void Foam::fvMatrix<Type>::operator-=
1161 template<
class Type>
1162 void Foam::fvMatrix<Type>::operator+=
1169 template<
class Type>
1170 void Foam::fvMatrix<Type>::operator-=
1177 template<
class Type>
1178 void Foam::fvMatrix<Type>::operator*=
1183 dimensions_ *= dsf.dimensions();
1185 source_ *= dsf.field();
1191 dsf.mesh().boundary()[
patchi].patchInternalField(dsf.field())
1194 internalCoeffs_[
patchi] *= pisf;
1195 boundaryCoeffs_[
patchi] *= pisf;
1198 if (faceFluxCorrectionPtr_)
1201 <<
"cannot scale a matrix containing a faceFluxCorrection" 1207 template<
class Type>
1208 void Foam::fvMatrix<Type>::operator*=
1218 template<
class Type>
1219 void Foam::fvMatrix<Type>::operator*=
1229 template<
class Type>
1230 void Foam::fvMatrix<Type>::operator*=
1235 dimensions_ *= ds.dimensions();
1237 source_ *= ds.value();
1238 internalCoeffs_ *= ds.value();
1239 boundaryCoeffs_ *= ds.value();
1241 if (faceFluxCorrectionPtr_)
1243 *faceFluxCorrectionPtr_ *= ds.value();
1250 template<
class Type>
1258 if (&fvm1.
psi() != &fvm2.
psi())
1261 <<
"incompatible fields for operation " 1263 <<
"[" << fvm1.
psi().name() <<
"] " 1265 <<
" [" << fvm2.
psi().name() <<
"]" 1272 <<
"incompatible dimensions for operation " 1282 template<
class Type>
1302 template<
class Type>
1313 <<
"incompatible dimensions for operation " 1323 template<
class Type>
1330 return fvm.
solve(solverControls);
1333 template<
class Type>
1349 template<
class Type>
1355 template<
class Type>
1367 template<
class Type>
1378 && A.
psi().mesh().fluxRequired(A.
psi().name())
1381 tAcorr().faceFluxCorrectionPtr() = (-A.
flux()).ptr();
1388 template<
class Type>
1401 (A.hasUpper() || A.hasLower())
1402 && A.psi().mesh().fluxRequired(A.psi().name())
1405 tAcorr.
ref().faceFluxCorrectionPtr() = (-A.flux()).ptr();
1414 template<
class Type>
1425 template<
class Type>
1436 template<
class Type>
1447 template<
class Type>
1458 template<
class Type>
1467 tC.
ref().source() += su.mesh().V()*su.field();
1471 template<
class Type>
1480 tC.
ref().source() += tsu().mesh().V()*tsu().field();
1485 template<
class Type>
1494 tC.
ref().source() += tsu().mesh().V()*tsu().primitiveField();
1499 template<
class Type>
1508 tC.
ref().source() += su.mesh().V()*su.field();
1512 template<
class Type>
1521 tC.
ref().source() += tsu().mesh().V()*tsu().field();
1526 template<
class Type>
1535 tC.
ref().source() += tsu().mesh().V()*tsu().primitiveField();
1540 template<
class Type>
1549 tC.
ref().source() += A.
psi().mesh().V()*su.value();
1553 template<
class Type>
1562 tC.
ref().source() += tC().psi().mesh().V()*su.value();
1566 template<
class Type>
1577 template<
class Type>
1588 template<
class Type>
1599 template<
class Type>
1611 template<
class Type>
1624 template<
class Type>
1637 template<
class Type>
1650 template<
class Type>
1664 template<
class Type>
1673 tC.
ref().source() -= su.mesh().V()*su.field();
1677 template<
class Type>
1686 tC.
ref().source() -= tsu().mesh().V()*tsu().field();
1691 template<
class Type>
1700 tC.
ref().source() -= tsu().mesh().V()*tsu().primitiveField();
1705 template<
class Type>
1714 tC.
ref().source() -= su.mesh().V()*su.field();
1718 template<
class Type>
1727 tC.
ref().source() -= tsu().mesh().V()*tsu().field();
1732 template<
class Type>
1741 tC.
ref().source() -= tsu().mesh().V()*tsu().primitiveField();
1746 template<
class Type>
1755 tC.
ref().source() -= su.mesh().V()*su.field();
1759 template<
class Type>
1768 tC.
ref().source() -= tsu().mesh().V()*tsu().field();
1773 template<
class Type>
1782 tC.
ref().source() -= tsu().mesh().V()*tsu().primitiveField();
1787 template<
class Type>
1796 tC.
ref().source() -= su.mesh().V()*su.field();
1800 template<
class Type>
1809 tC.
ref().source() -= tsu().mesh().V()*tsu().field();
1814 template<
class Type>
1823 tC.
ref().source() -= tsu().mesh().V()*tsu().primitiveField();
1829 template<
class Type>
1842 template<
class Type>
1855 template<
class Type>
1869 template<
class Type>
1883 template<
class Type>
1892 tC.
ref().source() += su.mesh().V()*su.field();
1896 template<
class Type>
1905 tC.
ref().source() += tsu().mesh().V()*tsu().field();
1910 template<
class Type>
1919 tC.
ref().source() += tsu().mesh().V()*tsu().primitiveField();
1924 template<
class Type>
1933 tC.
ref().source() += su.mesh().V()*su.field();
1937 template<
class Type>
1946 tC.
ref().source() += tsu().mesh().V()*tsu().field();
1951 template<
class Type>
1960 tC.
ref().source() += tsu().mesh().V()*tsu().primitiveField();
1965 template<
class Type>
1975 tC.
ref().source() -= su.mesh().V()*su.field();
1979 template<
class Type>
1989 tC.
ref().source() -= tsu().mesh().V()*tsu().field();
1994 template<
class Type>
2004 tC.
ref().source() -= tsu().mesh().V()*tsu().primitiveField();
2009 template<
class Type>
2019 tC.ref().source() -= su.mesh().V()*su.field();
2023 template<
class Type>
2033 tC.ref().source() -= tsu().mesh().V()*tsu().field();
2038 template<
class Type>
2048 tC.ref().source() -= tsu().mesh().V()*tsu().primitiveField();
2053 template<
class Type>
2062 tC.
ref().source() -= su.value()*A.psi().mesh().V();
2066 template<
class Type>
2075 tC.
ref().source() -= su.value()*tC().psi().mesh().V();
2079 template<
class Type>
2088 tC.
ref().source() -= su.value()*A.psi().mesh().V();
2092 template<
class Type>
2101 tC.
ref().source() -= su.value()*tC().psi().mesh().V();
2105 template<
class Type>
2114 tC.
ref().source() += su.value()*tC().psi().mesh().V();
2118 template<
class Type>
2127 tC.
ref().source() += su.value()*tC().psi().mesh().V();
2131 template<
class Type>
2141 tC.
ref().source() -= su.value()*A.psi().mesh().V();
2145 template<
class Type>
2155 tC.ref().source() -= su.value()*tC().psi().mesh().V();
2160 template<
class Type>
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>
2257 template<
class Type>
2279 extrapolatedCalculatedFvPatchScalarField::typeName
2287 for (
direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
2291 M.addBoundaryDiag(boundaryDiagCmpt, cmpt);
2309 template<
class Type>
2322 template<
class Type>
2335 template<
class Type>
2348 template<
class Type>
2362 template<
class Type>
2379 template<
class Type>
2380 Foam::Ostream& Foam::operator<<(Ostream& os, const fvMatrix<Type>& fvm)
2382 os << static_cast<const lduMatrix&>(fvm) <<
nl 2383 << fvm.dimensions_ <<
nl 2384 << fvm.source_ <<
nl 2385 << fvm.internalCoeffs_ <<
nl 2386 << fvm.boundaryCoeffs_ <<
endl;
2388 os.
check(
"Ostream& operator<<(Ostream&, fvMatrix<Type>&");
void replace(const direction, const GeometricField< cmptType, PatchField, GeoMesh > &)
tmp< fvMatrix< Type > > correction(const fvMatrix< Type > &)
Return the correction form of the given matrix.
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.
virtual bool coupled() const
Return true if this patch field is coupled.
const dimensionSet & dimensions() const
Return const reference to dimensions.
A face is a list of labels corresponding to mesh vertices.
Reference counter for various OpenFOAM components.
const GeometricField< Type, fvPatchField, volMesh > & psi() const
void relax()
Relax matrix (for steady-state solution).
tmp< scalarField > H1() const
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.
tmp< DimensionedField< typename DimensionedField< Type, GeoMesh >::cmptType, GeoMesh >> cmptAv(const DimensionedField< Type, GeoMesh > &df)
lduMatrix(const lduMesh &)
Construct given an LDU addressed mesh.
tmp< Field< Type > > H(const Field< Type > &) 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.
virtual bool check(const char *operation) const
Check IOstream status for given operation.
tmp< GeometricField< Type, fvsPatchField, surfaceMesh > > flux() const
Return the face-flux field from the matrix.
Ostream & endl(Ostream &os)
Add newline and flush stream.
Traits class for primitives.
void addToInternalField(const labelUList &addr, const Field< Type2 > &pf, Field< Type2 > &intf) const
Add patch contribution to internal field.
void operator-=(const fvMatrix< Type > &)
void addCmptAvBoundaryDiag(scalarField &diag) const
Abstract base class with a fat-interface to all derived classes covering all possible ways in which t...
const dimensionSet dimVol(dimVolume)
Generic GeometricField class.
static int & msgType()
Message tag of standard messages.
label eventNo() const
Event number at last update.
Generic dimensioned Type class.
bool isInternalFace(const label faceIndex) const
Return true if given face label is internal to the mesh.
tmp< scalarField > D() const
Return the matrix scalar diagonal.
const cellList & cells() const
const polyBoundaryMesh & boundaryMesh() const
Return boundary mesh.
conserve primitiveFieldRef()+
void operator=(const fvMatrix< Type > &)
virtual tmp< Field< Type > > patchNeighbourField() const
Return patchField on the opposite patch of a coupled patch.
void addBoundaryDiag(scalarField &diag, const direction cmpt) const
tmp< Field< Type > > faceH(const Field< Type > &) const
const word & name() const
Return const reference to name.
void clear() const
If object pointer points to valid object:
tmp< volScalarField > H1() const
Return H(1)
const dimensionSet dimVolume(pow3(dimLength))
Dimension set for the base types.
void diag(pointPatchField< vector > &, const pointPatchField< tensor > &)
const dimensionSet & dimensions() const
const labelUList & neighbour() const
Internal face neighbour.
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.
void setValues(const labelUList &cells, const UList< Type > &values)
Set solution in given cells to the specified values.
void sumMagOffDiag(scalarField &sumOff) const
virtual const labelUList & patchAddr(const label patchNo) const =0
Return patch to internal addressing given patch number.
virtual ~fvMatrix()
Destructor.
void addBoundarySource(Field< Type > &source, const bool couples=true) const
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.
tmp< volScalarField > A() const
Return the central coefficient.
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...
const dimensionSet & dimensions() const
Return dimensions.
const Field< Type > & field() const
dimensioned< Type > cmptMultiply(const dimensioned< Type > &, const dimensioned< Type > &)
void cmptMag(FieldField< Field, Type > &cf, const FieldField< Field, Type > &f)
An Ostream is an abstract base class for all output systems (streams, files, token lists...
T * ptr() const
Return tmp pointer for reuse.
Internal::FieldType & primitiveFieldRef()
Return a reference to the internal field.
tmp< Field< Type > > DD() const
Return the matrix Type diagonal.
SolverPerformance< Type > solve(const dictionary &)
Solve segregated or coupled returning the solution statistics.
void operator*=(const scalarField &)
void operator*=(const DimensionedField< scalar, volMesh > &)
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.
Internal & ref()
Return a reference to the dimensioned internal field.
const lduAddressing & lduAddr() const
Return the LDU addressing.
void subtractFromInternalField(const labelUList &addr, const Field< Type2 > &pf, Field< Type2 > &intf) const
Subtract patch contribution from internal field.
void operator+=(const fvMatrix< Type > &)
label size() const
Return the number of elements in the UList.
lduMatrix is a general matrix class in which the coefficients are stored as three arrays...
Boundary & boundaryFieldRef()
Return a reference to the boundary field.
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
const Mesh & mesh() const
Return mesh.
A cell is defined as a list of faces with extra functionality.
label whichPatch(const label faceIndex) const
Return patch index for a given face label.
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...
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 > &)
T returnReduce(const T &Value, const BinaryOp &bop, const int tag=Pstream::msgType(), const label comm=UPstream::worldComm)
tmp< GeometricField< Type, fvPatchField, volMesh > > H() const
Return the H operation source.
void boundaryManipulate(typename GeometricField< Type, fvPatchField, volMesh >::Boundary &values)
Manipulate based on a boundary field.
void operator-=(const lduMatrix &)
const labelUList & owner() const
Internal face owner.
void operator+=(const lduMatrix &)
A class for managing temporary objects.
void cmptMin(FieldField< Field, typename FieldField< Field, Type >::cmptType > &cf, const FieldField< Field, Type > &f)
T & ref() const
Return non-const reference or generate a fatal error.
const dimensionedScalar alpha
Fine-structure constant: default SI units: [].
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
const fileName & instance() const
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.
SolverPerformance< Type > solve()
Solve returning the solution statistics.
const word & name() const
Return name.
#define InfoInFunction
Report an information message using Foam::Info.