Compressible Flow Diamond Airfoil at Angle of Attack - Max Iterations Exceeded

We are trying to simulate air flow at Mach 3 over a diamond shaped airfoil of chord length 1m with a 15 degree half angle. Our goal was to calculate lift at angles of attack - 0,2,4,6,8,10,12,14,16 - and compare to analytical results using basic compressible flow theory. We have been consistently running into Exceeded Max Iterations errors, as well as exceeding the specified maximum courant number. We are not trying to resolve the boundary layer (since at a Re of +12e6, would be very very small), or trying to resolve the shock structures, we are only trying to get lift values at different angles of attack.

Thus far we have had convergence on a few laminar transient simulations, and a smaller number of k-wSST transient simulations. The end solution is fairly steady, so we would like to be able to use a steady state solution, but haven’t had any luck with convergence on those.

There are 4 “projects” associated with this endeavor. The first,

, is mine and mostly laminar transient simulations. The end of the solver log is shown below for the simulation named “DAirfoil15 - 12aoa, 0mesh” , “Run 1”. The error message it presents is “Maximum number of iterations exceeded.”

Solver log:

ExecutionTime = 347.54 s ClockTime = 380 s
Mean and max Courant Numbers = 0.0164781097357 0.0999838461065
deltaT = 2.61086930744e-06
Time = 0.0177818727461
diagonal: Solving for rho, Initial residual = 0, Final residual = 0, No Iterations 0
diagonal: Solving for rhoUx, Initial residual = 0, Final residual = 0, No Iterations 0
diagonal: Solving for rhoUy, Initial residual = 0, Final residual = 0, No Iterations 0
diagonal: Solving for rhoUz, Initial residual = 0, Final residual = 0, No Iterations 0
smoothSolver: Solving for Ux, Initial residual = 6.78940078722e-11, Final residual = 6.78940078722e-11, No Iterations 0
smoothSolver: Solving for Uy, Initial residual = 4.40786243635e-11, Final residual = 4.40786243635e-11, No Iterations 0
smoothSolver: Solving for Uz, Initial residual = 1.10328821598e-08, Final residual = 1.10328821598e-08, No Iterations 0
diagonal: Solving for rhoE, Initial residual = 0, Final residual = 0, No Iterations 0
smoothSolver: Solving for h, Initial residual = 4.60981725109e-11, Final residual = 4.60981725109e-11, No Iterations 0
ExecutionTime = 347.59 s ClockTime = 380 s
Mean and max Courant Numbers = 0.0164799706806 0.0999707283277
deltaT = 2.61150419501e-06
Time = 0.0177844842503
diagonal: Solving for rho, Initial residual = 0, Final residual = 0, No Iterations 0
diagonal: Solving for rhoUx, Initial residual = 0, Final residual = 0, No Iterations 0
diagonal: Solving for rhoUy, Initial residual = 0, Final residual = 0, No Iterations 0
diagonal: Solving for rhoUz, Initial residual = 0, Final residual = 0, No Iterations 0
smoothSolver: Solving for Ux, Initial residual = 6.78572395445e-11, Final residual = 6.78572395445e-11, No Iterations 0
smoothSolver: Solving for Uy, Initial residual = 4.41030964155e-11, Final residual = 4.41030964155e-11, No Iterations 0
smoothSolver: Solving for Uz, Initial residual = 1.08999660025e-08, Final residual = 1.08999660025e-08, No Iterations 0
diagonal: Solving for rhoE, Initial residual = 0, Final residual = 0, No Iterations 0
smoothSolver: Solving for h, Initial residual = 4.61279963388e-11, Final residual = 4.61279963388e-11, No Iterations 0
[9]
[9]
[9] ExecutionTime = 347.65 s ClockTime = 380 s
→ FOAM FATAL ERROR:
[9] Maximum number of iterations exceeded
[9]
[9] From function thermo::T(scalar f, scalar T0, scalar (thermo::*F)(const scalar) const, scalar (thermo::*dFdT)(const scalar) const, scalar (thermo::*limit)(const scalar) const) const
[9] in file at line 76.
[9]
FOAM parallel run aborting
[9]
[9] #0 Foam::error::printStack(Foam::Ostream&) at ??:?
[9] #1 Foam::error::abort() at ??:?
[9] #2 Foam::species::thermo >, Foam::sensibleEnthalpy>::THs(double, double, double) const at ??:?
[9] #3 Foam::hePsiThermo >, Foam::sensibleEnthalpy> > > >::calculate() at ??:?
[9] #4 Foam::hePsiThermo >, Foam::sensibleEnthalpy> > > >::correct() at ??:?
[9] #5
[9] at ??:?
[9] #6 __libc_start_main in "
[9] #7
[9] at ??:?

MPI_ABORT was invoked on rank 9 in communicator MPI_COMM_WORLD
with errorcode 1.
NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes.
You may or may not see output from other processes, depending on
exactly when Open MPI kills them.

The second associated project, also mine, is primarily attempts at k-wSST models, also transient. The link to the project is

Below is another snippet of the end of the solver log. This corresponds to the Simulation called “Airfoil Turbulent 3 - coarser mesh”, and then run name is “Same but GAMG & Smooth”. The same max iteration error popped up as well as “The Courant number (CFL) exceeded the limit of 1. You may experience either instability or bad temporal accuracy. It is recommended to keep the CFL number below 0.7. In order to achieve this you need to decrease the time step.”

Solver log:

GAMG: Solving for p, Initial residual = 1.42414603943e-05, Final residual = 2.39870784188e-16, No Iterations 1
diagonal: Solving for rho, Initial residual = 0, Final residual = 0, No Iterations 0
time step continuity errors : sum local = 6.64022390833e-05, global = 6.6402239083e-05, cumulative = 4.28467666308
rho max/min : 2.51716593916 0.5
smoothSolver: Solving for omega, Initial residual = 1.55792535405e-07, Final residual = 1.55792535405e-07, No Iterations 0
smoothSolver: Solving for k, Initial residual = 8.30096238902e-06, Final residual = 8.30096238902e-06, No Iterations 0
PIMPLE: iteration 4
smoothSolver: Solving for Ux, Initial residual = 3.70865215024e-06, Final residual = 3.70865215024e-06, No Iterations 0
smoothSolver: Solving for Uy, Initial residual = 7.62429351071e-07, Final residual = 7.62429351071e-07, No Iterations 0
smoothSolver: Solving for Uz, Initial residual = 1.7901142161e-06, Final residual = 1.7901142161e-06, No Iterations 0
smoothSolver: Solving for h, Initial residual = 1.80451190642e-05, Final residual = 5.83363381981e-09, No Iterations 1
GAMG: Solving for p, Initial residual = 1.96769145308e-05, Final residual = 2.09961985396e-16, No Iterations 1
diagonal: Solving for rho, Initial residual = 0, Final residual = 0, No Iterations 0
time step continuity errors : sum local = 6.64022390825e-05, global = 6.64022390823e-05, cumulative = 4.28474306532
rho max/min : 2.5172132253 0.5
smoothSolver: Solving for omega, Initial residual = 1.5566417153e-07, Final residual = 1.5566417153e-07, No Iterations 0
smoothSolver: Solving for k, Initial residual = 7.34234180476e-06, Final residual = 7.34234180476e-06, No Iterations 0
PIMPLE: iteration 5
smoothSolver: Solving for Ux, Initial residual = 8.33388464656e-06, Final residual = 8.33388464656e-06, No Iterations 0
smoothSolver: Solving for Uy, Initial residual = 2.16772705588e-06, Final residual = 2.16772705588e-06, No Iterations 0
smoothSolver: Solving for Uz, Initial residual = 4.49962524042e-06, Final residual = 4.49962524042e-06, No Iterations 0
smoothSolver: Solving for h, Initial residual = 2.23971677768e-05, Final residual = 6.81859483086e-09, No Iterations 1
[1]
[1]
[1] → FOAM FATAL ERROR:
[1] Maximum number of iterations exceeded
[1]
[1] From function thermo::T(scalar f, scalar T0, scalar (thermo::*F)(const scalar) const, scalar (thermo::*dFdT)(const scalar) const, scalar (thermo::*limit)(const scalar) const) const
[1] in file at line 76.
[1]
FOAM parallel run aborting
[1]
[1] #0 Foam::error::printStack(Foam::Ostream&) at ??:?
[1] #1 Foam::error::abort() at ??:?
[1] #2 Foam::species::thermo >, Foam::sensibleEnthalpy>::THs(double, double, double) const at ??:?
[1] #3 Foam::hePsiThermo >, Foam::sensibleEnthalpy> > > >::calculate() at ??:?
[1] #4 Foam::hePsiThermo >, Foam::sensibleEnthalpy> > > >::correct() at ??:?
[1] #5
[1] at ??:?
[1] #6 __libc_start_main in "
[1] #7
[1] at ??:?

MPI_ABORT was invoked on rank 1 in communicator MPI_COMM_WORLD
with errorcode 1.
NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes.
You may or may not see output from other processes, depending on
exactly when Open MPI kills them.

The third project associated is

This is my partner’s (we’re doing a group project for a CFD course). We were told that there is a bug in the code when trying to simulate an angle of attack (using x and y velocity components for the initial condition and the boundary condition) with a mesh that has refinements. So, (since I have run out of computing hours), he has been working on doing uniform meshes in this project:

trying to establish mesh convergence, and then we will be attempting that level of mesh fine-ness at our specified angles of attack.

Any advice that anyone has is much appreciated. We’re new at this, so our meshing skills, and simulation set-up I’m sure could all use some improvement. Thanks!

1 Like

Hi @djrussel and thanks a lot for the detailed description!

Will have a look at it later on and see what can be done here. @1318980 has performed a few simulations involving different AoA so he might be a good source for those kinds of problems :wink:

Cheers and happy weekend!

Jousef

Hi @djrussel!

Very interesting project. Quite the innovative idea to use a diamond airfoil for supersonic flow!

I’ve copied your project over and am looking into it at the moment. Will get back to you on any possible fixes.

Also I would like to keep tabs on your project! I’m interested in supersonic aerodynamics and would definitely love to help out and learn along the way.

Cheers!

Regards,
Barry

1 Like

Hi @djrussel

I’ve managed to get this particular case running. Refer to my copy of your project [here] and under "DAirfoil15 - 12aoa, 0mesh” > “Barry Run 2 Y Inlet Zero”.

So I’ve tried multiple things to try to get the max iteration error fixed.

  • Changing Maximal Courant Number under simulation control
  • Changing Maximal Timestep under simulation control
  • Changing Timestep under simulation control
  • Changing End Time under simulation control
  • Changing write time under simulation control
  • Removing Initial Velocity conditions
  • Changing your wall boundary conditions to custom with all as gradient to zero

All of the above attempts produced the same error and practically made no difference to the simulation, with the exception of the Courant number where anything more than 0.1 killed the run almost instantly.

So I suspected a problem with your boundary conditions for the inlet and sure enough if you refer to the successful run, removal of the Y velocity inlet and having just an X velocity inlet solved the issue. It seems like your desire to have a resultant vector of flow is not acting correctly and I suspect instead of producing a resultant flow from your two X and Y inlets, the solver just runs both independently causing weird values at the inlet and eventually reaching unrealistic values causing the error.

To resolve this I propose two different methods. The first being to place your Y component velocity on the other bounding box. The problem with this method is that it is not a very good representation of directional flow and will probably give you results that aren’t correct.

The second method is to create a circular bounding box much like that of this project so you can define direction of the flow via an angle without running into the current problems. This will likely give you what you have been trying to do without running into the error and negates the issue of the first solution.

Do let me know how it goes!

Regards,
Barry

1 Like

Thanks for taking a look Barry! It sounds like there may indeed be a SimScale issue with having both x and y components of the velocity at the inlet. I took a look at the simulation you referenced for doing a circular bounding box, and have a couple issues.

  • At the moment, the only meshing software I have access to is through SimScale. Is there a free meshing software that produced the mesh shown in that simulation? We had difficulty meshing the way we wanted to anyways, so another software would be useful generally, not just to get a rounded background box.
  • That simulation does not simulate at an angle of attack as far as I can tell. Their inlet BC is 30 m/s in x direction only, on the curved face. How would you define the inlet flow as a magnitude and angle instead of x and y components?

Thank you again for your help. I look forward to your response.
Hunter & Dan

Hi @hmeisner!

Sorry I am unsure about this because I’ve only used SimScale’s SnappyHexMesh as my primary mesher. I’m sure there are plenty out there and some of the PowerUsers may be able to offer alternatives when they answer you! May I ask what are the limitations you are encountering?

Hmm, now that I that I think about since it’s not exactly clear on how to adjust the magnitude and angle of the inlet why don’t you solve both problems by modifying the placement of the diamond shaped airfoil? That way, you can resolve your X and Y velocities as singular vector with an angle. Translate that angle to the placement of the airfoil and you can set your inlet simply as an X-direction inlet. This method can also allow you adjust for AOA by further increasing the angle at which you place your airfoil with your reference zero angle as the resultant inlet angle calculated earlier.

Let me know what you think!

Regards,
Barry

The primary issue with meshing we are having is maintaining the 2D mesh. All refinements except for boundary layer inflation refine in 3D, giving us more than one cell in the z direction. We also seem to be creating walls where there shouldn’t be any, often when region refinements overlap, or meet the background box.

I think what you are suggesting is to tilt the CAD instead of running a velocity profile change? If that’s the case, we tried that as well, with similar results. Refer to https://www.simscale.com/workbench/?pid=4410113038156479877#tab_1-0 , the simulation called “Alpha 12, 1” The mesh is tilted at 12 degrees angle of attack and the inlet velocity is only in the x direction. Similar to before, we run into the max iterations error. If you refer to the mesh used in this sim, you will also see some of the “walls” we formed unintentionally.

Thanks,
Dan & Hunter

Hi @hmeisner!

I see. Let me try to run it and see what I can do.

Let you know when I get something!

Regards,
Barry

Just an update, we have been doing it without mesh refinements, using a 900x600 background mesh. This link is the simulation we’ve been working on. We did a mesh convergence analysis and got pretty good results for the 900x600 mesh size. We then decided to simulate our angles of attack for this mesh size. Angle of attack 2,4, and 6 are working. We got max iterations errors for both 8 and 10. We have yet to try 12 - 16.

Hi @hmeisner,

Really strange that 8 and 10 gives you the error while 2, 4 and 6 don’t.

I have plans to modify the mesh and placement of the geometry. Let you know if anything works.

Regards,
Barry

I think we made some notable progress. For the laminar transient simulation, using a slip wall instead of no-slip allowed an angle of attack of 10 degrees to run with no errors, when before that was impossible. That was on a uniform grid mesh. I’m not sure what type of mesh would be needed to be successful for a turbulent simulation. I have been trying to learn to use GMSH to see if I can have a bit more freedom in determining where the mesh is refined. I imagine that the cells on the surface would need to be very very small given the high Reynolds number, to accurately capture the boundary layer and associated turbulence.

Thanks again for your help. If you have any suggestions for meshing, we’d be happy to hear them.

Hi @djrussel,

Sorry for the delayed reply. I just finished my exams and now am more free to help.

How is the progress so far? Anything to update? Also what current issues are you having now?

Could you also tell me what the objective is? Is it simply just obtaining different lift values at different AOA?

Cheers.

Regards,
Barry