CFD Online Discussion Forums

CFD Online Discussion Forums (
-   OpenFOAM Running, Solving & CFD (
-   -   About nonorthogonal correction in fvclaplacian (

7islands April 26, 2007 02:00

Hi, I've been solving a wave
I've been solving a wave propagation equation which is represented by fairly a simple equation of

fvm::d2dt2(phi) == c*fvc::laplacian(phi)

where phi is a volScalarField and c is a scalar constant.

Recently I was a little embarrassed to have found the uncorrected scheme (Gauss linear uncorrected) as the one for fvc::laplacian() gives much more stable solutions in tetrahedral meshes than the corrected one, because the correction should be meant for those kinds of non-orthogonal meshes.

After some digging into literature I found in the Prof. Jasak's PhD thesis there are three ways of doing nonorthogonal correction:
1. Minimum correction approach
2. Orthogonal correction approach
3. Over-relaxed approach
and it is concluded that the third approach (over-relaxation) gives the best overall results.

However, this time by looking into the following files I realized that the actually implemented scheme is the second one (the orthogonal correction approach) if I'm not wrong. This finding makes me wonder why...?

OpenFOAM-1.4/src/finiteVolume/finiteVolume/laplacianSchemes/gaussLaplacianScheme /gaussLaplacianScheme.C
OpenFOAM-1.4/src/finiteVolume/finiteVolume/snGradSchemes/correctedSnGrad/correct edSnGrad.C
OpenFOAM-1.4/src/finiteVolume/interpolation/surfaceInterpolation/surfaceInterpol ation/surfaceInterpolation.C

As you can see from the equation above, precise evaluation of the laplacian term is virtually everything I need as of now. I'm gonna try other two approaches by myself but is there anyone with any comments, thoughts, or anyone who tried other implementations by any chance?

Many thanks in advance,

pbo September 25, 2007 14:33

I guess the Orthogonal correct
I guess the Orthogonal correction approach provides the minimum error when --for the sake of boundedness-- no correction is applied (ie when you compute only Grad(Phi).k where k is the vector defined in Hrv's thesis). This is not the case with the over-relaxed approach (k is 'longer' in that approach).
On the other hand, when non-orthogonal corrections are applied, the over-relaxed approach is the best because it can handle highly non-orthogonal mesh and converge faster.
I would need the over-relaxed approach as well, because so far simpleFoam blows up on my tetrahedral mesh (severe non-orthogonality...).

Hrv, any quick fix? (I can't recompile OF on our cluster, because those lazy system administrators didn't update Suse -- we're still under Suse 9.3 with gcc 3.5, arghhhhhhhh). Is it available in previous binary versions of OF?

hjasak September 25, 2007 14:39

Yup, use Gauss linear limited
Yup, use Gauss linear limited 0.5 as a laplacian scheme and upwind on all convection terms. If that does not work, your mesh is past its sell-by date


7islands September 25, 2007 19:18

Hi all, I have to make my apo
Hi all,
I have to make my apologies for my post above having turned out to be complete wrong: the nonorthogonal correction implemented in OF is actually over-relaxed approach. When I wrote the post above I still hadn't noticed deltaCoeffs() were alrealy corrected ones to reflect non-orthogonalities. And I have conducted a test with the three techniques proposed in Hrvoje's thesis and the over-relaxed approach sure gave the best result.

With that said however, I am also one who have been looking for still better correction technique (if any)...


fumiya December 9, 2012 23:54


I'm trying to understand how the non-orthogonal correction is done in OpenFOAM.
You said that "deltaCoeffs() were alrealy corrected ones to reflect non-orthogonalities"
and I have questions regarding this description.

Q1) Where the correction to the deltaCoeffs is done in the code?
In the "gaussLaplacianScheme.C",

52 tmp<surfaceScalarField> tdeltaCoeffs =
53 this->tsnGradScheme_().deltaCoeffs(vf);
54 const surfaceScalarField& deltaCoeffs = tdeltaCoeffs();

, is this deltaCoeffs corrcted one?

Q2) Does this correction mean that the coefficient of laplace operator
deltaCoeffs.internalField()*gammaMagSf.internalFie ld() equals (|Δ|/(|Sf||d|)) * Γf|Sf|?
In the above equation, Δ is the vector defined in the Dr. Jasak's paper(over-relaxed approach Eq. (3.32)).

Best regards,

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