Hi,
bei einigen Simulationen ist es wichtig, dass OpenFOAM selbständig mit der Berechnung abbricht, wenn eine vordefinierte Variable (wie U, p) konvergiert ist.
OpenFOAM besitzt diese Fähigkeit von Hause aus schon und muss halt nur erweitert werden. Als Beispiel wird der SimpleFOAM Solver gewählt. Dieser Solver soll abbrechen, wenn "U" und "p" das Konvergenzkriterium erreicht hat:
Wir ersetzen den Code in der "convergenceCheck.H" Datei wie folgt:
Zitat:
// check convergenceInfo
<< "Initial residual for U = " << UEqnResidual << nl
<< "Initial residual for p = " << pEqnResidual << nl
<< endl;
if ((UEqnResidual < UConvergenceCriterion)
&& (pEqnResidual < pConvergenceCriterion))
{
Info<< "Reached convergence criterion." << endl;
runTime.writeAndEnd();
Info<< "latestTime = " << runTime.timeName() << endl;
}
Des Weiteren auch den Code in "initConvergenceCheck.H":
Zitat:
// initialize values for convergence checksscalar UEqnResidual = 0;
scalar pEqnResidual = 0;
scalar convergence = 0;
simple.readIfPresent("convergence", convergence);
scalar UConvergenceCriterion = convergence;
scalar pConvergenceCriterion = convergence;
simple.readIfPresent("UConvergenceCriterion", UConvergenceCriterion);
simple.readIfPresent("pConvergenceCriterion", pConvergenceCriterion);
Info
<< "Convergence criterion for U = " << UConvergenceCriterion << nl
<< "Convergence criterion for p = " << pConvergenceCriterion << nl
<< endl;
Man beachte, dass die Namen der Druck-, sowie Impulsgleichung zu "pEqn" und "UEqn" geändert wurden. Weiterhin wurde das alte vorhandene Konvergenzkriterium ausgetauscht.
Headerdateien anzupassen:
"pEqn.H":
Zitat:
// Non-orthogonal pressure corrector loop
for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
{
fvScalarMatrix pEqn
(
fvm::laplacian(1.0/AU, p) == fvc::Div(phi)
); pEqn.setReference(pRefCell, pRefValue);
// retain the residual from the first iteration
if (nonOrth == 0)
{
pEqnResidual = pEqn.solve().initialResidual();
// maxResidual = max(eqnResidual, maxResidual);
}
else
{
pEqn.solve();
}
if (nonOrth == nNonOrthCorr)
{
phi -= pEqn.flux();
}
}
# include "continuityErrs.H"
// Explicitly relax pressure for momentum corrector
p.relax();
// Momentum corrector
U -= fvc::grad(p)/AU;
U.correctBoundaryConditions();
UEqn.H:
Zitat:
// Solve the Momentum equation tmp<fvVectorMatrix> UEqn
(
fvm::Div(phi, U)
+ turbulence->divDevReff(U)
);
UEqn().relax();
UEqnResidual = solve
(
UEqn() == -fvc::grad(p)
).initialResidual();
Ich hoffe, das war etwas verständlich ausgedrückt? Im Anhang habe ich als Beispiel den SimpleConvergenceFoam Solver beigefügt...
Viel Spass
TTB
[Diese Nachricht wurde von TTB am 09. Mrz. 2009 editiert.]
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP