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 "EulerDdtScheme.H"
28 #include "surfaceInterpolate.H"
30 #include "fvMatrices.H"
32 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
37 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
42 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
45 tmp<GeometricField<Type, fvPatchField, volMesh> >
46 EulerDdtScheme<Type>::fvcDdt
48 const dimensioned<Type>& dt
51 dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
56 mesh().time().timeName(),
62 tmp<GeometricField<Type, fvPatchField, volMesh> > tdtdt
64 new GeometricField<Type, fvPatchField, volMesh>
71 dt.dimensions()/dimTime,
77 tdtdt().internalField() =
78 rDeltaT.value()*dt.value()*(1.0 - mesh().V0()/mesh().V());
84 return tmp<GeometricField<Type, fvPatchField, volMesh> >
86 new GeometricField<Type, fvPatchField, volMesh>
93 dt.dimensions()/dimTime,
96 calculatedFvPatchField<Type>::typeName
104 tmp<GeometricField<Type, fvPatchField, volMesh> >
105 EulerDdtScheme<Type>::fvcDdt
107 const GeometricField<Type, fvPatchField, volMesh>& vf
110 dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
114 "ddt("+vf.name()+')',
115 mesh().time().timeName(),
121 return tmp<GeometricField<Type, fvPatchField, volMesh> >
123 new GeometricField<Type, fvPatchField, volMesh>
127 rDeltaT.dimensions()*vf.dimensions(),
131 - vf.oldTime().internalField()*mesh().V0()/mesh().V()
135 vf.boundaryField() - vf.oldTime().boundaryField()
142 return tmp<GeometricField<Type, fvPatchField, volMesh> >
144 new GeometricField<Type, fvPatchField, volMesh>
147 rDeltaT*(vf - vf.oldTime())
155 tmp<GeometricField<Type, fvPatchField, volMesh> >
156 EulerDdtScheme<Type>::fvcDdt
158 const dimensionedScalar& rho,
159 const GeometricField<Type, fvPatchField, volMesh>& vf
162 dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
166 "ddt("+rho.name()+','+vf.name()+')',
167 mesh().time().timeName(),
173 return tmp<GeometricField<Type, fvPatchField, volMesh> >
175 new GeometricField<Type, fvPatchField, volMesh>
179 rDeltaT.dimensions()*rho.dimensions()*vf.dimensions(),
180 rDeltaT.value()*rho.value()*
183 - vf.oldTime().internalField()*mesh().V0()/mesh().V()
185 rDeltaT.value()*rho.value()*
187 vf.boundaryField() - vf.oldTime().boundaryField()
194 return tmp<GeometricField<Type, fvPatchField, volMesh> >
196 new GeometricField<Type, fvPatchField, volMesh>
199 rDeltaT*rho*(vf - vf.oldTime())
207 tmp<GeometricField<Type, fvPatchField, volMesh> >
208 EulerDdtScheme<Type>::fvcDdt
210 const volScalarField& rho,
211 const GeometricField<Type, fvPatchField, volMesh>& vf
214 dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
218 "ddt("+rho.name()+','+vf.name()+')',
219 mesh().time().timeName(),
225 return tmp<GeometricField<Type, fvPatchField, volMesh> >
227 new GeometricField<Type, fvPatchField, volMesh>
231 rDeltaT.dimensions()*rho.dimensions()*vf.dimensions(),
234 rho.internalField()*vf.internalField()
235 - rho.oldTime().internalField()
236 *vf.oldTime().internalField()*mesh().V0()/mesh().V()
240 rho.boundaryField()*vf.boundaryField()
241 - rho.oldTime().boundaryField()
242 *vf.oldTime().boundaryField()
249 return tmp<GeometricField<Type, fvPatchField, volMesh> >
251 new GeometricField<Type, fvPatchField, volMesh>
254 rDeltaT*(rho*vf - rho.oldTime()*vf.oldTime())
263 EulerDdtScheme<Type>::fvmDdt
265 GeometricField<Type, fvPatchField, volMesh>& vf
268 tmp<fvMatrix<Type> > tfvm
273 vf.dimensions()*dimVol/dimTime
277 fvMatrix<Type>& fvm = tfvm();
279 scalar rDeltaT = 1.0/mesh().time().deltaT().value();
281 fvm.diag() = rDeltaT*mesh().V();
285 fvm.source() = rDeltaT*vf.oldTime().internalField()*mesh().V0();
289 fvm.source() = rDeltaT*vf.oldTime().internalField()*mesh().V();
298 EulerDdtScheme<Type>::fvmDdt
300 const dimensionedScalar& rho,
301 GeometricField<Type, fvPatchField, volMesh>& vf
304 tmp<fvMatrix<Type> > tfvm
309 rho.dimensions()*vf.dimensions()*dimVol/dimTime
312 fvMatrix<Type>& fvm = tfvm();
314 scalar rDeltaT = 1.0/mesh().time().deltaT().value();
316 fvm.diag() = rDeltaT*rho.value()*mesh().V();
320 fvm.source() = rDeltaT
321 *rho.value()*vf.oldTime().internalField()*mesh().V0();
325 fvm.source() = rDeltaT
326 *rho.value()*vf.oldTime().internalField()*mesh().V();
335 EulerDdtScheme<Type>::fvmDdt
337 const volScalarField& rho,
338 GeometricField<Type, fvPatchField, volMesh>& vf
341 tmp<fvMatrix<Type> > tfvm
346 rho.dimensions()*vf.dimensions()*dimVol/dimTime
349 fvMatrix<Type>& fvm = tfvm();
351 scalar rDeltaT = 1.0/mesh().time().deltaT().value();
353 fvm.diag() = rDeltaT*rho.internalField()*mesh().V();
357 fvm.source() = rDeltaT
358 *rho.oldTime().internalField()
359 *vf.oldTime().internalField()*mesh().V0();
363 fvm.source() = rDeltaT
364 *rho.oldTime().internalField()
365 *vf.oldTime().internalField()*mesh().V();
373 tmp<typename EulerDdtScheme<Type>::fluxFieldType>
374 EulerDdtScheme<Type>::fvcDdtPhiCorr
376 const volScalarField& rA,
377 const GeometricField<Type, fvPatchField, volMesh>& U,
378 const fluxFieldType& phiAbs
381 dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
385 "ddtPhiCorr(" + rA.name() + ',' + U.name() + ',' + phiAbs.name() + ')',
386 mesh().time().timeName(),
390 tmp<fluxFieldType> phiCorr =
391 phiAbs.oldTime() - (fvc::interpolate(U.oldTime()) & mesh().Sf());
393 return tmp<fluxFieldType>
398 fvcDdtPhiCoeff(U.oldTime(), phiAbs.oldTime(), phiCorr())
399 *fvc::interpolate(rDeltaT*rA)*phiCorr
406 tmp<typename EulerDdtScheme<Type>::fluxFieldType>
407 EulerDdtScheme<Type>::fvcDdtPhiCorr
409 const volScalarField& rA,
410 const volScalarField& rho,
411 const GeometricField<Type, fvPatchField, volMesh>& U,
412 const fluxFieldType& phiAbs
415 dimensionedScalar rDeltaT = 1.0/mesh().time().deltaT();
423 + phiAbs.name() + ')',
424 mesh().time().timeName(),
430 U.dimensions() == dimVelocity
431 && phiAbs.dimensions() == dimVelocity*dimArea
434 return tmp<fluxFieldType>
440 *fvcDdtPhiCoeff(U.oldTime(), phiAbs.oldTime())
442 fvc::interpolate(rA*rho.oldTime())*phiAbs.oldTime()
443 - (fvc::interpolate(rA*rho.oldTime()*U.oldTime())
451 U.dimensions() == dimVelocity
452 && phiAbs.dimensions() == rho.dimensions()*dimVelocity*dimArea
455 return tmp<fluxFieldType>
464 phiAbs.oldTime()/fvc::interpolate(rho.oldTime())
467 fvc::interpolate(rA*rho.oldTime())
468 *phiAbs.oldTime()/fvc::interpolate(rho.oldTime())
472 rA*rho.oldTime()*U.oldTime()
481 U.dimensions() == rho.dimensions()*dimVelocity
482 && phiAbs.dimensions() == rho.dimensions()*dimVelocity*dimArea
485 return tmp<fluxFieldType>
491 *fvcDdtPhiCoeff(rho.oldTime(), U.oldTime(), phiAbs.oldTime())
493 fvc::interpolate(rA)*phiAbs.oldTime()
494 - (fvc::interpolate(rA*U.oldTime()) & mesh().Sf())
503 "EulerDdtScheme<Type>::fvcDdtPhiCorr"
504 ) << "dimensions of phiAbs are not correct"
505 << abort(FatalError);
507 return fluxFieldType::null();
513 tmp<surfaceScalarField> EulerDdtScheme<Type>::meshPhi
515 const GeometricField<Type, fvPatchField, volMesh>&
522 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
524 } // End namespace fv
526 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
528 } // End namespace Foam
530 // ************************************************************************* //