CFD Online Discussion Forums

CFD Online Discussion Forums (
-   OpenFOAM Programming & Development (
-   -   flux limiter involving tensor : How to use fvc::flux() with volTensorField ? (

Cyp December 21, 2010 06:57

flux limiter involving tensor : How to use fvc::flux() with volTensorField ?

I am trying to build a flux from the fvc::flux() function with an volTensorField. The aim is to use flux limiter such as vanLeer scheme.

For a volScalarField I use:

volScalarField fS = blahblah;
surfaceScalarField phi = linearInterpolate(U) & mesh.Sf();
surfaceScalarField phiS = fvc::flux(phi,fS,sScheme);

It perfectly works.

Now I want to replace the volScalarField fS with a volTensorField TfS but

volTensorField TfS = blahblah;
surfaceScalarField phiS = fvc::flux(phi,TfS,sScheme);

doesn't work. It even does not compile because fvc::flux() is not coded for volTensorField.

I can replace the previous snippet of code by:

volTensorField TfS = blahblah;
 surfaceScalarField phiS = linearInterpolate(U&TfS) & mesh.Sf();

It compiles but this snippet doesn't allow us to choose a flux limiter.

Do you know a trick to do such a thing ?
Thank you very much for your help,

Cyp January 3, 2011 06:05


I am still facing this problem.

Does anyone have an idea to solve this issue ?

Best regards,

(and happy new year!)

Cyp January 21, 2011 05:36


Here is the solution I found out to use tensor with the fvc::flux() object. Since fvc::flux() doesn't seem to be adapted to volTensorField, I turn the tensor formulation to a sum of scalarField formulation. Hence I can use fvc::flux().

U = Ux + Uy + Uz
fS&U = fSxx*Ux+fSyx*Ux+fSzx*Ux + fSxy*Uy+fSyy*Uy + ......

Firstly, I need to get the surfacic flux of each component of the velocity field:

        phi_x = linearInterpolate(U.component(vector::X)*vector(1,0,0)) & mesh.Sf();
        phi_y = linearInterpolate(U.component(vector::Y)*vector(0,1,0)) & mesh.Sf();
        phi_z = linearInterpolate(U.component(vector::Z)*vector(0,0,1)) & mesh.Sf();

I am not sure it is the best way to do but it seems to work. However, an odd thing is that phi-(phi_x+phi_y+phi_z) doesn't return exactly 0.0 ..

Then, I defined a surfaceScalarField which is based on the sum of volScalarField:

surfaceScalarField phiS =        fvc::flux(phi_x,fSb.component(tensor::XX),sScheme)
                  + fvc::flux(phi_x,fSb.component(tensor::YX),sScheme)
                  + fvc::flux(phi_x,fSb.component(tensor::ZX),sScheme)

                  + fvc::flux(phi_y,fSb.component(tensor::XY),sScheme)
                  + fvc::flux(phi_y,fSb.component(tensor::YY),sScheme)
                  + fvc::flux(phi_y,fSb.component(tensor::ZY),sScheme)

                  + fvc::flux(phi_z,fSb.component(tensor::XZ),sScheme)
                  + fvc::flux(phi_z,fSb.component(tensor::YZ),sScheme)
                  + fvc::flux(phi_z,fSb.component(tensor::ZZ),sScheme);

This method works on simple test cases where the tensor is isotropic. However, I still have problem with more elaborated problems. I guess the problems come from the boundary conditions..

I hope the snippet above could some of you,

Best regards,

All times are GMT -4. The time now is 05:28.