CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM Programming & Development (https://www.cfd-online.com/Forums/openfoam-programming-development/)
-   -   flux limiter involving tensor : How to use fvc::flux() with volTensorField ? (https://www.cfd-online.com/Forums/openfoam-programming-development/83251-flux-limiter-involving-tensor-how-use-fvc-flux-voltensorfield.html)

Cyp December 21, 2010 05:57

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

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:
Code:

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
Code:

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:
Code:

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

Cyp January 3, 2011 05:05

Hi!

I am still facing this problem.

Does anyone have an idea to solve this issue ?


Best regards,
Cyp

(and happy new year!)

Cyp January 21, 2011 04:36

Hi!

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:
Code:

        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:
Code:

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,
Cyp


All times are GMT -4. The time now is 14:07.