29 #include "surfaceInterpolate.H"
47 template<
class GeoField>
48 CrankNicolsonDdtScheme<Type>::DDt0Field<GeoField>::DDt0Field
60 this->
timeIndex() = mesh.time().startTimeIndex();
65 template<
class GeoField>
66 CrankNicolsonDdtScheme<Type>::DDt0Field<GeoField>::DDt0Field
70 const dimensioned<typename GeoField::value_type>& dimType
73 GeoField(io,
mesh, dimType),
79 template<
class GeoField>
80 label CrankNicolsonDdtScheme<Type>::DDt0Field<GeoField>::startTimeIndex()
const
82 return startTimeIndex_;
87 template<
class GeoField>
88 GeoField& CrankNicolsonDdtScheme<Type>::DDt0Field<GeoField>::operator()()
95 template<
class GeoField>
96 void CrankNicolsonDdtScheme<Type>::DDt0Field<GeoField>::operator=
101 GeoField::operator=(gf);
106 template<
class GeoField>
107 typename CrankNicolsonDdtScheme<Type>::template DDt0Field<GeoField>&
108 CrankNicolsonDdtScheme<Type>::ddt0_
114 if (!
mesh().objectRegistry::template foundObject<GeoField>(
name))
130 ).
template typeHeaderOk<DDt0Field<GeoField>>(
true)
135 new DDt0Field<GeoField>
153 new DDt0Field<GeoField>
174 DDt0Field<GeoField>& ddt0 =
static_cast<DDt0Field<GeoField>&
>
176 mesh().objectRegistry::template lookupObjectRef<GeoField>(
name)
184 template<
class GeoField>
187 const DDt0Field<GeoField>& ddt0
190 return ddt0.timeIndex() !=
mesh().time().timeIndex();
195 template<
class GeoField>
196 scalar CrankNicolsonDdtScheme<Type>::coef_
198 const DDt0Field<GeoField>& ddt0
213 template<
class GeoField>
214 scalar CrankNicolsonDdtScheme<Type>::coef0_
216 const DDt0Field<GeoField>& ddt0
231 template<
class GeoField>
234 const DDt0Field<GeoField>& ddt0
237 return coef_(ddt0)/
mesh().time().deltaT();
242 template<
class GeoField>
245 const DDt0Field<GeoField>& ddt0
248 return coef0_(ddt0)/
mesh().time().deltaT0();
253 template<
class GeoField>
254 tmp<GeoField> CrankNicolsonDdtScheme<Type>::offCentre_
271 const FieldField<fvPatchField, Type>&
ff
286 ocCoeff_(new Function1Types::Constant<scalar>(
"ocCoeff", 1))
306 token firstToken(is);
311 if (ocCoeff < 0 || ocCoeff > 1)
314 <<
"Off-centreing coefficient = " <<
ocCoeff
315 <<
" should be >= 0 and <= 1"
349 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
350 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
352 "ddt0(" + dt.
name() +
')',
358 "ddt(" + dt.
name() +
')',
359 mesh().time().timeName(),
383 (rDtCoef0*dt)*(
mesh().V0() -
mesh().V00())
384 -
mesh().V00()*offCentre_(ddt0.internalField())
390 (rDtCoef*dt)*(
mesh().V() -
mesh().V0())
391 -
mesh().V0()*offCentre_(ddt0.internalField())
406 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
407 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
409 "ddt0(" + vf.name() +
')',
415 "ddt(" + vf.name() +
')',
416 mesh().time().timeName(),
426 const scalar rDtCoef0 = rDtCoef0_(ddt0).value();
428 ddt0.primitiveFieldRef() =
434 ) -
mesh().V00()*offCentre_(ddt0.primitiveField())
437 ddt0.boundaryFieldRef() =
443 ) - offCentre_(
ff(ddt0.boundaryField()))
457 ) -
mesh().V0()*offCentre_(ddt0()())
462 ) - offCentre_(
ff(ddt0.boundaryField()))
471 - offCentre_(ddt0());
479 rDtCoef*(vf - vf.
oldTime()) - offCentre_(ddt0())
494 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
495 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
497 "ddt0(" +
rho.name() +
',' + vf.name() +
')',
498 rho.dimensions()*vf.dimensions()
503 "ddt(" +
rho.name() +
',' + vf.name() +
')',
504 mesh().time().timeName(),
514 const scalar rDtCoef0 = rDtCoef0_(ddt0).value();
516 ddt0.primitiveFieldRef() =
518 rDtCoef0*
rho.value()*
522 ) -
mesh().V00()*offCentre_(ddt0.primitiveField())
525 ddt0.boundaryFieldRef() =
527 rDtCoef0*
rho.value()*
531 ) - offCentre_(
ff(ddt0.boundaryField()))
541 rDtCoef.dimensions()*
rho.dimensions()*vf.dimensions(),
543 rDtCoef.value()*
rho.value()*
547 ) -
mesh().V0()*offCentre_(ddt0.primitiveField())
549 rDtCoef.value()*
rho.value()*
552 ) - offCentre_(
ff(ddt0.boundaryField()))
561 - offCentre_(ddt0());
569 rDtCoef*
rho*(vf - vf.
oldTime()) - offCentre_(ddt0())
584 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
585 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
587 "ddt0(" +
rho.name() +
',' + vf.name() +
')',
588 rho.dimensions()*vf.dimensions()
593 "ddt(" +
rho.name() +
',' + vf.name() +
')',
594 mesh().time().timeName(),
604 const scalar rDtCoef0 = rDtCoef0_(ddt0).value();
606 ddt0.primitiveFieldRef() =
610 mesh().V0()*
rho.oldTime().primitiveField()
612 -
mesh().V00()*
rho.oldTime().oldTime().primitiveField()
614 ) -
mesh().V00()*offCentre_(ddt0.primitiveField())
617 ddt0.boundaryFieldRef() =
621 rho.oldTime().boundaryField()
623 -
rho.oldTime().oldTime().boundaryField()
625 ) - offCentre_(
ff(ddt0.boundaryField()))
635 rDtCoef.dimensions()*
rho.dimensions()*vf.dimensions(),
640 -
mesh().V0()*
rho.oldTime().primitiveField()
642 ) -
mesh().V00()*offCentre_(ddt0.primitiveField())
648 ) - offCentre_(
ff(ddt0.boundaryField()))
656 ddt0 = rDtCoef0_(ddt0)*
660 ) - offCentre_(ddt0());
685 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
686 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
688 "ddt0(" +
alpha.
name() +
',' +
rho.name() +
',' + vf.name() +
')',
694 "ddt(" +
alpha.
name() +
',' +
rho.name() +
',' + vf.name() +
')',
695 mesh().time().timeName(),
705 const scalar rDtCoef0 = rDtCoef0_(ddt0).value();
707 ddt0.primitiveFieldRef() =
712 *
alpha.oldTime().primitiveField()
713 *
rho.oldTime().primitiveField()
717 *
alpha.oldTime().oldTime().primitiveField()
718 *
rho.oldTime().oldTime().primitiveField()
720 ) -
mesh().V00()*offCentre_(ddt0.primitiveField())
723 ddt0.boundaryFieldRef() =
727 alpha.oldTime().boundaryField()
728 *
rho.oldTime().boundaryField()
731 -
alpha.oldTime().oldTime().boundaryField()
732 *
rho.oldTime().oldTime().boundaryField()
734 ) - offCentre_(
ff(ddt0.boundaryField()))
750 *
alpha.primitiveField()
751 *
rho.primitiveField()
755 *
alpha.oldTime().primitiveField()
756 *
rho.oldTime().primitiveField()
758 ) -
mesh().V00()*offCentre_(ddt0.primitiveField())
762 alpha.boundaryField()
766 -
alpha.oldTime().boundaryField()
767 *
rho.oldTime().boundaryField()
769 ) - offCentre_(
ff(ddt0.boundaryField()))
777 ddt0 = rDtCoef0_(ddt0)*
783 -
alpha.oldTime().oldTime()
784 *
rho.oldTime().oldTime()
786 ) - offCentre_(ddt0());
813 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
814 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
816 "ddt0(" + vf.name() +
')',
831 const scalar rDtCoef = rDtCoef_(ddt0).value();
832 fvm.diag() = rDtCoef*
mesh().V();
840 const scalar rDtCoef0 = rDtCoef0_(ddt0).value();
842 ddt0.primitiveFieldRef() =
849 -
mesh().V00()*offCentre_(ddt0.primitiveField())
852 ddt0.boundaryFieldRef() =
859 - offCentre_(
ff(ddt0.boundaryField()))
866 + offCentre_(ddt0.primitiveField())
874 - offCentre_(ddt0());
880 + offCentre_(ddt0.primitiveField())
896 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
897 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
899 "ddt0(" +
rho.name() +
',' + vf.name() +
')',
900 rho.dimensions()*vf.dimensions()
913 const scalar rDtCoef = rDtCoef_(ddt0).value();
914 fvm.diag() = rDtCoef*
rho.value()*
mesh().V();
922 const scalar rDtCoef0 = rDtCoef0_(ddt0).value();
924 ddt0.primitiveFieldRef() =
926 rDtCoef0*
rho.value()*
931 -
mesh().V00()*offCentre_(ddt0.primitiveField())
934 ddt0.boundaryFieldRef() =
936 rDtCoef0*
rho.value()*
941 - offCentre_(
ff(ddt0.boundaryField()))
948 + offCentre_(ddt0.primitiveField())
956 - offCentre_(ddt0());
962 + offCentre_(ddt0.primitiveField())
978 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
979 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
981 "ddt0(" +
rho.name() +
',' + vf.name() +
')',
982 rho.dimensions()*vf.dimensions()
995 const scalar rDtCoef = rDtCoef_(ddt0).value();
996 fvm.diag() = rDtCoef*
rho.primitiveField()*
mesh().V();
999 rho.oldTime().oldTime();
1001 if (
mesh().moving())
1005 const scalar rDtCoef0 = rDtCoef0_(ddt0).value();
1007 ddt0.primitiveFieldRef() =
1011 mesh().V0()*
rho.oldTime().primitiveField()
1013 -
mesh().V00()*
rho.oldTime().oldTime().primitiveField()
1016 -
mesh().V00()*offCentre_(ddt0.primitiveField())
1019 ddt0.boundaryFieldRef() =
1023 rho.oldTime().boundaryField()
1025 -
rho.oldTime().oldTime().boundaryField()
1028 - offCentre_(
ff(ddt0.boundaryField()))
1035 + offCentre_(ddt0.primitiveField())
1042 ddt0 = rDtCoef0_(ddt0)*
1046 ) - offCentre_(ddt0());
1052 + offCentre_(ddt0.primitiveField())
1060 template<
class Type>
1069 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
1070 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
1072 "ddt0(" +
alpha.
name() +
',' +
rho.name() +
',' + vf.name() +
')',
1086 const scalar rDtCoef = rDtCoef_(ddt0).value();
1087 fvm.diag() = rDtCoef*
alpha.primitiveField()*
rho.primitiveField()*
mesh().V();
1090 alpha.oldTime().oldTime();
1091 rho.oldTime().oldTime();
1093 if (
mesh().moving())
1097 const scalar rDtCoef0 = rDtCoef0_(ddt0).value();
1099 ddt0.primitiveFieldRef() =
1104 *
alpha.oldTime().primitiveField()
1105 *
rho.oldTime().primitiveField()
1109 *
alpha.oldTime().oldTime().primitiveField()
1110 *
rho.oldTime().oldTime().primitiveField()
1113 -
mesh().V00()*offCentre_(ddt0.primitiveField())
1116 ddt0.boundaryFieldRef() =
1120 alpha.oldTime().boundaryField()
1121 *
rho.oldTime().boundaryField()
1124 -
alpha.oldTime().oldTime().boundaryField()
1125 *
rho.oldTime().oldTime().boundaryField()
1128 - offCentre_(
ff(ddt0.boundaryField()))
1135 *
alpha.oldTime().primitiveField()
1136 *
rho.oldTime().primitiveField()
1138 + offCentre_(ddt0.primitiveField())
1145 ddt0 = rDtCoef0_(ddt0)*
1151 -
alpha.oldTime().oldTime()
1152 *
rho.oldTime().oldTime()
1154 ) - offCentre_(ddt0());
1160 *
alpha.oldTime().primitiveField()
1161 *
rho.oldTime().primitiveField()
1163 + offCentre_(ddt0.primitiveField())
1171 template<
class Type>
1179 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
1180 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
1182 "ddtCorrDdt0(" +
U.name() +
')',
1186 DDt0Field<GeometricField<Type, fvsPatchField, surfaceMesh>>& dUfdt0 =
1187 ddt0_<GeometricField<Type, fvsPatchField, surfaceMesh>>
1189 "ddtCorrDdt0(" +
Uf.name() +
')',
1198 rDtCoef0_(ddt0)*(
U.oldTime() -
U.oldTime().oldTime())
1199 - offCentre_(ddt0());
1205 rDtCoef0_(dUfdt0)*(
Uf.oldTime() -
Uf.oldTime().oldTime())
1206 - offCentre_(dUfdt0());
1215 "ddtCorr(" +
U.name() +
',' +
Uf.name() +
')',
1216 mesh().time().timeName(),
1219 this->fvcDdtPhiCoeff(
U.oldTime(),
mesh().Sf() &
Uf.oldTime())
1223 (rDtCoef*
Uf.oldTime() + offCentre_(dUfdt0()))
1232 template<
class Type>
1240 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
1241 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
1243 "ddtCorrDdt0(" +
U.name() +
')',
1247 DDt0Field<fluxFieldType>& dphidt0 =
1248 ddt0_<fluxFieldType>
1250 "ddtCorrDdt0(" +
phi.name() +
')',
1253 dphidt0.setOriented();
1260 rDtCoef0_(ddt0)*(
U.oldTime() -
U.oldTime().oldTime())
1261 - offCentre_(ddt0());
1267 rDtCoef0_(dphidt0)*(
phi.oldTime() -
phi.oldTime().oldTime())
1268 - offCentre_(dphidt0());
1277 "ddtCorr(" +
U.name() +
',' +
phi.name() +
')',
1278 mesh().time().timeName(),
1281 this->fvcDdtPhiCoeff(
U.oldTime(),
phi.oldTime())
1283 (rDtCoef*
phi.oldTime() + offCentre_(dphidt0()))
1287 rDtCoef*
U.oldTime() + offCentre_(ddt0())
1295 template<
class Type>
1310 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
1311 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
1313 "ddtCorrDdt0(" +
rho.name() +
',' +
U.name() +
')',
1314 rho.dimensions()*
U.dimensions()
1317 DDt0Field<GeometricField<Type, fvsPatchField, surfaceMesh>>& dUfdt0 =
1318 ddt0_<GeometricField<Type, fvsPatchField, surfaceMesh>>
1320 "ddtCorrDdt0(" +
Uf.name() +
')',
1328 rho.oldTime()*
U.oldTime()
1335 *(rhoU0 -
rho.oldTime().oldTime()*
U.oldTime().oldTime())
1336 - offCentre_(ddt0());
1343 *(
Uf.oldTime() -
Uf.oldTime().oldTime())
1344 - offCentre_(dUfdt0());
1354 +
rho.name() +
',' +
U.name() +
',' +
Uf.name() +
')',
1355 mesh().time().timeName(),
1358 this->fvcDdtPhiCoeff
1361 mesh().Sf() &
Uf.oldTime(),
1367 (rDtCoef*
Uf.oldTime() + offCentre_(dUfdt0()))
1382 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
1383 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
1385 "ddtCorrDdt0(" +
U.name() +
')',
1389 DDt0Field<GeometricField<Type, fvsPatchField, surfaceMesh>>& dUfdt0 =
1390 ddt0_<GeometricField<Type, fvsPatchField, surfaceMesh>>
1392 "ddtCorrDdt0(" +
Uf.name() +
')',
1401 rDtCoef0_(ddt0)*(
U.oldTime() -
U.oldTime().oldTime())
1402 - offCentre_(ddt0());
1408 rDtCoef0_(dUfdt0)*(
Uf.oldTime() -
Uf.oldTime().oldTime())
1409 - offCentre_(dUfdt0());
1418 "ddtCorr(" +
U.name() +
',' +
Uf.name() +
')',
1419 mesh().time().timeName(),
1422 this->fvcDdtPhiCoeff
1425 mesh().Sf() &
Uf.oldTime(),
1431 (rDtCoef*
Uf.oldTime() + offCentre_(dUfdt0()))
1434 rDtCoef*
U.oldTime() + offCentre_(ddt0())
1444 <<
"dimensions of Uf are not correct"
1447 return fluxFieldType::null();
1452 template<
class Type>
1467 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
1468 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
1470 "ddtCorrDdt0(" +
rho.name() +
',' +
U.name() +
')',
1471 rho.dimensions()*
U.dimensions()
1474 DDt0Field<fluxFieldType>& dphidt0 =
1475 ddt0_<fluxFieldType>
1477 "ddtCorrDdt0(" +
phi.name() +
')',
1485 rho.oldTime()*
U.oldTime()
1492 *(rhoU0 -
rho.oldTime().oldTime()*
U.oldTime().oldTime())
1493 - offCentre_(ddt0());
1500 *(
phi.oldTime() -
phi.oldTime().oldTime())
1501 - offCentre_(dphidt0());
1511 +
rho.name() +
',' +
U.name() +
',' +
phi.name() +
')',
1512 mesh().time().timeName(),
1515 this->fvcDdtPhiCoeff(rhoU0,
phi.oldTime(),
rho.oldTime())
1517 (rDtCoef*
phi.oldTime() + offCentre_(dphidt0()))
1521 rDtCoef*rhoU0 + offCentre_(ddt0())
1535 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
1536 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
1538 "ddtCorrDdt0(" +
U.name() +
')',
1542 DDt0Field<fluxFieldType>& dphidt0 =
1543 ddt0_<fluxFieldType>
1545 "ddtCorrDdt0(" +
phi.name() +
')',
1554 rDtCoef0_(ddt0)*(
U.oldTime() -
U.oldTime().oldTime())
1555 - offCentre_(ddt0());
1561 rDtCoef0_(dphidt0)*(
phi.oldTime() -
phi.oldTime().oldTime())
1562 - offCentre_(dphidt0());
1571 "ddtCorr(" +
U.name() +
',' +
phi.name() +
')',
1572 mesh().time().timeName(),
1575 this->fvcDdtPhiCoeff(
U.oldTime(),
phi.oldTime(),
rho.oldTime())
1577 (rDtCoef*
phi.oldTime() + offCentre_(dphidt0()))
1581 rDtCoef*
U.oldTime() + offCentre_(ddt0())
1590 <<
"dimensions of phi are not correct"
1593 return fluxFieldType::null();
1598 template<
class Type>
1604 DDt0Field<surfaceScalarField>& meshPhi0 = ddt0_<surfaceScalarField>
1610 meshPhi0.setOriented();
1615 coef0_(meshPhi0)*
mesh().phi().oldTime() - offCentre_(meshPhi0());
1631 coef_(meshPhi0)*
mesh().
phi() - offCentre_(meshPhi0())