CFD Online Discussion Forums

CFD Online Discussion Forums (http://www.cfd-online.com/Forums/)
-   OpenFOAM (http://www.cfd-online.com/Forums/openfoam/)
-   -   Description of flux() method (http://www.cfd-online.com/Forums/openfoam/114933-description-flux-method.html)

fumiya March 20, 2013 05:19

Explanation of flux() method
 
1 Attachment(s)
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

    \sum_{f} \left \{\left ( \frac{1}{A_{P}} \right )_{f}\left | \mathbf{\Delta }  \right |\frac{p_{N}-p_{P}}{\left | \mathbf{d} \right |}  +\left ( \frac{1}{A_{P}} \right )_{f}\mathbf{k}\cdot \left ( \triangledown p \right )_{f} \right \}=\sum_{f}\left ( \frac{H}{A_{P}} \right )_{f}\cdot \mathbf{S}_{f} ---(1)

    where \mathbf{S}_{f} = \mathbf{\Delta } + \mathbf{k}(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

    \sum_{f} \left \{ \mathrm{phiHbyA} -\left ( \left ( \frac{1}{A_{P}} \right )_{f}\left | \mathbf{\Delta }  \right |\frac{p_{N}-p_{P}}{\left | \mathbf{d} \right |}  +\left ( \frac{1}{A_{P}} \right )_{f}\mathbf{k}\cdot \left ( \triangledown p \right )_{f}  \right ) \right \}=0 ---(2)

    Then we can construct the conservative face flux phi by

    \mathrm{phi} = \mathrm{phiHbyA} - \left ( \left ( \frac{1}{A_{P}} \right )_{f}\left | \mathbf{\Delta }  \right |\frac{p_{N}-p_{P}}{\left | \mathbf{d} \right |}  +\left ( \frac{1}{A_{P}} \right )_{f}\mathbf{k}\cdot \left ( \triangledown p \right )_{f}  \right ) ---(3)

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

    \left ( \frac{1}{A_{P}} \right )_{f}\left | \mathbf{\Delta }  \right |\frac{p_{N}-p_{P}}{\left | \mathbf{d} \right |}  +\left ( \frac{1}{A_{P}} \right )_{f}\mathbf{k}\cdot \left ( \triangledown p \right )_{f} ---(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

sharonyue August 25, 2013 23:40

Quote:

Originally Posted by fumiya (Post 415202)
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
            (
                fvm::div(A*fvc::grad(p)) == fvc::div(phiHbyA)
            );

is the same?


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