Autor
|
Thema: parametrierte Erstellung strukturierter Gitter (3240 mal gelesen)
|
easwood Mitglied
Beiträge: 11 Registriert: 22.01.2014
|
erstellt am: 22. Jan. 2014 08:47 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich bin Neuling in OpenFoam und beschäftige mich im Moment vor allem mit der Gittergenerierung. Für meine weitere Arbeit will ich strukturierte Gitter automatisiert und parametriert erstellen. Bei der Geometrie handelt es sich im Moment um einfache rechteckige Blöcke, die zu einem großen Netz zusammengebaut werden sollen. Ich habe mir das so vorgestellt, dass ich in einer Datei Ortsvektoren zu einem definierten Nullpunkt (x0, y0, z0) und Größe (Höhe, Breite, Tiefe) für verschiedene rechteckige Blöcke angebe und daraus anschließend mit BlockMesh ein Gitter zusammenbasteln kann. Zu Beginn habe ich das komplette Gitter in ein BlockMeshDict geschrieben und wollte daraus das Gitter erzeugen. Das funktioniert theoretisch auch, allerdings habe ich recht schnell festgestellt, dass mein Arbeitsspeicher für diese Aufgabe sehr schnell an seine Grenzen stößt, denn BlockMesh hat die Rechnung einfach abgebrochen (Ausgabe in der Kommandozeile: killed). Daher meine Fragen: Wie kann ich so ein Gitter parallelisiert mit BlockMesh erstellen oder gibt es einen einfacheren Weg? Kann ich einzelne Blöcke, die mit BlockMesh erstellt wurden, einfach zu einem zusammenhängenden Gitter zusammenbauen oder muss ich da immer dieses mergeMeshes verwenden (rechnet auch ziemlich lang). Gibt es ein anderes OpenSource-Tool, das für diese Aufgabe besser geeignet ist als BlockMesh? Ist es für so einfache Geometrien sinnvoll, einen eigenen Gittergenerator (für ein strukturiertes Hexaedernetz) zu schreiben oder gibt es so etwas schon? Hat jemand damit Erfahrung bzw. Literatur? Das sind sehr viele Fragen, die mich im Moment ein wenig quälen. Ich wäre für jede Hilfe dankbar. Gruß Easwood Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Wurstfred Mitglied
Beiträge: 14 Registriert: 27.11.2013 OpenFoam-2.2.x SuSe 12
|
erstellt am: 23. Jan. 2014 09:37 <-- editieren / zitieren --> Unities abgeben: Nur für easwood
Hi, ich beantworte dir mal ein paar Fragen. Parametrisierung blockMeshDict einfach: Code: convertToMeters 0.001;// (xmax-xmin)/a = (ymax-ymin)/b = (zmax-zmin)/c a 75; b 56; c 56; xmin -25; xmax 175; ymin -25; ymax 125; zmin -25; zmax 100; vertices ( ($xmin $ymin $zmin) //0 ($xmax $ymin $zmin) //1 ($xmax $ymax $zmin) //2 ($xmin $ymax $zmin) //3 ($xmin $ymin $zmax) //4 ($xmax $ymin $zmax) //5 ($xmax $ymax $zmax) //6 ($xmin $ymax $zmax) //7 );
blocks ( hex (0 1 2 3 4 5 6 7) ($a $b $c) simpleGrading (1 1 1) );
Für erweiterte Parametrisierung mit Formel, Berechnungen etc. googelst du am besten mal nach "m4 blockmesh openfoam" oder so, ansonsten gibt es dazu auch schon manche Tutorials die das benutzen:
Code: /OpenFOAM-2.2.x/tutorials> find -name *.m4 -type f ./incompressible/simpleFoam/mixerVessel2D/constant/polyMesh/blockMeshDict.m4 ./incompressible/pimpleDyMFoam/mixerVesselAMI2D/constant/polyMesh/blockMeshDict.m4 ./incompressible/SRFPimpleFoam/rotor2D/constant/polyMesh/blockMeshDict.m4 ./incompressible/porousSimpleFoam/angledDuctImplicit/constant/polyMesh/blockMeshDict.m4 ./multiphase/twoPhaseEulerFoam/mixerVessel2D/constant/polyMesh/blockMeshDict.m4 ./multiphase/compressibleTwoPhaseEulerFoam/mixerVessel2D/constant/polyMesh/blockMeshDict.m4 ./multiphase/MRFInterFoam/mixerVessel2D/constant/polyMesh/blockMeshDict.m4 ./multiphase/interDyMFoam/ras/sloshingTank2D/constant/polyMesh/blockMeshDict.m4 ./multiphase/interDyMFoam/ras/sloshingTank3D/constant/polyMesh/blockMeshDict.m4 ./multiphase/interDyMFoam/ras/sloshingTank3D6DoF/constant/polyMesh/blockMeshDict.m4 ./multiphase/interDyMFoam/ras/sloshingTank3D3DoF/constant/polyMesh/blockMeshDict.m4 ./multiphase/interDyMFoam/ras/sloshingTank2D3DoF/constant/polyMesh/blockMeshDict.m4 ./multiphase/multiphaseEulerFoam/mixerVessel2D/constant/polyMesh/blockMeshDict.m4 ./multiphase/MRFMultiphaseInterFoam/mixerVessel2D/constant/polyMesh/blockMeshDict.m4 ./compressible/rhoPorousSimpleFoam/angledDuctImplicit/constant/polyMesh/blockMeshDict.m4 ./compressible/rhoPimplecFoam/angledDuct/constant/polyMesh/blockMeshDict.m4 ./compressible/rhoPimpleFoam/ras/angledDuct/constant/polyMesh/blockMeshDict.m4 ./compressible/rhoPimpleFoam/ras/mixerVessel2D/constant/polyMesh/blockMeshDict.m4 ./compressible/rhoSimpleFoam/angledDuctExplicitFixedCoeff/constant/polyMesh/blockMeshDict.m4 ./compressible/rhoLTSPimpleFoam/angledDuct/constant/polyMesh/blockMeshDict.m4
Zum parallel laufen weiß ich selbst nicht viel, Google hat mir das ausgegeben: http://www.cfd-online.com/Forums/openfoam/84546-blockmesh-parallel-mesh-generation.html Fragen die noch offen sind: -andere Mesher -Literatur -Mesher selbst schreiben -Wieso bricht dein blockMesh ab Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Shor-ty Moderator
Beiträge: 2463 Registriert: 27.08.2010 OpenFOAM-dev (Foundation) OpenFOAM-xxxx (ESI)
|
erstellt am: 23. Jan. 2014 12:19 <-- editieren / zitieren --> Unities abgeben: Nur für easwood
Hallo, - wieso bricht blockMesh bei dir ab ? Ich schätze nicht das du einen schlechten Rechner hast - wie viele Zellen erstellst du denn? BlockMesh läuft bei mir zwischen 0,1s bis max 4s. Kannst du mal dein Dict posten? - Parallelisierung kann du meines Erachtens mit blockMesh nicht machen - müsste ich aber heute Abend nochmals nachschauen. Aber prinzipiell nicht weil die Parallelisierung auf ein Zersplitten des Netzes zurückzuführen ist, sodass jeder Kern eine eigene Domain hat. Beim Vernetzen von sHM ist das das selbe. Das Hintergrundnetz wird in kleine Domains gesplittet und jeder Kern berechnet dann die Deformation/Manipulation des Netzes. BlockMesh parallel auszuführen ergibt für mich auch keinen Sinn. Passt deine OpenFOAM Installation? ------------------ Grüße Tobias Holzmann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
easwood Mitglied
Beiträge: 11 Registriert: 22.01.2014
|
erstellt am: 27. Feb. 2014 08:36 <-- editieren / zitieren --> Unities abgeben:
Hallo, vielen Dank für eure Antworten. Mein blockMeshDict hatte zu viele Zellen, deswegen hat blockMesh abgebrochen (Arbeitsspeicher zu gering). Es bleibt für mich aber die Frage, wie ich um ein Bauteil für ein Fluid automatisiert ein Gitter erstellen kann. Als Beispiel habe ich eine Testgeometrie angehängt: Die Maße 500x800x1800 entsprechen dabei dem Fluidvolumen (alles rechtwinklig). Wie kann ich nun möglichst automatisiert, ein Gitter für das Fluidvolumen (um die Bauteile herum) erzeugen? Ich habe schon einiges in perl gescriptete, um einzelne Blöcke um die roten Bauteile herum in blockMesh zu erzeugen. Geht das vielleicht einfacher? Kann man mit einem Befehl die roten Bauteile aus einem rechteckigen Fluidblock herausschneiden? Vielen Dank für eure Hilfe
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Wurstfred Mitglied
Beiträge: 14 Registriert: 27.11.2013 OpenFoam-2.2.x SuSe 12
|
erstellt am: 27. Feb. 2014 10:02 <-- editieren / zitieren --> Unities abgeben: Nur für easwood
Hey, wie oben schon erwähnt sollte das doch echt mit m4 möglich sein. Mit snappyhexMesh könntest du zwar auch anfangen aber ehrlich gesagt nach meinen schwierigkeiten mit snappy würde ich mir lieber die Mühe machen und das mit blockMesh aufbauen bzw. einem anderen Programm und dann importieren. Vor allem auch weil die Geometrie so simple ist. Deine Geometrie ist ziemlich einfach und hat ja einen periodischen Aufbau. Das sollte eigentlich mit den von dir eingegebenen Werten sowie 2-3 verschachteteln Schleifen möglich sein. Schwierig wird wahrscheinlich nur die Sortierung der Werte für die einzelnen hexaeder in blockMeshDict. Aber eigentlich sollte das kein Problem darstellen. Sind nur ein paar Gedanken die mir gerade eingefallen sind. Gruß [Diese Nachricht wurde von Wurstfred am 27. Feb. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
easwood Mitglied
Beiträge: 11 Registriert: 22.01.2014
|
erstellt am: 28. Feb. 2014 10:48 <-- editieren / zitieren --> Unities abgeben:
Hallo, danke für deine Antwort, Wurstfred. naja für dieses einfache Beispiel geht das mit Sicherheit mit m4. Ich will die Blöcke aber beliebig in diesem Fluidvolumen verschieben und dann befürchte ich, dass es mit m4 ziemlich kompliziert wird. Unabhängig davon, welche Skriptsprache ich dafür verwende, die Sache für blockMesh zu parametrieren, bin ich mir nicht sicher, wie ich das überhaupt in blockMesh umsetzen kann. Meine ersten Gedanken, es in blockMesh umzusetzen waren folgende: 1.) "Zerstückeln" des Fluidbereichs in möglichst wenige Blöcke um die Bauteile herum 2.) Mergen der einzelnen Blöcke mit mergePatchPairs Problem von 2.) laut UserGuide: "it is inadvisable to merge a patch twice, i.e. include it twice in mergePatchPairs". Wenn man vermeiden will, dass keine Fläche der erstellten Fluidblöcke mehr als 1 mal gemergt werden muss, wird das ganze aber sehr schnell sehr kompliziert bzw. man benötigt extrem viele Blöcke. Deswegen meine Fragen: - Gibt es die Möglichkeit, aus einem kompletten Fluidblock die Bauteile herauszuschneiden? - Kann ich einzelne Blöcke, die mit blockMesh erzeugt wurden, irgendwie anders zu einem Netz zusammenbauen (ohne mergePatchPairs) Vielen Dank für eure Hilfe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
easwood Mitglied
Beiträge: 11 Registriert: 22.01.2014
|
erstellt am: 16. Jun. 2014 15:02 <-- editieren / zitieren --> Unities abgeben:
Hallo, im Moment habe ich das Ganze so aufgesetzt, dass ich mit blockmesh ein quaderförmiges Netz für den Fluidbereich erstelle und anschließend mit toposet und splitmeshregions die Bauteile aus diesem Fluidbereich herausschneide. Dabei ergibt sich allerdings das Problem, dass mein blockMesh-Netz sehr fein sein muss, damit das Herausschneiden sauber funktioniert. Wenn die Bauteile zwischen zwei Gitterzellen (des Fluidbereichs) liegen, werden komische Zellen und zusätzliche domains erzeugt. Hat jemand Erfahrung mit splitmeshregions und kann mir da weiterhelfen? vielen Dank Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Shor-ty Moderator
Beiträge: 2463 Registriert: 27.08.2010 OpenFOAM-dev (Foundation) OpenFOAM-xxxx (ESI)
|
erstellt am: 17. Jun. 2014 12:07 <-- editieren / zitieren --> Unities abgeben: Nur für easwood
Hallo eastwood, arbeite schon sehr lange mit snappyHexMesh und meines Erachtens ist das Tool überhaupt nicht schwer zu händeln. Das ist aber wohl Ansichtssache. Für dein Problem kommt mir gerade eine sehr schnelle Idee. -> Hintergrundnetz (grob) erzeugen (ist ja immer gleich), dann einen deiner Blöcke als STL File erzeugen und speichern (natürlich die Position wissen). Dann diese STL mit einem Skript in constant/triSurface/ kopieren. Als nächstes eine Kopie anlegen (Block_2). Diesen dann mittels Skript auf eine Position setzen (transformPoints/scaleSurfacePoints oder so ähnlich - ist ein implementiertes Tool in OpenFOAM). Das machst du dann x mal bis du alle Blöcke positioniert hast. Danach startest du sHM und fertig. Die sHMDict müsstest du "einmal" so generieren das es für deinen Fall passt. Aber das ist sehr einfach und wenn du es benötigst, kannst du das File via Skript auch anpassen. Du könntest dann auch ein "setupCase" erstellen, diesen dann kopieren, die oben genannten Änderungen durchführen und zusätzlich simulieren. Skripting von den OpenFOAM Dingen würd ich mal auf ein(e) (paar) Stunde(n) schätzen. Die Implementierung deiner Verschiebung musst du dir halt selber ausdenken. Wäre mein Vorschlag. PS: Wenn es in deinem Fall sowieso nur Würfel sind, kannst du mit sHM nur mit castellated meshen und erhältst ein reines Hexaedernetz. Sofern deine Positionen deiner Würfel an genauen Gitterpunkten vorzufinden sind, erhältst du sogar ein exaktes Hexaedernetz.
------------------ Best regards, Tobias Holzmann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| |
easwood Mitglied
Beiträge: 11 Registriert: 22.01.2014
|
erstellt am: 18. Jun. 2014 08:50 <-- editieren / zitieren --> Unities abgeben:
Hallo Tobias, danke für deinen Input. Mit sHM habe ich mich bisher noch nicht beschäftigt, deswegen werde ich mir das gleich mal anschauen. Was ich nicht so ganz verstanden habe. Was meinst du mit "exaktes Hexaedernetz" bzw. was würde passieren, wenn die Positionen der Quader nicht an "genauen Gitterpunkten (?)" nicht an genauen Gitterpunkten vorzufinden sind? Gruß Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|