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 "EulerD2dt2Scheme.H"
29 #include "fvMatrices.H"
31 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
36 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
41 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
44 tmp<GeometricField<Type, fvPatchField, volMesh> >
45 EulerD2dt2Scheme<Type>::fvcD2dt2
47 const GeometricField<Type, fvPatchField, volMesh>& vf
50 dimensionedScalar rDeltaT2 =
51 4.0/sqr(mesh().time().deltaT() + mesh().time().deltaT0());
53 IOobject d2dt2IOobject
55 "d2dt2("+vf.name()+')',
56 mesh().time().timeName(),
62 scalar deltaT = mesh().time().deltaT().value();
63 scalar deltaT0 = mesh().time().deltaT0().value();
65 scalar coefft = (deltaT + deltaT0)/(2*deltaT);
66 scalar coefft00 = (deltaT + deltaT0)/(2*deltaT0);
67 scalar coefft0 = coefft + coefft00;
71 scalar halfRdeltaT2 = rDeltaT2.value()/2.0;
73 scalarField VV0 = mesh().V() + mesh().V0();
74 scalarField V0V00 = mesh().V0() + mesh().V00();
76 return tmp<GeometricField<Type, fvPatchField, volMesh> >
78 new GeometricField<Type, fvPatchField, volMesh>
82 rDeltaT2.dimensions()*vf.dimensions(),
85 coefft*VV0*vf.internalField()
87 - (coefft*VV0 + coefft00*V0V00)
88 *vf.oldTime().internalField()
90 + (coefft00*V0V00)*vf.oldTime().oldTime().internalField()
94 coefft*vf.boundaryField()
95 - coefft0*vf.oldTime().boundaryField()
96 + coefft00*vf.oldTime().oldTime().boundaryField()
103 return tmp<GeometricField<Type, fvPatchField, volMesh> >
105 new GeometricField<Type, fvPatchField, volMesh>
111 - coefft0*vf.oldTime()
112 + coefft00*vf.oldTime().oldTime()
121 tmp<GeometricField<Type, fvPatchField, volMesh> >
122 EulerD2dt2Scheme<Type>::fvcD2dt2
124 const volScalarField& rho,
125 const GeometricField<Type, fvPatchField, volMesh>& vf
128 dimensionedScalar rDeltaT2 =
129 4.0/sqr(mesh().time().deltaT() + mesh().time().deltaT0());
131 IOobject d2dt2IOobject
133 "d2dt2("+rho.name()+','+vf.name()+')',
134 mesh().time().timeName(),
140 scalar deltaT = mesh().time().deltaT().value();
141 scalar deltaT0 = mesh().time().deltaT0().value();
143 scalar coefft = (deltaT + deltaT0)/(2*deltaT);
144 scalar coefft00 = (deltaT + deltaT0)/(2*deltaT0);
148 scalar halfRdeltaT2 = 0.5*rDeltaT2.value();
149 scalar quarterRdeltaT2 = 0.25*rDeltaT2.value();
151 scalarField VV0rhoRho0 =
152 (mesh().V() + mesh().V0())
153 *(rho.internalField() + rho.oldTime().internalField());
155 scalarField V0V00rho0Rho00 =
156 (mesh().V0() + mesh().V00())
158 rho.oldTime().internalField()
159 + rho.oldTime().oldTime().internalField()
162 return tmp<GeometricField<Type, fvPatchField, volMesh> >
164 new GeometricField<Type, fvPatchField, volMesh>
168 rDeltaT2.dimensions()*rho.dimensions()*vf.dimensions(),
171 coefft*VV0rhoRho0*vf.internalField()
173 - (coefft*VV0rhoRho0 + coefft00*V0V00rho0Rho00)
174 *vf.oldTime().internalField()
176 + (coefft00*V0V00rho0Rho00)
177 *vf.oldTime().oldTime().internalField()
182 *(rho.boundaryField() + rho.oldTime().boundaryField())
189 + rho.oldTime().boundaryField()
193 rho.oldTime().boundaryField()
194 + rho.oldTime().oldTime().boundaryField()
196 )*vf.oldTime().boundaryField()
200 rho.oldTime().boundaryField()
201 + rho.oldTime().oldTime().boundaryField()
202 )*vf.oldTime().oldTime().boundaryField()
209 dimensionedScalar halfRdeltaT2 = 0.5*rDeltaT2;
211 volScalarField rhoRho0 = rho + rho.oldTime();
212 volScalarField rho0Rho00 = rho.oldTime() +rho.oldTime().oldTime();
214 return tmp<GeometricField<Type, fvPatchField, volMesh> >
216 new GeometricField<Type, fvPatchField, volMesh>
222 - (coefft*rhoRho0 + coefft00*rho0Rho00)*vf.oldTime()
223 + coefft00*rho0Rho00*vf.oldTime().oldTime()
233 EulerD2dt2Scheme<Type>::fvmD2dt2
235 GeometricField<Type, fvPatchField, volMesh>& vf
238 tmp<fvMatrix<Type> > tfvm
243 vf.dimensions()*dimVol/dimTime/dimTime
247 fvMatrix<Type>& fvm = tfvm();
249 scalar deltaT = mesh().time().deltaT().value();
250 scalar deltaT0 = mesh().time().deltaT0().value();
252 scalar coefft = (deltaT + deltaT0)/(2*deltaT);
253 scalar coefft00 = (deltaT + deltaT0)/(2*deltaT0);
254 scalar coefft0 = coefft + coefft00;
256 scalar rDeltaT2 = 4.0/sqr(deltaT + deltaT0);
260 scalar halfRdeltaT2 = rDeltaT2/2.0;
262 scalarField VV0 = mesh().V() + mesh().V0();
263 scalarField V0V00 = mesh().V0() + mesh().V00();
265 fvm.diag() = (coefft*halfRdeltaT2)*VV0;
267 fvm.source() = halfRdeltaT2*
269 (coefft*VV0 + coefft00*V0V00)
270 *vf.oldTime().internalField()
272 - (coefft00*V0V00)*vf.oldTime().oldTime().internalField()
277 fvm.diag() = (coefft*rDeltaT2)*mesh().V();
279 fvm.source() = rDeltaT2*mesh().V()*
281 coefft0*vf.oldTime().internalField()
282 - coefft00*vf.oldTime().oldTime().internalField()
292 EulerD2dt2Scheme<Type>::fvmD2dt2
294 const dimensionedScalar& rho,
295 GeometricField<Type, fvPatchField, volMesh>& vf
298 tmp<fvMatrix<Type> > tfvm
303 rho.dimensions()*vf.dimensions()*dimVol
308 fvMatrix<Type>& fvm = tfvm();
310 scalar deltaT = mesh().time().deltaT().value();
311 scalar deltaT0 = mesh().time().deltaT0().value();
313 scalar coefft = (deltaT + deltaT0)/(2*deltaT);
314 scalar coefft00 = (deltaT + deltaT0)/(2*deltaT0);
316 scalar rDeltaT2 = 4.0/sqr(deltaT + deltaT0);
320 scalar halfRdeltaT2 = 0.5*rDeltaT2;
322 scalarField VV0 = mesh().V() + mesh().V0();
324 scalarField V0V00 = mesh().V0() + mesh().V00();
326 fvm.diag() = rho.value()*(coefft*halfRdeltaT2)*VV0;
328 fvm.source() = halfRdeltaT2*rho.value()*
330 (coefft*VV0 + coefft00*V0V00)
331 *vf.oldTime().internalField()
333 - (coefft00*V0V00)*vf.oldTime().oldTime().internalField()
338 fvm.diag() = (coefft*rDeltaT2)*mesh().V()*rho.value();
340 fvm.source() = rDeltaT2*mesh().V()*rho.value()*
342 (coefft + coefft00)*vf.oldTime().internalField()
343 - coefft00*vf.oldTime().oldTime().internalField()
353 EulerD2dt2Scheme<Type>::fvmD2dt2
355 const volScalarField& rho,
356 GeometricField<Type, fvPatchField, volMesh>& vf
359 tmp<fvMatrix<Type> > tfvm
364 rho.dimensions()*vf.dimensions()*dimVol
369 fvMatrix<Type>& fvm = tfvm();
371 scalar deltaT = mesh().time().deltaT().value();
372 scalar deltaT0 = mesh().time().deltaT0().value();
374 scalar coefft = (deltaT + deltaT0)/(2*deltaT);
375 scalar coefft00 = (deltaT + deltaT0)/(2*deltaT0);
377 scalar rDeltaT2 = 4.0/sqr(deltaT + deltaT0);
381 scalar quarterRdeltaT2 = 0.25*rDeltaT2;
383 scalarField VV0rhoRho0 =
384 (mesh().V() + mesh().V0())
385 *(rho.internalField() + rho.oldTime().internalField());
387 scalarField V0V00rho0Rho00 =
388 (mesh().V0() + mesh().V00())
390 rho.oldTime().internalField()
391 + rho.oldTime().oldTime().internalField()
394 fvm.diag() = (coefft*quarterRdeltaT2)*VV0rhoRho0;
396 fvm.source() = quarterRdeltaT2*
398 (coefft*VV0rhoRho0 + coefft00*V0V00rho0Rho00)
399 *vf.oldTime().internalField()
401 - (coefft00*V0V00rho0Rho00)
402 *vf.oldTime().oldTime().internalField()
407 scalar halfRdeltaT2 = 0.5*rDeltaT2;
409 scalarField rhoRho0 =
410 (rho.internalField() + rho.oldTime().internalField());
412 scalarField rho0Rho00 =
414 rho.oldTime().internalField()
415 + rho.oldTime().oldTime().internalField()
418 fvm.diag() = (coefft*halfRdeltaT2)*mesh().V()*rhoRho0;
420 fvm.source() = halfRdeltaT2*mesh().V()*
422 (coefft*rhoRho0 + coefft00*rho0Rho00)
423 *vf.oldTime().internalField()
425 - (coefft00*rho0Rho00)
426 *vf.oldTime().oldTime().internalField()
434 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
436 } // End namespace fv
438 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
440 } // End namespace Foam
442 // ************************************************************************* //