41#ifndef Foam_fvMatrixExpression_H
42#define Foam_fvMatrixExpression_H
75 typename FaceFluxExpr,
89 static constexpr bool is_leaf =
false;
120 DiagExpr
diag()
const
122 return static_cast<const E&
>(*this).diag();
127 return static_cast<E&
>(*this).diag();
130 UpperExpr
upper()
const
132 return static_cast<const E&
>(*this).upper();
137 return static_cast<E&
>(*this).upper();
140 LowerExpr
lower()
const
142 return static_cast<const E&
>(*this).lower();
147 return static_cast<E&
>(*this).lower();
184 return static_cast<E&
>(*this).source();
189 return static_cast<const E&
>(*this).source();
194 return static_cast<E&
>(*this).internalCoeffs(i);
199 return static_cast<const E&
>(*this).internalCoeffs(i);
204 return static_cast<E&
>(*this).boundaryCoeffs(i);
209 return static_cast<const E&
>(*this).boundaryCoeffs(i);
214 return static_cast<const E&
>(*this).faceFluxCorrection();
219 return static_cast<E&
>(*this).faceFluxCorrection();
231 template<
class Matrix>
241 upper().evaluate(m.upper());
245 lower().evaluate(m.lower());
253 auto& intCoeffs = m.internalCoeffs();
254 auto& bouCoeffs = m.boundaryCoeffs();
255 const label
n = intCoeffs.size();
256 for (label i = 0; i <
n; ++i)
258 if (intCoeffs.set(i) && intCoeffs[i].size())
261 intExpr.evaluate(intCoeffs[i]);
263 if (bouCoeffs.set(i) && bouCoeffs[i].size())
266 bouExpr.evaluate(bouCoeffs[i]);
282template<
class Matrix>
285 public fvMatrixExpression
287 fvMatrixRefWrap<Matrix>,
288 ListRefWrap<typename Matrix::psiFieldType::value_type>,
289 ListRefWrap<typename Matrix::psiFieldType::value_type>,
290 ListRefWrap<typename Matrix::psiFieldType::value_type>,
292 GeometricFieldRefWrap<typename Matrix::faceFluxFieldType>,
293 ListRefWrap<typename Matrix::psiFieldType::value_type>
298 static constexpr bool is_leaf =
false;
304 typedef typename Matrix::psiFieldType::value_type
value_type;
313 typename Matrix::faceFluxFieldType
377 typename E::DiagExpr,
378 typename E::UpperExpr,
379 typename E::LowerExpr,
380 typename E::FaceFluxExpr,
381 typename E::SourceExpr
403 expr.evaluate(elems_);
413 typename E::DiagExpr,
414 typename E::UpperExpr,
415 typename E::LowerExpr,
416 typename E::FaceFluxExpr,
417 typename E::SourceExpr
421 expr.evaluate(elems_);
432 typename E::DiagExpr,
433 typename E::UpperExpr,
434 typename E::LowerExpr,
435 typename E::FaceFluxExpr,
436 typename E::SourceExpr
440 return expr.evaluate(elems_);
448 return elems_.diag();
453 return elems_.
diag();
458 return elems_.upper();
463 return elems_.upper();
468 return elems_.lower();
473 return elems_.lower();
481 return elems_.source();
486 return elems_.source();
493 elems_.internalCoeffs().set(i)
494 ? elems_.internalCoeffs()[i]
503 elems_.internalCoeffs().set(i)
504 ? elems_.internalCoeffs()[i]
513 elems_.boundaryCoeffs().set(i)
514 ? elems_.boundaryCoeffs()[i]
523 elems_.boundaryCoeffs().set(i)
524 ? elems_.boundaryCoeffs()[i]
534 ).faceFluxCorrectionPtr().get();
539 return *elems_.faceFluxCorrectionPtr().get();
549template<
class Matrix>
554 fvMatrixConstRefWrap<Matrix>,
555 ListConstRefWrap<typename Matrix::psiFieldType::value_type>,
556 ListConstRefWrap<typename Matrix::psiFieldType::value_type>,
557 ListConstRefWrap<typename Matrix::psiFieldType::value_type>,
559 GeometricFieldConstRefWrap<typename Matrix::faceFluxFieldType>,
560 ListConstRefWrap<typename Matrix::psiFieldType::value_type>
565 static constexpr bool is_leaf =
false;
571 typedef typename Matrix::psiFieldType::value_type
value_type;
580 typename Matrix::faceFluxFieldType
619 return elems_.diag();
624 return elems_.upper();
629 return elems_.lower();
637 return elems_.source();
644 elems_.internalCoeffs().set(i)
645 ? elems_.internalCoeffs()[i]
654 elems_.boundaryCoeffs().set(i)
655 ? elems_.boundaryCoeffs()[i]
665 ).faceFluxCorrectionPtr().get();
676template<
typename E1,
typename E2>
684 typename E1::DiagExpr,
685 typename E2::DiagExpr
689 typename E1::UpperExpr,
690 typename E2::UpperExpr
694 typename E1::LowerExpr,
695 typename E2::LowerExpr
699 typename E1::FaceFluxExpr,
700 typename E2::FaceFluxExpr
704 typename E1::SourceExpr,
705 typename E2::SourceExpr
710 typename std::conditional<E1::is_leaf, const E1&, const E1>::type u_;
711 typename std::conditional<E2::is_leaf, const E2&, const E2>::type v_;
714 static constexpr bool is_leaf =
false;
722 typename E1::DiagExpr,
723 typename E2::DiagExpr
727 typename E1::UpperExpr,
728 typename E2::UpperExpr
732 typename E1::LowerExpr,
733 typename E2::LowerExpr
737 typename E1::FaceFluxExpr,
738 typename E2::FaceFluxExpr
742 typename E1::SourceExpr,
743 typename E2::SourceExpr
746 fvm_add(
const E1& u,
const E2& v)
779 return u_.diag() + v_.diag();
784 return u_.upper() + v_.upper();
789 return u_.lower() + v_.lower();
796 return u_.source() + v_.source();
801 return u_.boundaryCoeffs(i) + v_.boundaryCoeffs(i);
806 return u_.internalCoeffs(i) + v_.internalCoeffs(i);
811 return u_.faceFluxCorrection() + v_.faceFluxCorrection();
814template<
typename E1,
typename E2>
821 typename E1::DiagExpr,
822 typename E1::UpperExpr,
823 typename E1::LowerExpr,
824 typename E1::FaceFluxExpr,
825 typename E1::SourceExpr
830 typename E2::DiagExpr,
831 typename E2::UpperExpr,
832 typename E2::LowerExpr,
833 typename E2::FaceFluxExpr,
834 typename E2::SourceExpr
840 static_cast<const E1&
>(u),
841 static_cast<const E2&
>(v)
847template<
typename E1,
typename E2>
852 fvm_subtract<E1, E2>,
855 typename E1::DiagExpr,
856 typename E2::DiagExpr
860 typename E1::UpperExpr,
861 typename E2::UpperExpr
865 typename E1::LowerExpr,
866 typename E2::LowerExpr
870 typename E1::FaceFluxExpr,
871 typename E2::FaceFluxExpr
875 typename E1::SourceExpr,
876 typename E2::SourceExpr
881 typename std::conditional<E1::is_leaf, const E1&, const E1>::type u_;
882 typename std::conditional<E2::is_leaf, const E2&, const E2>::type v_;
885 static constexpr bool is_leaf =
false;
893 typename E1::DiagExpr,
894 typename E2::DiagExpr
898 typename E1::UpperExpr,
899 typename E2::UpperExpr
903 typename E1::LowerExpr,
904 typename E2::LowerExpr
908 typename E1::FaceFluxExpr,
909 typename E2::FaceFluxExpr
913 typename E1::SourceExpr,
914 typename E2::SourceExpr
944 return u_.diag() - v_.diag();
949 return u_.upper() - v_.upper();
954 return u_.lower() - v_.lower();
962 return u_.source() - v_.source();
967 return u_.internalCoeffs(i) - v_.internalCoeffs(i);
972 return u_.boundaryCoeffs(i) - v_.boundaryCoeffs(i);
977 return u_.faceFluxCorrection() - v_.faceFluxCorrection();
980template<
typename E1,
typename E2>
987 typename E1::DiagExpr,
988 typename E1::UpperExpr,
989 typename E1::LowerExpr,
990 typename E1::FaceFluxExpr,
991 typename E1::SourceExpr
996 typename E2::DiagExpr,
997 typename E2::UpperExpr,
998 typename E2::LowerExpr,
999 typename E2::FaceFluxExpr,
1000 typename E2::SourceExpr
1006 static_cast<const E1&
>(u),
1007 static_cast<const E2&
>(v)
1010template<
typename E1,
typename E2>
1017 typename E1::DiagExpr,
1018 typename E1::UpperExpr,
1019 typename E1::LowerExpr,
1020 typename E1::FaceFluxExpr,
1021 typename E1::SourceExpr
1026 typename E2::DiagExpr,
1027 typename E2::UpperExpr,
1028 typename E2::LowerExpr,
1029 typename E2::FaceFluxExpr,
1030 typename E2::SourceExpr
1036 static_cast<const E1&
>(u),
1037 static_cast<const E2&
>(v)
1043template<
typename E1>
1049 List_negate<typename E1::DiagExpr>,
1050 List_negate<typename E1::UpperExpr>,
1051 List_negate<typename E1::LowerExpr>,
1052 List_negate<typename E1::FaceFluxExpr>,
1053 List_negate<typename E1::SourceExpr>
1057 typename std::conditional<E1::is_leaf, const E1&, const E1>::type u_;
1060 static constexpr bool is_leaf =
false;
1087 u.hasFaceFluxCorrection(),
1116 return -u_.source();
1121 return -u_.internalCoeffs(i);
1126 return -u_.boundaryCoeffs(i);
1131 return -u_.faceFluxCorrection();
1134template<
typename E1>
1141 typename E1::DiagExpr,
1142 typename E1::UpperExpr,
1143 typename E1::LowerExpr,
1144 typename E1::FaceFluxExpr,
1145 typename E1::SourceExpr
1155template<
class E1,
class E2>
1160 fvMatrixInternal<E1, E2>,
1164 GeometricField<typename E1::value_type, fvPatchField, volMesh>,
1170 static constexpr bool is_leaf =
false;
1298template<
typename E1>
1301 const dimensionSet& dimensions,
1302 const E1& expression,
1303 const GeometricField<typename E1::value_type, fvPatchField, volMesh>&
fld
1320 V*
max(expression, constantZero),
1321 V*
min(expression, constantZero)*
expr(
fld.internalField())
1324template<
typename E1>
1328 const E1& expression,
1350template<
typename E1>
1354 const E1& expression,
1361 typedef ListConstRefWrap<typename E1::value_type>
expr;
1369 return fvMatrixInternal
1385 const Expr& expression
1389 typedef ListConstRefWrap<typename Expr::value_type>
expr;
1391 typedef ListRefWrap<typename Expr::value_type>
evaluator;
1404 const Expr& expression
1409template<
class Expr,
class Expr2>
1414 const Expr& expression
1418 typedef ListConstRefWrap<typename Expr::value_type>
expr;
1420 typedef ListRefWrap<typename Expr::value_type>
evaluator;
1429template<
class Expr,
class Expr2>
1432 fvMatrix<typename Expr::value_type>& m,
1434 const Expr& expression
1444 const constant constantZero(expression.size(), 0.0);
1447 const expr V(m.psi().mesh().V());
1450 auto&
diag = m.diag();
1451 auto& source = m.source();
1467 *
min(expression, constantZero)
1468 *
expr(m.psi().internalField())
1479template<
typename E1,
typename E2>
1482 public GeometricFieldExpression
1484 interpolate<E1, E2>,
1489 IndirectConstWrap<typename E1::IntExpr>,
1490 IndirectConstWrap<typename E1::IntExpr>,
1491 typename E2::IntExpr
1495 typename E1::UncoupledPatchExpr,
1500 IndirectConstWrap<typename E1::IntExpr>,
1501 typename E1::CoupledPatchExpr,
1502 typename E2::CoupledPatchExpr
1506 typename E1::value_type
1510 typename std::conditional
1518 typename std::conditional
1530 static constexpr bool is_leaf =
false;
1537 typename E2::IntExpr
1547 typename E1::CoupledPatchExpr,
1548 typename E2::CoupledPatchExpr
1559 const E2& faceWeights,
1575 cellVals_(cellVals),
1576 faceWeights_(faceWeights),
1582 const auto ownVal = cellVals_[mesh_.
owner()[i]];
1583 const auto neiVal = cellVals_[mesh_.
neighbour()[i]];
1584 return faceWeights_[i]*(ownVal-neiVal) + neiVal;
1589 return faceWeights_.size();
1596 IndirectConstWrap<typename E1::IntExpr>
1598 cellVals_.internalField(),
1601 IndirectConstWrap<typename E1::IntExpr>
1603 cellVals_.internalField(),
1606 faceWeights_.internalField()
1621 cellVals_.internalField(),
1622 mesh_.boundaryMesh()[i].faceCells()
1626 [&](
const auto&
fld,
const label i)
1628 return ListConstTmpWrap<Field<value_type>>
1630 fld.boundaryField()[i].patchNeighbourField()
1635 faceWeights_.coupledPatchField(i)
1641template<
typename E1>
1647 GeometricFieldConstRefWrap<surfaceScalarField>
1666 mesh.surfaceInterpolation::weights().
expr(),
1673template<
class Type,
class E1,
class E2>
1677 const E1& gammaMagSf,
1678 const E2& deltaCoeffs
1689 deltaCoeffs.dimensions()
1690 * gammaMagSf.dimensions()
1697 deltaCoeffs.internalField()*gammaMagSf.internalField()
1701 forAll(vf.boundaryField(), patchi)
1703 const auto& pvf = vf.boundaryField()[patchi];
1704 auto& intCoeffs =
fvm.internalCoeffs()[patchi];
1705 auto& bouCoeffs =
fvm.boundaryCoeffs()[patchi];
1717 expr(pvf.gradientInternalCoeffs(pDeltaCoeffs)())
1718 *gammaMagSf.patchField(patchi)
1724 -
expr(pvf.gradientBoundaryCoeffs(pDeltaCoeffs)())
1725 *gammaMagSf.patchField(patchi)
1734 expr(pvf.gradientInternalCoeffs()())
1735 *gammaMagSf.patchField(patchi)
1741 -
expr(pvf.gradientBoundaryCoeffs()())
1742 *gammaMagSf.patchField(patchi)
Expression templates for GeometricFields.
Expression templates for List.
Info<< nl;Info<< "Write faMesh in vtk format:"<< nl;{ vtk::uindirectPatchWriter writer(aMesh.patch(), fileName(aMesh.time().globalPath()/vtkBaseFileName));writer.writeGeometry();globalIndex procAddr(aMesh.nFaces());labelList cellIDs;if(UPstream::master()) { cellIDs.resize(procAddr.totalSize());for(const labelRange &range :procAddr.ranges()) { auto slice=cellIDs.slice(range);slice=identity(range);} } writer.beginCellData(4);writer.writeProcIDs();writer.write("cellID", cellIDs);writer.write("area", aMesh.S().field());writer.write("normal", aMesh.faceAreaNormals());writer.beginPointData(1);writer.write("normal", aMesh.pointAreaNormals());Info<< " "<< writer.output().name()<< nl;}{ vtk::lineWriter writer(aMesh.points(), aMesh.edges(), fileName(aMesh.time().globalPath()/(vtkBaseFileName+"-edges")));writer.writeGeometry();writer.beginCellData(4);writer.writeProcIDs();{ Field< scalar > fld(faMeshTools::flattenEdgeField(aMesh.magLe(), true))
const Mesh & mesh() const noexcept
Return const reference to mesh.
Expression wrap of const reference to GeometricField.
GeometricFieldExpression(const dimensionSet &dimensions, const orientedType oriented)
const dimensionSet & dimensions() const noexcept
const orientedType & oriented() const noexcept
Expression wrap of non-const reference to GeometricField.
Expression wrap of indirection.
Expression wrap of const reference to UList.
Expression wrap of non-const reference to List.
Not possible: a *= b has to return a new type so it can never be in-place.
Expression wrap of const reference to fvMatrix.
ListConstRefWrap< value_type > LowerExpr
ListConstRefWrap< value_type > UpperExpr
static constexpr bool is_leaf
UpperExpr internalCoeffs(const label i) const
GeometricFieldConstRefWrap< typename Matrix::faceFluxFieldType > FaceFluxExpr
fvMatrixConstRefWrap(const this_type &elems)
Matrix this_type
The fvMatrix type.
FaceFluxExpr faceFluxCorrection() const
SourceExpr source() const
ListConstRefWrap< value_type > SourceExpr
UpperExpr boundaryCoeffs(const label i) const
Matrix::psiFieldType::value_type value_type
Type to return for internal field.
ListConstRefWrap< value_type > DiagExpr
Type to return for containers.
Matrix & evaluate(Matrix &m) const
Helper to evaluate (=construct) an fvMatrix.
static constexpr bool is_leaf
UpperExpr internalCoeffs(const label i)
UpperExpr internalCoeffs(const label i) const
const dimensionSet & dimensions() const noexcept
UpperExpr boundaryCoeffs(const label i)
FaceFluxExpr faceFluxCorrection() const
bool hasFaceFluxCorrection() const
fvMatrixExpression(const bool hasDiag, const bool hasUpper, const bool hasLower, const bool hasFaceFluxCorrection, const dimensionSet &dimensions)
SourceExpr source() const
FaceFluxExpr faceFluxCorrection()
UpperExpr boundaryCoeffs(const label i) const
const bool hasFaceFluxCorrection_
fvMatrix, internal parts and dimensions only. No upper/lower/boundaryCoeffs
static constexpr bool is_leaf
auto boundaryCoeffs(const label i) const
auto internalCoeffs(const label i) const
E1::value_type value_type
Type to return for internal field.
fvMatrixInternal(const dimensionSet &dimensions, const DiagExpr &diag, const SourceExpr &source)
E1 DiagExpr
Type to return for containers.
fvMatrixInternal(const dimensionSet &dimensions, const DiagExpr &&diag, const SourceExpr &&source)
GeometricField< value_type, fvPatchField, volMesh > FaceFluxExpr
auto faceFluxCorrection() const
Expression wrap of non-const reference to fvMatrix.
fvMatrixRefWrap(this_type &&elems)
Move construct.
GeometricFieldRefWrap< typename Matrix::faceFluxFieldType > FaceFluxExpr
ListRefWrap< value_type > LowerExpr
static constexpr bool is_leaf
ListRefWrap< value_type > UpperExpr
UpperExpr internalCoeffs(const label i)
this_type & evaluate(const fvMatrixExpression< E, typename E::DiagExpr, typename E::UpperExpr, typename E::LowerExpr, typename E::FaceFluxExpr, typename E::SourceExpr > &expr)
Evaluate and return as GeoField. Rename to evaluate to make it clear it takes time?...
fvMatrixRefWrap(this_type &elems, const fvMatrixExpression< E, typename E::DiagExpr, typename E::UpperExpr, typename E::LowerExpr, typename E::FaceFluxExpr, typename E::SourceExpr > &expr)
UpperExpr internalCoeffs(const label i) const
Matrix this_type
The fvMatrix type.
UpperExpr boundaryCoeffs(const label i)
ListRefWrap< value_type > SourceExpr
FaceFluxExpr faceFluxCorrection() const
SourceExpr source() const
FaceFluxExpr faceFluxCorrection()
fvMatrixRefWrap(this_type &elems)
Copy construct.
UpperExpr boundaryCoeffs(const label i) const
ListRefWrap< value_type > DiagExpr
Type to return for containers.
Matrix::psiFieldType::value_type value_type
Type to return for internal field.
fvm_add(const E1 &u, const E2 &v)
static constexpr bool is_leaf
GF_add< typename E1::FaceFluxExpr, typename E2::FaceFluxExpr > FaceFluxExpr
UpperExpr internalCoeffs(const label i) const
List_add< typename E1::LowerExpr, typename E2::LowerExpr > LowerExpr
E1::value_type value_type
Type to return for internal field.
List_add< typename E1::UpperExpr, typename E2::UpperExpr > UpperExpr
FaceFluxExpr faceFluxCorrection() const
SourceExpr source() const
List_add< typename E1::DiagExpr, typename E2::DiagExpr > DiagExpr
Type to return for containers.
UpperExpr boundaryCoeffs(const label i) const
List_add< typename E1::SourceExpr, typename E2::SourceExpr > SourceExpr
static constexpr bool is_leaf
List_negate< typename E1::SourceExpr > SourceExpr
UpperExpr internalCoeffs(const label i) const
E1::value_type value_type
Type to return for internal field.
FaceFluxExpr faceFluxCorrection() const
List_negate< typename E1::UpperExpr > UpperExpr
List_negate< typename E1::FaceFluxExpr > FaceFluxExpr
SourceExpr source() const
List_negate< typename E1::LowerExpr > LowerExpr
UpperExpr boundaryCoeffs(const label i) const
List_negate< typename E1::DiagExpr > DiagExpr
Type to return for containers.
GF_subtract< typename E1::FaceFluxExpr, typename E2::FaceFluxExpr > FaceFluxExpr
List_subtract< typename E1::DiagExpr, typename E2::DiagExpr > DiagExpr
Type to return for containers.
static constexpr bool is_leaf
UpperExpr internalCoeffs(const label i) const
E1::value_type value_type
Type to return for internal field.
List_subtract< typename E1::SourceExpr, typename E2::SourceExpr > SourceExpr
FaceFluxExpr faceFluxCorrection() const
SourceExpr source() const
List_subtract< typename E1::UpperExpr, typename E2::UpperExpr > UpperExpr
fvm_subtract(const E1 &u, const E2 &v)
UpperExpr boundaryCoeffs(const label i) const
List_subtract< typename E1::LowerExpr, typename E2::LowerExpr > LowerExpr
E1::UncoupledPatchExpr UncoupledPatchExpr
Type to return for uncoupled patch field.
static constexpr bool is_leaf
List_interpolate< IndirectConstWrap< typename E1::IntExpr >, typename E1::CoupledPatchExpr, typename E2::CoupledPatchExpr > CoupledPatchExpr
Type to return for coupled patch field.
IntExpr internalField() const
E1::value_type value_type
Type of actual values.
UncoupledPatchExpr patchField(const label i) const
interpolate(const E1 &cellVals, const E2 &faceWeights, const fvMesh &mesh)
List_interpolate< IndirectConstWrap< typename E1::IntExpr >, IndirectConstWrap< typename E1::IntExpr >, typename E2::IntExpr > IntExpr
Type to return for internal field.
value_type operator[](const label i) const
CoupledPatchExpr coupledPatchField(const label i) const
linearInterpolate(const E1 &cellVals, const fvMesh &mesh)
Generic GeometricField class.
static const this_type & null() noexcept
Return a null GeometricField (reference to a nullObject).
const Internal & internalField() const noexcept
Return a const-reference to the dimensioned internal field.
static const List< T > & null() noexcept
Return a null List (reference to a nullObject). Behaves like an empty List.
A templated (m x n) matrix of objects of <T>. The layout is (mRows x nCols) - row-major order:
List< Type > diag() const
Extract the diagonal elements. Method may change in the future.
Dimension set for the base types, which can be used to implement rigorous dimension checking for alge...
void reset(const dimensionSet &ds)
Copy assign the exponents from the dimensionSet.
A special matrix type and solver, designed for finite volume solutions of scalar equations....
const GeometricField< Type, fvPatchField, volMesh > & psi(const label i=0) const
Return psi.
Field< Type > & source() noexcept
Mesh data needed to do the Finite Volume discretisation.
const DimensionedField< scalar, volMesh > & V() const
Return cell volumes.
const labelUList & owner() const
Internal face owner. Note bypassing virtual mechanism so.
const labelUList & neighbour() const
Internal face neighbour.
const scalarField & diag() const
Cell to surface interpolation scheme. Included in fvMesh.
gmvFile<< "tracers "<< particles.size()<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().x()<< " ";}gmvFile<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().y()<< " ";}gmvFile<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().z()<< " ";}gmvFile<< nl;forAll(lagrangianScalarNames, i){ word name=lagrangianScalarNames[i];IOField< scalar > s(IOobject(name, runTime.timeName(), cloud::prefix, mesh, IOobject::MUST_READ, IOobject::NO_WRITE))
A namespace for expression templates.
ListRefWrap< typename Expr::value_type > evaluator
Evaluator of an expression.
ListConstRefWrap< typename Expr::value_type > expr
Fully self-contained constant field wrapper. Not needed?
void fvmLaplacianUncorrected(fvMatrix< Type > &fvm, const E1 &gammaMagSf, const E2 &deltaCoeffs)
auto max(GeometricFieldExpression< E1, typename E1::IntExpr, typename E1::UncoupledPatchExpr, typename E1::CoupledPatchExpr, typename E1::value_type > const &u, GeometricFieldExpression< E2, typename E2::IntExpr, typename E2::UncoupledPatchExpr, typename E2::CoupledPatchExpr, typename E2::value_type > const &v)
const expr V(m.psi().mesh().V())
auto min(GeometricFieldExpression< E1, typename E1::IntExpr, typename E1::UncoupledPatchExpr, typename E1::CoupledPatchExpr, typename E1::value_type > const &u, GeometricFieldExpression< E2, typename E2::IntExpr, typename E2::UncoupledPatchExpr, typename E2::CoupledPatchExpr, typename E2::value_type > const &v)
void rhs(fvMatrix< typename Expr::value_type > &m, const Expr &expression)
auto SuSp(const dimensionSet &dimensions, const E1 &expression, const GeometricField< typename E1::value_type, fvPatchField, volMesh > &fld)
Different types of constants.
Namespace of functions to calculate implicit derivatives returning a matrix.
GeometricField< scalar, fvsPatchField, surfaceMesh > surfaceScalarField
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
void diag(pointPatchField< vector > &, const pointPatchField< tensor > &)
const dimensionSet dimVol(dimVolume)
Older spelling for dimVolume.
#define forAll(list, i)
Loop across all elements in list.