Hi Philipp und willkommen im Forum,
ich machs kurz. Es gibt hier schon einen Unterschied aber nicht im mathematischen Sinne sondern in der Programmierung, dass dazu führt, dass man aufpassen muss. Wird das simulationType laminar verwendet, wird die Variable modelType auf laminar gesetzt (andererseits auf RASModel oder LESModel) - es ist ein Wort das gespeichert wird (TurbulenceModel.C. Entsprechend wird dann die Berechnung mit den laminaren oder RAS/LES Modellen durchgeführt. Wichtig ist oft die Funktion correct() der Modelle, welche in den Lösern mit folgendem Code aufgerufen wird (Ausschnitt aus pimpleFoam.C)
Code:
turbulence->correct();
Wenn du turbulence off; im RAS Model wählst, dann wird die Funktion turbulence->correct() aufgerufen aber es passiert nichts im Sinne, dass die physikalischen Größen wie epsilon/k/nut/... nicht aktualisiert werden. Bspw. kEpsilon.C
Code:
template<class BasicTurbulenceModel>
void kEpsilon<BasicTurbulenceModel>::correct()
{
if (!this->turbulence_)
{
return;
}
.
.
.
Der Wert on; oder off; wird in der Variablen turbulence_ gespeichert (nur zur Info).
Ein kurzer Test mit dem pimpleFoam und pitzDaily zeigt verschieden Resultate bezüglich laminar und RAS mit turbulence off (sofern man den Code nicht versteht; vorab: Laminar und RAS mit turbulence off ergeben schon die gleichen Ergebnisse).
Ums kurz zu machen, in der UEqn.H Header Datei (die in jeder Applikation zu finden ist) wird folgendes aufgerufen:
Code:
+ turbulence->divDevReff(U) // inco -> wird dann in divDevRhoReff weitergeleitet
+ turbulence->divDevRhoReff(U) // compr
Entsprechend deiner Modelauswahl, wird die Funktion des Modells aufgerufen. Bspw. wird für die Reynolds-Stress Klasse (sollten die RAS Modelle sein) folgendes berechnet:
Code:
template<class BasicTurbulenceModel>
template<class RhoFieldType>
Foam::tmp<Foam::fvVectorMatrix>
Foam::ReynoldsStress<BasicTurbulenceModel>::DivDevRhoReff
(
const RhoFieldType& rho,
volVectorField& U
) const
{
if (couplingFactor_.value() > 0.0)
{
return
(
fvc::laplacian
(
(1.0 - couplingFactor_)*this->alpha_*rho*this->nut(),
U,
"laplacian(nuEff,U)"
)
+ fvc::Div
(
this->alpha_*rho*R_
+ couplingFactor_
*this->alpha_*rho*this->nut()*fvc::grad(U),
"div(devRhoReff)"
)
- fvc::Div(this->alpha_*rho*this->nu()*dev2(T(fvc::grad(U))))
- fvm::laplacian(this->alpha_*rho*this->nuEff(), U)
);
}
else
{
return
(
fvc::laplacian
(
this->alpha_*rho*this->nut(),
U,
"laplacian(nuEff,U)"
)
+ fvc::Div(this->alpha_*rho*R_)
- fvc::Div(this->alpha_*rho*this->nu()*dev2(T(fvc::grad(U))))
- fvm::laplacian(this->alpha_*rho*this->nuEff(), U)
);
}
}
Wird hingegen laminar verwendet, wird bei einem linearen Viskosen Charakter (Newtonsche Fluide) folgendes berechnet:
Code:
template<class BasicTurbulenceModel>
Foam::tmp<Foam::fvVectorMatrix>
Foam::linearViscousStress<BasicTurbulenceModel>::DivDevRhoReff
(
const volScalarField& rho,
volVectorField& U
) const
{
return
(
- fvc::Div((this->alpha_*rho*this->nuEff())*dev2(T(fvc::grad(U))))
- fvm::laplacian(this->alpha_*rho*this->nuEff(), U)
);
}
Du siehst also, die Berechnung ist unterschiedlich, wenn auch die Mathematik die gleiche ist. Siehe hierzu mein Buch, da hab ich das etwas erklärt. Basiert aber auf 2.3.x und ist out-of-date. Die ganze Sache gäbe mir Anreiz das alles erneut niederzuschreiben aber die Zeit hab ich gerade leider nicht.
Zusammenfassend:
- Laminar und RAS/LES Modelle berechnen die Funktion divDevReff bzw. divDevRhoReff unterschiedlich
- turbulence off; macht nichts anderes als das die Turbulenzgrößen k/epsilon/omega/nut etc. nicht aktualisiert werden, allerdings wird trotzdem mit der Funktion der RAS Modelle gearbeitet, dass einen Unterschied erzeugt WENN!!! die Turbulenzgrößen vorher mit einem Wert unterschiedlich zu NULL initialisiert wird.
Resultat:
Laminar und RAS ergeben die gleichen Ergebnisse; pitzDaily Test zeigt es; allerdings nur wenn die Variablen k, epsilon etc. mit sehr kleinen Werten initialisiert werden (bspw. 1e-16) und keine Wandfunktionen verwendet werden. Entsprechend der Mathematik haben wir den gleichen Spannungstensor nur mit einer erhöhten Diffusion (nut+nu = nuEff). Wenn nut ~ 0 ist, dann ist nuEff gleich nu und das RAS Modell sollte fast identische Werte zum laminaren Modell geben. Natürlich muss man hier die Größenordnungen analysieren. Es sollte klar sein, dass die Verwendung der RAS Modelle einen Mehraufwand in der Berechnung repräsentiert (mehr Gleichungen), die alle einen Rundungsfehler enthalten können und daher kleine Abweichungen erzielen und dadurch das Ergebnis minimal beeinflussen kann.
Ich hoffe meine Ausführung ist klar.
------------------
Viele Grüße,
Tobi
OpenFOAM® Tutorials | Training | Publikationen | Für Anfänger wiki.openfoam.com
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP