Comparison of artificial compressibility methods

I thought people might be interested in a recent paper from the PyFR team where we compared some artificial compressibility approaches. These are a set of techniques for solving the incompressible Navier–Stokes equation.

The methods we compared are the ACM approach of Chorin, which is the method currently used in mainline PyFR. The second approach was a hyperbolic diffusion version of this equation set, where the viscous terms are hyperbolised through additional equations. The final approach was a lesser known method called entropically damped artificial compressibility (EDAC). In this method rather than enforcing constant entropy, you minimise density fluctuations which results in a diffusion term on the right hand side of the entropy equality (where it would normally be zero).

The advantage of EDAC is that it is able to keep the velocity divergence sufficiently under control that unsteady flows can be simulated without having to iteratively solve for pressure and velocity at each time step.

However, there is no such thing as a free lunch and that is still true here. Any divergence in the velocity field is balanced by the pressure field. The scaling in this balancing act is controlled by a parameter we call \zeta. As \zeta increases the velocity divergence decreases and the pressure fluctuations to balance it reduce, but the system becomes stiffer. This ultimately means smaller explicit time steps have to be used. Now you could just decrease \zeta and be happy with larger velocity divergence, however a main result from the paper was that the larger pressure fluctuations can really mess with phenomena like separation and turbulent transition.

Ultimately, EDAC can be really fast but if you want to use it you have to be quite carefully when you set \zeta, too low and the physics will be seriously impacted, too high and you’ll be waiting ages for the results. The really nice thing though is the setup time for a case is much lower than ACM. You turn on adaptive time stepping, set a \zeta and you’re off. No guessing at Dt and Dtau, no configuring the pseudo stepper, no configuring multigrid cycles.

If you want to know more you can find the open access paper here: Redirecting