27 #include "surfaceInterpolate.H"
44 scalar backwardDdtScheme<Type>::deltaT_()
const
46 return mesh().time().deltaTValue();
51 scalar backwardDdtScheme<Type>::deltaT0_()
const
53 return mesh().time().deltaT0Value();
58 template<
class GeoField>
59 scalar backwardDdtScheme<Type>::deltaT0_(
const GeoField& vf)
const
61 if (vf.nOldTimes() < 2)
83 const word ddtName(
"ddt("+dt.
name()+
')');
85 const scalar deltaT = deltaT_();
86 const scalar deltaT0 = deltaT0_();
88 const scalar coefft = 1 + deltaT/(deltaT + deltaT0);
89 const scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
90 const scalar coefft0 = coefft + coefft00;
109 tdtdt.
ref().primitiveFieldRef() = rDeltaT.
value()*dt.
value()*
111 coefft - (coefft0*mesh().V0() - coefft00*mesh().V00())/mesh().V()
146 const word ddtName(
"ddt("+vf.
name()+
')');
148 const scalar deltaT = deltaT_();
149 const scalar deltaT0 = deltaT0_(vf);
151 const scalar coefft = 1 + deltaT/(deltaT + deltaT0);
152 const scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
153 const scalar coefft0 = coefft + coefft00;
166 coefft0*vf.
oldTime()()*mesh().V0()
167 - coefft00*vf.
oldTime().oldTime()()
175 coefft0*vf.
oldTime().boundaryField()
176 - coefft00*vf.
oldTime().oldTime().boundaryField()
193 + coefft00*vf.
oldTime().oldTime()
211 const word ddtName(
"ddt("+
rho.name()+
','+vf.
name()+
')');
213 const scalar deltaT = deltaT_();
214 const scalar deltaT0 = deltaT0_(vf);
216 const scalar coefft = 1 + deltaT/(deltaT + deltaT0);
217 const scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
218 const scalar coefft0 = coefft + coefft00;
231 coefft0*vf.
oldTime()()*mesh().V0()
232 - coefft00*vf.
oldTime().oldTime()()
240 coefft0*vf.
oldTime().boundaryField()
241 - coefft00*vf.
oldTime().oldTime().boundaryField()
258 + coefft00*vf.
oldTime().oldTime()
276 const word ddtName(
"ddt("+
rho.name()+
','+vf.
name()+
')');
278 const scalar deltaT = deltaT_();
279 const scalar deltaT0 = deltaT0_(vf);
281 const scalar coefft = 1 + deltaT/(deltaT + deltaT0);
282 const scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
283 const scalar coefft0 = coefft + coefft00;
296 coefft0*
rho.oldTime()()
298 - coefft00*
rho.oldTime().oldTime()()
299 *vf.
oldTime().oldTime()()*mesh().V00()
306 coefft0*
rho.oldTime().boundaryField()
308 - coefft00*
rho.oldTime().oldTime().boundaryField()
309 *vf.
oldTime().oldTime().boundaryField()
326 + coefft00*
rho.oldTime().oldTime()*vf.
oldTime().oldTime()
347 const scalar deltaT = deltaT_();
348 const scalar deltaT0 = deltaT0_(vf);
350 const scalar coefft = 1 + deltaT/(deltaT + deltaT0);
351 const scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
352 const scalar coefft0 = coefft + coefft00;
369 *
alpha.oldTime().oldTime()()*
rho.oldTime().oldTime()()
370 *vf.
oldTime().oldTime()()*mesh().V00()
376 *
alpha.boundaryField()
381 *
alpha.oldTime().boundaryField()
382 *
rho.oldTime().boundaryField()
386 *
alpha.oldTime().oldTime().boundaryField()
387 *
rho.oldTime().oldTime().boundaryField()
388 *vf.
oldTime().oldTime().boundaryField()
405 + coefft00*
alpha.oldTime().oldTime()
406 *
rho.oldTime().oldTime()*vf.
oldTime().oldTime()
432 const scalar rDeltaT = 1.0/deltaT_();
434 const scalar deltaT = deltaT_();
435 const scalar deltaT0 = deltaT0_(vf);
437 const scalar coefft = 1 + deltaT/(deltaT + deltaT0);
438 const scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
439 const scalar coefft0 = coefft + coefft00;
441 fvm.
diag() = (coefft*rDeltaT)*mesh().V();
447 coefft0*vf.
oldTime().primitiveField()*mesh().V0()
448 - coefft00*vf.
oldTime().oldTime().primitiveField()
454 fvm.
source() = rDeltaT*mesh().V()*
456 coefft0*vf.
oldTime().primitiveField()
457 - coefft00*vf.
oldTime().oldTime().primitiveField()
483 const scalar rDeltaT = 1.0/deltaT_();
485 const scalar deltaT = deltaT_();
486 const scalar deltaT0 = deltaT0_(vf);
488 const scalar coefft = 1 + deltaT/(deltaT + deltaT0);
489 const scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
490 const scalar coefft0 = coefft + coefft00;
492 fvm.
diag() = (coefft*rDeltaT*
rho.value())*mesh().V();
498 coefft0*vf.
oldTime().primitiveField()*mesh().V0()
499 - coefft00*vf.
oldTime().oldTime().primitiveField()
505 fvm.
source() = rDeltaT*mesh().V()*
rho.value()*
507 coefft0*vf.
oldTime().primitiveField()
508 - coefft00*vf.
oldTime().oldTime().primitiveField()
534 const scalar rDeltaT = 1.0/deltaT_();
536 const scalar deltaT = deltaT_();
537 const scalar deltaT0 = deltaT0_(vf);
539 const scalar coefft = 1 + deltaT/(deltaT + deltaT0);
540 const scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
541 const scalar coefft0 = coefft + coefft00;
543 fvm.
diag() = (coefft*rDeltaT)*
rho.primitiveField()*mesh().V();
549 coefft0*
rho.oldTime().primitiveField()
550 *vf.
oldTime().primitiveField()*mesh().V0()
551 - coefft00*
rho.oldTime().oldTime().primitiveField()
552 *vf.
oldTime().oldTime().primitiveField()*mesh().V00()
557 fvm.
source() = rDeltaT*mesh().V()*
559 coefft0*
rho.oldTime().primitiveField()
561 - coefft00*
rho.oldTime().oldTime().primitiveField()
562 *vf.
oldTime().oldTime().primitiveField()
589 const scalar rDeltaT = 1.0/deltaT_();
591 const scalar deltaT = deltaT_();
592 const scalar deltaT0 = deltaT0_(vf);
594 const scalar coefft = 1 + deltaT/(deltaT + deltaT0);
595 const scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
596 const scalar coefft0 = coefft + coefft00;
599 (coefft*rDeltaT)*
alpha.primitiveField()*
rho.primitiveField()*mesh().V();
606 *
alpha.oldTime().primitiveField()
607 *
rho.oldTime().primitiveField()
608 *vf.
oldTime().primitiveField()*mesh().V0()
611 *
alpha.oldTime().oldTime().primitiveField()
612 *
rho.oldTime().oldTime().primitiveField()
613 *vf.
oldTime().oldTime().primitiveField()*mesh().V00()
618 fvm.
source() = rDeltaT*mesh().V()*
621 *
alpha.oldTime().primitiveField()
622 *
rho.oldTime().primitiveField()
626 *
alpha.oldTime().oldTime().primitiveField()
627 *
rho.oldTime().oldTime().primitiveField()
628 *vf.
oldTime().oldTime().primitiveField()
646 const scalar deltaT = deltaT_();
647 const scalar deltaT0 = deltaT0_(
U);
649 const scalar coefft = 1 + deltaT/(deltaT + deltaT0);
650 const scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
651 const scalar coefft0 = coefft + coefft00;
655 "ddtCorr(" +
U.name() +
',' + Uf.
name() +
')',
656 this->fvcDdtPhiCoeff(
U.oldTime(), (mesh().Sf() & Uf.
oldTime()))
664 coefft0*
U.oldTime() - coefft00*
U.oldTime().oldTime()
682 const scalar deltaT = deltaT_();
683 const scalar deltaT0 = deltaT0_(
U);
685 const scalar coefft = 1 + deltaT/(deltaT + deltaT0);
686 const scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
687 const scalar coefft0 = coefft + coefft00;
691 "ddtCorr(" +
U.name() +
',' + phi.
name() +
')',
692 this->fvcDdtPhiCoeff(
U.oldTime(), phi.
oldTime())
699 coefft0*
U.oldTime() - coefft00*
U.oldTime().oldTime()
717 const scalar deltaT = deltaT_();
718 const scalar deltaT0 = deltaT0_(
U);
720 const scalar coefft = 1 + deltaT/(deltaT + deltaT0);
721 const scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
722 const scalar coefft0 = coefft + coefft00;
732 rho.oldTime()*
U.oldTime()
737 rho.oldTime().oldTime()*
U.oldTime().oldTime()
742 "ddtCorr(" +
rho.name() +
',' +
U.name() +
',' + rhoUf.
name() +
')',
755 - coefft00*rhoUf.
oldTime().oldTime()
770 "ddtCorr(" +
rho.name() +
',' +
U.name() +
',' + rhoUf.
name() +
')',
783 - coefft00*rhoUf.
oldTime().oldTime()
788 - coefft00*
U.oldTime().oldTime()
797 <<
"dimensions of phi are not correct"
800 return fluxFieldType::null();
816 const scalar deltaT = deltaT_();
817 const scalar deltaT0 = deltaT0_(
U);
819 const scalar coefft = 1 + deltaT/(deltaT + deltaT0);
820 const scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
821 const scalar coefft0 = coefft + coefft00;
831 rho.oldTime()*
U.oldTime()
836 rho.oldTime().oldTime()*
U.oldTime().oldTime()
841 "ddtCorr(" +
rho.name() +
',' +
U.name() +
',' + phi.
name() +
')',
842 this->fvcDdtPhiCoeff(rhoU0, phi.
oldTime(),
rho.oldTime())
849 coefft0*rhoU0 - coefft00*rhoU00
862 "ddtCorr(" +
rho.name() +
',' +
U.name() +
',' + phi.
name() +
')',
863 this->fvcDdtPhiCoeff(
U.oldTime(), phi.
oldTime(),
rho.oldTime())
870 coefft0*
U.oldTime() - coefft00*
U.oldTime().oldTime()
878 <<
"dimensions of phi are not correct"
881 return fluxFieldType::null();
898 const scalar deltaT = deltaT_();
899 const scalar deltaT0 = deltaT0_(
U);
901 const scalar coefft = 1 + deltaT/(deltaT + deltaT0);
902 const scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
903 const scalar coefft0 = coefft + coefft00;
910 alpha.oldTime().oldTime()*
rho.oldTime().oldTime()
916 +
alpha.name() +
rho.name() +
',' +
U.name() +
',' + Uf.
name()
918 this->fvcDdtPhiCoeff(
U.oldTime(), mesh().Sf() & Uf.
oldTime())
930 coefft0*alphaRho0*
U.oldTime()
931 - coefft00*alphaRho00*
U.oldTime().oldTime()
940 <<
"dimensions of phi are not correct"
943 return fluxFieldType::null();
960 const scalar deltaT = deltaT_();
961 const scalar deltaT0 = deltaT0_(
U);
963 const scalar coefft = 1 + deltaT/(deltaT + deltaT0);
964 const scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
965 const scalar coefft0 = coefft + coefft00;
972 alpha.oldTime().oldTime()*
rho.oldTime().oldTime()
978 +
alpha.name() +
rho.name() +
',' +
U.name() +
',' + phi.
name()
980 this->fvcDdtPhiCoeff(
U.oldTime(), phi.
oldTime())
991 coefft0*alphaRho0*
U.oldTime()
992 - coefft00*alphaRho00*
U.oldTime().oldTime()
1000 <<
"dimensions of phi are not correct"
1003 return fluxFieldType::null();
1008 template<
class Type>
1014 const scalar deltaT = deltaT_();
1015 const scalar deltaT0 = deltaT0_(vf);
1018 const scalar coefft0_00 = deltaT/(deltaT + deltaT0);
1021 const scalar coefftn_0 = 1 + coefft0_00;
1025 mesh().phi().
name(),
1026 coefftn_0*mesh().phi() - coefft0_00*mesh().phi().oldTime()
1031 template<
class Type>
1038 const scalar deltaT = deltaT_();
1039 const scalar deltaT0 = deltaT0_(vf);
1042 const scalar coefft0_00 = deltaT/(deltaT + deltaT0);
1045 const scalar coefftn_0 = 1 + coefft0_00;
1049 coefftn_0*mesh().phi().boundaryField()[
patchi]
1050 - coefft0_00*mesh().phi().oldTime().boundaryField()[
patchi]
const dimensionSet & dimensions() const
Return dimensions.
Generic GeometricField class.
const GeometricField< Type, PatchField, GeoMesh > & oldTime() const
Return old time field.
static tmp< GeometricField< Type, PatchField, GeoMesh > > New(const word &name, const Internal &, const PtrList< PatchField< Type >> &)
Return a temporary field constructed from name,.
const Boundary & boundaryField() const
Return const-reference to the boundary field.
const word & name() const
Return name.
This boundary condition is not designed to be evaluated; it is assumed that the value is assigned via...
Generic dimensioned Type class.
const dimensionSet & dimensions() const
Return const reference to dimensions.
const Type & value() const
Return const reference to value.
const word & name() const
Return const reference to name.
A special matrix type and solver, designed for finite volume solutions of scalar equations....
virtual tmp< fluxFieldType > fvcDdtPhiCorr(const VolField< Type > &U, const fluxFieldType &phi)
virtual tmp< fvMatrix< Type > > fvmDdt(const VolField< Type > &)
virtual tmp< surfaceScalarField > meshPhi(const VolField< Type > &)
virtual tmp< VolField< Type > > fvcDdt(const dimensioned< Type > &)
virtual tmp< fluxFieldType > fvcDdtUfCorr(const VolField< Type > &U, const SurfaceField< Type > &Uf)
A class for managing temporary objects.
T & ref() const
Return non-const reference or generate a fatal error.
A class for handling words, derived from string.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
A special matrix type and solver, designed for finite volume solutions of scalar equations.
Calculate the divergence of the given field.
volScalarField alpha(IOobject("alpha", runTime.name(), mesh, IOobject::READ_IF_PRESENT, IOobject::AUTO_WRITE), lambda *max(Ua &U, zeroSensitivity))
autoPtr< CompressibleMomentumTransportModel > New(const volScalarField &rho, const volVectorField &U, const surfaceScalarField &phi, const viscosity &viscosity)
static tmp< SurfaceField< Type > > interpolate(const VolField< Type > &tvf, const surfaceScalarField &faceFlux, Istream &schemeData)
Interpolate field onto faces using scheme given by Istream.
static tmp< SurfaceField< typename innerProduct< vector, Type >::type > > dotInterpolate(const surfaceVectorField &Sf, const VolField< Type > &tvf)
Interpolate field onto faces.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
errorManip< error > abort(error &err)
const dimensionSet dimTime
const dimensionSet dimVol
const dimensionSet dimVelocity
word name(const complex &)
Return a string representation of a complex.
const dimensionSet dimFlux