|
[Sponsors] |
August 5, 2022, 17:27 |
Correct way to write two nested solvers
|
#1 |
Senior Member
Join Date: Jul 2013
Posts: 124
Rep Power: 13 |
Hi All,
I am basically trying to write a nested solver that alternately solves the steady-state flow profile using simpleFoam, and then updates a scalar field using scalarTransportFoam. This must be done iteratively, because the viscosity of the fluid depends on the scalar quantity, so after updating the scalar quantity I need to re-solve the (steady) fluid velocity. I was able to make this work by taking out the guts of simpleFoam and placing them in an inner loop in my scalarTransportFoam modified solver, but I couldn't figure out the proper way to access the residuals for terminating the solver. Finally I figured out I could do it like this: // SOLVE THE FLOW FIELD int myCounter = 0; while (true) { // --- Pressure-velocity SIMPLE corrector #include "UEqn.H" p.storePrevIter(); #include "pEqn.H" laminarTransport.correct(); turbulence->correct(); if (eqnResidualU[0] < UResidual.value() && eqnResidualU[1] < UResidual.value() && eqnResidualU[2] < UResidual.value() && eqnResidualP < pResidual.value()) { break; } myCounter = myCounter + 1; Info<< "counter = " << myCounter << endl; } // Update the concentration numSteps times for (int n = 0; n < numSteps.value(); ++n) { runTime++; Info<< "Time = " << runTime.timeName() << nl << endl; #include "CEqn.H" Info << "max(C) = " << max(C) << endl; Info << "min(C) = " << min(C) << endl; runTime.write(); Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s" << nl << endl; } } Where the residuals are calculated here in the UEqn file: if (simple.momentumPredictor()) { eqnResidualU = solve(UEqn == -fvc::grad(p)).initialResidual(); fvOptions.correct(U); } and similar for the pressure residual. I seriously doubt this is the best way to do this, but I don't really know. The thing that really bothers me is that this fluid solver part of the code is 5x slower than just running simpleFoam, although it is essentially the same UEqn and same pEqn, and it is running the same number of total iterations. Something else is slowing it down significantly, but I don't know what. The other weird thing to me is that I had to add the middle line here: #include "UEqn.H" p.storePrevIter(); #include "pEqn.H" which is not present in simpleFoam, and I don't really understand why. Does anyone have any advice for understanding these issues? Thanks |
|
Tags |
scalartransportfoam, simplefoam, speed |
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Should I focus on explicit or implicit solvers for transient simulations? | aerosayan | Main CFD Forum | 1 | April 11, 2021 08:31 |
MULES in Eulerian solvers | MMNCH | OpenFOAM Programming & Development | 2 | July 7, 2020 14:58 |
Correct way to write intermediate values of field calculations | joeeweaver | OpenFOAM Programming & Development | 2 | February 5, 2020 13:30 |
OpenFOAM solvers for two-phase boiling flows | Coris | CFD Freelancers | 1 | May 22, 2019 04:54 |
Types of solvers | CFD-Junior | Main CFD Forum | 6 | April 14, 2019 18:25 |