1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
7 -------------------------------------------------------------------------------
9 This file is part of OpenFOAM.
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 the
13 Free Software Foundation; either version 2 of the License, or (at your
14 option) any later version.
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
21 You should have received a copy of the GNU General Public License
22 along with OpenFOAM; if not, write to the Free Software Foundation,
23 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 \*---------------------------------------------------------------------------*/
27 #include "backwardDdtScheme.H"
28 #include "surfaceInterpolate.H"
30 #include "fvMatrices.H"
32 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
37 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
42 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
45 scalar backwardDdtScheme<Type>::deltaT_() const
47 return mesh().time().deltaT().value();
52 scalar backwardDdtScheme<Type>::deltaT0_() const
54 return mesh().time().deltaT0().value();
59 template<class GeoField>
60 scalar backwardDdtScheme<Type>::deltaT0_(const GeoField& vf) const
62 if (vf.nOldTimes() < 2)
73 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
76 tmp<GeometricField<Type, fvPatchField, volMesh> >
77 backwardDdtScheme<Type>::fvcDdt
79 const dimensioned<Type>& dt
82 dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
87 mesh().time().timeName(),
91 scalar deltaT = deltaT_();
92 scalar deltaT0 = deltaT0_();
94 scalar coefft = 1 + deltaT/(deltaT + deltaT0);
95 scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
96 scalar coefft0 = coefft + coefft00;
100 tmp<GeometricField<Type, fvPatchField, volMesh> > tdtdt
102 new GeometricField<Type, fvPatchField, volMesh>
109 dt.dimensions()/dimTime,
115 tdtdt().internalField() = rDeltaT.value()*dt.value()*
117 coefft - (coefft0*mesh().V0() - coefft00*mesh().V00())/mesh().V()
124 return tmp<GeometricField<Type, fvPatchField, volMesh> >
126 new GeometricField<Type, fvPatchField, volMesh>
133 dt.dimensions()/dimTime,
136 calculatedFvPatchField<Type>::typeName
144 tmp<GeometricField<Type, fvPatchField, volMesh> >
145 backwardDdtScheme<Type>::fvcDdt
147 const GeometricField<Type, fvPatchField, volMesh>& vf
150 dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
154 "ddt("+vf.name()+')',
155 mesh().time().timeName(),
159 scalar deltaT = deltaT_();
160 scalar deltaT0 = deltaT0_(vf);
162 scalar coefft = 1 + deltaT/(deltaT + deltaT0);
163 scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
164 scalar coefft0 = coefft + coefft00;
168 return tmp<GeometricField<Type, fvPatchField, volMesh> >
170 new GeometricField<Type, fvPatchField, volMesh>
174 rDeltaT.dimensions()*vf.dimensions(),
177 coefft*vf.internalField() -
179 coefft0*vf.oldTime().internalField()*mesh().V0()
180 - coefft00*vf.oldTime().oldTime().internalField()
186 coefft*vf.boundaryField() -
188 coefft0*vf.oldTime().boundaryField()
189 - coefft00*vf.oldTime().oldTime().boundaryField()
197 return tmp<GeometricField<Type, fvPatchField, volMesh> >
199 new GeometricField<Type, fvPatchField, volMesh>
205 - coefft0*vf.oldTime()
206 + coefft00*vf.oldTime().oldTime()
215 tmp<GeometricField<Type, fvPatchField, volMesh> >
216 backwardDdtScheme<Type>::fvcDdt
218 const dimensionedScalar& rho,
219 const GeometricField<Type, fvPatchField, volMesh>& vf
222 dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
226 "ddt("+rho.name()+','+vf.name()+')',
227 mesh().time().timeName(),
231 scalar deltaT = deltaT_();
232 scalar deltaT0 = deltaT0_(vf);
234 scalar coefft = 1 + deltaT/(deltaT + deltaT0);
235 scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
236 scalar coefft0 = coefft + coefft00;
240 return tmp<GeometricField<Type, fvPatchField, volMesh> >
242 new GeometricField<Type, fvPatchField, volMesh>
246 rDeltaT.dimensions()*rho.dimensions()*vf.dimensions(),
247 rDeltaT.value()*rho.value()*
249 coefft*vf.internalField() -
251 coefft0*vf.oldTime().internalField()*mesh().V0()
252 - coefft00*vf.oldTime().oldTime().internalField()
256 rDeltaT.value()*rho.value()*
258 coefft*vf.boundaryField() -
260 coefft0*vf.oldTime().boundaryField()
261 - coefft00*vf.oldTime().oldTime().boundaryField()
269 return tmp<GeometricField<Type, fvPatchField, volMesh> >
271 new GeometricField<Type, fvPatchField, volMesh>
277 - coefft0*vf.oldTime()
278 + coefft00*vf.oldTime().oldTime()
286 tmp<GeometricField<Type, fvPatchField, volMesh> >
287 backwardDdtScheme<Type>::fvcDdt
289 const volScalarField& rho,
290 const GeometricField<Type, fvPatchField, volMesh>& vf
293 dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
297 "ddt("+rho.name()+','+vf.name()+')',
298 mesh().time().timeName(),
302 scalar deltaT = deltaT_();
303 scalar deltaT0 = deltaT0_(vf);
305 scalar coefft = 1 + deltaT/(deltaT + deltaT0);
306 scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
307 scalar coefft0 = coefft + coefft00;
311 return tmp<GeometricField<Type, fvPatchField, volMesh> >
313 new GeometricField<Type, fvPatchField, volMesh>
317 rDeltaT.dimensions()*rho.dimensions()*vf.dimensions(),
320 coefft*rho.internalField()*vf.internalField() -
322 coefft0*rho.oldTime().internalField()
323 *vf.oldTime().internalField()*mesh().V0()
324 - coefft00*rho.oldTime().oldTime().internalField()
325 *vf.oldTime().oldTime().internalField()*mesh().V00()
330 coefft*rho.boundaryField()*vf.boundaryField() -
332 coefft0*rho.oldTime().boundaryField()
333 *vf.oldTime().boundaryField()
334 - coefft00*rho.oldTime().oldTime().boundaryField()
335 *vf.oldTime().oldTime().boundaryField()
343 return tmp<GeometricField<Type, fvPatchField, volMesh> >
345 new GeometricField<Type, fvPatchField, volMesh>
351 - coefft0*rho.oldTime()*vf.oldTime()
352 + coefft00*rho.oldTime().oldTime()*vf.oldTime().oldTime()
362 backwardDdtScheme<Type>::fvmDdt
364 GeometricField<Type, fvPatchField, volMesh>& vf
367 tmp<fvMatrix<Type> > tfvm
372 vf.dimensions()*dimVol/dimTime
376 fvMatrix<Type>& fvm = tfvm();
378 scalar rDeltaT = 1.0/deltaT_();
380 scalar deltaT = deltaT_();
381 scalar deltaT0 = deltaT0_(vf);
383 scalar coefft = 1 + deltaT/(deltaT + deltaT0);
384 scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
385 scalar coefft0 = coefft + coefft00;
387 fvm.diag() = (coefft*rDeltaT)*mesh().V();
391 fvm.source() = rDeltaT*
393 coefft0*vf.oldTime().internalField()*mesh().V0()
394 - coefft00*vf.oldTime().oldTime().internalField()
400 fvm.source() = rDeltaT*mesh().V()*
402 coefft0*vf.oldTime().internalField()
403 - coefft00*vf.oldTime().oldTime().internalField()
413 backwardDdtScheme<Type>::fvmDdt
415 const dimensionedScalar& rho,
416 GeometricField<Type, fvPatchField, volMesh>& vf
419 tmp<fvMatrix<Type> > tfvm
424 rho.dimensions()*vf.dimensions()*dimVol/dimTime
427 fvMatrix<Type>& fvm = tfvm();
429 scalar rDeltaT = 1.0/deltaT_();
431 scalar deltaT = deltaT_();
432 scalar deltaT0 = deltaT0_(vf);
434 scalar coefft = 1 + deltaT/(deltaT + deltaT0);
435 scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
436 scalar coefft0 = coefft + coefft00;
438 fvm.diag() = (coefft*rDeltaT*rho.value())*mesh().V();
442 fvm.source() = rDeltaT*rho.value()*
444 coefft0*vf.oldTime().internalField()*mesh().V0()
445 - coefft00*vf.oldTime().oldTime().internalField()
451 fvm.source() = rDeltaT*mesh().V()*rho.value()*
453 coefft0*vf.oldTime().internalField()
454 - coefft00*vf.oldTime().oldTime().internalField()
464 backwardDdtScheme<Type>::fvmDdt
466 const volScalarField& rho,
467 GeometricField<Type, fvPatchField, volMesh>& vf
470 tmp<fvMatrix<Type> > tfvm
475 rho.dimensions()*vf.dimensions()*dimVol/dimTime
478 fvMatrix<Type>& fvm = tfvm();
480 scalar rDeltaT = 1.0/deltaT_();
482 scalar deltaT = deltaT_();
483 scalar deltaT0 = deltaT0_(vf);
485 scalar coefft = 1 + deltaT/(deltaT + deltaT0);
486 scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
487 scalar coefft0 = coefft + coefft00;
489 fvm.diag() = (coefft*rDeltaT)*rho.internalField()*mesh().V();
493 fvm.source() = rDeltaT*
495 coefft0*rho.oldTime().internalField()
496 *vf.oldTime().internalField()*mesh().V0()
497 - coefft00*rho.oldTime().oldTime().internalField()
498 *vf.oldTime().oldTime().internalField()*mesh().V00()
503 fvm.source() = rDeltaT*mesh().V()*
505 coefft0*rho.oldTime().internalField()
506 *vf.oldTime().internalField()
507 - coefft00*rho.oldTime().oldTime().internalField()
508 *vf.oldTime().oldTime().internalField()
517 tmp<typename backwardDdtScheme<Type>::fluxFieldType>
518 backwardDdtScheme<Type>::fvcDdtPhiCorr
520 const volScalarField& rA,
521 const GeometricField<Type, fvPatchField, volMesh>& U,
522 const fluxFieldType& phi
525 dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
529 "ddtPhiCorr(" + rA.name() + ',' + U.name() + ',' + phi.name() + ')',
530 mesh().time().timeName(),
534 scalar deltaT = deltaT_();
535 scalar deltaT0 = deltaT0_(U);
537 scalar coefft = 1 + deltaT/(deltaT + deltaT0);
538 scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
539 scalar coefft0 = coefft + coefft00;
541 return tmp<fluxFieldType>
546 rDeltaT*fvcDdtPhiCoeff(U.oldTime(), phi.oldTime())
550 coefft0*phi.oldTime()
551 - coefft00*phi.oldTime().oldTime()
559 - coefft00*U.oldTime().oldTime()
570 tmp<typename backwardDdtScheme<Type>::fluxFieldType>
571 backwardDdtScheme<Type>::fvcDdtPhiCorr
573 const volScalarField& rA,
574 const volScalarField& rho,
575 const GeometricField<Type, fvPatchField, volMesh>& U,
576 const fluxFieldType& phiAbs
579 dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
587 + phiAbs.name() + ')',
588 mesh().time().timeName(),
592 scalar deltaT = deltaT_();
593 scalar deltaT0 = deltaT0_(U);
595 scalar coefft = 1 + deltaT/(deltaT + deltaT0);
596 scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
597 scalar coefft0 = coefft + coefft00;
601 U.dimensions() == dimVelocity
602 && phiAbs.dimensions() == dimVelocity*dimArea
605 return tmp<fluxFieldType>
610 rDeltaT*fvcDdtPhiCoeff(U.oldTime(), phiAbs.oldTime())
612 coefft0*fvc::interpolate(rA*rho.oldTime())
614 - coefft00*fvc::interpolate(rA*rho.oldTime().oldTime())
615 *phiAbs.oldTime().oldTime()
621 coefft0*rho.oldTime()*U.oldTime()
622 - coefft00*rho.oldTime().oldTime()
623 *U.oldTime().oldTime()
633 U.dimensions() == dimVelocity
634 && phiAbs.dimensions() == rho.dimensions()*dimVelocity*dimArea
637 return tmp<fluxFieldType>
646 phiAbs.oldTime()/fvc::interpolate(rho.oldTime())
649 fvc::interpolate(rA*rho.oldTime())
651 coefft0*phiAbs.oldTime()
652 /fvc::interpolate(rho.oldTime())
653 - coefft00*phiAbs.oldTime().oldTime()
654 /fvc::interpolate(rho.oldTime().oldTime())
662 - coefft00*U.oldTime().oldTime()
672 U.dimensions() == rho.dimensions()*dimVelocity
673 && phiAbs.dimensions() == rho.dimensions()*dimVelocity*dimArea
676 return tmp<fluxFieldType>
682 *fvcDdtPhiCoeff(rho.oldTime(), U.oldTime(), phiAbs.oldTime())
686 coefft0*phiAbs.oldTime()
687 - coefft00*phiAbs.oldTime().oldTime()
695 - coefft00*U.oldTime().oldTime()
707 "backwardDdtScheme<Type>::fvcDdtPhiCorr"
708 ) << "dimensions of phiAbs are not correct"
709 << abort(FatalError);
711 return fluxFieldType::null();
717 tmp<surfaceScalarField> backwardDdtScheme<Type>::meshPhi
719 const GeometricField<Type, fvPatchField, volMesh>& vf
722 scalar deltaT = deltaT_();
723 scalar deltaT0 = deltaT0_(vf);
725 // Coefficient for t-3/2 (between times 0 and 00)
726 scalar coefft0_00 = deltaT/(deltaT + deltaT0);
728 // Coefficient for t-1/2 (between times n and 0)
729 scalar coefftn_0 = 1 + coefft0_00;
731 return coefftn_0*mesh().phi() - coefft0_00*mesh().phi().oldTime();
735 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
737 } // End namespace fv
739 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
741 } // End namespace Foam
743 // ************************************************************************* //