CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM (https://www.cfd-online.com/Forums/openfoam/)
-   -   How to get initial residuals for U components during runtime? (https://www.cfd-online.com/Forums/openfoam/87096-how-get-initial-residuals-u-components-during-runtime.html)

 florian_krause April 11, 2011 11:49

How to get initial residuals for U components during runtime?

Dear all,
I use a modified simpleFoam in OpenFOAM-1.7.x. I simulate a laminar pipe flow with uniform fixed value inlet boundary conditons and zeroGradient outlet boundary conditions. I've set up the case as a wedge using wedge boundary conditions. so far so good...

Now I want to stop the simulations if a pre-defined convergence criterion is satisfied for pressure p and the axial (x) and wall-normal (y) velocity component.

If I use

tmp<fvVectorMatrix> UEqn
(
fvm::div(phi, U)
+ turbulence->divDevReff(U)
);

UEqn().relax();

eqnResidualU = solve
(
).initialResidual();

maxResidualU = max(eqnResidualU, maxResidualU);

then I get the initial residuals for all three velocity components. And using

if (maxResidualU < convergenceCriterionU && maxResidualP < convergenceCriterionP)
{
Info<< "reached convergence criterion for U and p"<< endl;
runTime.writeAndEnd();
Info<< "latestTime = " << runTime.timeName() << endl;
}

I perform the actual convergence check on all three velocity components.

As mentioned above, for this wedge case, I want to stop the calculation if only the x and y component of U satisfy the pre-defined convergence criterion.

Does anyone know how to do that? As always, any help is appreciated!

Best,
Florian

 Logan Page May 5, 2011 18:22

Try modifying the solver along the lines of this

int StopItter = 1;
while (runTime.loop() && StopItter)
{
.
.
.
#include "UEqn.H"
#include "TEqn.H"
#include "pEqn.H"
.
.
.
}

then where you do the convergence check try this

if (maxResidualU < convergenceCriterionU && maxResidualP < convergenceCriterionP)
{
Info<< "reached convergence criterion for U and p"<< endl;
runTime.writeAndEnd();
Info<< "latestTime = " << runTime.timeName() << endl;
StopItter = 0;
}

 florian_krause May 6, 2011 03:10

thanks for your reply, but if I understand your suggestions correctly, then it will basically do the same as before using
if (maxResidualU < convergenceCriterionU && maxResidualP < convergenceCriterionP)
{
runTime.writeAndEnd();
}
It will stop the calculation when the convergence criteria are satisfied. My concern is
eqnResidualU = solve
(
).initialResidual();
maxResidualU = max(eqnResidualU, maxResidualU);
If I compare maxResidualU with my convergence criterion, it will always check if the residuals of all velocity components satisfy the convergence criterion. What I need in my specific case is to stop the calculation if only the residuals of Ux and Uy satisfy my convergence criterion.
Best,
Florian

 Logan Page May 6, 2011 08:54

Hmm yeah sorry i didtnt look at the code properly before replying :P

I actually have no idea how you would split the Ux and Uy residuals in OpenFOAM itself.

How i ended up terminating a simulation upon reaching steady-state was by controlling it with an octave script
1) run OpenFoam solver for n time steps (say 200) from previous time step
2) access the log file and pull out the initial residuals
3) check convergence criterion
4) if convergence reached stop else (1)

not very efficient i know, but for what i am doing i had problems with the Ux and Uy residuals, they never actually reach the convergence criterion but rather approached a flat line so i had to specify
(1-UxRes(@200)/UxRes(@0)) < 1e-4 for example

sorry i couldnt be of more help.

 All times are GMT -4. The time now is 13:32.