FreeFOAM The Cross-Platform CFD Toolkit
Hosted by SourceForge:
Get FreeFOAM at SourceForge.net.
            Fast, secure and Free Open Source software downloads

LimitedScheme.C

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------------*\
00002   =========                 |
00003   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
00004    \\    /   O peration     |
00005     \\  /    A nd           | Copyright (C) 1991-2010 OpenCFD Ltd.
00006      \\/     M anipulation  |
00007 -------------------------------------------------------------------------------
00008 License
00009     This file is part of OpenFOAM.
00010 
00011     OpenFOAM is free software: you can redistribute it and/or modify it
00012     under the terms of the GNU General Public License as published by
00013     the Free Software Foundation, either version 3 of the License, or
00014     (at your option) any later version.
00015 
00016     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
00017     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00018     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
00019     for more details.
00020 
00021     You should have received a copy of the GNU General Public License
00022     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
00023 
00024 \*---------------------------------------------------------------------------*/
00025 
00026 #include <finiteVolume/volFields.H>
00027 #include <finiteVolume/surfaceFields.H>
00028 #include <finiteVolume/fvcGrad.H>
00029 #include <finiteVolume/coupledFvPatchFields.H>
00030 
00031 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
00032 
00033 namespace Foam
00034 {
00035 
00036 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
00037 
00038 template<class Type, class Limiter, template<class> class LimitFunc>
00039 tmp<surfaceScalarField> LimitedScheme<Type, Limiter, LimitFunc>::limiter
00040 (
00041     const GeometricField<Type, fvPatchField, volMesh>& phi
00042 ) const
00043 {
00044     const fvMesh& mesh = this->mesh();
00045 
00046     tmp<surfaceScalarField> tLimiter
00047     (
00048         new surfaceScalarField
00049         (
00050             IOobject
00051             (
00052                 type() + "Limiter(" + phi.name() + ')',
00053                 mesh.time().timeName(),
00054                 mesh
00055             ),
00056             mesh,
00057             dimless
00058         )
00059     );
00060     surfaceScalarField& lim = tLimiter();
00061 
00062     tmp<GeometricField<typename Limiter::phiType, fvPatchField, volMesh> >
00063         tlPhi = LimitFunc<Type>()(phi);
00064 
00065     const GeometricField<typename Limiter::phiType, fvPatchField, volMesh>&
00066         lPhi = tlPhi();
00067 
00068     GeometricField<typename Limiter::gradPhiType, fvPatchField, volMesh>
00069         gradc(fvc::grad(lPhi));
00070 
00071     const surfaceScalarField& CDweights = mesh.surfaceInterpolation::weights();
00072 
00073     const unallocLabelList& owner = mesh.owner();
00074     const unallocLabelList& neighbour = mesh.neighbour();
00075 
00076     const vectorField& C = mesh.C();
00077 
00078     scalarField& pLim = lim.internalField();
00079 
00080     forAll(pLim, face)
00081     {
00082         label own = owner[face];
00083         label nei = neighbour[face];
00084 
00085         pLim[face] = Limiter::limiter
00086         (
00087             CDweights[face],
00088             this->faceFlux_[face],
00089             lPhi[own],
00090             lPhi[nei],
00091             gradc[own],
00092             gradc[nei],
00093             C[nei] - C[own]
00094         );
00095     }
00096 
00097     surfaceScalarField::GeometricBoundaryField& bLim = lim.boundaryField();
00098 
00099     forAll(bLim, patchi)
00100     {
00101         scalarField& pLim = bLim[patchi];
00102 
00103         if (bLim[patchi].coupled())
00104         {
00105             const scalarField& pCDweights = CDweights.boundaryField()[patchi];
00106             const scalarField& pFaceFlux =
00107                 this->faceFlux_.boundaryField()[patchi];
00108             Field<typename Limiter::phiType> plPhiP =
00109                 lPhi.boundaryField()[patchi].patchInternalField();
00110             Field<typename Limiter::phiType> plPhiN =
00111                 lPhi.boundaryField()[patchi].patchNeighbourField();
00112             Field<typename Limiter::gradPhiType> pGradcP =
00113                 gradc.boundaryField()[patchi].patchInternalField();
00114             Field<typename Limiter::gradPhiType> pGradcN =
00115                 gradc.boundaryField()[patchi].patchNeighbourField();
00116 
00117             // Build the d-vectors
00118             vectorField pd = 
00119                 mesh.Sf().boundaryField()[patchi]
00120                /(
00121                    mesh.magSf().boundaryField()[patchi]
00122                   *mesh.deltaCoeffs().boundaryField()[patchi]
00123                 );
00124 
00125             if (!mesh.orthogonal())
00126             {
00127                 pd -= mesh.correctionVectors().boundaryField()[patchi]
00128                     /mesh.deltaCoeffs().boundaryField()[patchi];
00129             }
00130 
00131             forAll(pLim, face)
00132             {
00133                 pLim[face] = Limiter::limiter
00134                 (
00135                     pCDweights[face],
00136                     pFaceFlux[face],
00137                     plPhiP[face],
00138                     plPhiN[face],
00139                     pGradcP[face],
00140                     pGradcN[face],
00141                     pd[face]
00142                 );
00143             }
00144         }
00145         else
00146         {
00147             pLim = 1.0;
00148         }
00149     }
00150 
00151     return tLimiter;
00152 }
00153 
00154 
00155 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
00156 
00157 } // End namespace Foam
00158 
00159 // ************************ vim: set sw=4 sts=4 et: ************************ //
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines