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 #include "gaussConvectionScheme.H"
00027 #include <finiteVolume/fvcSurfaceIntegrate.H>
00028 #include <finiteVolume/fvMatrices.H>
00029
00030
00031
00032 namespace Foam
00033 {
00034
00035
00036
00037 namespace fv
00038 {
00039
00040
00041
00042 template<class Type>
00043 tmp<GeometricField<Type, fvsPatchField, surfaceMesh> >
00044 gaussConvectionScheme<Type>::interpolate
00045 (
00046 const surfaceScalarField&,
00047 const GeometricField<Type, fvPatchField, volMesh>& vf
00048 ) const
00049 {
00050 return tinterpScheme_().interpolate(vf);
00051 }
00052
00053
00054 template<class Type>
00055 tmp<GeometricField<Type, fvsPatchField, surfaceMesh> >
00056 gaussConvectionScheme<Type>::flux
00057 (
00058 const surfaceScalarField& faceFlux,
00059 const GeometricField<Type, fvPatchField, volMesh>& vf
00060 ) const
00061 {
00062 return faceFlux*interpolate(faceFlux, vf);
00063 }
00064
00065
00066 template<class Type>
00067 tmp<fvMatrix<Type> >
00068 gaussConvectionScheme<Type>::fvmDiv
00069 (
00070 const surfaceScalarField& faceFlux,
00071 GeometricField<Type, fvPatchField, volMesh>& vf
00072 ) const
00073 {
00074 tmp<surfaceScalarField> tweights = tinterpScheme_().weights(vf);
00075 const surfaceScalarField& weights = tweights();
00076
00077 tmp<fvMatrix<Type> > tfvm
00078 (
00079 new fvMatrix<Type>
00080 (
00081 vf,
00082 faceFlux.dimensions()*vf.dimensions()
00083 )
00084 );
00085 fvMatrix<Type>& fvm = tfvm();
00086
00087 fvm.lower() = -weights.internalField()*faceFlux.internalField();
00088 fvm.upper() = fvm.lower() + faceFlux.internalField();
00089 fvm.negSumDiag();
00090
00091 forAll(fvm.psi().boundaryField(), patchI)
00092 {
00093 const fvPatchField<Type>& psf = fvm.psi().boundaryField()[patchI];
00094 const fvsPatchScalarField& patchFlux = faceFlux.boundaryField()[patchI];
00095 const fvsPatchScalarField& pw = weights.boundaryField()[patchI];
00096
00097 fvm.internalCoeffs()[patchI] = patchFlux*psf.valueInternalCoeffs(pw);
00098 fvm.boundaryCoeffs()[patchI] = -patchFlux*psf.valueBoundaryCoeffs(pw);
00099 }
00100
00101 if (tinterpScheme_().corrected())
00102 {
00103 fvm += fvc::surfaceIntegrate(faceFlux*tinterpScheme_().correction(vf));
00104 }
00105
00106 return tfvm;
00107 }
00108
00109
00110 template<class Type>
00111 tmp<GeometricField<Type, fvPatchField, volMesh> >
00112 gaussConvectionScheme<Type>::fvcDiv
00113 (
00114 const surfaceScalarField& faceFlux,
00115 const GeometricField<Type, fvPatchField, volMesh>& vf
00116 ) const
00117 {
00118 tmp<GeometricField<Type, fvPatchField, volMesh> > tConvection
00119 (
00120 fvc::surfaceIntegrate(flux(faceFlux, vf))
00121 );
00122
00123 tConvection().rename
00124 (
00125 "convection(" + faceFlux.name() + ',' + vf.name() + ')'
00126 );
00127
00128 return tConvection;
00129 }
00130
00131
00132
00133
00134 }
00135
00136
00137
00138 }
00139
00140