Pierwszy case - przepływy potencjalne i laminarne, wizualizacja Karol Wędołowski, IGF/ICM UW
Czym będziemy się zajmować? () Problem fizyczny opływ cylindra Przepływ potencjalny (nieściśliwy i bezwirowy) Lepki, nieściśliwy przepływ laminarny (2) Struktura case'u w praktyce (streamfunctionfoam) Tworzenie siatki blockmesh i blockmeshdict Wstępna uwaga o wizualizacji paraview i parafoam ZADANIE znajdź i popraw błąd w siatce Warunki początkowe i brzegowe folder 0 : psi ZADANIE 2 uzupełnienie warunków brzegowych Wizualizacja c.d. ZADANIE 3 porównania z rozwiązaniem analitycznym (3) Symulacja lepkiego przepływu laminarnego Solver icofoam dodatkowy plik transportproperties, zmiany w katalogu system. ZADANIE 4 uzupełnienie pliku controldict ZADANIE 5 zmiana liczby Reynoldsa, wizualizacja
Opływ cylindra przepływ potencjalny 2D Założenia: U =0 U =0 Wnioski: e x ey y x U = e x e z y y 2 =0 U= 2 =0 Równania laplace'a na potencjał skalarny i funkcję prądu. Jeden stopień swobody cyrkulacja wokół cylindra. Przepływ jest zdefiniowany przez warunki brzegowe na funkcję prądu! Rozwiązanie analityczne (dla zerowej cyrkulacji): [ U x =U U y =U Wartość funkcji prądu dla przepływu potencjalnego r cos 2 R r sin 2 R ]
Opływ cylindra lepki przepływ nieściśliwy Równania: U =0 U U U = p 2 U t Równania zmienne w czasie, ale dochodzące do stanu stacjonarnego Potrzebne są warunki brzegowe dla prędkości i ciśnienia Brak poślizgu na powierzchni cylindra Wartość prędkości dla Re=50 liczba Reynoldsa R e= RU
Co będzie potrzebne do ćwiczeń? () Plik pierwszycase.tar Rozpakowujemy poleceniem tar -xf pierwszycase.tar (2) Otwieramy katalog streamfunctionfoam Uruchamiamy polecenie wmake jest to kompilacja solvera (ale o tym później ) (3) Wracamy i otwieramy katalog cylinderstreamfunction
Struktura case'u cylinderstreamfunctionstart 0 constant psi system polymesh controldict fvscheme fvsolution blockmeshdict points faces owner neighbour otwieramy folder polymesh
Aplikacja blockmesh Służy do konstrukcji prostych strukturalnych siatek składających się z elementów zwanych blokami Możliwe jest tworzenie różnych kształtów komórek ale najłatwiej używa się komórek heksagonalnych Umożliwia tworzenie krawędzi, nie będących liniami prostymi np. łuków lub spline'ów Komunikacja z użytkownikiem przez plik tekstowy blockmeshdict Wymaga trochę cierpliwości i trójwymiarowej wyobraźni :-)
Aplikacja blockmesh
Aplikacja blockmesh Widok jednej ściany siatki (z=-0,5 m) wraz z numeracją bloków i punktów.
Plik blockmeshdict Jak zdefiniować siatkę? W skrócie: Podzielmy interesującą nas geometrię na bloki (np. heksagonalne) Wypiszmy współrzędne wszystkich wierzchołków występujących w tych blokach (wspólne punkty wypisujemy tylko raz) Zdefiniujmy za ich pomocą bloki (przez podanie 8 punktów w odpowiedniej kolejności) Jeżeli część krawędzi utworzonych bloków ma być krzywymi, to definiujemy ich kształt. Przyporządkowujemy zewnętrzne ściany bloków do odpowiednich fragmentów brzegu obszaru (tzw. patches)
Plik blockmeshdict A na przykładzie: Otwórzmy plik blockmeshdict Zwróćmy uwagę z jakich części się składa vertices blocks edges patches mergepairs (nieistotne)
Plik blockmeshdict Vertices indeksowanie od 0! dobrze jest ponumerować kolejne punkty ( // oznacza komentarz, tak jak w C++) vertices ( (0.5 0-0.5) ( 0-0.5) (8 0-0.5) (8 0.70707-0.5) (0.70707 0.70707-0.5) (0.353553 0.353553-0.5) (8 2-0.5) Uwaga! W OpenFOAM zawsze używamy siatki trójwymiarowej (w przypadku 2D siatka ma jedną komórkę grubości w jednym z kierunków) //0 // //2 //3 //4 //5 //6... (- 0 0.5) (-2 0 0.5) (-2 0.70707 0.5) (-0.70707 0.70707 0.5) (-0.353553 0.353553 0.5) (-2 2 0.5) (-0.70707 2 0.5) Punkty o numerach 0-8 oraz 38-50 znajdują się w płaszczyźnie z=-0,5 m. Punkty o numerach 9-37 oraz 5-63 znajdują się w płaszczyźnie z=0,5 m. //3 //32 //33 //34 //35 //36 //37... ); (-2-0.70707 0.5) (-0.70707-0.70707 0.5) (-0.353553-0.353553 0.5) (-2-2 0.5) (-0.70707-2 0.5) //59 //60 //6 //62 //63
Plik blockmeshdict Blocks blocks ( ); (5 4 9 0 24 23 28 29) (0 4 5 9 20 23 24) ( 2 3 4 20 2 22 23) (4 3 6 7 23 22 25 26) (9 4 7 8 28 23 26 27) (5 6 0 9 34 35 29 28) (2 6 5 3 30 35 34) (3 2 5 4 32 3 34 33) (4 5 8 7 33 34 37 36) (5 9 8 8 34 28 27 37) (45 44 39 40 58 57 52 53) (40 39 0 53 52 20 9) (39 38 2 52 5 2 20) (42 4 38 39 55 54 5 52) (43 42 39 44 56 55 52 57) (44 45 48 47 57 58 6 60) (47 48 2 60 6 30 3) (46 47 2 3 59 60 3 32) (49 50 47 46 62 63 60 59) (50 43 44 47 63 56 57 60) lista wierzchołków (0 0 ) (0 0 ) (00 0 ) (00 20 ) (0 20 ) (0 0 ) (0 0 ) (20 0 ) (20 20 ) (0 20 ) (0 0 ) (0 0 ) (00 0 ) (00 20 ) (0 20 ) (0 0 ) (0 0 ) (20 0 ) (20 20 ) (0 20 ) liczba komórek w każdym kierunku ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) sposób zagęszczenia komórek //0 // //2 //3 //4 //5 //6 //7 //8 //9 //0 // //2 //3 //4 //5 //6 //7 //8 //9
Plik blockmeshdict Blocks Pojedynczy blok dzielimy na odpowiednią liczbę komórek w każdym z kierunków wyznaczonych przez lokalny układ współrzędnych. Sąsiadujące bloki muszą mieć wspólną ścianę podzieloną na komórki w taki sam sposób (inaczej używamy mergepairs). Blok można dzielić na komórki niejednorodnie, (np. lub edgegrading ). Kolejność numerowania wierzchołków w bloku wyznacza w nim lokalny układ współrzędnych.
Plik blockmeshdict Edges Definiując łuk pomiędzy dwoma punktami podajemy trzeci punkt leżący na tym samym okręgu. edges ( 0 5 (0.469846 0.70-0.5) 5 0 (0.70 0.469846-0.5) 4 (0.939693 0.34202-0.5) 4 9 (0.34202 0.939693-0.5) 9 24 (0.469846 0.70 0.5) 24 29 (0.70 0.469846 0.5) 20 23 (0.939693 0.34202 0.5) 23 28 (0.34202 0.939693 0.5) 6 (-0.469846 0.70-0.5) 6 0 (-0.70 0.469846-0.5)... W przypadku spline'ów podajemy listę punktów interpolacyjnych. ); 20 52 48 2 47 30 6 3 60 52 57 48 45 47 44 6 58 60 57 (0.939693-0.34202 0.5) (0.34202-0.939693 0.5) (-0.469846-0.70-0.5) (-0.70-0.469846-0.5) (-0.939693-0.34202-0.5) (-0.34202-0.939693-0.5) (-0.469846-0.70 0.5) (-0.70-0.469846 0.5) (-0.939693-0.34202 0.5) (-0.34202-0.939693 0.5)
ZADANIE Zbudować siatkę poleceniem blockmesh Obejrzeć ją w programie Paraview (polecenie parafoam) Znaleźć błędy w siatce i poprawić je w pliku blockmeshdict Ale najpierw, krótka uwaga o programie Paraview...
Program Paraview i polecenie parafoam Paraview jest darmowym (otwartym) programem służącym do wizualizacji danych. Odczytuje wiele formatów danych wejściowych, m.in. jest zintegrowana ze strukturą case'ów w OF. Najłatwiej, uruchomić polecenie parafoam z poziomu głównego katalogu case'u. Można też stworzyć pusty plik z rozszerzeniem.openfoam, uruchomić program poleceniem paraview i otworzyć utworzony plik poprzez file open UWAGA! W razie, gdyby program paraview wyświetlał dziwne kształty należy spróbować przed uruchomieniem wpisać w terminalu linijkę export LC_ALL=C
Program Paraview elementy siatki do wyświetlenia pola do załadowania sposób kolorowania obiektu sposób wyświetlania obiektu
Program Paraview wybór chwili czasowej linie prądu kalkulator przekrój pole wektorowe Wracamy do zadania...
Plik blockmeshdict Patches Jest to podział brzegu obszaru na oddzielne powierzchnie, na których można zadać różne warunki brzegowe. Do każdego zdefiniowanego fragmentu przyporządkowujemy odpowiednie ściany bloków, wykorzystanych w siatce. Ścianę określamy jako listę wierzchołków w kolejności takiej, aby definiowała ona wektor normalny na zewnątrz domeny. W geometrii 2D możemy nie definiować ścian oddzielonych jedną warstwą komórek. Zostaną one dodane do obszaru defaultfaces. patches ( patch down ( (4 54 55 42) (42 55 56 43) (43 56 63 50) (50 63 62 49) ) patch outlet ( (2 3 22 2) (3 6 25 22) (2 2 5 38) (38 5 54 4) ) patch inletup ( (4 3 32 33) (7 4 33 36) ) patch inletdown ( (46 59 32 3) (49 62 59 46) ) patch cylinder ( (0 5 24 29) (5 0 9 24) (6 0 29 35) ( 6 35 30) patch up ( (7 8 27 26) (6 7 26 25) (8 8 37 27) (8 7 36 37) ) ) ); (40 (45 (48 ( 53 58 6 30 9 53 58 6 0) 40) 45) 48)
Plik blockmeshdict up inletup cylinder inletdown down outlet
Warunki brzegowe ZADANIE 2 Uzupełnić warunki brzegowe w pliku psi w katalogu 0. Uruchomić symulację poleceniem streamfunctionfoam
ZADANIE 2 Chcemy mieć na wlocie (inlet) jednorodną prędkość 0,25 m/s. Podpowiedź: Stała wartość psi dla ścian up i down oraz dla cylindra Stały gradient na wlocie i wylocie (inletup, inletdown, outlet) Sprawdzić jak zależy przepływ od wartości psi na powierzchni cylindra. dimensions [0 2-0 0 0 0]; internalfield uniform 0; boundaryfield { down { type??? } outlet { type??? } up { type??? } inletup { type??? } inletdown { type??? } cylinder { type??? } defaultfaces { type empty; } }
ZADANIE 3 Porównać wyniki z rozwiązaniem analitycznym Wykorzystać funkcję calculator w Paraview y Rozwiązanie analityczne (dla zerowej cyrkulacji): U x =U [ U y =U r cos 2 R r sin 2 R ] r R Θ x
Solver icofoam Solver icofoam rozwiązuje zmienne w czasie równania NavierStokes'a dla płynu nieściśliwego z czysto molekularną lepkością. Stosowany jest w nim algorytm PISO do rozwiązania sprzężenia ciśnienie - prędkość. Równania: U =0 U 2 U U = p U t Konieczne są warunki początkowe i brzegowe na U i p. Jeden parametr fizyczny lepkość (transportproperties) Zarządzanie czasem symulacji (controldict) Otwórzmy katalog cylindericofoamstart...
Struktura case'u cylindericofoamstart 0 constant transportproperties U p system polymesh blockmeshdict points faces owner neighbour controldict fvscheme fvsolution
Plik transportproperties /* * C++ * *\ ========= \\ / F ield OpenFOAM: The Open Source CFD Toolbox \\ / O peration Version:.7. \\ / A nd Web: www.openfoam.com \\/ M anipulation \* */ FoamFile { version 2.0; format ascii; class dictionary; location "constant"; object transportproperties; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // nu nu [ 0 2 0 0 0 0 ] 0.005; wartość nazwa stałej w symulacji nazwa pozycji w słowniku jednostki
Plik controldict Początek symulacji starttime, firsttime lub latesttime Wartość zmiennej starttime Koniec symulacji endtime, writenow, nowritenow lub nextwrite application icofoam; startfrom starttime; starttime???; stopat???; endtime endtime; Wartość zmiennej endtime Krok czasowy Kiedy zapisywać wyniki timestep lub adjustableruntime (przy zmiennym kroku czasowym) DeltaT???; writecontrol timestep; WriteInterval???; Co ile kroków czasowych (timestep) lub co ile sekund (adjustableruntime) purgewrite 0; Nadpisywanie katalogów jeśli różne od zera, definiuje ile ostatnich folderów będzie zapisanych
Plik fvschemes Zestaw schematów dyskretyzacji dla poszczególnych członów w równaniach. Może być podana wartość domyślna. Gauss - oznacza, że wykorzystuje się naturalną dla FVM zamianę całek objętościowych na powierzchniowe (twierdzenie Gaussa). np. linear schemat interpolacji wartości ze środków komórek na ściany Aby sprawdzić dostępne schematy najlepiej wpisać błędną nazwę i uruchomić solver. ddtschemes { default Euler; } gradschemes { default Gauss linear; grad(p) Gauss linear; } divschemes { default none; div(phi,u) Gauss linear; } laplacianschemes { default none; laplacian(nu,u) Gauss linear corrected; laplacian(( A(U)),p) Gauss linear corrected; } div(phi,u) Gauss ddsaf;
ZADANIE 4 Uzupełnić plik controldict (dobrać odpowiedni krok czasowy) Uruchomić solver icofoam i obejrzeć wyniki Powiększyć domenę, aby zmniejszyć wpływ brzegów (zachować rozdzielczość siatki) Użyć stabilnego schematu z większym krokiem czasowym
ZADANIE 5 Wykonać kilka symulacji dla różnych liczb Reynoldsa. Czy zmiania się charakter przepływu? Wyrysować linie prądu, wokół cylindra oraz w obszarze recyrkulacji Parametry schematu całkowania Źródło, z którego wypuszczamy próbki Point Source lub Line Source Stream tracer
Bardzo dziękuję za uwagę