Diese flüssige Simulation basiert auf einem Papier von Stam . Auf Seite 7 beschreibt er die Grundidee der Advektion:
Beginnen Sie mit zwei Rastern: eines, das die Dichtewerte aus dem vorherigen Zeitschritt und eins enthält Das wird die neuen Werte enthalten. Für jede Rasterzelle des Letzteren verfolgen wir das Zentrum der Zelle Position rückwärts durch das Geschwindigkeitsfeld. Wir interpolieren dann linear aus dem Raster von vorherige Dichtewerte und weisen Sie diesen Wert der aktuellen Rasterzelle zu.
Verbessern Sie den Code. Die beiden Dichtegitter sind d
und d0
, u
und v
sind Geschwindigkeitskomponenten, dt
ist der Zeitschritt, N
(global) ist die Gittergröße, b
kann ignoriert werden:
Diese Methode ist kurz und funktioniert gut genug, aber die Implementierung von Objektgrenzen ist schwierig für mich herauszufinden, weil Werte rückwärts verfolgt und interpoliert werden. Meine derzeitige Lösung besteht darin, die Dichte einfach außerhalb der Grenzen zu verschieben, wenn daneben ein leerer Raum (oder Leerzeichen) vorhanden ist, der jedoch ungenau ist und Dichte erzeugt, insbesondere an Ecken und Bereichen mit diagonaler Geschwindigkeit. Streik> nur visuell korrekt. Ich suche jetzt nach "Korrektheit".
Relevante Teile meines Grenzcodes:
%Vor% bound
ist ein Vektor von Bools mit Zeilen und Spalten 0
bis N+1
. Grenzobjekte werden vor der Hauptschleife eingerichtet, indem Zellkoordinaten in bound
auf 1
gesetzt werden.
Das Papier sagt vage: "Dann müssen wir einfach hinzufügen
einige Code in die set_bnd()
Routine, um Werte für die besetzten Zellen aus den Werten von zu füllen
Ihre direkten Nachbarn ", was ich mache. Ich suche nach einer Möglichkeit, Grenzen genauer zu implementieren, das heißt nicht-fließende feste Grenzen zu haben und eventuell Grenzen für mehrere Flüssigkeiten zu unterstützen. Visuelle Qualität ist viel wichtiger als physikalische Korrektheit.
Ihre Antwort kommt eher aus der Physik als aus der Simulation. Da es sich um Grenzen handelt, muss Ihr Geschwindigkeitsfeld die Prandtl-Rutschgrenze erfüllen, die besagt, dass die Geschwindigkeit an der Grenze null sein muss. Siehe Ссылка für (viele) weitere Informationen. Wenn Ihr Geschwindigkeitsfeld dieses Kriterium nicht erfüllt, haben Sie die Schwierigkeiten, die Sie beschreiben, einschließlich der Advektion von Masse über eine Grenze hinweg, was eine ziemlich grundlegende Verletzung des Modells darstellt.
Sie sollten sich auch darüber im Klaren sein, dass dieser Advektionscode die Dichte nicht bewahrt (durch Design) und dass das Erhaltungsgesetz am Ende behoben wird. Sie müssen diesen Schritt beachten, da die Hodge-Dekomposition des Vektorfelds auch anwendbare Randbedingungen hat.
Sie könnten an "The Art of Fluid Animation" von Jos Stam (Sept. 2015) interessiert sein. Um Seite 69 er diskutiert Randbedingungen in einigen Details. .
Vielleicht auch von Interesse: Ссылка .
"The Perfect Storm" war vor einer Weile, also muss dein flüssiger Sim entweder sehr groß, sehr schnell oder sehr detailliert sein. Vorzugsweise alle drei. Einige verwenden möglicherweise eine GPU, wenn ihr Anwendungsfall dies zulässt.
Vielleicht hilft es ..
Tags und Links c++ interpolation fluid-dynamics simulation