Symulacje komputerowe dynamiki płynów LBM i Karman vortex street Beata Kowal 1 Wstęp 1.1 LMP LBM (Lattice Boltzmann methods) to metody komputerowej symulacji płynów. Zamiast rozwiazywac równanie Naviera-Stokesa rozwiązujemy równanie Boltzmanna, aby zasymulować przepływ płynu. Model Bhatnagar-Gross-Krook (BGK) zadaje człon kolizji w równaniu Boltzmanna. Odbicia i translacje są zdefiniowane w następujący sposób: Krok odbicia f i (x, t + δt) = f i (x, t) + 1 τ (f eq f i ) krok translacji f i (x + e i δt, t + δt) = f i (x, t + δt) Gdzie i to kierunek, a δ x to jednostka sieci. Wektory sieci e i : e 0 = (0, 0) e 1 = (1, 0) e 2 = (0, 1) e 3 = ( 1, 0) e 4 = (0, 1) e 5 = (1, 1) e 6 = ( 1, 1) e 7 = ( 1, 1) e 8 = (1, 1) Funkcja f eq i jest ( funkcja rozkładu ) prawdopodobieństwa w stanie równowagi. f eq = ρ 2πRT exp (e u)2 2RT 1
= ρ 2πRT exp ( = 3ρ 2πc 2 exp f eq i = 3ρ = ρw i exp e2 2RT ( 3e2 2πc 2 exp ) ( exp ( 3eu c 2 ) 2c exp 2 ( ) 3e2 i 2c exp 2 ( ) 3e iu c 3u2 2 2c 2 Wagi w i : w 0 = 4/9 w 1, w 2, w 3, w 4 = 1/9 w 5, w 6, w 7, w 8 = 1/36 Odbicia od brzegu sieci: eu RT u2 2RT ) 3u2 2c 2 ) ( ) 3e iu c 3u2 2 2c 2 1.2 Karman vortex street Pisząc program skupiłam się na problemie ścieżki wirowej von Karmana. Gdy ciecz przepływa przez kanał z przeszkodą dla odpowiednio dużej liczby Reynoldsa za przeszkodą tworzą się struktury wirowe. ścieżka wirowa von Karmana na morzu Grenlandzkim (NASA image by Jeff Schmaltz, http://earthobservatory.nasa.gov/naturalhazards/view.php?id=77654) 2
2 Opis programu Klasa Vertex zawiera: f[9] - tablica 9-elementowa opisująca rozklad prawdopodobienstwa Solid - czy węzeł jest ściana lub przeszkodą i,j - współrzędne węzła. Vertex(), Vertex(int,int) - konstruktory Neighbours - tablica sąsiadów węzła SetNeighbour(int, Vertex) - ustawienie sąsiadów węzła SetZero - zerowanie tablicy f[9] Klasa Grid zawiera: Width, Height - szerokość i wysokość sieci Grid() - konstruktor. Vertices - tablica dwuwymiarowa węzłów sieci Vertex this[int,int] - sieć ma charakter tablicy ClearStates() - czyszczenie tablicy węzłów Mod(int,int) - funkcja modulo Klasa Simulation zawiera: Tau - parametr lepkosci V - maksymalna predkosc źródła w[9] - tablica 9-elementowa wag e[9] - tablica 9-elementowa wektorow dwuwymiarowych sieci MaxDensity, MinDensity - maksymalna i minimalna gestosc MaxSpeedSq - maksymalna predkosc do kwadratu Width, Height - szerokość i wysokość sieci SimulationGrid, BackupGrid - dwie sieci, BackupGrid ewoluuje z Simulation- Grid, a następnie zamieniamy sieci. Vertex this[int,int] - sieć SimulationGrid ma charakter tablicy dwuwymiarowej Simulation(int,int) - konstruktor Evolution() - krok ewolucyjny StepTransition() - krok translacji i odbicia StepCollision() - krok kolizji feq(double,vector,int) - funkcja rozkladu w stanie równowagi SetStart() - generuje predkości w stanie początkowym SetSource() - generuje źródło SetSolid(int, int) - ustawia w węźle własność przeszkody SetZero() - zerowanie sieci Density(int, int) - masa cząstek w węźle Momentum(int, int ) - pęd cząstek w węźle Klasa Particle zawiera: x, y -współrzędne Birthday - moment narodzin 3
Particle(float, float, int) - konstruktor Klasa Vector zawiera: x, y -współrzędne Vector(double, double) - konstruktor operator +(Vector,Vector), operator *(Vector,Vector), operator *(Vector,double), operator *(double,vector), operator /(Vector,double)- działania na wektorach Klasa VisualizerMacro zawiera: BufferContext, Buffer - zmienne związane z buforem, po którym rysujemy Simulation - instancja klasy Simulation Timer - uruchamia funkcję Step w równych odstepach czasu DensityIsOn - włącznik wizualizacji gęstości ParticlesIsOn - włącznik cząstek SimulationStep - delegat kroku symulacji Nr - numer kroku MoveParticles(int) - przesuwa czastki DrawParticles(Graphics) - rysuje czastki IsOn - włącznik timera TimeInterval - przedział czasu pomiędzy krokami Reset(int,int,double)-tworzenie nowej symulacji z parametrami wysokość, szerokość, tau VisualizerMacro() -konstruktor Pixel(Graphics, float, float, int) - rysowanie piksela Disk(Graphics, float, float, float) - rysowanie kółka Draw() - rysowanie sieci ResizeBuffer() - ustawia wielkość buforu Step(object, EventArgs ) - wykonuje kolejny krok OnResize(EventArgs) - funkcja, która uruchamia się przy zmianie rozmiaru okna. OnPaint(PaintEventArgs), OnPaintBackground(PaintEventArgs ) - funkcje, które uruchamiają się, gdy kontrolka ma się narysować. Dispose(bool) - czyszczenie zasobów Klasa WindowLBM zawiera w pliku Window.cs: WindowLBM()-konstruktor StartButton Click(object, EventArgs ) - gdy naciskany jest przycisk start ResetButton Click(object, EventArgs ) - gdy naciskany jest przycisk reset IntervalScrollBar ValueChanged(object, EventArgs ) - gdy przesuwany jest suwak visualizermacro SimulationStep() - licznik kroków checkboxdensity CheckedChanged(object, EventArgs) - włączenie / wyłaczenie wizualizacji gęstości checkboxparticles CheckedChanged(object, EventArgs) - włączenie / wyłączenie 4
źródła cząstek StringToInt(string) - funkcja pomocnicza, która przekształca string na int StringToDouble(string) - funkcja pomocnicza, która przekształca string na double Oprócz tego WindowLBM.designer.cs - plik wygenerowany przez Visual Studio - zawiera budowę okna. 3 Obsługa programu W programie możemy wygenerować sieć gdzie od górnej i dolnej granicy cząstki się odbijają, z lewej strony znajduje się źródło cząstek a po prawej ujście. W programie możemy regulować czas pomiędzy krokami symulacji przy pomocy suwaka a także zatrzymać symulację klawiszem stop. Możemy zmienić wymiary sieci, współczynnik lepkości τ - po wprowadzeniu tych zmian należy wcisnąć reset, aby wygenerować sieć z nowymi parametrami. Można włączyć i wyłączyć strumienie barwnych cząstek poruszających się wraz z płynem oraz włączyć i wyłączyć zabarwienie obrazujące gęstość płynu. Źródło płynu wzdłuż lewego brzegu ma wartości prędkości w postaci paraboli, wartośc 0 na brzegach i maksymalna wartość pośrodku strumienia. 5
4 Wyniki Wygenerowałam symulacje dla sieci 50x150 i dla różnych wartości parametru τ. Po około 10 000 kroków symulacji otrzymałam grafiki. Dla odpowiednio małej wartości τ obserwujemy ścieżkę wirową von Karmana. Dla τ = 0.6 Dla τ = 0.56 Dla τ = 0.55 6
Przy włączonej funkcji wizualizacji gęstości płynu: Dla τ = 0.6 Dla τ = 0.56 Dla τ = 0.55 7
Bibliografia [1] stackoverflow.com [2] A Practical Introduction to the Lattice Boltzmann Method, Alexander J. Wagner [3] Badanie zjawisk zachodzących w cieczach nieściśliwych metodą cząstek znaczonych, M.Matyka 8