backwardDdtScheme.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration | Website: https://openfoam.org
5  \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8 License
9  This file is part of OpenFOAM.
10 
11  OpenFOAM is free software: you can redistribute it and/or modify it
12  under the terms of the GNU General Public License as published by
13  the Free Software Foundation, either version 3 of the License, or
14  (at your option) any later version.
15 
16  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19  for more details.
20 
21  You should have received a copy of the GNU General Public License
22  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
23 
24 \*---------------------------------------------------------------------------*/
25 
26 #include "backwardDdtScheme.H"
27 #include "surfaceInterpolate.H"
28 #include "fvcDiv.H"
29 #include "fvMatrices.H"
30 
31 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
32 
33 namespace Foam
34 {
35 
36 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
37 
38 namespace fv
39 {
40 
41 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
42 
43 template<class Type>
44 scalar backwardDdtScheme<Type>::deltaT_() const
45 {
46  return mesh().time().deltaTValue();
47 }
48 
49 
50 template<class Type>
51 scalar backwardDdtScheme<Type>::deltaT0_() const
52 {
53  return mesh().time().deltaT0Value();
54 }
55 
56 
57 template<class Type>
58 template<class GeoField>
59 scalar backwardDdtScheme<Type>::deltaT0_(const GeoField& vf) const
60 {
61  if (vf.nOldTimes() < 2)
62  {
63  return great;
64  }
65  else
66  {
67  return deltaT0_();
68  }
69 }
70 
71 
72 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
73 
74 template<class Type>
75 tmp<GeometricField<Type, fvPatchField, volMesh>>
77 (
78  const dimensioned<Type>& dt
79 )
80 {
81  dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
82 
83  IOobject ddtIOobject
84  (
85  "ddt("+dt.name()+')',
86  mesh().time().timeName(),
87  mesh()
88  );
89 
90  scalar deltaT = deltaT_();
91  scalar deltaT0 = deltaT0_();
92 
93  scalar coefft = 1 + deltaT/(deltaT + deltaT0);
94  scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
95  scalar coefft0 = coefft + coefft00;
96 
97  if (mesh().moving())
98  {
100  (
102  (
103  ddtIOobject,
104  mesh(),
106  (
107  "0",
108  dt.dimensions()/dimTime,
109  Zero
110  )
111  )
112  );
113 
114  tdtdt.ref().primitiveFieldRef() = rDeltaT.value()*dt.value()*
115  (
116  coefft - (coefft0*mesh().V0() - coefft00*mesh().V00())/mesh().V()
117  );
118 
119  return tdtdt;
120  }
121  else
122  {
124  (
126  (
127  ddtIOobject,
128  mesh(),
130  (
131  "0",
132  dt.dimensions()/dimTime,
133  Zero
134  ),
136  )
137  );
138  }
139 }
140 
141 
142 template<class Type>
145 (
147 )
148 {
149  dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
150 
151  IOobject ddtIOobject
152  (
153  "ddt("+vf.name()+')',
154  mesh().time().timeName(),
155  mesh()
156  );
157 
158  scalar deltaT = deltaT_();
159  scalar deltaT0 = deltaT0_(vf);
160 
161  scalar coefft = 1 + deltaT/(deltaT + deltaT0);
162  scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
163  scalar coefft0 = coefft + coefft00;
164 
165  if (mesh().moving())
166  {
168  (
170  (
171  ddtIOobject,
172  mesh(),
173  rDeltaT.dimensions()*vf.dimensions(),
174  rDeltaT.value()*
175  (
176  coefft*vf.primitiveField() -
177  (
178  coefft0*vf.oldTime().primitiveField()*mesh().V0()
179  - coefft00*vf.oldTime().oldTime().primitiveField()
180  *mesh().V00()
181  )/mesh().V()
182  ),
183  rDeltaT.value()*
184  (
185  coefft*vf.boundaryField() -
186  (
187  coefft0*vf.oldTime().boundaryField()
188  - coefft00*vf.oldTime().oldTime().boundaryField()
189  )
190  )
191  )
192  );
193  }
194  else
195  {
197  (
199  (
200  ddtIOobject,
201  rDeltaT*
202  (
203  coefft*vf
204  - coefft0*vf.oldTime()
205  + coefft00*vf.oldTime().oldTime()
206  )
207  )
208  );
209  }
210 }
211 
212 
213 template<class Type>
216 (
217  const dimensionedScalar& rho,
219 )
220 {
221  dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
222 
223  IOobject ddtIOobject
224  (
225  "ddt("+rho.name()+','+vf.name()+')',
226  mesh().time().timeName(),
227  mesh()
228  );
229 
230  scalar deltaT = deltaT_();
231  scalar deltaT0 = deltaT0_(vf);
232 
233  scalar coefft = 1 + deltaT/(deltaT + deltaT0);
234  scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
235  scalar coefft0 = coefft + coefft00;
236 
237  if (mesh().moving())
238  {
240  (
242  (
243  ddtIOobject,
244  mesh(),
245  rDeltaT.dimensions()*rho.dimensions()*vf.dimensions(),
246  rDeltaT.value()*rho.value()*
247  (
248  coefft*vf.primitiveField() -
249  (
250  coefft0*vf.oldTime().primitiveField()*mesh().V0()
251  - coefft00*vf.oldTime().oldTime().primitiveField()
252  *mesh().V00()
253  )/mesh().V()
254  ),
255  rDeltaT.value()*rho.value()*
256  (
257  coefft*vf.boundaryField() -
258  (
259  coefft0*vf.oldTime().boundaryField()
260  - coefft00*vf.oldTime().oldTime().boundaryField()
261  )
262  )
263  )
264  );
265  }
266  else
267  {
269  (
271  (
272  ddtIOobject,
273  rDeltaT*rho*
274  (
275  coefft*vf
276  - coefft0*vf.oldTime()
277  + coefft00*vf.oldTime().oldTime()
278  )
279  )
280  );
281  }
282 }
283 
284 
285 template<class Type>
288 (
289  const volScalarField& rho,
291 )
292 {
293  dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
294 
295  IOobject ddtIOobject
296  (
297  "ddt("+rho.name()+','+vf.name()+')',
298  mesh().time().timeName(),
299  mesh()
300  );
301 
302  scalar deltaT = deltaT_();
303  scalar deltaT0 = deltaT0_(vf);
304 
305  scalar coefft = 1 + deltaT/(deltaT + deltaT0);
306  scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
307  scalar coefft0 = coefft + coefft00;
308 
309  if (mesh().moving())
310  {
312  (
314  (
315  ddtIOobject,
316  mesh(),
317  rDeltaT.dimensions()*rho.dimensions()*vf.dimensions(),
318  rDeltaT.value()*
319  (
320  coefft*rho.primitiveField()*vf.primitiveField() -
321  (
322  coefft0*rho.oldTime().primitiveField()
323  *vf.oldTime().primitiveField()*mesh().V0()
324  - coefft00*rho.oldTime().oldTime().primitiveField()
325  *vf.oldTime().oldTime().primitiveField()*mesh().V00()
326  )/mesh().V()
327  ),
328  rDeltaT.value()*
329  (
330  coefft*rho.boundaryField()*vf.boundaryField() -
331  (
332  coefft0*rho.oldTime().boundaryField()
333  *vf.oldTime().boundaryField()
334  - coefft00*rho.oldTime().oldTime().boundaryField()
335  *vf.oldTime().oldTime().boundaryField()
336  )
337  )
338  )
339  );
340  }
341  else
342  {
344  (
346  (
347  ddtIOobject,
348  rDeltaT*
349  (
350  coefft*rho*vf
351  - coefft0*rho.oldTime()*vf.oldTime()
352  + coefft00*rho.oldTime().oldTime()*vf.oldTime().oldTime()
353  )
354  )
355  );
356  }
357 }
358 
359 
360 template<class Type>
363 (
364  const volScalarField& alpha,
365  const volScalarField& rho,
367 )
368 {
369  dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
370 
371  IOobject ddtIOobject
372  (
373  "ddt("+alpha.name()+','+rho.name()+','+vf.name()+')',
374  mesh().time().timeName(),
375  mesh()
376  );
377 
378  scalar deltaT = deltaT_();
379  scalar deltaT0 = deltaT0_(vf);
380 
381  scalar coefft = 1 + deltaT/(deltaT + deltaT0);
382  scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
383  scalar coefft0 = coefft + coefft00;
384 
385  if (mesh().moving())
386  {
388  (
390  (
391  ddtIOobject,
392  mesh(),
393  rDeltaT.dimensions()
394  *alpha.dimensions()*rho.dimensions()*vf.dimensions(),
395  rDeltaT.value()*
396  (
397  coefft
398  *alpha.primitiveField()
399  *rho.primitiveField()
400  *vf.primitiveField() -
401  (
402  coefft0
403  *alpha.oldTime().primitiveField()
404  *rho.oldTime().primitiveField()
405  *vf.oldTime().primitiveField()*mesh().V0()
406 
407  - coefft00
408  *alpha.oldTime().oldTime().primitiveField()
409  *rho.oldTime().oldTime().primitiveField()
410  *vf.oldTime().oldTime().primitiveField()*mesh().V00()
411  )/mesh().V()
412  ),
413  rDeltaT.value()*
414  (
415  coefft
416  *alpha.boundaryField()
417  *rho.boundaryField()
418  *vf.boundaryField() -
419  (
420  coefft0
421  *alpha.oldTime().boundaryField()
422  *rho.oldTime().boundaryField()
423  *vf.oldTime().boundaryField()
424 
425  - coefft00
426  *alpha.oldTime().oldTime().boundaryField()
427  *rho.oldTime().oldTime().boundaryField()
428  *vf.oldTime().oldTime().boundaryField()
429  )
430  )
431  )
432  );
433  }
434  else
435  {
437  (
439  (
440  ddtIOobject,
441  rDeltaT*
442  (
443  coefft*alpha*rho*vf
444  - coefft0*alpha.oldTime()*rho.oldTime()*vf.oldTime()
445  + coefft00*alpha.oldTime().oldTime()
446  *rho.oldTime().oldTime()*vf.oldTime().oldTime()
447  )
448  )
449  );
450  }
451 }
452 
453 
454 template<class Type>
457 (
459 )
460 {
461  tmp<fvMatrix<Type>> tfvm
462  (
463  new fvMatrix<Type>
464  (
465  vf,
467  )
468  );
469 
470  fvMatrix<Type>& fvm = tfvm.ref();
471 
472  scalar rDeltaT = 1.0/deltaT_();
473 
474  scalar deltaT = deltaT_();
475  scalar deltaT0 = deltaT0_(vf);
476 
477  scalar coefft = 1 + deltaT/(deltaT + deltaT0);
478  scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
479  scalar coefft0 = coefft + coefft00;
480 
481  fvm.diag() = (coefft*rDeltaT)*mesh().V();
482 
483  if (mesh().moving())
484  {
485  fvm.source() = rDeltaT*
486  (
487  coefft0*vf.oldTime().primitiveField()*mesh().V0()
488  - coefft00*vf.oldTime().oldTime().primitiveField()
489  *mesh().V00()
490  );
491  }
492  else
493  {
494  fvm.source() = rDeltaT*mesh().V()*
495  (
496  coefft0*vf.oldTime().primitiveField()
497  - coefft00*vf.oldTime().oldTime().primitiveField()
498  );
499  }
500 
501  return tfvm;
502 }
503 
504 
505 template<class Type>
508 (
509  const dimensionedScalar& rho,
511 )
512 {
513  tmp<fvMatrix<Type>> tfvm
514  (
515  new fvMatrix<Type>
516  (
517  vf,
519  )
520  );
521  fvMatrix<Type>& fvm = tfvm.ref();
522 
523  scalar rDeltaT = 1.0/deltaT_();
524 
525  scalar deltaT = deltaT_();
526  scalar deltaT0 = deltaT0_(vf);
527 
528  scalar coefft = 1 + deltaT/(deltaT + deltaT0);
529  scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
530  scalar coefft0 = coefft + coefft00;
531 
532  fvm.diag() = (coefft*rDeltaT*rho.value())*mesh().V();
533 
534  if (mesh().moving())
535  {
536  fvm.source() = rDeltaT*rho.value()*
537  (
538  coefft0*vf.oldTime().primitiveField()*mesh().V0()
539  - coefft00*vf.oldTime().oldTime().primitiveField()
540  *mesh().V00()
541  );
542  }
543  else
544  {
545  fvm.source() = rDeltaT*mesh().V()*rho.value()*
546  (
547  coefft0*vf.oldTime().primitiveField()
548  - coefft00*vf.oldTime().oldTime().primitiveField()
549  );
550  }
551 
552  return tfvm;
553 }
554 
555 
556 template<class Type>
559 (
560  const volScalarField& rho,
562 )
563 {
564  tmp<fvMatrix<Type>> tfvm
565  (
566  new fvMatrix<Type>
567  (
568  vf,
570  )
571  );
572  fvMatrix<Type>& fvm = tfvm.ref();
573 
574  scalar rDeltaT = 1.0/deltaT_();
575 
576  scalar deltaT = deltaT_();
577  scalar deltaT0 = deltaT0_(vf);
578 
579  scalar coefft = 1 + deltaT/(deltaT + deltaT0);
580  scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
581  scalar coefft0 = coefft + coefft00;
582 
583  fvm.diag() = (coefft*rDeltaT)*rho.primitiveField()*mesh().V();
584 
585  if (mesh().moving())
586  {
587  fvm.source() = rDeltaT*
588  (
589  coefft0*rho.oldTime().primitiveField()
590  *vf.oldTime().primitiveField()*mesh().V0()
591  - coefft00*rho.oldTime().oldTime().primitiveField()
592  *vf.oldTime().oldTime().primitiveField()*mesh().V00()
593  );
594  }
595  else
596  {
597  fvm.source() = rDeltaT*mesh().V()*
598  (
599  coefft0*rho.oldTime().primitiveField()
600  *vf.oldTime().primitiveField()
601  - coefft00*rho.oldTime().oldTime().primitiveField()
602  *vf.oldTime().oldTime().primitiveField()
603  );
604  }
605 
606  return tfvm;
607 }
608 
609 
610 template<class Type>
613 (
614  const volScalarField& alpha,
615  const volScalarField& rho,
617 )
618 {
619  tmp<fvMatrix<Type>> tfvm
620  (
621  new fvMatrix<Type>
622  (
623  vf,
624  alpha.dimensions()*rho.dimensions()*vf.dimensions()*dimVol/dimTime
625  )
626  );
627  fvMatrix<Type>& fvm = tfvm.ref();
628 
629  scalar rDeltaT = 1.0/deltaT_();
630 
631  scalar deltaT = deltaT_();
632  scalar deltaT0 = deltaT0_(vf);
633 
634  scalar coefft = 1 + deltaT/(deltaT + deltaT0);
635  scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
636  scalar coefft0 = coefft + coefft00;
637 
638  fvm.diag() =
639  (coefft*rDeltaT)*alpha.primitiveField()*rho.primitiveField()*mesh().V();
640 
641  if (mesh().moving())
642  {
643  fvm.source() = rDeltaT*
644  (
645  coefft0
646  *alpha.oldTime().primitiveField()
647  *rho.oldTime().primitiveField()
648  *vf.oldTime().primitiveField()*mesh().V0()
649 
650  - coefft00
651  *alpha.oldTime().oldTime().primitiveField()
652  *rho.oldTime().oldTime().primitiveField()
653  *vf.oldTime().oldTime().primitiveField()*mesh().V00()
654  );
655  }
656  else
657  {
658  fvm.source() = rDeltaT*mesh().V()*
659  (
660  coefft0
661  *alpha.oldTime().primitiveField()
662  *rho.oldTime().primitiveField()
663  *vf.oldTime().primitiveField()
664 
665  - coefft00
666  *alpha.oldTime().oldTime().primitiveField()
667  *rho.oldTime().oldTime().primitiveField()
668  *vf.oldTime().oldTime().primitiveField()
669  );
670  }
671 
672  return tfvm;
673 }
674 
675 
676 template<class Type>
679 (
682 )
683 {
684  dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
685 
686  scalar deltaT = deltaT_();
687  scalar deltaT0 = deltaT0_(U);
688 
689  scalar coefft = 1 + deltaT/(deltaT + deltaT0);
690  scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
691  scalar coefft0 = coefft + coefft00;
692 
693  return tmp<fluxFieldType>
694  (
695  new fluxFieldType
696  (
697  IOobject
698  (
699  "ddtCorr(" + U.name() + ',' + Uf.name() + ')',
700  mesh().time().timeName(),
701  mesh()
702  ),
703  this->fvcDdtPhiCoeff(U.oldTime(), (mesh().Sf() & Uf.oldTime()))
704  *rDeltaT
705  *(
706  mesh().Sf()
707  & (
708  (coefft0*Uf.oldTime() - coefft00*Uf.oldTime().oldTime())
710  (
711  coefft0*U.oldTime() - coefft00*U.oldTime().oldTime()
712  )
713  )
714  )
715  )
716  );
717 }
718 
719 
720 template<class Type>
723 (
725  const fluxFieldType& phi
726 )
727 {
728  dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
729 
730  scalar deltaT = deltaT_();
731  scalar deltaT0 = deltaT0_(U);
732 
733  scalar coefft = 1 + deltaT/(deltaT + deltaT0);
734  scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
735  scalar coefft0 = coefft + coefft00;
736 
737  return tmp<fluxFieldType>
738  (
739  new fluxFieldType
740  (
741  IOobject
742  (
743  "ddtCorr(" + U.name() + ',' + phi.name() + ')',
744  mesh().time().timeName(),
745  mesh()
746  ),
747  this->fvcDdtPhiCoeff(U.oldTime(), phi.oldTime())
748  *rDeltaT
749  *(
750  (coefft0*phi.oldTime() - coefft00*phi.oldTime().oldTime())
752  (
753  mesh().Sf(),
754  coefft0*U.oldTime() - coefft00*U.oldTime().oldTime()
755  )
756  )
757  )
758  );
759 }
760 
761 
762 template<class Type>
765 (
766  const volScalarField& rho,
769 )
770 {
771  dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
772 
773  scalar deltaT = deltaT_();
774  scalar deltaT0 = deltaT0_(U);
775 
776  scalar coefft = 1 + deltaT/(deltaT + deltaT0);
777  scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
778  scalar coefft0 = coefft + coefft00;
779 
780  if
781  (
782  U.dimensions() == dimVelocity
783  && Uf.dimensions() == rho.dimensions()*dimVelocity
784  )
785  {
787  (
788  rho.oldTime()*U.oldTime()
789  );
790 
792  (
793  rho.oldTime().oldTime()*U.oldTime().oldTime()
794  );
795 
796  return tmp<fluxFieldType>
797  (
798  new fluxFieldType
799  (
800  IOobject
801  (
802  "ddtCorr("
803  + rho.name() + ',' + U.name() + ',' + Uf.name() + ')',
804  mesh().time().timeName(),
805  mesh()
806  ),
807  this->fvcDdtPhiCoeff
808  (
809  rhoU0,
810  mesh().Sf() & Uf.oldTime(),
811  rho.oldTime()
812  )
813  *rDeltaT
814  *(
815  mesh().Sf()
816  & (
817  (coefft0*Uf.oldTime() - coefft00*Uf.oldTime().oldTime())
818  - fvc::interpolate(coefft0*rhoU0 - coefft00*rhoU00)
819  )
820  )
821  )
822  );
823  }
824  else if
825  (
826  U.dimensions() == rho.dimensions()*dimVelocity
827  && Uf.dimensions() == rho.dimensions()*dimVelocity
828  )
829  {
830  return tmp<fluxFieldType>
831  (
832  new fluxFieldType
833  (
834  IOobject
835  (
836  "ddtCorr("
837  + rho.name() + ',' + U.name() + ',' + Uf.name() + ')',
838  mesh().time().timeName(),
839  mesh()
840  ),
841  this->fvcDdtPhiCoeff
842  (
843  U.oldTime(),
844  mesh().Sf() & Uf.oldTime(),
845  rho.oldTime()
846  )
847  *rDeltaT
848  *(
849  mesh().Sf()
850  & (
851  (coefft0*Uf.oldTime() - coefft00*Uf.oldTime().oldTime())
853  (
854  coefft0*U.oldTime()
855  - coefft00*U.oldTime().oldTime()
856  )
857  )
858  )
859  )
860  );
861  }
862  else
863  {
865  << "dimensions of phi are not correct"
866  << abort(FatalError);
867 
868  return fluxFieldType::null();
869  }
870 }
871 
872 
873 template<class Type>
876 (
877  const volScalarField& rho,
879  const fluxFieldType& phi
880 )
881 {
882  dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
883 
884  scalar deltaT = deltaT_();
885  scalar deltaT0 = deltaT0_(U);
886 
887  scalar coefft = 1 + deltaT/(deltaT + deltaT0);
888  scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
889  scalar coefft0 = coefft + coefft00;
890 
891  if
892  (
893  U.dimensions() == dimVelocity
894  && phi.dimensions() == rho.dimensions()*dimVelocity*dimArea
895  )
896  {
898  (
899  rho.oldTime()*U.oldTime()
900  );
901 
903  (
904  rho.oldTime().oldTime()*U.oldTime().oldTime()
905  );
906 
907  return tmp<fluxFieldType>
908  (
909  new fluxFieldType
910  (
911  IOobject
912  (
913  "ddtCorr("
914  + rho.name() + ',' + U.name() + ',' + phi.name() + ')',
915  mesh().time().timeName(),
916  mesh()
917  ),
918  this->fvcDdtPhiCoeff(rhoU0, phi.oldTime(), rho.oldTime())
919  *rDeltaT
920  *(
921  (coefft0*phi.oldTime() - coefft00*phi.oldTime().oldTime())
923  (
924  mesh().Sf(),
925  coefft0*rhoU0 - coefft00*rhoU00
926  )
927  )
928  )
929  );
930  }
931  else if
932  (
933  U.dimensions() == rho.dimensions()*dimVelocity
934  && phi.dimensions() == rho.dimensions()*dimVelocity*dimArea
935  )
936  {
937  return tmp<fluxFieldType>
938  (
939  new fluxFieldType
940  (
941  IOobject
942  (
943  "ddtCorr("
944  + rho.name() + ',' + U.name() + ',' + phi.name() + ')',
945  mesh().time().timeName(),
946  mesh()
947  ),
948  this->fvcDdtPhiCoeff(U.oldTime(), phi.oldTime(), rho.oldTime())
949  *rDeltaT
950  *(
951  (coefft0*phi.oldTime() - coefft00*phi.oldTime().oldTime())
953  (
954  mesh().Sf(),
955  coefft0*U.oldTime() - coefft00*U.oldTime().oldTime()
956  )
957  )
958  )
959  );
960  }
961  else
962  {
964  << "dimensions of phi are not correct"
965  << abort(FatalError);
966 
967  return fluxFieldType::null();
968  }
969 }
970 
971 
972 template<class Type>
974 (
976 )
977 {
978  scalar deltaT = deltaT_();
979  scalar deltaT0 = deltaT0_(vf);
980 
981  // Coefficient for t-3/2 (between times 0 and 00)
982  scalar coefft0_00 = deltaT/(deltaT + deltaT0);
983 
984  // Coefficient for t-1/2 (between times n and 0)
985  scalar coefftn_0 = 1 + coefft0_00;
986 
988  (
990  (
991  IOobject
992  (
993  mesh().phi().name(),
994  mesh().time().timeName(),
995  mesh(),
998  false
999  ),
1000  coefftn_0*mesh().phi() - coefft0_00*mesh().phi().oldTime()
1001  )
1002  );
1003 }
1004 
1005 
1006 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
1007 
1008 } // End namespace fv
1009 
1010 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
1011 
1012 } // End namespace Foam
1013 
1014 // ************************************************************************* //
rho oldTime()
const GeometricField< Type, PatchField, GeoMesh > & oldTime() const
Return old time field.
tmp< fvMatrix< Type > > fvmDdt(const GeometricField< Type, fvPatchField, volMesh > &)
const word & name() const
Return name.
Definition: IOobject.H:297
surfaceScalarField & phi
error FatalError
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:319
const Boundary & boundaryField() const
Return const-reference to the boundary field.
T & ref() const
Return non-const reference or generate a fatal error.
Definition: tmpI.H:174
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< Type, fvPatchField, volMesh > > fvcDdt(const dimensioned< Type > &)
const dimensionSet dimVol(dimVolume)
Definition: dimensionSets.H:59
const Internal::FieldType & primitiveField() const
Return a const-reference to the internal field.
Generic GeometricField class.
Generic dimensioned Type class.
tmp< surfaceScalarField > meshPhi(const GeometricField< Type, fvPatchField, volMesh > &)
const dimensionSet & dimensions() const
Return dimensions.
dynamicFvMesh & mesh
labelList fv(nPoints)
This boundary condition is not designed to be evaluated; it is assmued that the value is assigned via...
const Type & value() const
Return const reference to value.
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.
Definition: fvPatchField.H:72
word timeName
Definition: getTimeIndex.H:3
static const zero Zero
Definition: zero.H:97
tmp< fluxFieldType > fvcDdtUfCorr(const GeometricField< Type, fvPatchField, volMesh > &U, const GeometricField< Type, fvsPatchField, surfaceMesh > &Uf)
errorManip< error > abort(error &err)
Definition: errorManip.H:131
Calculate the divergence of the given field.
Field< Type > & source()
Definition: fvMatrix.H:294
const word & name() const
Return const reference to name.
word name(const complex &)
Return a string representation of a complex.
Definition: complex.C:47
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.
const dimensionSet dimTime(0, 0, 1, 0, 0, 0, 0)
Definition: dimensionSets.H:51
A special matrix type and solver, designed for finite volume solutions of scalar equations.
const dimensionSet & dimensions() const
Return const reference to dimensions.
A class for managing temporary objects.
Definition: PtrList.H:53
GeometricField< scalar, fvsPatchField, surfaceMesh > surfaceScalarField
scalarField & diag()
Definition: lduMatrix.C:186
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
Definition: IOobject.H:92
const dimensionSet dimArea(sqr(dimLength))
Definition: dimensionSets.H:57
Namespace for OpenFOAM.
const dimensionSet dimVelocity