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_)
355 const_cast<
fvMatrix<Type>&>(tfvm()),
359 dimensions_(tfvm().dimensions_),
362 const_cast<
fvMatrix<Type>&>(tfvm()).source_,
367 const_cast<
fvMatrix<Type>&>(tfvm()).internalCoeffs_,
372 const_cast<
fvMatrix<Type>&>(tfvm()).boundaryCoeffs_,
375 faceFluxCorrectionPtr_(nullptr)
380 <<
"Copying fvMatrix<Type> for field " << psi_.name() <<
endl;
383 if (tfvm().faceFluxCorrectionPtr_)
387 faceFluxCorrectionPtr_ = tfvm().faceFluxCorrectionPtr_;
388 tfvm().faceFluxCorrectionPtr_ =
nullptr;
392 faceFluxCorrectionPtr_ =
new 395 *(tfvm().faceFluxCorrectionPtr_)
415 internalCoeffs_(psi.
mesh().boundary().size()),
416 boundaryCoeffs_(psi.
mesh().boundary().size()),
417 faceFluxCorrectionPtr_(
nullptr)
422 <<
"Constructing fvMatrix<Type> for field " << psi_.name() <<
endl;
470 <<
"Destroying fvMatrix<Type> for field " << psi_.name() <<
endl;
473 if (faceFluxCorrectionPtr_)
475 delete faceFluxCorrectionPtr_;
509 const bool forceReference
512 if ((forceReference || psi_.needReference()) && celli >= 0)
531 <<
"Relaxing " << psi_.name() <<
" by " << alpha <<
endl;
587 scalar d = (sumOff[celli] - D[celli])/
mag(D[celli]);
592 maxNon =
max(maxNon, d);
621 <<
"Matrix dominance test for " << psi_.name() <<
nl 622 <<
" number of non-dominant cells : " << nNon <<
nl 623 <<
" maximum relative non-dominance : " << maxNon <<
nl 624 <<
" average relative non-dominance : " << sumNon <<
nl 633 D[celli] =
max(
mag(D[celli]), sumOff[celli]);
667 S += (D - D0)*psi_.primitiveField();
676 psi_.mesh().data::template lookupOrDefault<bool>
677 (
"finalIteration",
false)
678 && psi_.mesh().relaxEquation(psi_.name() +
"Final")
681 relax(psi_.mesh().equationRelaxationFactor(psi_.name() +
"Final"));
683 else if (psi_.mesh().relaxEquation(psi_.name()))
685 relax(psi_.mesh().equationRelaxationFactor(psi_.name()));
699 bFields[
patchi].manipulateMatrix(*
this);
744 "A("+psi_.name()+
')',
746 dimensions_/psi_.dimensions()/
dimVol,
747 extrapolatedCalculatedFvPatchScalarField::typeName
751 tAphi.
ref().primitiveFieldRef() =
D()/psi_.mesh().V();
752 tAphi.
ref().correctBoundaryConditions();
768 "H("+psi_.name()+
')',
776 extrapolatedCalculatedFvPatchScalarField::typeName
782 for (
direction cmpt=0; cmpt<Type::nComponents; cmpt++)
784 scalarField psiCmpt(psi_.primitiveField().component(cmpt));
788 boundaryDiagCmpt.negate();
800 typename Type::labelType validComponents
802 psi_.mesh().template validComponents<Type>()
805 for (
direction cmpt=0; cmpt<Type::nComponents; cmpt++)
807 if (validComponents[cmpt] == -1)
830 dimensions_/(
dimVol*psi_.dimensions()),
831 extrapolatedCalculatedFvPatchScalarField::typeName
853 H1_.primitiveFieldRef() /= psi_.mesh().V();
854 H1_.correctBoundaryConditions();
865 if (!psi_.mesh().fluxRequired(psi_.name()))
868 <<
"flux requested but " << psi_.name()
869 <<
" not specified in the fluxRequired sub-dictionary" 881 "flux("+psi_.name()+
')',
894 for (
direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
911 psi_.boundaryField()[
patchi].patchInternalField()
919 if (psi_.boundaryField()[
patchi].coupled())
921 NeighbourContrib[
patchi] =
925 psi_.boundaryField()[
patchi].patchNeighbourField()
938 if (faceFluxCorrectionPtr_)
940 fieldFlux += *faceFluxCorrectionPtr_;
955 <<
"attempted assignment to self" 959 if (&psi_ != &(fvmv.psi_))
962 <<
"different fields" 966 dimensions_ = fvmv.dimensions_;
968 source_ = fvmv.source_;
969 internalCoeffs_ = fvmv.internalCoeffs_;
970 boundaryCoeffs_ = fvmv.boundaryCoeffs_;
972 if (faceFluxCorrectionPtr_ && fvmv.faceFluxCorrectionPtr_)
974 *faceFluxCorrectionPtr_ = *fvmv.faceFluxCorrectionPtr_;
976 else if (fvmv.faceFluxCorrectionPtr_)
978 faceFluxCorrectionPtr_ =
980 (*fvmv.faceFluxCorrectionPtr_);
998 internalCoeffs_.negate();
999 boundaryCoeffs_.negate();
1001 if (faceFluxCorrectionPtr_)
1003 faceFluxCorrectionPtr_->negate();
1008 template<
class Type>
1013 dimensions_ += fvmv.dimensions_;
1015 source_ += fvmv.source_;
1016 internalCoeffs_ += fvmv.internalCoeffs_;
1017 boundaryCoeffs_ += fvmv.boundaryCoeffs_;
1019 if (faceFluxCorrectionPtr_ && fvmv.faceFluxCorrectionPtr_)
1021 *faceFluxCorrectionPtr_ += *fvmv.faceFluxCorrectionPtr_;
1023 else if (fvmv.faceFluxCorrectionPtr_)
1025 faceFluxCorrectionPtr_ =
new 1028 *fvmv.faceFluxCorrectionPtr_
1034 template<
class Type>
1042 template<
class Type>
1047 dimensions_ -= fvmv.dimensions_;
1049 source_ -= fvmv.source_;
1050 internalCoeffs_ -= fvmv.internalCoeffs_;
1051 boundaryCoeffs_ -= fvmv.boundaryCoeffs_;
1053 if (faceFluxCorrectionPtr_ && fvmv.faceFluxCorrectionPtr_)
1055 *faceFluxCorrectionPtr_ -= *fvmv.faceFluxCorrectionPtr_;
1057 else if (fvmv.faceFluxCorrectionPtr_)
1059 faceFluxCorrectionPtr_ =
1061 (-*fvmv.faceFluxCorrectionPtr_);
1066 template<
class Type>
1074 template<
class Type>
1075 void Foam::fvMatrix<Type>::operator+=
1081 source() -= su.mesh().V()*su.field();
1085 template<
class Type>
1086 void Foam::fvMatrix<Type>::operator+=
1096 template<
class Type>
1097 void Foam::fvMatrix<Type>::operator+=
1107 template<
class Type>
1108 void Foam::fvMatrix<Type>::operator-=
1114 source() += su.mesh().V()*su.field();
1118 template<
class Type>
1119 void Foam::fvMatrix<Type>::operator-=
1129 template<
class Type>
1130 void Foam::fvMatrix<Type>::operator-=
1140 template<
class Type>
1141 void Foam::fvMatrix<Type>::operator+=
1150 template<
class Type>
1151 void Foam::fvMatrix<Type>::operator-=
1160 template<
class Type>
1161 void Foam::fvMatrix<Type>::operator+=
1168 template<
class Type>
1169 void Foam::fvMatrix<Type>::operator-=
1176 template<
class Type>
1177 void Foam::fvMatrix<Type>::operator*=
1182 dimensions_ *= dsf.dimensions();
1184 source_ *= dsf.field();
1190 dsf.mesh().boundary()[
patchi].patchInternalField(dsf.field())
1193 internalCoeffs_[
patchi] *= pisf;
1194 boundaryCoeffs_[
patchi] *= pisf;
1197 if (faceFluxCorrectionPtr_)
1200 <<
"cannot scale a matrix containing a faceFluxCorrection" 1206 template<
class Type>
1207 void Foam::fvMatrix<Type>::operator*=
1217 template<
class Type>
1218 void Foam::fvMatrix<Type>::operator*=
1228 template<
class Type>
1229 void Foam::fvMatrix<Type>::operator*=
1234 dimensions_ *= ds.dimensions();
1236 source_ *= ds.value();
1237 internalCoeffs_ *= ds.value();
1238 boundaryCoeffs_ *= ds.value();
1240 if (faceFluxCorrectionPtr_)
1242 *faceFluxCorrectionPtr_ *= ds.value();
1249 template<
class Type>
1257 if (&fvm1.
psi() != &fvm2.
psi())
1260 <<
"incompatible fields for operation " 1262 <<
"[" << fvm1.
psi().name() <<
"] " 1264 <<
" [" << fvm2.
psi().name() <<
"]" 1271 <<
"incompatible dimensions for operation " 1281 template<
class Type>
1301 template<
class Type>
1312 <<
"incompatible dimensions for operation " 1322 template<
class Type>
1338 template<
class Type>
1356 template<
class Type>
1367 template<
class Type>
1378 template<
class Type>
1389 template<
class Type>
1400 template<
class Type>
1409 tC.
ref().source() += su.mesh().V()*su.field();
1413 template<
class Type>
1422 tC.
ref().source() += tsu().mesh().V()*tsu().field();
1427 template<
class Type>
1436 tC.
ref().source() += tsu().mesh().V()*tsu().primitiveField();
1441 template<
class Type>
1450 tC.
ref().source() += su.mesh().V()*su.field();
1454 template<
class Type>
1463 tC.
ref().source() += tsu().mesh().V()*tsu().field();
1468 template<
class Type>
1477 tC.
ref().source() += tsu().mesh().V()*tsu().primitiveField();
1482 template<
class Type>
1491 tC.
ref().source() += A.
psi().mesh().V()*su.value();
1495 template<
class Type>
1504 tC.
ref().source() += tC().psi().mesh().V()*su.value();
1508 template<
class Type>
1519 template<
class Type>
1530 template<
class Type>
1541 template<
class Type>
1553 template<
class Type>
1566 template<
class Type>
1579 template<
class Type>
1592 template<
class Type>
1606 template<
class Type>
1615 tC.
ref().source() -= su.mesh().V()*su.field();
1619 template<
class Type>
1628 tC.
ref().source() -= tsu().mesh().V()*tsu().field();
1633 template<
class Type>
1642 tC.
ref().source() -= tsu().mesh().V()*tsu().primitiveField();
1647 template<
class Type>
1656 tC.
ref().source() -= su.mesh().V()*su.field();
1660 template<
class Type>
1669 tC.
ref().source() -= tsu().mesh().V()*tsu().field();
1674 template<
class Type>
1683 tC.
ref().source() -= tsu().mesh().V()*tsu().primitiveField();
1688 template<
class Type>
1697 tC.
ref().source() -= su.mesh().V()*su.field();
1701 template<
class Type>
1710 tC.
ref().source() -= tsu().mesh().V()*tsu().field();
1715 template<
class Type>
1724 tC.
ref().source() -= tsu().mesh().V()*tsu().primitiveField();
1729 template<
class Type>
1738 tC.
ref().source() -= su.mesh().V()*su.field();
1742 template<
class Type>
1751 tC.
ref().source() -= tsu().mesh().V()*tsu().field();
1756 template<
class Type>
1765 tC.
ref().source() -= tsu().mesh().V()*tsu().primitiveField();
1771 template<
class Type>
1784 template<
class Type>
1797 template<
class Type>
1811 template<
class Type>
1825 template<
class Type>
1834 tC.
ref().source() += su.mesh().V()*su.field();
1838 template<
class Type>
1847 tC.
ref().source() += tsu().mesh().V()*tsu().field();
1852 template<
class Type>
1861 tC.
ref().source() += tsu().mesh().V()*tsu().primitiveField();
1866 template<
class Type>
1875 tC.
ref().source() += su.mesh().V()*su.field();
1879 template<
class Type>
1888 tC.
ref().source() += tsu().mesh().V()*tsu().field();
1893 template<
class Type>
1902 tC.
ref().source() += tsu().mesh().V()*tsu().primitiveField();
1907 template<
class Type>
1917 tC.
ref().source() -= su.mesh().V()*su.field();
1921 template<
class Type>
1931 tC.
ref().source() -= tsu().mesh().V()*tsu().field();
1936 template<
class Type>
1946 tC.
ref().source() -= tsu().mesh().V()*tsu().primitiveField();
1951 template<
class Type>
1961 tC.ref().source() -= su.mesh().V()*su.field();
1965 template<
class Type>
1975 tC.ref().source() -= tsu().mesh().V()*tsu().field();
1980 template<
class Type>
1990 tC.ref().source() -= tsu().mesh().V()*tsu().primitiveField();
1995 template<
class Type>
2004 tC.
ref().source() -= su.value()*A.psi().mesh().V();
2008 template<
class Type>
2017 tC.
ref().source() -= su.value()*tC().psi().mesh().V();
2021 template<
class Type>
2030 tC.
ref().source() -= su.value()*A.psi().mesh().V();
2034 template<
class Type>
2043 tC.
ref().source() -= su.value()*tC().psi().mesh().V();
2047 template<
class Type>
2056 tC.
ref().source() += su.value()*tC().psi().mesh().V();
2060 template<
class Type>
2069 tC.
ref().source() += su.value()*tC().psi().mesh().V();
2073 template<
class Type>
2083 tC.
ref().source() -= su.value()*A.psi().mesh().V();
2087 template<
class Type>
2097 tC.ref().source() -= su.value()*tC().psi().mesh().V();
2102 template<
class Type>
2114 template<
class Type>
2126 template<
class Type>
2138 template<
class Type>
2150 template<
class Type>
2162 template<
class Type>
2174 template<
class Type>
2186 template<
class Type>
2199 template<
class Type>
2221 extrapolatedCalculatedFvPatchScalarField::typeName
2229 for (
direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
2233 M.addBoundaryDiag(boundaryDiagCmpt, cmpt);
2251 template<
class Type>
2264 template<
class Type>
2277 template<
class Type>
2290 template<
class Type>
2304 template<
class Type>
2321 template<
class Type>
2322 Foam::Ostream& Foam::operator<<(Ostream& os, const fvMatrix<Type>& fvm)
2324 os << static_cast<const lduMatrix&>(fvm) <<
nl 2325 << fvm.dimensions_ <<
nl 2326 << fvm.source_ <<
nl 2327 << fvm.internalCoeffs_ <<
nl 2328 << fvm.boundaryCoeffs_ <<
endl;
2330 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).
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.
DimensionedField< scalar, volMesh > Internal
Type of the internal field from which this GeometricField is derived.
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.
static tmp< GeometricField< scalar, fvPatchField, volMesh > > New(const word &name, const Mesh &, const dimensionSet &, const word &patchFieldType=fvPatchField< scalar >::calculatedType())
Return a temporary field constructed from name, mesh, dimensionSet.
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.
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.
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)
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 &)
volScalarField alpha(IOobject("alpha", runTime.timeName(), mesh, IOobject::READ_IF_PRESENT, IOobject::AUTO_WRITE), lambda *max(Ua &U, zeroSensitivity))
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.
void deleteDemandDrivenData(DataPtr &dataPtr)
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.
#define InfoInFunction
Report an information message using Foam::Info.
const dimensionSet & dimensions() const