37#define declareFvmLaplacianScalarGamma(Type) \
40Foam::tmp<Foam::fvMatrix<Foam::Type>> \
41Foam::fv::fusedGaussLaplacianScheme<Foam::Type, Foam::scalar>:: \
44 const GeometricField<scalar, fvPatchField, volMesh>& gamma, \
45 const GeometricField<Type, fvPatchField, volMesh>& vf \
48 DebugPout<< "fusedGaussLaplacianScheme::fvmLaplacian on " << vf.name() \
49 << " with scalar gamma " << gamma.name() << " and ET" << endl; \
51 const fvMesh& mesh = this->mesh(); \
53 const auto weights = this->tinterpGammaScheme_().weights(gamma).expr(); \
54 const auto gammaMagSf = \
55 Expression::interpolate(gamma.expr(), weights, mesh) \
56 * mesh.magSf().expr(); \
58 const_cast<orientedType&>(gammaMagSf.oriented()).setOriented(false); \
59 const auto deltaCoeffs = this->tsnGradScheme_().deltaCoeffs(vf).expr(); \
61 tmp<fvMatrix<Type>> tfvm \
66 gamma.dimensions()*mesh.magSf().dimensions()*vf.dimensions() \
69 fvMatrix<Type>& fvm = tfvm.ref(); \
71 Expression::fvmLaplacianUncorrected(fvm, gammaMagSf, deltaCoeffs); \
73 if (this->tsnGradScheme_().corrected()) \
75 const auto corr(this->tsnGradScheme_().correction(vf).expr()); \
76 fvmCorrection(fvm, gamma.dimensions(), gammaMagSf, corr); \
83Foam::tmp<Foam::fvMatrix<Foam::Type>> \
84Foam::fv::fusedGaussLaplacianScheme<Foam::Type, Foam::scalar>:: \
87 const GeometricField<scalar, fvsPatchField, surfaceMesh>& gamma, \
88 const GeometricField<Type, fvPatchField, volMesh>& vf \
91 DebugPout<< "fusedGaussLaplacianScheme::fvmLaplacian on " << vf.name() \
92 << " with interpolated gamma " << gamma.name() << " and ET" << endl; \
94 const fvMesh& mesh = this->mesh(); \
96 const auto gammaMagSf = gamma.expr()* mesh.magSf().expr(); \
97 const auto deltaCoeffs = this->tsnGradScheme_().deltaCoeffs(vf).expr(); \
99 tmp<fvMatrix<Type>> tfvm \
104 gamma.dimensions()*mesh.magSf().dimensions()*vf.dimensions() \
107 fvMatrix<Type>& fvm = tfvm.ref(); \
109 Expression::fvmLaplacianUncorrected(fvm, gammaMagSf, deltaCoeffs); \
111 if (this->tsnGradScheme_().corrected()) \
113 const auto corr(this->tsnGradScheme_().correction(vf).expr()); \
114 fvmCorrection(fvm, gamma.dimensions(), gammaMagSf, corr); \
121Foam::tmp<Foam::GeometricField<Foam::Type, Foam::fvPatchField, Foam::volMesh>> \
122Foam::fv::fusedGaussLaplacianScheme<Foam::Type, Foam::scalar>:: \
125 const GeometricField<scalar, fvsPatchField, surfaceMesh>& gamma, \
126 const GeometricField<Type, fvPatchField, volMesh>& vf \
129 DebugPout<< "fvcLaplacian on " << vf.name() \
130 << " with scalar gamma " << gamma.name() << endl; \
132 const fvMesh& mesh = this->mesh(); \
134 tmp<GeometricField<Type, fvPatchField, volMesh>> tLaplacian \
136 fvc::div(gamma*this->tsnGradScheme_().snGrad(vf)*mesh.magSf()) \
139 tLaplacian.ref().rename \
141 "laplacian(" + gamma.name() + ',' + vf.name() + ')' \
155 const GeometricField<scalar, fvPatchField, volMesh>&
gamma,
156 const GeometricField<scalar, fvPatchField, volMesh>& vf
160 typedef GeometricField<Type, fvPatchField, volMesh> FieldType;
161 typedef GeometricField<Type, fvsPatchField, surfaceMesh> SurfaceFieldType;
162 typedef typename outerProduct<vector, Type>::type GradType;
163 typedef GeometricField<GradType, fvPatchField, volMesh> GradFieldType;
166 <<
"fusedGaussLaplacianScheme<scalar, scalar>::fvcLaplacian"
167 <<
" on " << vf.name() <<
" with gamma " <<
gamma.name() << endl;
169 const fvMesh&
mesh = vf.mesh();
171 tmp<FieldType> tresult
177 "laplacian(" + vf.name() +
')',
186 gamma.dimensions()*vf.dimensions()/dimArea, Zero
188 fvPatchFieldBase::extrapolatedCalculatedType()
191 FieldType& result = tresult.ref();
193 const auto tweights(this->tinterpGammaScheme_().weights(
gamma));
194 const auto& weights = tweights();
195 const auto tdeltaCoeffs(this->tsnGradScheme_().deltaCoeffs(vf));
196 const auto& deltaCoeffs = tdeltaCoeffs();
198 if (this->tsnGradScheme_().corrected())
201 tmp<SurfaceFieldType> tfaceGrad
207 "snGradCorr("+vf.name()+
')',
220 tmp<GradFieldType> tgGrad
222 gradScheme<Type>::New
225 mesh.gradScheme(
"grad(" + vf.name() +
')')
226 )().grad(vf,
"grad(" + vf.name() +
')')
228 const auto& gGrad = tgGrad();
231 const auto dotInterpolate = [&]
236 const GradType& ownVal,
237 const GradType& neiVal,
244 result = dotVector&(
lambda*(ownVal - neiVal) + neiVal);
249 mesh.surfaceInterpolation::weights(),
251 mesh.nonOrthCorrectionVectors(),
256 const auto& faceGrad = tfaceGrad();
258 const auto snGrad = [&]
263 const scalar ownGamma,
264 const scalar neiGamma,
270 const Type& correction
273 const auto snGrad(dc*(neiVal-ownVal) + correction);
274 const scalar faceGamma(weight*(ownGamma-neiGamma)+neiGamma);
275 return mag(Sf)*faceGamma*snGrad;
296 const auto snGrad = [&]
301 const scalar ownGamma,
302 const scalar neiGamma,
309 const auto snGrad(dc*(neiVal-ownVal));
310 const scalar faceGamma(weight*(ownGamma-neiGamma)+neiGamma);
311 return mag(Sf)*faceGamma*snGrad;
329 result.primitiveFieldRef() /=
mesh.V();
330 result.correctBoundaryConditions();
348 <<
"fusedGaussLaplacianScheme<vector, scalar>::fvcLaplacian"
349 <<
" on " << vf.
name() <<
" with gamma " <<
gamma.name() <<
endl;
365 "laplacian(" + vf.
name() +
')',
379 FieldType& result = tresult.
ref();
382 const auto& weights = tweights();
384 const auto& deltaCoeffs = tdeltaCoeffs();
395 "snGradCorr("+vf.
name()+
')',
413 mesh.gradScheme(
"grad(" + vf.
name() +
')')
414 )().grad(vf,
"grad(" + vf.
name() +
')')
416 const auto& gGrad = tgGrad();
419 const auto dotInterpolate = [&]
424 const GradType& ownVal,
425 const GradType& neiVal,
432 result = dotVector&(
lambda*(ownVal - neiVal) + neiVal);
437 mesh.surfaceInterpolation::weights(),
439 mesh.nonOrthCorrectionVectors(),
444 const auto& faceGrad = tfaceGrad();
446 const auto snGrad = [&]
451 const scalar ownGamma,
452 const scalar neiGamma,
461 const auto snGrad(dc*(neiVal-ownVal) +
correction);
462 const scalar faceGamma(weight*(ownGamma-neiGamma)+neiGamma);
463 return mag(Sf)*faceGamma*snGrad;
484 const auto snGrad = [&]
489 const scalar ownGamma,
490 const scalar neiGamma,
497 const auto snGrad(dc*(neiVal-ownVal));
498 const scalar faceGamma(weight*(ownGamma-neiGamma)+neiGamma);
499 return mag(Sf)*faceGamma*snGrad;
517 result.primitiveFieldRef() /=
mesh.V();
518 result.correctBoundaryConditions();
549 "laplacian(" + vf.
name() +
')',
560 FieldType& result = tresult.
ref();
563 <<
"fusedGaussLaplacianScheme<scalar, GType>::fvcLaplacian on "
565 <<
" to generate " << result.name() <<
endl;
569 const auto& deltaCoeffs = tdeltaCoeffs();
581 "snGradCorr("+vf.
name()+
')',
599 mesh.gradScheme(
"grad(" + vf.
name() +
')')
600 )().grad(vf,
"grad(" + vf.
name() +
')')
602 const auto& gGrad = tgGrad();
605 const auto dotInterpolate = [&]
610 const GradType& ownVal,
611 const GradType& neiVal,
618 result = dotVector&(
lambda*(ownVal - neiVal) + neiVal);
623 mesh.surfaceInterpolation::weights(),
625 mesh.nonOrthCorrectionVectors(),
630 const auto& faceGrad = tfaceGrad();
632 const auto snGrad = [&]
641 const auto snGrad(dc*(neiVal-ownVal) +
correction);
642 return mag(Sf)*snGrad;
657 const auto snGrad = [&]
665 const auto snGrad(dc*(neiVal-ownVal));
666 return mag(Sf)*snGrad;
679 result.primitiveFieldRef() /=
mesh.V();
680 result.correctBoundaryConditions();
711 "laplacian(" + vf.
name() +
')',
722 FieldType& result = tresult.
ref();
725 <<
"fusedGaussLaplacianScheme<vector, GType>::fvcLaplacian on "
727 <<
" to generate " << result.name() <<
endl;
731 const auto& deltaCoeffs = tdeltaCoeffs();
743 "snGradCorr("+vf.
name()+
')',
761 mesh.gradScheme(
"grad(" + vf.
name() +
')')
762 )().grad(vf,
"grad(" + vf.
name() +
')')
764 const auto& gGrad = tgGrad();
767 const auto dotInterpolate = [&]
772 const GradType& ownVal,
773 const GradType& neiVal,
780 result = dotVector&(
lambda*(ownVal - neiVal) + neiVal);
785 mesh.surfaceInterpolation::weights(),
787 mesh.nonOrthCorrectionVectors(),
792 const auto& faceGrad = tfaceGrad();
794 const auto snGrad = [&]
803 const auto snGrad(dc*(neiVal-ownVal) +
correction);
804 return mag(Sf)*snGrad;
819 const auto snGrad = [&]
827 const auto snGrad(dc*(neiVal-ownVal));
828 return mag(Sf)*snGrad;
841 result.primitiveFieldRef() /=
mesh.V();
842 result.correctBoundaryConditions();
const Mesh & mesh() const noexcept
Return const reference to mesh.
const dimensionSet & dimensions() const noexcept
Return dimensions.
Generic GeometricField class.
@ NO_READ
Nothing to be read.
@ NO_WRITE
Ignore writing from objectRegistry::writeObject().
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.
Generic dimensioned Type class.
Mesh data needed to do the Finite Volume discretisation.
static const word & extrapolatedCalculatedType() noexcept
The type name for extrapolatedCalculated patch fields combines zero-gradient and calculated.
virtual tmp< GeometricField< Type, fvPatchField, volMesh > > fvcLaplacian(const GeometricField< Type, fvPatchField, volMesh > &)
static tmp< gradScheme< Type > > New(const fvMesh &mesh, Istream &schemeData)
Return a pointer to a new gradScheme created on freestore.
tmp< snGradScheme< Type > > tsnGradScheme_
tmp< surfaceInterpolationScheme< GType > > tinterpGammaScheme_
const fvMesh & mesh() const
Return mesh reference.
typeOfRank< typenamepTraits< arg1 >::cmptType, direction(pTraits< arg1 >::rank)+direction(pTraits< arg2 >::rank)>::type type
A class for managing temporary objects.
T & ref() const
Return non-const reference to the contents of a non-null managed pointer.
A Vector of values with scalar precision, where scalar is float/double depending on the compilation f...
#define declareFvmLaplacianScalarGamma(Type)
Expression templates for fvMatrix.
#define makeFvLaplacianScheme(SS)
#define DebugPout
Report an information message using Foam::Pout.
static tmp< GeometricField< Type, fvsPatchField, surfaceMesh > > interpolate(const GeometricField< Type, fvPatchField, volMesh > &tvf, const surfaceScalarField &faceFlux, Istream &schemeData)
Interpolate field onto faces using scheme given by Istream.
void surfaceSnSum(const surfaceScalarField &deltaCoeffs, const GeometricField< Type, fvPatchField, volMesh > &vf, const CellToFaceOp &cop, GeometricField< ResultType, fvPatchField, volMesh > &result, const bool doCorrectBoundaryConditions)
sum of snGrad
const dimensionSet dimArea(sqr(dimLength))
Ostream & endl(Ostream &os)
Add newline and flush stream.
dimensioned< typename typeOfMag< Type >::type > mag(const dimensioned< Type > &dt)
static constexpr const zero Zero
Global zero (0).
tmp< fvMatrix< Type > > correction(const fvMatrix< Type > &)
Return the correction form of the given matrix by subtracting the matrix multiplied by the current fi...
SphericalTensor< scalar > sphericalTensor
SphericalTensor of scalars, i.e. SphericalTensor<scalar>.
SymmTensor< scalar > symmTensor
SymmTensor of scalars, i.e. SymmTensor<scalar>.
dimensionedScalar lambda("lambda", dimTime/sqr(dimLength), laminarTransport)