27 #include "surfaceInterpolate.H" 44 template<
class GeoField>
45 CrankNicolsonDdtScheme<Type>::DDt0Field<GeoField>::DDt0Field
57 this->
timeIndex() = mesh.time().startTimeIndex();
62 template<
class GeoField>
63 CrankNicolsonDdtScheme<Type>::DDt0Field<GeoField>::DDt0Field
67 const dimensioned<typename GeoField::value_type>& dimType
70 GeoField(io, mesh, dimType),
76 template<
class GeoField>
77 label CrankNicolsonDdtScheme<Type>::DDt0Field<GeoField>::
78 startTimeIndex()
const 80 return startTimeIndex_;
85 template<
class GeoField>
86 GeoField& CrankNicolsonDdtScheme<Type>::DDt0Field<GeoField>::
94 template<
class GeoField>
95 void CrankNicolsonDdtScheme<Type>::DDt0Field<GeoField>::
96 operator=(
const GeoField& gf)
98 GeoField::operator=(gf);
103 template<
class GeoField>
104 CrankNicolsonDdtScheme<Type>::DDt0Field<GeoField>&
105 CrankNicolsonDdtScheme<Type>::ddt0_
108 const dimensionSet& dims
111 if (!
mesh().objectRegistry::template foundObject<GeoField>(name))
113 const Time& runTime =
mesh().
time();
114 word startTimeName = runTime.
timeName(runTime.startTime().value());
119 runTime.timeIndex() == runTime.startTimeIndex()
120 || runTime.timeIndex() == runTime.startTimeIndex() + 1
132 new DDt0Field<GeoField>
150 new DDt0Field<GeoField>
161 dimensioned<typename GeoField::value_type>
172 DDt0Field<GeoField>& ddt0 =
static_cast<DDt0Field<GeoField>&
> 174 const_cast<GeoField&
> 176 mesh().objectRegistry::template lookupObject<GeoField>(
name)
185 template<
class GeoField>
186 bool CrankNicolsonDdtScheme<Type>::evaluate
188 const DDt0Field<GeoField>& ddt0
195 template<
class GeoField>
196 scalar CrankNicolsonDdtScheme<Type>::coef_
198 const DDt0Field<GeoField>& ddt0
203 return 1.0 + ocCoeff_;
213 template<
class GeoField>
214 scalar CrankNicolsonDdtScheme<Type>::coef0_
216 const DDt0Field<GeoField>& ddt0
221 return 1.0 + ocCoeff_;
231 template<
class GeoField>
234 const DDt0Field<GeoField>& ddt0
242 template<
class GeoField>
245 const DDt0Field<GeoField>& ddt0
253 template<
class GeoField>
254 tmp<GeoField> CrankNicolsonDdtScheme<Type>::offCentre_
261 return ocCoeff_*ddt0;
271 const FieldField<fvPatchField, Type>&
ff 289 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
290 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
292 "ddt0(" + dt.
name() +
')',
298 "ddt(" + dt.
name() +
')',
329 -
mesh().
V00()*offCentre_(ddt0.internalField())
336 -
mesh().
V0()*offCentre_(ddt0.internalField())
351 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
352 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
354 "ddt0(" + vf.
name() +
')',
360 "ddt(" + vf.
name() +
')',
371 scalar rDtCoef0 = rDtCoef0_(ddt0).
value();
373 ddt0.primitiveFieldRef() =
379 ) -
mesh().
V00()*offCentre_(ddt0.primitiveField())
382 ddt0.boundaryFieldRef() =
387 - vf.
oldTime().oldTime().boundaryField()
388 ) - offCentre_(
ff(ddt0.boundaryField()))
402 ) -
mesh().
V0()*offCentre_(ddt0()())
407 ) - offCentre_(
ff(ddt0.boundaryField()))
416 - offCentre_(ddt0());
424 rDtCoef*(vf - vf.
oldTime()) - offCentre_(ddt0())
439 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
440 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
442 "ddt0(" + rho.
name() +
',' + vf.
name() +
')',
448 "ddt(" + rho.
name() +
',' + vf.
name() +
')',
459 scalar rDtCoef0 = rDtCoef0_(ddt0).
value();
461 ddt0.primitiveFieldRef() =
463 rDtCoef0*rho.
value()*
467 ) -
mesh().
V00()*offCentre_(ddt0.primitiveField())
470 ddt0.boundaryFieldRef() =
472 rDtCoef0*rho.
value()*
475 - vf.
oldTime().oldTime().boundaryField()
476 ) - offCentre_(
ff(ddt0.boundaryField()))
488 rDtCoef.value()*rho.
value()*
492 ) -
mesh().
V0()*offCentre_(ddt0.primitiveField())
494 rDtCoef.value()*rho.
value()*
497 ) - offCentre_(
ff(ddt0.boundaryField()))
505 ddt0 = rDtCoef0_(ddt0)*rho*(vf.
oldTime() - vf.
oldTime().oldTime())
506 - offCentre_(ddt0());
514 rDtCoef*rho*(vf - vf.
oldTime()) - offCentre_(ddt0())
529 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
530 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
532 "ddt0(" + rho.
name() +
',' + vf.
name() +
')',
538 "ddt(" + rho.
name() +
',' + vf.
name() +
')',
549 scalar rDtCoef0 = rDtCoef0_(ddt0).
value();
551 ddt0.primitiveFieldRef() =
558 *vf.
oldTime().oldTime().primitiveField()
559 ) -
mesh().
V00()*offCentre_(ddt0.primitiveField())
562 ddt0.boundaryFieldRef() =
569 *vf.
oldTime().oldTime().boundaryField()
570 ) - offCentre_(
ff(ddt0.boundaryField()))
587 ) -
mesh().
V00()*offCentre_(ddt0.primitiveField())
593 ) - offCentre_(
ff(ddt0.boundaryField()))
601 ddt0 = rDtCoef0_(ddt0)*
605 ) - offCentre_(ddt0());
630 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
631 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
633 "ddt0(" + alpha.
name() +
',' + rho.
name() +
',' + vf.
name() +
')',
639 "ddt(" + alpha.
name() +
',' + rho.
name() +
',' + vf.
name() +
')',
650 scalar rDtCoef0 = rDtCoef0_(ddt0).
value();
652 ddt0.primitiveFieldRef() =
664 *vf.
oldTime().oldTime().primitiveField()
665 ) -
mesh().
V00()*offCentre_(ddt0.primitiveField())
668 ddt0.boundaryFieldRef() =
678 *vf.
oldTime().oldTime().boundaryField()
679 ) - offCentre_(
ff(ddt0.boundaryField()))
703 ) -
mesh().
V00()*offCentre_(ddt0.primitiveField())
714 ) - offCentre_(
ff(ddt0.boundaryField()))
722 ddt0 = rDtCoef0_(ddt0)*
731 ) - offCentre_(ddt0());
758 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
759 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
761 "ddt0(" + vf.
name() +
')',
776 scalar rDtCoef = rDtCoef_(ddt0).
value();
785 scalar rDtCoef0 = rDtCoef0_(ddt0).
value();
787 ddt0.primitiveFieldRef() =
794 -
mesh().
V00()*offCentre_(ddt0.primitiveField())
797 ddt0.boundaryFieldRef() =
802 - vf.
oldTime().oldTime().boundaryField()
804 - offCentre_(
ff(ddt0.boundaryField()))
810 rDtCoef*vf.
oldTime().primitiveField()
811 + offCentre_(ddt0.primitiveField())
819 - offCentre_(ddt0());
824 rDtCoef*vf.
oldTime().primitiveField()
825 + offCentre_(ddt0.primitiveField())
841 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
842 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
844 "ddt0(" + rho.
name() +
',' + vf.
name() +
')',
858 scalar rDtCoef = rDtCoef_(ddt0).
value();
867 scalar rDtCoef0 = rDtCoef0_(ddt0).
value();
869 ddt0.primitiveFieldRef() =
871 rDtCoef0*rho.
value()*
876 -
mesh().
V00()*offCentre_(ddt0.primitiveField())
879 ddt0.boundaryFieldRef() =
881 rDtCoef0*rho.
value()*
884 - vf.
oldTime().oldTime().boundaryField()
886 - offCentre_(
ff(ddt0.boundaryField()))
893 + offCentre_(ddt0.primitiveField())
900 ddt0 = rDtCoef0_(ddt0)*rho*(vf.
oldTime() - vf.
oldTime().oldTime())
901 - offCentre_(ddt0());
907 + offCentre_(ddt0.primitiveField())
923 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
924 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
926 "ddt0(" + rho.
name() +
',' + vf.
name() +
')',
940 scalar rDtCoef = rDtCoef_(ddt0).
value();
950 scalar rDtCoef0 = rDtCoef0_(ddt0).
value();
952 ddt0.primitiveFieldRef() =
959 *vf.
oldTime().oldTime().primitiveField()
961 -
mesh().
V00()*offCentre_(ddt0.primitiveField())
964 ddt0.boundaryFieldRef() =
971 *vf.
oldTime().oldTime().boundaryField()
973 - offCentre_(
ff(ddt0.boundaryField()))
980 + offCentre_(ddt0.primitiveField())
987 ddt0 = rDtCoef0_(ddt0)*
991 ) - offCentre_(ddt0());
997 + offCentre_(ddt0.primitiveField())
1005 template<
class Type>
1014 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
1015 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
1017 "ddt0(" + alpha.
name() +
',' + rho.
name() +
',' + vf.
name() +
')',
1031 scalar rDtCoef = rDtCoef_(ddt0).
value();
1038 if (
mesh().moving())
1042 scalar rDtCoef0 = rDtCoef0_(ddt0).
value();
1044 ddt0.primitiveFieldRef() =
1051 *vf.
oldTime().primitiveField()
1056 *vf.
oldTime().oldTime().primitiveField()
1058 -
mesh().
V00()*offCentre_(ddt0.primitiveField())
1061 ddt0.boundaryFieldRef() =
1071 *vf.
oldTime().oldTime().boundaryField()
1073 - offCentre_(
ff(ddt0.boundaryField()))
1082 *vf.
oldTime().primitiveField()
1083 + offCentre_(ddt0.primitiveField())
1090 ddt0 = rDtCoef0_(ddt0)*
1099 ) - offCentre_(ddt0());
1107 *vf.
oldTime().primitiveField()
1108 + offCentre_(ddt0.primitiveField())
1116 template<
class Type>
1124 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
1125 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
1127 "ddt0(" + U.
name() +
')',
1131 DDt0Field<GeometricField<Type, fvsPatchField, surfaceMesh>>& dUfdt0 =
1132 ddt0_<GeometricField<Type, fvsPatchField, surfaceMesh>>
1134 "ddt0(" + Uf.
name() +
')',
1144 - offCentre_(ddt0());
1147 if (evaluate(dUfdt0))
1151 - offCentre_(dUfdt0());
1160 "ddtCorr(" + U.
name() +
',' + Uf.
name() +
')',
1168 (rDtCoef*Uf.
oldTime() + offCentre_(dUfdt0()))
1177 template<
class Type>
1185 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
1186 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
1188 "ddt0(" + U.
name() +
')',
1192 DDt0Field<fluxFieldType>& dphidt0 =
1193 ddt0_<fluxFieldType>
1195 "ddt0(" + phi.
name() +
')',
1205 - offCentre_(ddt0());
1208 if (evaluate(dphidt0))
1212 - offCentre_(dphidt0());
1221 "ddtCorr(" + U.
name() +
',' + phi.
name() +
')',
1227 (rDtCoef*phi.
oldTime() + offCentre_(dphidt0()))
1231 rDtCoef*U.
oldTime() + offCentre_(ddt0())
1239 template<
class Type>
1254 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
1255 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
1257 "ddt0(" + rho.
name() +
',' + U.
name() +
')',
1261 DDt0Field<GeometricField<Type, fvsPatchField, surfaceMesh>>& dUfdt0 =
1262 ddt0_<GeometricField<Type, fvsPatchField, surfaceMesh>>
1264 "ddt0(" + Uf.
name() +
')',
1280 - offCentre_(ddt0());
1283 if (evaluate(dUfdt0))
1288 - offCentre_(dUfdt0());
1306 (rDtCoef*Uf.
oldTime() + offCentre_(dUfdt0()))
1326 <<
"dimensions of Uf are not correct" 1334 template<
class Type>
1349 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
1350 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
1352 "ddt0(" + rho.
name() +
',' + U.
name() +
')',
1356 DDt0Field<fluxFieldType>& dphidt0 =
1357 ddt0_<fluxFieldType>
1359 "ddt0(" + phi.
name() +
')',
1375 - offCentre_(ddt0());
1378 if (evaluate(dphidt0))
1383 - offCentre_(dphidt0());
1393 + rho.
name() +
',' + U.
name() +
',' + phi.
name() +
')',
1399 (rDtCoef*phi.
oldTime() + offCentre_(dphidt0()))
1403 rDtCoef*rhoU0 + offCentre_(ddt0())
1422 <<
"dimensions of phi are not correct" 1430 template<
class Type>
1436 DDt0Field<surfaceScalarField>& meshPhi0 = ddt0_<surfaceScalarField>
1442 if (evaluate(meshPhi0))
1445 coef0_(meshPhi0)*
mesh().
phi().
oldTime() - offCentre_(meshPhi0());
1461 coef_(meshPhi0)*
mesh().
phi() - offCentre_(meshPhi0())
tmp< fluxFieldType > fvcDdtUfCorr(const GeometricField< Type, fvPatchField, volMesh > &U, const GeometricField< Type, fvsPatchField, surfaceMesh > &Uf)
label timeIndex() const
Return current time index.
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 surfaceVectorField & Sf() const
Return cell face area vectors.
dimensionedScalar deltaT0() const
Return old time step.
const dimensionSet & dimensions() const
Return const reference to dimensions.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
const surfaceScalarField & phi() const
Return cell face motion fluxes.
static tmp< GeometricField< typename innerProduct< vector, Type >::type, fvsPatchField, surfaceMesh > > dotInterpolate(const surfaceVectorField &Sf, const GeometricField< Type, fvPatchField, volMesh > &tvf)
Interpolate field onto faces.
tmp< GeometricField< typename flux< Type >::type, fvsPatchField, surfaceMesh > > ddtCorr(const GeometricField< Type, fvPatchField, volMesh > &U, const GeometricField< Type, fvsPatchField, surfaceMesh > &Uf)
const DimensionedField< scalar, volMesh > & V0() const
Return old-time cell volumes.
const DimensionedField< scalar, volMesh > & V00() const
Return old-old-time cell volumes.
const dimensionSet dimVol(dimVolume)
const Internal::FieldType & primitiveField() const
Return a const-reference to the internal field.
const Type & value() const
Return const reference to value.
Generic GeometricField class.
static word timeName(const scalar, const int precision=precision_)
Return time name of given scalar time.
Generic dimensioned Type class.
const word & name() const
Return const reference to name.
const dimensionSet dimVolume(pow3(dimLength))
ddtScheme< Type >::fluxFieldType fluxFieldType
const GeometricField< Type, PatchField, GeoMesh > & oldTime() const
Return old time field.
const Boundary & boundaryField() const
Return const-reference to the boundary field.
tmp< fluxFieldType > fvcDdtPhiCorr(const GeometricField< Type, fvPatchField, volMesh > &U, const fluxFieldType &phi)
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.
errorManip< error > abort(error &err)
const dimensionSet & dimensions() const
Return dimensions.
Calculate the divergence of the given field.
void store()
Transfer ownership of this object to its registry.
tmp< fvMatrix< Type > > fvmDdt(const GeometricField< Type, fvPatchField, volMesh > &)
word name(const complex &)
Return a string representation of a complex.
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.
static const GeometricField< Type, PatchField, GeoMesh > & null()
Return a null geometric field.
tmp< surfaceScalarField > fvcDdtPhiCoeff(const GeometricField< Type, fvPatchField, volMesh > &U, const fluxFieldType &phi, const fluxFieldType &phiCorr)
tmp< GeometricField< Type, fvPatchField, volMesh > > fvcDdt(const dimensioned< Type > &)
dimensionedScalar deltaT() const
Return time step.
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
const DimensionedField< scalar, volMesh > & V() const
Return cell volumes.
const dimensionSet dimTime(0, 0, 1, 0, 0, 0, 0)
A special matrix type and solver, designed for finite volume solutions of scalar equations.
tmp< surfaceScalarField > meshPhi(const GeometricField< Type, fvPatchField, volMesh > &)
const fvMesh & mesh() const
Return mesh reference.
A class for managing temporary objects.
GeometricField< scalar, fvsPatchField, surfaceMesh > surfaceScalarField
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
const word & name() const
Return name.
const FieldField< fvPatchField, Type > & ff(const FieldField< fvPatchField, Type > &bf)
const dimensionSet dimArea(sqr(dimLength))
const Time & time() const
Return the top-level database.
const dimensionSet dimVelocity