Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #ifndef cubic_H
00037 #define cubic_H
00038
00039 #include <finiteVolume/linear.H>
00040 #include <finiteVolume/gaussGrad.H>
00041
00042
00043
00044 namespace Foam
00045 {
00046
00047
00048
00049
00050
00051 template<class Type>
00052 class cubic
00053 :
00054 public linear<Type>
00055 {
00056
00057
00058
00059 cubic(const cubic&);
00060
00061
00062 void operator=(const cubic&);
00063
00064
00065 public:
00066
00067
00068 TypeName("cubic");
00069
00070
00071
00072
00073
00074 cubic(const fvMesh& mesh)
00075 :
00076 linear<Type>(mesh)
00077 {}
00078
00079
00080 cubic
00081 (
00082 const fvMesh& mesh,
00083 Istream&
00084 )
00085 :
00086 linear<Type>(mesh)
00087 {}
00088
00089
00090 cubic
00091 (
00092 const fvMesh& mesh,
00093 const surfaceScalarField&,
00094 Istream&
00095 )
00096 :
00097 linear<Type>(mesh)
00098 {}
00099
00100
00101
00102
00103
00104 virtual bool corrected() const
00105 {
00106 return true;
00107 }
00108
00109
00110 virtual tmp<GeometricField<Type, fvsPatchField, surfaceMesh> >
00111 correction
00112 (
00113 const GeometricField<Type, fvPatchField, volMesh>& vf
00114 ) const
00115 {
00116 const fvMesh& mesh = this->mesh();
00117
00118
00119 const surfaceScalarField& lambda = mesh.weights();
00120
00121 surfaceScalarField kSc =
00122 lambda*(scalar(1) - lambda*(scalar(3) - scalar(2)*lambda));
00123
00124 surfaceScalarField kVecP = sqr(scalar(1) - lambda)*lambda;
00125 surfaceScalarField kVecN = sqr(lambda)*(lambda - scalar(1));
00126
00127 tmp<GeometricField<Type, fvsPatchField, surfaceMesh> > tsfCorr
00128 (
00129 new GeometricField<Type, fvsPatchField, surfaceMesh>
00130 (
00131 IOobject
00132 (
00133 vf.name(),
00134 mesh.time().timeName(),
00135 mesh
00136 ),
00137 surfaceInterpolationScheme<Type>::interpolate(vf, kSc, -kSc)
00138 )
00139 );
00140
00141 GeometricField<Type, fvsPatchField, surfaceMesh>& sfCorr = tsfCorr();
00142
00143 for (direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
00144 {
00145 sfCorr.replace
00146 (
00147 cmpt,
00148 sfCorr.component(cmpt)
00149 + (
00150 surfaceInterpolationScheme
00151 <
00152 typename outerProduct
00153 <
00154 vector,
00155 typename pTraits<Type>::cmptType
00156 >::type
00157 >::interpolate
00158 (
00159 fv::gaussGrad
00160 <typename pTraits<Type>::cmptType>(mesh)
00161 .grad(vf.component(cmpt)),
00162 kVecP,
00163 kVecN
00164 ) & mesh.Sf()
00165 )/mesh.magSf()/mesh.surfaceInterpolation::deltaCoeffs()
00166 );
00167 }
00168
00169 forAll (sfCorr.boundaryField(), pi)
00170 {
00171 if (!sfCorr.boundaryField()[pi].coupled())
00172 {
00173 sfCorr.boundaryField()[pi] = pTraits<Type>::zero;
00174 }
00175 }
00176
00177 return tsfCorr;
00178 }
00179 };
00180
00181
00182
00183
00184 }
00185
00186
00187
00188 #endif
00189
00190