CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM Running, Solving & CFD (https://www.cfd-online.com/Forums/openfoam-solving/)
-   -   How to choose the right courant number? (https://www.cfd-online.com/Forums/openfoam-solving/69611-how-choose-right-courant-number.html)

vitor October 28, 2009 13:23

How to choose the right courant number?
 
How to choose the right Courant number in complexes simulations (3D, with a great number of cells) and what are its implications?


Thanks.

MadsR October 29, 2009 03:50

Hi Vitor.

The Courant/CFL number (wiki here) depends, as you probably know, on velocity, cell-size and time step and is typically calculated for each cell. The Courant number will accordingly change a bit with velocity when you have a static mesh and a constant time step. Now, assuming here that your mesh is static (non-moving/morphing) and that the velocity field is more or less fully developed, changing the time step is a good way of controlling the Courant number.

A physical explanation, for a CFD simulation, of the Courant number could be that it tells you something about how fluid is moving through your computational cells. If the Courant number is <=1 fluid particles move from one cell to another within one time step (at most). If it is >1 a fluid particles moves through two or more cells at each time step and this can affect convergence negatively. Robust systems and fine solvers, as OpenFOAM, easily deals with large Courant numbers way into the houndreds, but it's a good place to look if you have Convergence problems and it also can effect accuracy of a transient simulation. Diffusion dominated problems should typically be run with low Courant numbers, if I remember correctly.

Hope it helps you a bit, I didn't mean to lecture you if you already knew this.

Short answer is: lower time step to lower Courant number, raise time step to increase Courant number.

Cheers
Mads

akidess October 29, 2009 11:46

For complex simulations with changing velocities it can help to use automatic time step adjustment. See how it's implemented in the interFoam solver (http://www.opencfd.co.uk/openfoam/doc/damBreak.html), or also threads in the forum (e.g. Problems with adjustable timestep control and maxCo Number).

vitor October 30, 2009 05:23

Quote:

Originally Posted by akidess (Post 234532)
For complex simulations with changing velocities it can help to use automatic time step adjustment. See how it's implemented in the interFoam solver (http://www.opencfd.co.uk/openfoam/doc/damBreak.html), or also threads in the forum (e.g. Problems with adjustable timestep control and maxCo Number).

I've seen it, but do you have any tips for setting the right maxCo?


Thanks;

Vitor

akidess October 30, 2009 14:10

Unfortunately I don't think there is a general recipe for that. You will have to play around a little and see what works for you. As Mads already lined out, maxCo will usually have to be smaller than 1, and I think you will rarely have to make it smaller than 0.5.

vitor.geraldes@ist.utl.pt April 24, 2010 20:02

I think that the best approach is to make different simulations with decreasing values of the time step until the final solution becomes independent of this value. I have already made some simulations where the maximum Courant was of the order of hundreds and, nevertheless, the solution was already converged.

dohnie April 27, 2010 05:31

Actually, in compressible flow (if you are interested in acoustic waves or shocks) the courant number should not be based on velocity U, but on U+a (sound speed).
Does anybody know if this is implemented in OpenFOAM? Seems to be trickier than I thought at first, because U is a volVectorField and a is a volScalarField (thus it should always be added in the positive U-direction).

SMesser April 28, 2011 17:48

adjustable time step doesn't limit Courant?
 
I'm using sonicDyMFoam with a solid object moving through a confined space (a fast gas valve). I'm getting lots of trouble with "max number of iterations exceeded" in the calculation of e and "time step continuity errors". I've tried setting maxCo=0.2 and maxAlphaCo=0.2 in system/controlDict, yet the text output shows the max Courant number is still sometimes 1 or larger... sometimes the mean is >1 as well.

Is this normal? my controlDict is as follows:
Code:

/*--------------------------------*- C++ -*----------------------------------*\
| =========                |                                                |
| \\      /  F ield        | OpenFOAM: The Open Source CFD Toolbox          |
|  \\    /  O peration    | Version:  1.7.1                                |
|  \\  /    A nd          | Web:      www.OpenFOAM.com                      |
|    \\/    M anipulation  |                                                |
\*---------------------------------------------------------------------------*/
FoamFile
{
    version    2.0;
    format      ascii;
    class      dictionary;
    location    "system";
    object      controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

application    sonicDyMFoam;

startFrom      startTime;

startTime      0;

stopAt          endTime;

endTime        0.001;

deltaT          1e-7;

writeControl    adjustableRunTime;

writeInterval  1e-6;//2e-5

purgeWrite      0;

writeFormat    ascii;

writePrecision  6;

writeCompression uncompressed;

timeFormat      general;

timePrecision  6;

runTimeModifiable yes;

adjustTimeStep  yes;

maxCo          0.2;
maxAlphaCo      0.2;

maxDeltaT      1;


// ************************************************************************* //

Thanks

maysmech April 30, 2011 08:58

I have this problem too.

I can't use max courant setting for pisoFoam and simpleFoam.

Any suggestion?

Best,

truong_nm May 2, 2011 04:39

CFL in steady solvers
 
Hi maysmech,

There's no CFL Number in such steady solvers. In OF, steady solver means "d/dt=0". Thus, there is no more time step and so no more Courant Number.

I do agree with you: how to control stability in such cases?
The answer is: relaxation factors.

Minh

maysmech May 2, 2011 06:23

You right, I meant pisoFoam only. It is an unsteady solver.

SMesser May 4, 2011 13:35

details of crash
 
A couple of updates - I tried increasing the spatial and temporal resolution to get y+ to about 63, following the Best-Practices for TurboMachinery page on the CFD Wiki, but the sim crashed _faster_... which seems odd. I'm dealing with a fast-opening gas valve. (40 psi Argon on one side, vacuum on the other; device spatial scales are on the order of 1 cm, and opening time is measured in several tens of microseconds.) I also found a web tutorial with info on revising OpenFoam codes to do adaptive timesteps, but it seemed fairly out-of-date and led to me reinstalling OpenFoam. (I'm missing some library; compilation fails unless I'm in the midst of the install.)

I've learned a couple other things:
1) Strong pressure differences (or maybe just strong gradients?) cause crashiness, but I'm not sure _why_ or if there's a workaround. I changed the "vacuum" to 10 psi to avoid the problem, but the motion of the valve's poppet still generates a near-vacuum for some time. (The mechanical parts move slower than Mach 1, but the gas still has to flow supersonically to fill in the gaps through narrow channels.)

2) non-convergence seems to show up at calculation of either e or T. This makes me think my problem's in the choice of thermodynamic model (currently
Code:

thermoType      ePsiThermo<pureMixture<constTransport<specieThermo<hConstThermo<perfectGas>>>>>;
), but I'd love feedback from someone with more experience

3) The message from the last timestep is
Code:

Time = 5.68e-06

Courant Number mean: 0.000260452 max: 0.850669
DICPCG:  Solving for cellMotionUx, Initial residual = 1.7015e-07, Final residual = 9.6024e-09, No Iterations 80
diagonal:  Solving for rho, Initial residual = 0, Final residual = 0, No Iterations 0
DILUPBiCG:  Solving for Ux, Initial residual = 0.641902, Final residual = 4.55875e-06, No Iterations 3
DILUPBiCG:  Solving for Uy, Initial residual = 0.0790439, Final residual = 2.72074e-07, No Iterations 4
DILUPBiCG:  Solving for e, Initial residual = 0.967212, Final residual = 6.18915e-06, No Iterations 2


--> FOAM FATAL ERROR:
Maximum number of iterations exceeded

    From function specieThermo<thermo>::T(scalar f, scalar T0, scalar (specieThermo<thermo>::*F)(const scalar) const, scalar (specieThermo<thermo>::*dFdT)(const scalar) const) const
    in file /home/opencfd/OpenFOAM/OpenFOAM-1.7.x/src/thermophysicalModels/specie/lnInclude/specieThermoI.H at line 67.

FOAM aborting

#0  Foam::error::printStack(Foam::Ostream&) in "/opt/openfoam171/lib/linuxGccDPOpt/libOpenFOAM.so"
#1  Foam::error::abort() in "/opt/openfoam171/lib/linuxGccDPOpt/libOpenFOAM.so"
#2  Foam::ePsiThermo<Foam::pureMixture<Foam::constTransport<Foam::specieThermo<Foam::hConstThermo<Foam::perfectGas> > > > >::calculate() in "/opt/openfoam171/lib/linuxGccDPOpt/libbasicThermophysicalModels.so"
#3  Foam::ePsiThermo<Foam::pureMixture<Foam::constTransport<Foam::specieThermo<Foam::hConstThermo<Foam::perfectGas> > > > >::correct() in "/opt/openfoam171/lib/linuxGccDPOpt/libbasicThermophysicalModels.so"
#4 
 in "/opt/openfoam171/applications/bin/linuxGccDPOpt/sonicDyMFoam"
#5  __libc_start_main in "/lib/libc.so.6"
#6 
 in "/opt/openfoam171/applications/bin/linuxGccDPOpt/sonicDyMFoam"

I'm not sure how / if I should try to increase the max number of iterations. Would it be better to increase tolerance and/or relTol in fvSchemes? T isn't directly listed there, but most listed items are at tolerance of 10^-5 or 10^-8, with relTol=0. Using relTol seems sketchy since this is a transient sim, not steady-state. Again, it'd be nifty to get feedback from an expert.

Thanks for answering the new-B questions. This isn't my first simulation, but I'm much more used to wiring up hardware than to trying to simulate its operation.

dancfd May 22, 2012 21:54

Hello Sarah,

I do not think that adjustTimeStep works for sonicDyMFoam - my experience has shown that regardless of what I set maxCo to, the timestep will revert to what I set in the deltaT field in controlDict. Granted, I am using sonicFoam vice sonicDyMFoam, however they probably have that limitation in common.

I suggest that you may have to try reducing your deltaT until you compute a Co that is where you want it to be. I find ~0.5 to be the maximum that will converge. Please post the results / let me know if you were able to resolve your issue, since I am still struggling with this too.

Regards,

Dan

zaynah04 January 9, 2013 14:55

dear Mads,

i have very low courant numb 1e-5, and my solution does not acheive convergence.. can you please tell me what may be the problem?
i am using incompresible flow in laminar regime with very low velocity..
thanks
zaynah

MadsR January 10, 2013 03:10

Dear Zaynah,

troubleshooting convergence problems can be easy or very, very hard, especially through a forum :)
You don't reveal enough information for anyone to help you out I think. I think that a Courant number of 1e-5 is surprisingly low (actually I would bluntly call it: way too low) but it could depend on some strange :) simulation that you are trying to perform.
Tell us more, but my intuition says that it is not your Courant number which is the problem. It seems that you have tried to lower the time step much to achieve convergence? Is it some explosion simulation or what?

best regards
Mads

Traib January 10, 2013 06:23

Hi Mads,

User zaynah's has found the solution which was I think related to the problem setup as we were discussing in another thread. If you don't mind, I have a question regarding what you said above.

You mentioned relatively lower courant number/time step size required for explosion problems? Or do I understand it differently? I am working on explosions and my simulations sometimes result in very low courant numbers (lower upto 0.01 and time steps upto 1e-15s) when adjustTimeStep is enabled with maxCo typically around 0.2. The problem that I often face is the courant number calculated using the typical velocity, timestep and cell size, which is of order 1e-8s, does not always apply- infact sometimes the time step size required is 10 or higher times than calculated for stable calculations.

I am not sure my explanation is clear enough but any information would be helpful regarding the treatments required in such problems.

zaynah04 January 10, 2013 06:30

Hi Mads,
i will come back to you later with this..I am currently stuck somewhere else..:(

I have successfully iterated around 6 case and achieved convergence...

Suddenly for all the 6 cases i get this same error!!
can anyone tell me what is wrong ?

Quote:

--> FOAM FATAL IO ERROR:
cannot find file

file: /home/zaynah/Desktop/system/controlDict at line 0.

From function regIOobject::readStream()
in file db/regIOobject/regIOobjectRead.C at line 73.

FOAM exiting

http://www.cfd-online.com/Forums/ope...ntroldict.html

MadsR January 10, 2013 10:10

Traib,

I am not sure I understand your question. I don't think explosions, per say, needs low Courant numbers, as it of course also depends on your mesh, but they sure needs low time-steps (relative to more "normal" simulations).
I would expect, being completely ignorant of explosion simulations, however, that you would run at a very low min-Courant number as I would expect that your cells are quite large in certain (most) areas because of the development of an explosion-plume (or what you call it) into the surroundings...I am just guessing here though.

Mads

Traib January 10, 2013 10:37

Thanks for your reply Mads. Yes, the cells are of quite varied sizes, larger at regions far from core combustion region. I just realized I was using max time step as the limiting parameter with low courant number calculated using smallest mesh size, instead of using an appropriate courant number to control the time step, which resulted in significantly decreased time step sizes in densely meshed areas where temperature also increase significantly. This strangely enough seems to be the cause of the error and with a limit on courant number time step sizes are adjusted to about the calculated values. I suppose I just had to try this different approach for stable results.

zaynah04 January 10, 2013 11:35

Dear Mads,

lets come back to the low courant number..;-)

My velocity is 0.0001m/s courant is 2.4 e-6.

i am simulating some simple case for comparison with other softwares.. I have to decide which software is best suited for my project.

I have not modify the time step.
Quote:

It seems that you have tried to lower the time step much to achieve convergence?
i will be waiting for your analysis..
Regards
zaynah.

ps: for good convergence what must be display in terminal? i mean for me to know that the solution has converged??

zaynah04 January 19, 2013 15:36

Dear Mads,

Thanks to you analyssi, I have solved all other queries concerning the courant numbers..

I have one thing which is quite bothering me and i hope you can help me out of this tight spot.;)

I have a case where i am simulating wind flow over a sphere ( 2D), its incompressible, turbulent and stready.

I used pisoFoam and i got the same results which i obtained with Fluent for same mesh.
Now i am using simpleFOam, and solution converged. But in paraview i get completely nonsense results..:(

Your conclusion would be more than welcome dear Mads..:p
Thanking you in advance if you can help me out from this Tight spot..

Best Regards
Zaynah.

immortality February 11, 2013 15:41

hi
how is it possible to add "adjustableRunTime" into sonicFoam?

chegdan February 11, 2013 16:25

Quote:

Originally Posted by immortality (Post 407229)
hi
how is it possible to add "adjustableRunTime" into sonicFoam?

See http://www.cfd-online.com/Forums/ope...tml#post407241

halowine May 30, 2013 16:23

Hi,

I'm trying to resolve supersonic compressible flow with OpenFOAM and I have some questions about the Courant Number calculation.

I fix my Courant number in the ControlDict file, and the time step try to adapt himself.

I look up on the C/H file of the courant number calcultation and I found that the formulation used looks like:

CFL = 0.5 * (sumFace of phi/rho) / VolumeCell ~ 0.5 * [ u * dt / dx + v * dt / dy + w * dt / dz ]

Thus, I don't understand why they put 0.5 coefficient, but I maybe misreaded the code...

I have also another question. For compressible flow where shock occurs, the CFL needs to be (for resolving acoustic and shock)
CFL_comp = dt * (U + a) / dt (a: speed of sound)

Does anyone know if it's the correct formulation for shocked flow?? or the normal form is better?

If I summarize all the CFL calculation (OpenFOAM + compressible/shock), the equation becomes :

CFL_comp = CFL_wanted (ex=0.5) / ( 2 * ( 1 + max(Mach number) ) )

(2 is for compensating the 0.5 coefficient of OpenFOAM and ( 1 + max(Mach number) ) is for (U + a))

right??

thx

vonboett October 3, 2013 08:28

Courant number for non-newtonian fluids
 
Dear modellers,

I have nice results for an adapted InterMixingFoam solver that works with a pressure dependent viscosity in one phase. I use maxCo 0.25 because that is what I got recommended for Large Eddy Simulations. Here I have no turbulence, but when I change maxCo, say to 0.4, the viscosity of the fluid increases!
Has anyone experience or ideas of explanation for this behavior with pressure dependent viscosities?

deliberation October 14, 2014 20:07

Hi, Mads!

I'm quite new here and I'm trying to understand Delf 3D so I can work in a model of a river to see the water level changing with this new construction.
I am sorry for my ignorance, but I can't understand how the velocity can affect Courant number. So far I've just added the grid and bathymetry. Can you please explain me?

Thanks a lot!

Joana

Alaska1964 July 21, 2016 04:19

HiMads and everyone,
I am trying to save computational costs by increasing the time step unti I get some CFL# of 0.5. When my timestep is 10^-6 my mean Courant number (CFL#) is 0.0032.
How can I define the most appropriate Courant number? We know that CFL# should be less than 1, but how shall I know the lower limit of Courant number? How shall I know if 0.4 is better of 0.1 of 0.0032 ?
Is there another criteria to restrict our choices on time-step to reduce the calculation cost?

Thanks in advance for help and ur time,

Mohammed_D November 19, 2019 02:23

Convergence can be obtained for sure, but your information travels accross hundreds of cells so you will lose accuracy. but what was the purpose of your simulations? we can not judge the used time steps of courant number without knowing the purpose.

Dlveckio April 27, 2020 22:52

high courant number but accurate results
 
hi, i have a similar problem. I did several simulations of natural convection in closed spaces in a transitory state in laminar flow. At first I did not take into account the value of the Courant number, however later I determined, now, the courant number in all simulations is greater than 1 but less than 2, does this indicate that my results are not correct? Because when I compare it with experimental studies, the relative error percentage is less than 3%.

What can this mean?

guanjiang.chen October 18, 2021 14:09

Quote:

Originally Posted by Dlveckio (Post 767621)
hi, i have a similar problem. I did several simulations of natural convection in closed spaces in a transitory state in laminar flow. At first I did not take into account the value of the Courant number, however later I determined, now, the courant number in all simulations is greater than 1 but less than 2, does this indicate that my results are not correct? Because when I compare it with experimental studies, the relative error percentage is less than 3%.

What can this mean?

Hi,

https://www.cfd-online.com/Forums/op...treatment.html

The last reply may help. For transient problems, the courant number a little higher than 1 may not be wrong if your result is reasonable. If you use the implicit scheme, there is no fixed limit for the courant number。 just prevent it become too large to diffuse I think.

Regards,


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