FreeFOAM The Cross-Platform CFD Toolkit
gaussConvectionScheme.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration |
5  \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8 License
9  This file is part of OpenFOAM.
10 
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
13  the Free Software Foundation, either version 3 of the License, or
14  (at your option) any later version.
15 
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
19  for more details.
20 
21  You should have received a copy of the GNU General Public License
22  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
23 
24 \*---------------------------------------------------------------------------*/
25 
26 #include "gaussConvectionScheme.H"
29 
30 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
31 
32 namespace Foam
33 {
34 
35 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
36 
37 namespace fv
38 {
39 
40 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
41 
42 template<class Type>
43 tmp<GeometricField<Type, fvsPatchField, surfaceMesh> >
45 (
46  const surfaceScalarField&,
48 ) const
49 {
50  return tinterpScheme_().interpolate(vf);
51 }
52 
53 
54 template<class Type>
57 (
58  const surfaceScalarField& faceFlux,
60 ) const
61 {
62  return faceFlux*interpolate(faceFlux, vf);
63 }
64 
65 
66 template<class Type>
69 (
70  const surfaceScalarField& faceFlux,
72 ) const
73 {
74  tmp<surfaceScalarField> tweights = tinterpScheme_().weights(vf);
75  const surfaceScalarField& weights = tweights();
76 
77  tmp<fvMatrix<Type> > tfvm
78  (
79  new fvMatrix<Type>
80  (
81  vf,
82  faceFlux.dimensions()*vf.dimensions()
83  )
84  );
85  fvMatrix<Type>& fvm = tfvm();
86 
87  fvm.lower() = -weights.internalField()*faceFlux.internalField();
88  fvm.upper() = fvm.lower() + faceFlux.internalField();
89  fvm.negSumDiag();
90 
91  forAll(fvm.psi().boundaryField(), patchI)
92  {
93  const fvPatchField<Type>& psf = fvm.psi().boundaryField()[patchI];
94  const fvsPatchScalarField& patchFlux = faceFlux.boundaryField()[patchI];
95  const fvsPatchScalarField& pw = weights.boundaryField()[patchI];
96 
97  fvm.internalCoeffs()[patchI] = patchFlux*psf.valueInternalCoeffs(pw);
98  fvm.boundaryCoeffs()[patchI] = -patchFlux*psf.valueBoundaryCoeffs(pw);
99  }
100 
101  if (tinterpScheme_().corrected())
102  {
103  fvm += fvc::surfaceIntegrate(faceFlux*tinterpScheme_().correction(vf));
104  }
105 
106  return tfvm;
107 }
108 
109 
110 template<class Type>
113 (
114  const surfaceScalarField& faceFlux,
116 ) const
117 {
119  (
120  fvc::surfaceIntegrate(flux(faceFlux, vf))
121  );
122 
123  tConvection().rename
124  (
125  "convection(" + faceFlux.name() + ',' + vf.name() + ')'
126  );
127 
128  return tConvection;
129 }
130 
131 
132 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
133 
134 } // End namespace fv
135 
136 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
137 
138 } // End namespace Foam
139 
140 // ************************ vim: set sw=4 sts=4 et: ************************ //