# Description of flux() method

 Register Blogs Members List Search Today's Posts Mark Forums Read

March 20, 2013, 04:19
Explanation of flux() method
#1
Senior Member

Fumiya Nozaki
Join Date: Jun 2010
Location: Yokohama, Japan
Posts: 266
Blog Entries: 1
Rep Power: 18
I try to describe the role of flux() method and how it achieves it's role in OpenFOAM.
This topic is difficult for me to comprehend, so I'm grad if the following explanations could be of some help
• Role of flux() method
To construct the conservative face flux
• How to achieve this
If we discretize the pressure poisson equation(e.g., pEqn in simpleFoam), we can get

---(1)

where (See the attached picture).

The second term of the l.h.s of the eqn. (1) is the explicit non-orthogonal correction term
(source term) and the first term is the implicit orthogonal part(matrix coefficients).
If we arrange the above equation using OpenFOAM notation(v2.2), we get

---(2)

Then we can construct the conservative face flux phi by

---(3)

In the eqn. (3), the pEqn.flux() calculates

---(4)

,so we can get the conservative face flux using the following code

Code:
if (simple.finalNonOrthogonalIter())
{
phi = phiHbyA - pEqn.flux();
}
• Where is flux() function implemented?
As you can see in the eqn. (4), the flux() is the sum of
• 1st term
the off-diagonal coefficients of the pressure poisson equation multiplied by pressure values at cell centers

in fvMatrix.C
Code:
00895     for (direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
00896     {
00897         fieldFlux.internalField().replace
00898         (
00899             cmpt,
00900             lduMatrix::faceH(psi_.internalField().component(cmpt))
00901         );
00902     }
and lduMatrix::faceH is implemented in lduMatrixTemplates.C
Code:
00092         for (register label face=0; face<l.size(); face++)
00093         {
00094             faceHpsi[face] =
00095                 Upper[face]*psi[u[face]]
00096               - Lower[face]*psi[l[face]];
00097         }
• 2nd term
the non orthogonality explicit corrections

in fvMatrix.C
Code:
00937     if (faceFluxCorrectionPtr_)
00938     {
00939         fieldFlux += *faceFluxCorrectionPtr_;
00940     }

Please correct the mistakes, if any.

Best regards,
Fumiya
Attached Images
 over-relaxed.png (5.5 KB, 547 views)

Last edited by fumiya; March 21, 2013 at 10:09.

August 25, 2013, 23:40
#2
Senior Member

Dongyue Li
Join Date: Jun 2012
Location: Beijing, China
Posts: 840
Rep Power: 17
Quote:
 Originally Posted by fumiya I try to describe the role of flux() method and how it achieves it's role in OpenFOAM. This topic is difficult for me to comprehend, so I'm grad if the following explanations could be of some help .......................... Best regards, Fumiya
Excellent!!Fumiya now Its a bit clear regarding the p.Eqn.flux().

BTW, do you think
Code:
fvScalarMatrix pEqn
(
fvm::laplacian(rAU, p) == fvc::div(phiHbyA)
);

fvScalarMatrix pEqn
(
);
is the same?

December 21, 2016, 10:39
#3
New Member

longyun wang
Join Date: Dec 2016
Posts: 6
Rep Power: 9
Quote:
 Originally Posted by fumiya I try to describe the role of flux() method and how it achieves it's role in OpenFOAM. This topic is difficult for me to comprehend, so I'm grad if the following explanations could be of some help Role of flux() method To construct the conservative face flux How to achieve this If we discretize the pressure poisson equation(e.g., pEqn in simpleFoam), we can get ---(1) where (See the attached picture). The second term of the l.h.s of the eqn. (1) is the explicit non-orthogonal correction term (source term) and the first term is the implicit orthogonal part(matrix coefficients). If we arrange the above equation using OpenFOAM notation(v2.2), we get ---(2) Then we can construct the conservative face flux phi by ---(3) In the eqn. (3), the pEqn.flux() calculates ---(4) ,so we can get the conservative face flux using the following code Code: if (simple.finalNonOrthogonalIter()) { phi = phiHbyA - pEqn.flux(); } Where is flux() function implemented? As you can see in the eqn. (4), the flux() is the sum of 1st term the off-diagonal coefficients of the pressure poisson equation multiplied by pressure values at cell centers in fvMatrix.C Code: 00895 for (direction cmpt=0; cmpt::nComponents; cmpt++) 00896 { 00897 fieldFlux.internalField().replace 00898 ( 00899 cmpt, 00900 lduMatrix::faceH(psi_.internalField().component(cmpt)) 00901 ); 00902 } and lduMatrix::faceH is implemented in lduMatrixTemplates.C Code: 00092 for (register label face=0; face
hi,
I am studing icofoam now, and I found the code:
[/CODE]
77 surfaceScalarField phiHbyA
78 (
79 "phiHbyA",
80 fvc::flux(HbyA)
81 + fvc::interpolate(rAU)*fvc::ddtCorr(U, phi)
82 );
[/CODE]

I can't understand why there is an item "fvc::interpolate(rAU)*fvc::ddtCorr(U, phi)"? According to the equation above, there should be only the first item.

 December 24, 2016, 12:40 #4 Senior Member     Fumiya Nozaki Join Date: Jun 2010 Location: Yokohama, Japan Posts: 266 Blog Entries: 1 Rep Power: 18 Hi, The term "ddtCorr" is considered in the transient solvers. The following references could be of some help: Best regards, Fumiya __________________ [Personal]Blog: https://caefn.com/ Twitter: https://twitter.com/FumiyaNozaki SlideShare: http://www.slideshare.net/fumiyanozaki96

April 3, 2017, 20:36
#5
New Member

yuancong
Join Date: Sep 2016
Posts: 2
Rep Power: 0
Quote:
 Originally Posted by sharonyue Excellent!!Fumiya now Its a bit clear regarding the p.Eqn.flux(). BTW, do you think Code: fvScalarMatrix pEqn ( fvm::laplacian(rAU, p) == fvc::div(phiHbyA) ); fvScalarMatrix pEqn ( fvm::div(A*fvc::grad(p)) == fvc::div(phiHbyA) );` is the same?
i do not think so. fvc::grad(p) returns a volscalarfield. so the second pEqn is actually based on grad(p).

 January 2, 2018, 11:05 Flux in 2D Model #6 Member   Join Date: May 2017 Posts: 44 Rep Power: 9 Dear Foamers, I am trying to add a source term to alpha using mass flux. I am starting with a circle and while using .flux(), I can see my circle changes to a square. I am wondering if .flux() can be used in 2D the same as 1D. Thanks,