Improved combustion solver robustness for coarse grids#2733
Improved combustion solver robustness for coarse grids#2733EvertBunschoten wants to merge 30 commits intodevelopfrom
Conversation
pcarruscag
left a comment
There was a problem hiding this comment.
Hmmm but then you are not solving the same equations anymore.
If the issue is "propagation speed" it sounds like something should be done about the CFL.
It is not about accurately modeling the propagation of the flame, it is just to allow the flame to propagate through the coarse regions of the domain without the solver diverging. For cells larger than the flame length scale, we can't accurately resolve the propagation of the flame front anyway because the diffusive time scales and reaction source time scales differ at those length scales. |
|
So is it possible to adjust the diffusion coefficients in those regions? |
|
I agree with Pedro, it is great that it doesn't blow up, but the solution is not physical anymore. You can look into 'thickened flame' models. In these models, the propagation speed is physically correct, but the flame is artificially thickened by increasing the diffusion coefficient. |
|
It's mentioned in Poinsot & Veynante btw. |
…factor according to the model by Butler and O'Rouke
…_flame_lengthscale
|
looks good. Note that the thickened flame model of the paper we discussed https://share.google/Ia0hcPhfoOKvHypb3 recovers the flame speed by also modifying the diffusivity and source term in the energy equation, and therefore modifies the flame temperature. |
It is possible to calculate the flame thickness during simulations with Equation 4 of the paper you linked. However, the flame speed correction model will not work when the correction factor depends on the local value of the flame thickness. |
|
is it possible to compute an estimate of the original flame thickness locally? |
I have tried the following method to try to obtain a measure for the thickness of the flame on a sufficiently refined grid. |
|
So the issue I have is: how much are we going to accommodate a bad setup (a mesh that is too coarse) for a user? |
The purpose of this feature is not to accommodate a bad setup where the mesh in the flame zone is too coarse to accurately resolve the flame front. For complicated 3D laminar test cases and future support for tubulent flames, the flow field needs to develop before igniting the flame. Consequently, the flame front will propagate through all regions of the computational domain downstream of the flame, including regions close to the outlet where the mesh is less refined. |
|
ok, so for this PR, do you just want to implement the steady case, where any unsteady propagation is nonphysical anyway? There is still some kind of length scale involved then? |
pcarruscag
left a comment
There was a problem hiding this comment.
Perhaps we can move forward with a default that does not compromise results, and it is then an option to set an adequate lenght scale?
I developed a new way to approximate the flame thickness:
The flame thickness value is now also included in the history output when the option is enabled in the configuration so users are better informed on whether the mesh is sufficiently refined. Finally, the global flame thickness value is now adjusted upwards or downwards depending on whether the flame thickness increases or decreases. This allows for the flame thickness value to become more accurate as the solution converges, while providing sufficient dampening while the flame propagates through coarse cells. |
|
Nice work! Is there also no correction when the mesh is sufficiently fine? |
|
@EvertBunschoten can you add a testcase? |
SU2_CFD/src/output/CFlowOutput.cpp
Outdated
| AddHistoryOutput("RMS_"+CV_name, "rms["+CV_name+"]",ScreenOutputFormat::FIXED, "RMS_RES", "Root-mean squared residual of " + CV_name + " controlling variable equation.", HistoryFieldType::RESIDUAL); | ||
| } | ||
| if (flamelet_config_options.thickenedflame_correction) | ||
| AddHistoryOutput("THICKNESS","flamethickness",ScreenOutputFormat::FIXED, "RMS_RES", "Flame thickness used for thickened flame correction model.", HistoryFieldType::RESIDUAL); |
There was a problem hiding this comment.
I have placed the flame thickness under its own category as a user-defined coefficient.
|
|
||
| /* Update flame thickness value. */ | ||
| su2double flame_thickness{default_flame_thickness}; | ||
| if (Tmax_global > 800.0) flame_thickness = (pvmax_global - pvmin_global) / (gradpv_global+1e-5); |
There was a problem hiding this comment.
Is this temperature a tunable parameter?
| su2double pvmax_local{-1e3}, pvmin_local{1e3}, pvmax_global{0.0},pvmin_global{0.0}, gradpv_local{0.0}, gradpv_global{0.0}, Tmax_local{-1e6},Tmax_global{0.0}; | ||
|
|
||
| SU2_OMP_FOR_STAT(omp_chunk_size) |
There was a problem hiding this comment.
This does not work with OpenMP because the local variables are also thread-local, you can take a look at how we compute time steps for the pattern you need to use.
No correction is applied if the length scale of the cell is lower than the calculated flame length scale. |
…icient under its own group
…e/SU2 into feature_flame_lengthscale






Simulations of flames in large domains is difficult because volumetric source terms blow up in large cells, causing the species solver to diverge. I implemented a damping term which scales the species source terms in cells with a length scale above a user-defined threshold. This allows for the flame to propagate through regions of the domain with large cells (such as in the far-field) without diverging, while the source terms in refined regions remain unaffected.
To illustrate how this feature improves robustness, I ran a 2D simulation of a circular flame propagating from a refined region in the middle domain towards the edges where the mesh is significantly more coarse.
The image below shows the temperature field after 30 iterations as computed with the previous implementation (left), and the new implementation with a flame length scale specified as 1e-4 m (right). The solution is unaffected while the flame is within the refined region of the mesh.
However, the instance the flame reaches the coarser cells, the solver quickly diverges without damping. With the damping active, the flame propagates through the entire domain without an issue.

PR Checklist
Put an X by all that apply. You can fill this out after submitting the PR. If you have any questions, don't hesitate to ask! We want to help. These are a guide for you to know what the reviewers will be looking for in your contribution.
pre-commit run --allto format old commits.