30 #include "surfaceInterpolate.H"
48 template<
class GeoField>
49 CrankNicolsonDdtScheme<Type>::DDt0Field<GeoField>::DDt0Field
61 this->
timeIndex() = mesh.time().startTimeIndex();
66 template<
class GeoField>
67 CrankNicolsonDdtScheme<Type>::DDt0Field<GeoField>::DDt0Field
71 const dimensioned<typename GeoField::value_type>& dimType
74 GeoField(io,
mesh, dimType),
80 template<
class GeoField>
81 label CrankNicolsonDdtScheme<Type>::DDt0Field<GeoField>::startTimeIndex()
const
83 return startTimeIndex_;
88 template<
class GeoField>
89 GeoField& CrankNicolsonDdtScheme<Type>::DDt0Field<GeoField>::operator()()
96 template<
class GeoField>
97 void CrankNicolsonDdtScheme<Type>::DDt0Field<GeoField>::operator=
102 GeoField::operator=(gf);
107 template<
class GeoField>
115 if (!
mesh().objectRegistry::template foundObject<GeoField>(
name))
131 ).
template typeHeaderOk<DDt0Field<GeoField>>(
true)
136 new DDt0Field<GeoField>
154 new DDt0Field<GeoField>
175 DDt0Field<GeoField>& ddt0 =
static_cast<DDt0Field<GeoField>&
>
177 mesh().objectRegistry::template lookupObjectRef<GeoField>(
name)
185 template<
class GeoField>
186 bool CrankNicolsonDdtScheme<Type>::evaluate
188 DDt0Field<GeoField>& ddt0
191 bool evaluated = (ddt0.timeIndex() !=
mesh().time().timeIndex());
192 ddt0.timeIndex() =
mesh().time().timeIndex();
198 template<
class GeoField>
199 scalar CrankNicolsonDdtScheme<Type>::coef_
201 const DDt0Field<GeoField>& ddt0
216 template<
class GeoField>
217 scalar CrankNicolsonDdtScheme<Type>::coef0_
219 const DDt0Field<GeoField>& ddt0
234 template<
class GeoField>
237 const DDt0Field<GeoField>& ddt0
240 return coef_(ddt0)/
mesh().time().deltaT();
245 template<
class GeoField>
248 const DDt0Field<GeoField>& ddt0
251 return coef0_(ddt0)/
mesh().time().deltaT0();
256 template<
class GeoField>
257 tmp<GeoField> CrankNicolsonDdtScheme<Type>::offCentre_
274 const FieldField<fvPatchField, Type>&
ff
276 const FieldField<fvPatchField, Type>& bf
289 ocCoeff_(new Function1Types::Constant<scalar>(
"ocCoeff", 1))
301 CrankNicolsonDdtScheme<Type>::CrankNicolsonDdtScheme
307 ddtScheme<Type>(
mesh, is)
309 token firstToken(is);
314 if (ocCoeff < 0 || ocCoeff > 1)
317 <<
"Off-centreing coefficient = " <<
ocCoeff
318 <<
" should be >= 0 and <= 1"
324 new Function1Types::Constant<scalar>(
"ocCoeff",
ocCoeff)
331 ocCoeff_ = Function1<scalar>::New(
"ocCoeff",
dict, &
mesh);
352 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
353 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
355 "ddt0(" + dt.
name() +
')',
361 "ddt(" + dt.
name() +
')',
386 (rDtCoef0*dt)*(
mesh().V0() -
mesh().V00())
387 -
mesh().V00()*offCentre_(ddt0.internalField())
393 (rDtCoef*dt)*(
mesh().V() -
mesh().V0())
394 -
mesh().V0()*offCentre_(ddt0.internalField())
409 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
410 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
412 "ddt0(" + vf.name() +
')',
418 "ddt(" + vf.name() +
')',
429 const scalar rDtCoef0 = rDtCoef0_(ddt0).value();
431 ddt0.primitiveFieldRef() =
436 -
mesh().V00()*vf.
oldTime().oldTime().primitiveField()
437 ) -
mesh().V00()*offCentre_(ddt0.primitiveField())
440 ddt0.boundaryFieldRef() =
445 - vf.
oldTime().oldTime().boundaryField()
446 ) - offCentre_(
ff(ddt0.boundaryField()))
460 ) -
mesh().V0()*offCentre_(ddt0()())
465 ) - offCentre_(
ff(ddt0.boundaryField()))
474 - offCentre_(ddt0());
477 return tmp<GeometricField<Type, fvPatchField, volMesh>>
479 new GeometricField<Type, fvPatchField, volMesh>
482 rDtCoef*(vf - vf.
oldTime()) - offCentre_(ddt0())
497 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
498 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
500 "ddt0(" +
rho.name() +
',' + vf.name() +
')',
501 rho.dimensions()*vf.dimensions()
506 "ddt(" +
rho.name() +
',' + vf.name() +
')',
517 const scalar rDtCoef0 = rDtCoef0_(ddt0).value();
519 ddt0.primitiveFieldRef() =
521 rDtCoef0*
rho.value()*
524 -
mesh().V00()*vf.
oldTime().oldTime().primitiveField()
525 ) -
mesh().V00()*offCentre_(ddt0.primitiveField())
528 ddt0.boundaryFieldRef() =
530 rDtCoef0*
rho.value()*
533 - vf.
oldTime().oldTime().boundaryField()
534 ) - offCentre_(
ff(ddt0.boundaryField()))
538 return tmp<GeometricField<Type, fvPatchField, volMesh>>
540 new GeometricField<Type, fvPatchField, volMesh>
550 ) -
mesh().V0()*offCentre_(ddt0.primitiveField())
555 ) - offCentre_(
ff(ddt0.boundaryField()))
564 - offCentre_(ddt0());
567 return tmp<GeometricField<Type, fvPatchField, volMesh>>
569 new GeometricField<Type, fvPatchField, volMesh>
572 rDtCoef*
rho*(vf - vf.
oldTime()) - offCentre_(ddt0())
587 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
588 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
590 "ddt0(" +
rho.name() +
',' + vf.name() +
')',
591 rho.dimensions()*vf.dimensions()
596 "ddt(" +
rho.name() +
',' + vf.name() +
')',
607 const scalar rDtCoef0 = rDtCoef0_(ddt0).value();
609 ddt0.primitiveFieldRef() =
613 mesh().V0()*
rho.oldTime().primitiveField()
615 -
mesh().V00()*
rho.oldTime().oldTime().primitiveField()
616 *vf.
oldTime().oldTime().primitiveField()
617 ) -
mesh().V00()*offCentre_(ddt0.primitiveField())
620 ddt0.boundaryFieldRef() =
624 rho.oldTime().boundaryField()
626 -
rho.oldTime().oldTime().boundaryField()
627 *vf.
oldTime().oldTime().boundaryField()
628 ) - offCentre_(
ff(ddt0.boundaryField()))
632 return tmp<GeometricField<Type, fvPatchField, volMesh>>
634 new GeometricField<Type, fvPatchField, volMesh>
643 -
mesh().V0()*
rho.oldTime().primitiveField()
645 ) -
mesh().V00()*offCentre_(ddt0.primitiveField())
650 -
rho.oldTime().boundaryField()*vf.
oldTime().boundaryField()
651 ) - offCentre_(
ff(ddt0.boundaryField()))
659 ddt0 = rDtCoef0_(ddt0)*
662 -
rho.oldTime().oldTime()*vf.
oldTime().oldTime()
663 ) - offCentre_(ddt0());
666 return tmp<GeometricField<Type, fvPatchField, volMesh>>
668 new GeometricField<Type, fvPatchField, volMesh>
688 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
689 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
691 "ddt0(" +
alpha.
name() +
',' +
rho.name() +
',' + vf.name() +
')',
697 "ddt(" +
alpha.
name() +
',' +
rho.name() +
',' + vf.name() +
')',
708 const scalar rDtCoef0 = rDtCoef0_(ddt0).value();
710 ddt0.primitiveFieldRef() =
715 *
alpha.oldTime().primitiveField()
716 *
rho.oldTime().primitiveField()
720 *
alpha.oldTime().oldTime().primitiveField()
721 *
rho.oldTime().oldTime().primitiveField()
722 *vf.
oldTime().oldTime().primitiveField()
723 ) -
mesh().V00()*offCentre_(ddt0.primitiveField())
726 ddt0.boundaryFieldRef() =
730 alpha.oldTime().boundaryField()
731 *
rho.oldTime().boundaryField()
734 -
alpha.oldTime().oldTime().boundaryField()
735 *
rho.oldTime().oldTime().boundaryField()
736 *vf.
oldTime().oldTime().boundaryField()
737 ) - offCentre_(
ff(ddt0.boundaryField()))
741 return tmp<GeometricField<Type, fvPatchField, volMesh>>
743 new GeometricField<Type, fvPatchField, volMesh>
753 *
alpha.primitiveField()
754 *
rho.primitiveField()
758 *
alpha.oldTime().primitiveField()
759 *
rho.oldTime().primitiveField()
761 ) -
mesh().V00()*offCentre_(ddt0.primitiveField())
765 alpha.boundaryField()
769 -
alpha.oldTime().boundaryField()
770 *
rho.oldTime().boundaryField()
772 ) - offCentre_(
ff(ddt0.boundaryField()))
780 ddt0 = rDtCoef0_(ddt0)*
786 -
alpha.oldTime().oldTime()
787 *
rho.oldTime().oldTime()
789 ) - offCentre_(ddt0());
792 return tmp<GeometricField<Type, fvPatchField, volMesh>>
794 new GeometricField<Type, fvPatchField, volMesh>
816 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
817 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
819 "ddt0(" + vf.name() +
')',
834 const scalar rDtCoef = rDtCoef_(ddt0).
value();
835 fvm.diag() = rDtCoef*
mesh().V();
843 const scalar rDtCoef0 = rDtCoef0_(ddt0).value();
845 ddt0.primitiveFieldRef() =
850 -
mesh().V00()*vf.
oldTime().oldTime().primitiveField()
852 -
mesh().V00()*offCentre_(ddt0.primitiveField())
855 ddt0.boundaryFieldRef() =
860 - vf.
oldTime().oldTime().boundaryField()
862 - offCentre_(
ff(ddt0.boundaryField()))
868 rDtCoef*vf.
oldTime().primitiveField()
869 + offCentre_(ddt0.primitiveField())
877 - offCentre_(ddt0());
883 rDtCoef*vf.
oldTime().primitiveField()
884 + offCentre_(ddt0.primitiveField())
900 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
901 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
903 "ddt0(" +
rho.name() +
',' + vf.name() +
')',
904 rho.dimensions()*vf.dimensions()
917 const scalar rDtCoef = rDtCoef_(ddt0).value();
918 fvm.diag() = rDtCoef*
rho.value()*
mesh().V();
926 const scalar rDtCoef0 = rDtCoef0_(ddt0).value();
928 ddt0.primitiveFieldRef() =
930 rDtCoef0*
rho.value()*
933 -
mesh().V00()*vf.
oldTime().oldTime().primitiveField()
935 -
mesh().V00()*offCentre_(ddt0.primitiveField())
938 ddt0.boundaryFieldRef() =
940 rDtCoef0*
rho.value()*
943 - vf.
oldTime().oldTime().boundaryField()
945 - offCentre_(
ff(ddt0.boundaryField()))
951 rDtCoef*
rho.value()*vf.
oldTime().primitiveField()
952 + offCentre_(ddt0.primitiveField())
960 - offCentre_(ddt0());
965 rDtCoef*
rho.value()*vf.
oldTime().primitiveField()
966 + offCentre_(ddt0.primitiveField())
982 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
983 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
985 "ddt0(" +
rho.name() +
',' + vf.name() +
')',
986 rho.dimensions()*vf.dimensions()
999 const scalar rDtCoef = rDtCoef_(ddt0).value();
1000 fvm.diag() = rDtCoef*
rho.primitiveField()*
mesh().V();
1003 rho.oldTime().oldTime();
1005 if (
mesh().moving())
1009 const scalar rDtCoef0 = rDtCoef0_(ddt0).value();
1011 ddt0.primitiveFieldRef() =
1015 mesh().V0()*
rho.oldTime().primitiveField()
1016 *vf.
oldTime().primitiveField()
1017 -
mesh().V00()*
rho.oldTime().oldTime().primitiveField()
1018 *vf.
oldTime().oldTime().primitiveField()
1020 -
mesh().V00()*offCentre_(ddt0.primitiveField())
1023 ddt0.boundaryFieldRef() =
1027 rho.oldTime().boundaryField()
1029 -
rho.oldTime().oldTime().boundaryField()
1030 *vf.
oldTime().oldTime().boundaryField()
1032 - offCentre_(
ff(ddt0.boundaryField()))
1038 rDtCoef*
rho.oldTime().primitiveField()*vf.
oldTime().primitiveField()
1039 + offCentre_(ddt0.primitiveField())
1046 ddt0 = rDtCoef0_(ddt0)*
1049 -
rho.oldTime().oldTime()*vf.
oldTime().oldTime()
1050 ) - offCentre_(ddt0());
1055 rDtCoef*
rho.oldTime().primitiveField()*vf.
oldTime().primitiveField()
1056 + offCentre_(ddt0.primitiveField())
1064 template<
class Type>
1073 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
1074 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
1076 "ddt0(" +
alpha.
name() +
',' +
rho.name() +
',' + vf.name() +
')',
1090 const scalar rDtCoef = rDtCoef_(ddt0).value();
1091 fvm.diag() = rDtCoef*
alpha.primitiveField()*
rho.primitiveField()*
mesh().V();
1094 alpha.oldTime().oldTime();
1095 rho.oldTime().oldTime();
1097 if (
mesh().moving())
1101 const scalar rDtCoef0 = rDtCoef0_(ddt0).value();
1103 ddt0.primitiveFieldRef() =
1108 *
alpha.oldTime().primitiveField()
1109 *
rho.oldTime().primitiveField()
1110 *vf.
oldTime().primitiveField()
1113 *
alpha.oldTime().oldTime().primitiveField()
1114 *
rho.oldTime().oldTime().primitiveField()
1115 *vf.
oldTime().oldTime().primitiveField()
1117 -
mesh().V00()*offCentre_(ddt0.primitiveField())
1120 ddt0.boundaryFieldRef() =
1124 alpha.oldTime().boundaryField()
1125 *
rho.oldTime().boundaryField()
1128 -
alpha.oldTime().oldTime().boundaryField()
1129 *
rho.oldTime().oldTime().boundaryField()
1130 *vf.
oldTime().oldTime().boundaryField()
1132 - offCentre_(
ff(ddt0.boundaryField()))
1139 *
alpha.oldTime().primitiveField()
1140 *
rho.oldTime().primitiveField()
1141 *vf.
oldTime().primitiveField()
1142 + offCentre_(ddt0.primitiveField())
1149 ddt0 = rDtCoef0_(ddt0)*
1155 -
alpha.oldTime().oldTime()
1156 *
rho.oldTime().oldTime()
1158 ) - offCentre_(ddt0());
1164 *
alpha.oldTime().primitiveField()
1165 *
rho.oldTime().primitiveField()
1166 *vf.
oldTime().primitiveField()
1167 + offCentre_(ddt0.primitiveField())
1175 template<
class Type>
1183 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
1184 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
1186 "ddtCorrDdt0(" +
U.name() +
')',
1190 DDt0Field<GeometricField<Type, fvsPatchField, surfaceMesh>>& dUfdt0 =
1191 ddt0_<GeometricField<Type, fvsPatchField, surfaceMesh>>
1193 "ddtCorrDdt0(" +
Uf.name() +
')',
1202 rDtCoef0_(ddt0)*(
U.oldTime() -
U.oldTime().oldTime())
1203 - offCentre_(ddt0());
1209 rDtCoef0_(dUfdt0)*(
Uf.oldTime() -
Uf.oldTime().oldTime())
1210 - offCentre_(dUfdt0());
1213 return tmp<fluxFieldType>
1219 "ddtCorr(" +
U.name() +
',' +
Uf.name() +
')',
1223 this->fvcDdtPhiCoeff(
U.oldTime(),
mesh().Sf() &
Uf.oldTime())
1227 (rDtCoef*
Uf.oldTime() + offCentre_(dUfdt0()))
1236 template<
class Type>
1241 const fluxFieldType&
phi
1244 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
1245 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
1247 "ddtCorrDdt0(" +
U.name() +
')',
1251 DDt0Field<fluxFieldType>& dphidt0 =
1252 ddt0_<fluxFieldType>
1254 "ddtCorrDdt0(" +
phi.name() +
')',
1257 dphidt0.setOriented();
1264 rDtCoef0_(ddt0)*(
U.oldTime() -
U.oldTime().oldTime())
1265 - offCentre_(ddt0());
1271 rDtCoef0_(dphidt0)*(
phi.oldTime() -
phi.oldTime().oldTime())
1272 - offCentre_(dphidt0());
1275 return tmp<fluxFieldType>
1281 "ddtCorr(" +
U.name() +
',' +
phi.name() +
')',
1285 this->fvcDdtPhiCoeff(
U.oldTime(),
phi.oldTime())
1287 (rDtCoef*
phi.oldTime() + offCentre_(dphidt0()))
1291 rDtCoef*
U.oldTime() + offCentre_(ddt0())
1299 template<
class Type>
1314 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
1315 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
1317 "ddtCorrDdt0(" +
rho.name() +
',' +
U.name() +
')',
1318 rho.dimensions()*
U.dimensions()
1321 DDt0Field<GeometricField<Type, fvsPatchField, surfaceMesh>>& dUfdt0 =
1322 ddt0_<GeometricField<Type, fvsPatchField, surfaceMesh>>
1324 "ddtCorrDdt0(" +
Uf.name() +
')',
1332 rho.oldTime()*
U.oldTime()
1339 *(rhoU0 -
rho.oldTime().oldTime()*
U.oldTime().oldTime())
1340 - offCentre_(ddt0());
1347 *(
Uf.oldTime() -
Uf.oldTime().oldTime())
1348 - offCentre_(dUfdt0());
1358 +
rho.name() +
',' +
U.name() +
',' +
Uf.name() +
')',
1362 this->fvcDdtPhiCoeff
1365 mesh().Sf() &
Uf.oldTime(),
1371 (rDtCoef*
Uf.oldTime() + offCentre_(dUfdt0()))
1386 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
1387 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
1389 "ddtCorrDdt0(" +
U.name() +
')',
1393 DDt0Field<GeometricField<Type, fvsPatchField, surfaceMesh>>& dUfdt0 =
1394 ddt0_<GeometricField<Type, fvsPatchField, surfaceMesh>>
1396 "ddtCorrDdt0(" +
Uf.name() +
')',
1405 rDtCoef0_(ddt0)*(
U.oldTime() -
U.oldTime().oldTime())
1406 - offCentre_(ddt0());
1412 rDtCoef0_(dUfdt0)*(
Uf.oldTime() -
Uf.oldTime().oldTime())
1413 - offCentre_(dUfdt0());
1416 return tmp<fluxFieldType>
1422 "ddtCorr(" +
U.name() +
',' +
Uf.name() +
')',
1426 this->fvcDdtPhiCoeff
1429 mesh().Sf() &
Uf.oldTime(),
1435 (rDtCoef*
Uf.oldTime() + offCentre_(dUfdt0()))
1438 rDtCoef*
U.oldTime() + offCentre_(ddt0())
1448 <<
"dimensions of Uf are not correct"
1451 return fluxFieldType::null();
1456 template<
class Type>
1462 const fluxFieldType&
phi
1471 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
1472 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
1474 "ddtCorrDdt0(" +
rho.name() +
',' +
U.name() +
')',
1475 rho.dimensions()*
U.dimensions()
1478 DDt0Field<fluxFieldType>& dphidt0 =
1479 ddt0_<fluxFieldType>
1481 "ddtCorrDdt0(" +
phi.name() +
')',
1489 rho.oldTime()*
U.oldTime()
1496 *(rhoU0 -
rho.oldTime().oldTime()*
U.oldTime().oldTime())
1497 - offCentre_(ddt0());
1504 *(
phi.oldTime() -
phi.oldTime().oldTime())
1505 - offCentre_(dphidt0());
1515 +
rho.name() +
',' +
U.name() +
',' +
phi.name() +
')',
1519 this->fvcDdtPhiCoeff(rhoU0,
phi.oldTime(),
rho.oldTime())
1521 (rDtCoef*
phi.oldTime() + offCentre_(dphidt0()))
1525 rDtCoef*rhoU0 + offCentre_(ddt0())
1539 DDt0Field<GeometricField<Type, fvPatchField, volMesh>>& ddt0 =
1540 ddt0_<GeometricField<Type, fvPatchField, volMesh>>
1542 "ddtCorrDdt0(" +
U.name() +
')',
1546 DDt0Field<fluxFieldType>& dphidt0 =
1547 ddt0_<fluxFieldType>
1549 "ddtCorrDdt0(" +
phi.name() +
')',
1558 rDtCoef0_(ddt0)*(
U.oldTime() -
U.oldTime().oldTime())
1559 - offCentre_(ddt0());
1565 rDtCoef0_(dphidt0)*(
phi.oldTime() -
phi.oldTime().oldTime())
1566 - offCentre_(dphidt0());
1569 return tmp<fluxFieldType>
1575 "ddtCorr(" +
U.name() +
',' +
phi.name() +
')',
1579 this->fvcDdtPhiCoeff(
U.oldTime(),
phi.oldTime(),
rho.oldTime())
1581 (rDtCoef*
phi.oldTime() + offCentre_(dphidt0()))
1585 rDtCoef*
U.oldTime() + offCentre_(ddt0())
1594 <<
"dimensions of phi are not correct"
1597 return fluxFieldType::null();
1602 template<
class Type>
1608 DDt0Field<surfaceScalarField>& meshPhi0 = ddt0_<surfaceScalarField>
1614 meshPhi0.setOriented();
1619 coef0_(meshPhi0)*
mesh().phi().oldTime() - offCentre_(meshPhi0());
1622 return tmp<surfaceScalarField>
1635 coef_(meshPhi0)*
mesh().
phi() - offCentre_(meshPhi0())