| |  | Online-Kurs: Grundlagen des 3D-Druck-Designs für Industrieingenieure , ein Kurs
|
Autor
|
Thema: Erhaltungsgleichungen im Code wiederfinden (717 / mal gelesen)
|
Studentenmensch Mitglied Student

 Beiträge: 47 Registriert: 12.05.2016
|
erstellt am: 06. Jul. 2016 08:32 <-- editieren / zitieren --> Unities abgeben:         
Grüß Gott, ich bin im programmieren nicht sonderlich bewandert. Trotzdem würde ich gerne wissen, was da genau passiert im Hintergrund. Angenommen ich nehme den solver: rhoPorousSimpleFoam Unter applications>solvers>compressibible>rhoSimpleFoam>rhoPorousSimpleFoam liegen u.a.: UEqn.H pEqn.H EEqn.H Ich denke das sind die wesentlichen Dateien. Meine Frage ist, wo ich dort jetzt die Navier-Stokes Gleichungen wiederfinde bzw. die Gleichungen für Impuls, Masse und, da es sich um einen kompressiblen Fall handelt, auch die der Energie. Unter UEqn.H finde ich: Code:
// Construct the Momentum equation tmp<fvVectorMatrix> UEqn ( fvm::Div(phi, U) + turbulence->divDevRhoReff(U) == fvOptions(rho, U) ); UEqn().relax();
Laut OpenFoam User Guide heißt das soviel wie: Diskretisierter Term (Divergenz (Rho* Geschwindigkeit U) ) + ? = Einem Term aus fvOptions UEqn().relax() ? Wo sind die ganzen anderen Terme der Impulsgleichung? Was passiert denn in pEqn? Ein grober Überblick welche Gleichungen hier gelöst werden wäre hilfreich :-) Code:
{ const volScalarField& psi = thermo.psi(); volVectorField HbyA("HbyA", U); if (pressureImplicitPorosity) { HbyA = trTU() & UEqn().H(); } else { HbyA = trAU()*UEqn().H(); } UEqn.clear(); bool closedVolume = false; surfaceScalarField phiHbyA ( "phiHbyA", fvc::interpolate(rho*HbyA) & mesh.Sf() ); fvOptions.makeRelative(fvc::interpolate(rho), phiHbyA); closedVolume = adjustPhi(phiHbyA, U, p); while (simple.correctNonOrthogonal()) { tmp<fvScalarMatrix> tpEqn; if (pressureImplicitPorosity) { tpEqn = ( fvm::laplacian(rho*trTU(), p) + fvOptions(psi, p, rho.name()) == fvc::Div(phiHbyA) ); } else { tpEqn = ( fvm::laplacian(rho*trAU(), p) + fvOptions(psi, p, rho.name()) == fvc::Div(phiHbyA) ); } tpEqn().setReference(pRefCell, pRefValue); tpEqn().solve(); if (simple.finalNonOrthogonalIter()) { phi = phiHbyA - tpEqn().flux(); } } #include "incompressible/continuityErrs.H" // Explicitly relax pressure for momentum corrector p.relax(); if (pressureImplicitPorosity) { U = HbyA - (trTU() & fvc::grad(p)); } else { U = HbyA - trAU()*fvc::grad(p); } U.correctBoundaryConditions(); fvOptions.correct(U); // For closed-volume cases adjust the pressure and density levels // to obey overall mass continuity if (closedVolume) { p += (initialMass - fvc::nobiggrin mainIntegrate(psi*p)) /fvc::nobiggrin mainIntegrate(psi); } rho = thermo.rho(); rho = max(rho, rhoMin); rho = min(rho, rhoMax); rho.relax(); Info<< "rho max/min : " << max(rho).value() << " " << min(rho).value() << endl; }
Bevor ich mit EEqn weitermache erstmal die beiden :-) Danke für ein paar Tipps Lg Moritz
------------------ Moritz Franke Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Shor-ty Moderator
     

 Beiträge: 2466 Registriert: 27.08.2010 ESI-OpenCFD OpenFOAM v2312
|
erstellt am: 06. Jul. 2016 15:38 <-- editieren / zitieren --> Unities abgeben:          Nur für Studentenmensch
Hi Moritz, FOAM hat sich ziemlich stark verändert seit den Anfängen. Am Anfang war das alles noch etwas leichter zu verstehen aber es wird immer notwendiger die Numerik und wirklich Ahnung von Gleichungen zu haben. Da in FOAM immer mehr Wert auf numerische Stabilisierung und konsistenz der Gleichungen gelegt wird. Zu deiner Frage. Numerisch betrachtet löst man die NS Gleichung nicht, da dies nicht möglich ist. Du hast Ux, Uy, Uz und p als Unbekannte. Allerdings hast du nicht 4 Gleichungen in denen diese vorkommen. Zwar hast du drei NS Gleichungen + Massenerhaltung (4 Gleichungen) aber in der Massenerhaltung kommt kein Druck vor, somit kann das Gleichungssystem nicht ohne Weiteres gelösen werden. Heißt, es kann nicht direkt gelöst werden, sondern muss mittels iterativen Methoden bestimmt werden. Zur Berechnung verwendet man nicht direkt die U und p Felder sondern bezieht sich hauptsächlich auf die sogenannten Fluxes (phi). In UEqn.H wird die Matrix für die Momentum-Gleichung (ohne Druckterm) konstruiert (Matrix) aber nicht gelöst wenn MomentumCorrector = false. Allerdings braucht man die Matrix später bei der Druckberechnung. Um die Dinge einfach zu halten nehmen wir an das momentumCorrector an ist. D.h. du konstruierst deine NS ohne Druckterm und berechnest dir aufgrund des vorhanden Geschwindigkeitfeldes die Fluxes an jedem Face deiner diskretisierten Domain. Diese Fluxes müssen die Kontinuität erfüllen. Da aber die berechneten Fluxes ohne Druck berechnet worden sind kann zwar die Konti erfüllt sein aber dann stimmt das Druckfeld nicht. Somit muss man mittels den Fluxes ein neues Druckfeld berechnen, die Fluxes neu berechnen und schauen das das Druck und Geschwindigkeitsfeld so übereinstimmen, dass die Massenerhaltung stimmt. Man bricht aber irgendwann vorher ab wenn der Fehler (Residual) eine gewisse Grenze erreicht. Wie man das letztlich macht (Druck-Geschwindigkeitskorrektur) hängt davon ab welchen Algorithmus man verwendet, PISO, SIMPLE, PIMPLE, SIMPLEC, SIMPLER usw... Um die Druckgleichung verstehen zu können brauchst du schon etwas mehr Wissen im Bereich der Druck-Geschwindigkeitskorrektur Algorithmen. Ich empfehle hier den Ferziger, dann verstehst du auch die pEqn.H etwas besser. Das hier:
Code:
// Construct the Momentum equation tmp<fvVectorMatrix> UEqn ( fvm::Div(phi, U) + turbulence->divDevRhoReff(U) == fvOptions(rho, U) ); UEqn().relax();
Ist die Navier-Stokes-Gleichung ohne (-grad(p)). Zusementhält diese Gleichung einen Source-Term den man in fvOptions einfügen könnte. Wird keine fvOptions verwendet, ist der Source Term Null. Warum man das macht ist einfach. Der User hat nun die Möglichkeit ohne Hard-Coding die Momentum-Gleichung mittels bestimmter Soruce-Terme zu verändern (during run time). Wenns dich wirklich interessiert wieso der oben genannte Code die NS Gleichung repräsentiert, dann kannst du das bei mir nachlesen: Mathematics, Numerics, Derivations and OpenFOAM. Das was du suchst sind die letzten Kapitel -> divDevRhoREff. Ansonsten hast du in pEqn.H eben noch zusätzlich Korrekturen bezüglich Porosität, subsonische, transonische etc. Für den Anfang glaube ich eine sehr gute Einführung 
------------------ Viele Grüße, Tobias Holzmann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Studentenmensch Mitglied Student

 Beiträge: 47 Registriert: 12.05.2016
|
erstellt am: 07. Jul. 2016 14:16 <-- editieren / zitieren --> Unities abgeben:         
Zitat: FOAM hat sich ziemlich stark verändert seit den Anfängen. Am Anfang war das alles noch etwas leichter zu verstehen aber es wird immer notwendiger die Numerik und wirklich Ahnung von Gleichungen zu haben.
Um beim kommerziellen Support abzuzocken? Wo bleibt dann der OpenSource Spirit? Danke aufjedenfall für deinen Support Tobi Holzmann :-) Hört sich ziemlich komplex an. Da war mal was mit Row-Chie Interpolation , sowas hatte ich mal gehört :-) Wie spielen denn in das ganze Thema die RANS Gleichungen rein? Letztlich löst man das ganze Strömungsfeld ja auf den gemittelten NS Gleichungen? Grüße moritz ------------------ Moritz Franke Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Shor-ty Moderator
     

 Beiträge: 2466 Registriert: 27.08.2010 ESI-OpenCFD OpenFOAM v2312
|
erstellt am: 08. Jul. 2016 00:13 <-- editieren / zitieren --> Unities abgeben:          Nur für Studentenmensch
Zitat: Original erstellt von Studentenmensch:
Um beim kommerziellen Support abzuzocken? Wo bleibt dann der OpenSource Spirit? Danke aufjedenfall für deinen Support Tobi Holzmann :-) Hört sich ziemlich komplex an. Da war mal was mit Row-Chie Interpolation , sowas hatte ich mal gehört :-) Wie spielen denn in das ganze Thema die RANS Gleichungen rein? Letztlich löst man das ganze Strömungsfeld ja auf den gemittelten NS Gleichungen? Grüße moritz
Hi, immer ganz ruhig. Du bekommst eine Toolbox die wirklich viel kann und die OpenSource ist. Die Änderung sind aufgrund der Konsistenz von Gleichungen und Neuerungen in der Numerik zurückzuführen. Da wird zwangsläufig alles etwas komplexer. Die Dinge beim "alten" zu lassen wäre schlichtweg falsch und würde FOAM nicht konkurenzfähig machen. Natürlich ist es von der Anwenderseite aus gesehen mühseeliger zu verstehen aber mal eherlich - wenn man sich nicht bewusst ist was man macht, dann kann man auch direkt nen kommerzielles Programm kaufen. Du siehst schon, ich steuer extrem gegen deine Aussage, da ich selber den OpenSource Gedanken für richtig halte, allerdings finde ich es auch notwendig das diverse Änderungen gemacht werden, die möglicherweise auch auf die Lesbarkeit/das Verständnis Einfluss nehmen. Trotz alledem das FOAM Open Source ist, müssen die Leute Geld verdienen (na klar durch Schulungen und kommerziellen Support, und dass wenn der Code komplexer wird, sich größere Supportlücken ergeben mag auch einleuchten, allerdings ist es auch notwendig die Toolbox zu verbessern). Ich merks bei mir - steck viel Arbeit in Foren, freiwillige Arbeit (www.holzmann-cfd.de) und für was? Richtig für nichts. Ich bekomm kein Geld dafür und auch kaum Rückmeldung. Ich mach das derzeit nur aus Überzeugung das vom Open Source Gedanken und hoff das irgendwann was zurückkommt. Ob 's so ist, kann ich nicht sagen oder vorhersehen. Hoffen ist das einzige das bleibt, wie beim Spiel gegen Frankreich heute. Viel gekämpft kann man stolz auf unsere Elf sein aber letztlich zählt halt der Titel. Ob man unter den Top 4 ist interessiert letztlich auch niemand oder? Ähnlich bei mir oder bei Foam - man muss konkurenzfähig bleiben (: So das wars aber auch mit dem kleinen Ausflug (: Eins noch - FOAM bietet die Möglichkeit den Code zu betrachten. Du hast also die Möglichkeit nachzuvollziehen was gemacht wird (jeden kleinen Schritt). Es obliegt also an dem User selber (: ------------------ Viele Grüße, Tobias Holzmann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |