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 "boundedBackwardDdtScheme.H"
28 #include "surfaceInterpolate.H"
31 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
36 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
41 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
43 scalar boundedBackwardDdtScheme::deltaT_() const
45 return mesh().time().deltaT().value();
49 scalar boundedBackwardDdtScheme::deltaT0_() const
51 return mesh().time().deltaT0().value();
55 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
58 boundedBackwardDdtScheme::fvcDdt
60 const dimensionedScalar& dt
63 // No change compared to backward
65 dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
70 mesh().time().timeName(),
74 scalar deltaT = deltaT_();
75 scalar deltaT0 = deltaT0_();
77 scalar coefft = 1 + deltaT/(deltaT + deltaT0);
78 scalar coefft00 = deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
79 scalar coefft0 = coefft + coefft00;
83 tmp<volScalarField> tdtdt
92 dt.dimensions()/dimTime,
98 tdtdt().internalField() = rDeltaT.value()*dt.value()*
100 coefft - (coefft0*mesh().V0() - coefft00*mesh().V00())/mesh().V()
107 return tmp<volScalarField>
116 dt.dimensions()/dimTime,
119 calculatedFvPatchScalarField::typeName
127 boundedBackwardDdtScheme::fvcDdt
129 const volScalarField& vf
132 dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
136 "ddt("+vf.name()+')',
137 mesh().time().timeName(),
141 scalar deltaT = deltaT_();
142 scalar deltaT0 = deltaT0_(vf);
144 // Calculate unboundedness indicator
145 // Note: all times moved by one because access to internal field
146 // copies current field into the old-time level.
147 volScalarField phict =
150 vf.oldTime().oldTime()
151 - vf.oldTime().oldTime().oldTime()
157 - vf.oldTime().oldTime()
159 + dimensionedScalar("small", vf.dimensions(), VSMALL)
162 volScalarField limiter(pos(phict) - pos(phict - scalar(1)));
164 volScalarField coefft = scalar(1) + limiter*deltaT/(deltaT + deltaT0);
165 volScalarField coefft00 = limiter*sqr(deltaT)/(deltaT0*(deltaT + deltaT0));
166 volScalarField coefft0 = coefft + coefft00;
170 return tmp<volScalarField>
176 rDeltaT.dimensions()*vf.dimensions(),
179 coefft*vf.internalField() -
181 coefft0.internalField()
182 *vf.oldTime().internalField()*mesh().V0()
183 - coefft00.internalField()
184 *vf.oldTime().oldTime().internalField()
190 coefft.boundaryField()*vf.boundaryField() -
192 coefft0.boundaryField()*
193 vf.oldTime().boundaryField()
194 - coefft00.boundaryField()*
195 vf.oldTime().oldTime().boundaryField()
203 return tmp<volScalarField>
211 - coefft0*vf.oldTime()
212 + coefft00*vf.oldTime().oldTime()
221 boundedBackwardDdtScheme::fvcDdt
223 const dimensionedScalar& rho,
224 const volScalarField& vf
227 dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
231 "ddt("+rho.name()+','+vf.name()+')',
232 mesh().time().timeName(),
236 scalar deltaT = deltaT_();
237 scalar deltaT0 = deltaT0_(vf);
239 // Calculate unboundedness indicator
240 // Note: all times moved by one because access to internal field
241 // copies current field into the old-time level.
242 volScalarField phict =
245 vf.oldTime().oldTime()
246 - vf.oldTime().oldTime().oldTime()
252 - vf.oldTime().oldTime()
254 + dimensionedScalar("small", vf.dimensions(), VSMALL)
257 volScalarField limiter(pos(phict) - pos(phict - scalar(1)));
259 volScalarField coefft = scalar(1) + limiter*deltaT/(deltaT + deltaT0);
260 volScalarField coefft00 = limiter*sqr(deltaT)/(deltaT0*(deltaT + deltaT0));
261 volScalarField coefft0 = coefft + coefft00;
265 return tmp<volScalarField>
271 rDeltaT.dimensions()*rho.dimensions()*vf.dimensions(),
272 rDeltaT.value()*rho.value()*
274 coefft*vf.internalField() -
276 coefft0.internalField()*
277 vf.oldTime().internalField()*mesh().V0()
278 - coefft00.internalField()*
279 vf.oldTime().oldTime().internalField()
283 rDeltaT.value()*rho.value()*
285 coefft.boundaryField()*vf.boundaryField() -
287 coefft0.boundaryField()*
288 vf.oldTime().boundaryField()
289 - coefft00.boundaryField()*
290 vf.oldTime().oldTime().boundaryField()
298 return tmp<volScalarField>
306 - coefft0*vf.oldTime()
307 + coefft00*vf.oldTime().oldTime()
316 boundedBackwardDdtScheme::fvcDdt
318 const volScalarField& rho,
319 const volScalarField& vf
322 dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
326 "ddt("+rho.name()+','+vf.name()+')',
327 mesh().time().timeName(),
331 scalar deltaT = deltaT_();
332 scalar deltaT0 = deltaT0_(vf);
334 // Calculate unboundedness indicator
335 // Note: all times moved by one because access to internal field
336 // copies current field into the old-time level.
337 volScalarField phict =
340 rho.oldTime().oldTime()*vf.oldTime().oldTime()
341 - rho.oldTime().oldTime().oldTime()*vf.oldTime().oldTime().oldTime()
346 rho.oldTime()*vf.oldTime()
347 - rho.oldTime().oldTime()*vf.oldTime().oldTime()
349 + dimensionedScalar("small", rho.dimensions()*vf.dimensions(), VSMALL)
352 volScalarField limiter(pos(phict) - pos(phict - scalar(1)));
354 volScalarField coefft = scalar(1) + limiter*deltaT/(deltaT + deltaT0);
355 volScalarField coefft00 = limiter*sqr(deltaT)/(deltaT0*(deltaT + deltaT0));
356 volScalarField coefft0 = coefft + coefft00;
360 return tmp<volScalarField>
366 rDeltaT.dimensions()*rho.dimensions()*vf.dimensions(),
369 coefft*rho.internalField()*vf.internalField() -
371 coefft0.internalField()*
372 rho.oldTime().internalField()*
373 vf.oldTime().internalField()*mesh().V0()
374 - coefft00.internalField()*
375 rho.oldTime().oldTime().internalField()
376 *vf.oldTime().oldTime().internalField()*mesh().V00()
381 coefft.boundaryField()*vf.boundaryField() -
383 coefft0.boundaryField()*
384 rho.oldTime().boundaryField()*
385 vf.oldTime().boundaryField()
386 - coefft00.boundaryField()*
387 rho.oldTime().oldTime().boundaryField()*
388 vf.oldTime().oldTime().boundaryField()
396 return tmp<volScalarField>
404 - coefft0*rho.oldTime()*vf.oldTime()
405 + coefft00*rho.oldTime().oldTime()*vf.oldTime().oldTime()
414 boundedBackwardDdtScheme::fvmDdt
419 tmp<fvScalarMatrix> tfvm
424 vf.dimensions()*dimVol/dimTime
428 fvScalarMatrix& fvm = tfvm();
430 scalar rDeltaT = 1.0/deltaT_();
432 scalar deltaT = deltaT_();
433 scalar deltaT0 = deltaT0_(vf);
435 // Calculate unboundedness indicator
436 // Note: all times moved by one because access to internal field
437 // copies current field into the old-time level.
441 vf.oldTime().oldTime().internalField()
442 - vf.oldTime().oldTime().oldTime().internalField()
447 vf.oldTime().internalField()
448 - vf.oldTime().oldTime().internalField()
453 scalarField limiter(pos(phict) - pos(phict - 1.0));
455 scalarField coefft = 1.0 + limiter*deltaT/(deltaT + deltaT0);
456 scalarField coefft00 = limiter*deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
457 scalarField coefft0 = coefft + coefft00;
459 fvm.diag() = (coefft*rDeltaT)*mesh().V();
463 fvm.source() = rDeltaT*
465 coefft0*vf.oldTime().internalField()*mesh().V0()
466 - coefft00*vf.oldTime().oldTime().internalField()
472 fvm.source() = rDeltaT*mesh().V()*
474 coefft0*vf.oldTime().internalField()
475 - coefft00*vf.oldTime().oldTime().internalField()
484 boundedBackwardDdtScheme::fvmDdt
486 const dimensionedScalar& rho,
490 tmp<fvScalarMatrix> tfvm
495 rho.dimensions()*vf.dimensions()*dimVol/dimTime
498 fvScalarMatrix& fvm = tfvm();
500 scalar rDeltaT = 1.0/deltaT_();
502 scalar deltaT = deltaT_();
503 scalar deltaT0 = deltaT0_(vf);
505 // Calculate unboundedness indicator
506 // Note: all times moved by one because access to internal field
507 // copies current field into the old-time level.
511 vf.oldTime().oldTime().internalField()
512 - vf.oldTime().oldTime().oldTime().internalField()
517 vf.oldTime().internalField()
518 - vf.oldTime().oldTime().internalField()
523 scalarField limiter(pos(phict) - pos(phict - 1.0));
525 scalarField coefft = 1.0 + limiter*deltaT/(deltaT + deltaT0);
526 scalarField coefft00 = limiter*deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
527 scalarField coefft0 = coefft + coefft00;
529 fvm.diag() = (coefft*rDeltaT*rho.value())*mesh().V();
533 fvm.source() = rDeltaT*rho.value()*
535 coefft0*vf.oldTime().internalField()*mesh().V0()
536 - coefft00*vf.oldTime().oldTime().internalField()
542 fvm.source() = rDeltaT*mesh().V()*rho.value()*
544 coefft0*vf.oldTime().internalField()
545 - coefft00*vf.oldTime().oldTime().internalField()
554 boundedBackwardDdtScheme::fvmDdt
556 const volScalarField& rho,
560 tmp<fvScalarMatrix> tfvm
565 rho.dimensions()*vf.dimensions()*dimVol/dimTime
568 fvScalarMatrix& fvm = tfvm();
570 scalar rDeltaT = 1.0/deltaT_();
572 scalar deltaT = deltaT_();
573 scalar deltaT0 = deltaT0_(vf);
575 // Calculate unboundedness indicator
576 // Note: all times moved by one because access to internal field
577 // copies current field into the old-time level.
581 rho.oldTime().oldTime().internalField()*
582 vf.oldTime().oldTime().internalField()
583 - rho.oldTime().oldTime().oldTime().internalField()*
584 vf.oldTime().oldTime().oldTime().internalField()
589 rho.oldTime().internalField()*
590 vf.oldTime().internalField()
591 - rho.oldTime().oldTime().internalField()*
592 vf.oldTime().oldTime().internalField()
597 scalarField limiter(pos(phict) - pos(phict - 1.0));
599 scalarField coefft = 1.0 + limiter*deltaT/(deltaT + deltaT0);
600 scalarField coefft00 = limiter*deltaT*deltaT/(deltaT0*(deltaT + deltaT0));
601 scalarField coefft0 = coefft + coefft00;
603 fvm.diag() = (coefft*rDeltaT)*rho.internalField()*mesh().V();
607 fvm.source() = rDeltaT*
609 coefft0*rho.oldTime().internalField()
610 *vf.oldTime().internalField()*mesh().V0()
611 - coefft00*rho.oldTime().oldTime().internalField()
612 *vf.oldTime().oldTime().internalField()*mesh().V00()
617 fvm.source() = rDeltaT*mesh().V()*
619 coefft0*rho.oldTime().internalField()
620 *vf.oldTime().internalField()
621 - coefft00*rho.oldTime().oldTime().internalField()
622 *vf.oldTime().oldTime().internalField()
630 tmp<surfaceScalarField> boundedBackwardDdtScheme::fvcDdtPhiCorr
632 const volScalarField& rA,
633 const volScalarField& U,
634 const surfaceScalarField& phi
639 "boundedBackwardDdtScheme::fvcDdtPhiCorr"
642 return surfaceScalarField::null();
646 tmp<surfaceScalarField> boundedBackwardDdtScheme::fvcDdtPhiCorr
648 const volScalarField& rA,
649 const volScalarField& rho,
650 const volScalarField& U,
651 const surfaceScalarField& phi
656 "boundedBackwardDdtScheme::fvcDdtPhiCorr"
659 return surfaceScalarField::null();
663 tmp<surfaceScalarField> boundedBackwardDdtScheme::meshPhi
665 const volScalarField& vf
670 "boundedBackwardDdtScheme::meshPhi(const volScalarField& vf)"
673 return surfaceScalarField::null();
677 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
679 } // End namespace fv
681 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
683 } // End namespace Foam
685 // ************************************************************************* //