Symulacje CFD w darmowym oprogramowaniu OpenFOAM
Spośród wielu typów analiz numerycznych wykorzystywanych w przemyśle, symulacje z zakresu mechaniki płynów, czyli CFD (Computational Fluid Dynamics), należą do najbardziej wymagających pod wieloma względami – począwszy od podstaw teoretycznych, przez przygotowanie analiz i dostępność oprogramowania oraz zasobów obliczeniowych, aż po weryfikację wyników. Większość programów umożliwiających tego typu symulacje to drogie komercyjne środowiska a darmowe rozwiązania są zwykle bardziej akademickimi narzędziami do wąskich zastosowań.
Jest jednak pewien wyjątek – OpenFOAM. To bezsprzecznie najbardziej zaawansowany darmowy i otwartoźródłowy kod do symulacji przepływowych. Problem polega jednak na tym, iż nie posiada on interfejsu graficznego i wymaga pracy na plikach wejściowych oraz poleceniach dla solvera, co skutecznie odstrasza wielu początkujących użytkowników. Powstało już kilka interfejsów graficznych dla OpenFOAM, ale wszystkie są komercyjnymi programami. Istnieje wprawdzie HELYX-OS, który ma charakter open-source, ale wersja na system Windows jest już płatna. W praktyce jedynym w pełni darmowym i funkcjonalnym preprocessorem dla OpenFOAM jest opcjonalny moduł CfdOF programu FreeCAD, omawianego w artykule FreeCAD – w pełni darmowa alternatywa dla komercyjnych programów do projektowania. Temu modułowi będzie poświęcona większość niniejszego artykułu. Wypróbować można jeszcze otwarte środowisko BARAM tworzone przez NEXTfoam, ale może ono nie przypaść do gustu wielu użytkownikom. W kwestii postprocessingu sprawa jest prostsza – darmowe ParaView doskonale radzi sobie z obróbką wyników z OpenFOAM.
Oprogramowanie OpenFOAM
Na początek warto scharakteryzować samo środowisko OpenFOAM. Jest to niezwykle rozbudowane i potężne oprogramowanie, z którego korzysta wielu gigantów takich dziedzin przemysłu jak motoryzacja i lotnictwo, ale również elektronika czy medycyna.
Do największych użytkowników OpenFOAM należy m.in. Boeing, Oak Ridge National Laboratory, Intel, Pfizer, Volkswagen, Toyota, Audi i BMW
OpenFOAM posiada szereg solverów do wielu różnych zastosowań, od podstawowych po bardzo specjalistyczne. Spośród nich warto wymienić przede wszystkim:
- icoFoam – przepływy nieustalone, nieściśliwe, laminarne, płyny newtonowskie,
- simpleFoam – przepływy ustalone, nieściśliwe, turbulentne,
- pimpleFoam – przepływy nieustalone, nieściśliwe, turbulentne, płyny newtonowskie,
- sonicFoam – przepływy nieustalone, ściśliwe (gazy), turbulentne, okołodźwiękowe/naddźwiękowe,
- buoyantSimpleFoam – przepływy ustalone, turbulentne, ściśliwe, uwzględniające przepływ ciepła z promieniowaniem,
- sprayFoam – przepływy nieustalone, ściśliwe, turbulentne, z modelowaniem cząsteczek,
- SRFSimpleFoam – przepływy ustalone, nieściśliwe, turbulentne, płyny nienewtonowskie, z jednym ruchomym układem odniesienia,
- overPimpleDyMFoam – przepływy nieustalone, nieściśliwe, płyny newtonowskie, z ruchomą siatką,
- porousSimpleFoam – przepływy ustalone, nieściśliwe, turbulentne, z modelowaniem ośrodków porowatych,
- fireFoam – przepływy nieustalone z modelowaniem spalania,
- interFoam – przepływy nieustalone, nieściśliwe, z 2 niemieszalnymi fazami i przepływy z wolną powierzchnią
- multiphaseInterFoam – przepływy nieustalone, nieściśliwe, z wieloma fazami.
Jak można wywnioskować z nazewnictwa, dostępne są różne wersje niektórych z wymienionych solverów. Przykładowo, nonNewtonianIcoFoam dodaje do icoFoam modelowanie płynów nienewtonowskich zaś buoyantPimpleFoam pozwala na analizy przepływów nieustalonych z pozostałymi założeniami analogicznymi do buoyantSimpleFoam. Z kolei rhoPimpleFoam rozszerza pimpleFoam o przepływy ściśliwe. Istnieje jeszcze wiele innych zaawansowanych solverów, np. do modelowania przepływów reaktywnych.
OpenFOAM posiada również zautomatyzowane narzędzia do tworzenia siatek – blockMesh oraz snappyHexMesh. To pierwsze tworzy siatki z prostopadłościanów, zaś drugie przycina siatki utworzone przez blockMesh w taki sposób, by dopasować je do analizowanej w danym przypadku geometrii (nawet jeśli jest ona bardzo złożona).
Przy pracy z OpenFOAM istotna jest znajomość struktury jego plików. Główne foldery widoczne przed uruchomieniem symulacji to:
- 0 – reprezentuje czas t=0 s, pliki p oraz U zawierają definicje warunków początkowych i brzegowych, odpowiednio dla ciśnienia i prędkości,
- constant – zawiera właściwości płynu (plik transportProperties), model turbulencji (turbulenceProperties) oraz definicję siatki (katalog polyMesh, w tym plik boundary zawierający definicje powierzchni używanych do warunków brzegowych),
- system – zawiera m.in. pliki z ustawieniami wbudowanego generatora siatki (plik blockMeshDict), przebiegu obliczeń (plik controlDict – solver, czas analizy, częstotliwość zapisu wyników itd.) oraz obliczeń równoległych (plik decomposeParDict).
Po uruchomieniu analizy pojawiają się dodatkowe katalogi z liczbami w nazwie – zawierają one wyniki dla danej chwili czasu. W przypadku obliczeń równoległych tworzone są foldery processor0, processor1 itd., do których trafiają katalogi z wynikami dla części siatki przydzielonej danemu procesorowi.
Poniżej przedstawiony został fragment przykładowego pliku wejściowego OpenFOAM – z definicją warunków początkowych i brzegowych dla ciśnienia.
Linia ze słowem kluczowym dimensions definiuje jednostki. Kolejne pozycje w nawiasie kwadratowym odpowiadają masie, długości, czasowi, temperaturze, ilości substancji, natężeniu i światłości (zwykle w układzie SI). Każda pozycja zawiera potęgę w jakiej występuje dana jednostka. Należy zwrócić uwagę na to, iż w przypadku przepływów nieściśliwych jednostką ciśnienia w danych wejściowych i wyjściowych jest m^2/s^2, czyli ciśnienie podzielone przez gęstość.
Więcej informacji na te tematy i ogólnie o wszelkich aspektach pracy bezpośrednio z OpenFOAM oraz przykłady (tutorials), można znaleźć w plikach instalacyjnych (ścieżka np. ESI-OpenCFD\OpenFOAM\v2206\msys64\home\ofuser\OpenFOAM \OpenFOAM-v2206\tutorials) oraz w internetowej dokumentacji tego środowiska, na stronach openfoam.com i openfoam.org – istnieją 2 główne wersje tego oprogramowania rozwijane odpowiednio przez ESI Group i The OpenFOAM Foundation. Ta pierwsza jest bardziej popularna i korzysta z niej też opisywany w artykule moduł CfdOF programu FreeCAD.
Między tymi wersjami występują różnice w nazwach kolejnych wydań i stosunkowo niewielkie różnice w funkcjonalnościach. Pliki dokumentacji i przykładów można również znaleźć w folderze instalacyjnym programu. Trudniej o pozycje książkowe na temat OpenFOAM. Kilkudziesięciostronicowy wstęp do tego środowiska jest zawarty na końcu książki „Konwekcyjny przepływ ciepła. Metody obliczeniowe” I. Szczygła. Ponadto, dostępny jest darmowy podręcznik „The OpenFOAM Technology Primer” T. Marica, J. Hopkena i K.G. Mooney’a. Z kolei książka „The Finite Volume Method in Computational Fluid Dynamics. An Advanced Introduction with OpenFOAM and Matlab” F. Moukalleda i innych skupia się bardziej na teorii. W 2023 roku powinna się jeszcze ukazać pozycja „Practical Finite Volume Method in OpenFOAM: Applications of CFD with Second Order FVM” H. Jasaka i T. Uroic.
Co ciekawe, istnieje możliwość sprzężenia OpenFOAM z innym solverem (takim jak np. CalculiX) przy pomocy biblioteki preCICE, co pozwala symulować zagadnienia FSI (mechanika płynów z mechaniką ciał stałych) czy CHT (wymiana ciepła między płynem i ciałem stałym). Z kolei PrePoMax, omawiany w poprzednich artykułach, posiada opcję importu rozkładu ciśnień z symulacji OpenFOAM jako obciążeń w analizie mechanicznej. Wszystkie wymienione tu programy są otwartoźródłowe.
Moduł CfdOF programu FreeCAD
Opcjonalny moduł CfdOF programu FreeCAD znacznie ułatwia przygotowywanie symulacji w OpenFOAM. Jest on stale rozwijany i chociaż wspiera jedynie część z niezwykle szerokich możliwości tego solvera, to i tak jest już bardzo rozbudowanym, sprawnie działającym narzędziem. Jego obecne (grudzień 2022 r.) możliwości wymienione w opisie repozytorium z kodem źródłowym to:
- przepływy laminarne, nieściśliwe (solvery simpleFoam, pimpleFoam),
- różne modele turbulencji,
- przepływy nieściśliwe z wolną powierzchnią (solvery interFoam, multiphaseInterFoam),
- przepływy ściśliwe z wymianą ciepła (solvery buoyantSimpleFoam, buoyantPimpleFoam),
- przepływy ściśliwe okołodźwiękowe i naddźwiękowe (solver HiSA oparty o OpenFOAM),
- ośrodki i przegrody porowate,
- trzy różne narzędzia do generowania siatek (cfMesh, snappyHexMesh, Gmsh).
Dostępnych jest kilka rodzajów warunków brzegowych:
- ściana – bez poślizgu, z poślizgiem, z częściowym poślizgiem, ruchoma z zadaną prędkością liniową, z funkcją chropowatości,
- wlot – jednorodna prędkość, strumień objętości/masy, ciśnienie całkowite/statyczne,
- wylot – ciśnienie statyczne, jednorodna prędkość, ekstrapolacja,
- otwarty brzeg – ciśnienie otoczenia, pole dalekie,
- symetria,
- przegroda porowata.
Możliwe są analizy 2D dla zagadnień płaskich i osiowosymetrycznych. Aby je przeprowadzić należy utworzyć zwykłą siatkę objętościową i dodać Mesh refinement –> Extrusion a następnie wskazać powierzchnię, z której zostanie wyciągnięta siatka z 1 elementem na grubości.
Narzędzie Reporting function pozwala definiować dodatkowe żądania wyników – siły i ich współczynniki (oporu i siły nośnej) dla określonych powierzchni oraz pomiary wartości we wskazanym punkcie.
Moduł CfdOF służy do preprocessingu, czyli przygotowania modeli oraz uruchomienia obliczeń. Natomiast postprocessing (obróbka wyników) odbywa się w zewnętrznym oprogramowaniu ParaView.
Pierwszym krokiem przed rozpoczęciem pracy w CfdOF jest oczywiście zainstalowanie (lub pobranie wersji developerskiej) programu FreeCAD. Następnie trzeba skorzystać z Menedżera dodatków (Tools –> Addon manager) i z jego poziomu (zakładka Workbenches) zainstalować środowisko CfdOF. Menedżer dodatków pozwala również aktualizować poszczególne moduły. Na tym jednak nie kończą się przygotowania, ponieważ po ponownym uruchomieniu programu FreeCAD należy przejść do Edit –> Preferences –> CfdOF i zainstalować dodatkowe narzędzia potrzebne do pracy z modułem CfdOF oraz wskazać ścieżki ich plików wykonywalnych. W skład tych komponentów wchodzi oczywiście sam OpenFOAM oraz ParaView, ale też wspomniane zewnętrzne programy cfMesh i HiSA. Potrzebny może być również Gmsh, ale jest on dostępny w folderze instalacyjnym FreeCAD’a, ze względu na wykorzystanie we wbudowanym module FEM. Po zainstalowaniu wszystkich komponentów można skorzystać z przycisku Run dependency checker, który sprawdza ich stan. W przypadku problemów z instalacją lub działaniem modułu CfdOF najlepiej zgłosić się z prośbą o pomoc na forum programu. Najpierw jednak należy upewnić się, że korzystamy z najnowszej dostępnej wersji modułu i poszczególnych dodatkowych komponentów.
Przykład z instrukcją
Podstawy obsługi modułu CfdOF zostaną przedstawione na prostym przykładzie przepływu wokół kuli. Bardziej złożone przykłady symulacji przepływów zewnętrznych i wewnętrznych są prezentowane w filmikach instruktażowych na YouTube, ale najlepiej zacząć pracę z programem od jak najprostszego przypadku.
Pierwszym krokiem jest przygotowanie geometrii. Do tego celu można tu wykorzystać prymitywy geometryczne i operacje boolowskie w module Part programu FreeCAD. Najpierw należy skorzystać z narzędzia Cube i zmienić wymiary na 1200x300x600 mm. Następnie użyć opcji Sphere i podać promień 60 mm oraz pozycję (300,0,300). Ostatnim krokiem przygotowywania geometrii jest zaznaczenie utworzonych obiektów w drzewie modelu (najpierw prostopadłościanu a następnie kuli, przytrzymując Ctrl) i użycie narzędzia Cut. Dzięki temu kula zostanie wycięta w prostopadłościanie tworząc domenę płynu, dla której na dalszym etapie zostanie utworzona siatka. Model obejmuję połowę układu, korzystając z jego symetrii.
Po utworzeniu geometrii należy przejść do modułu CfdOF i utworzyć Analysis container. W nim znajdą się definicje cech symulacji. Przycisk Select models na górnym pasku służy do przejścia do ustawień typu analizy. W tym uproszczonym przypadku należy pozostawić domyślne ustawienia – przepływ ustalony, jednofazowy, nieściśliwy, lepki, laminarny. Użyty zostanie solver simpleFoam. Przycisk Add fluid properties pozwala z kolei zdefiniować właściwości płynu. Dostępnych jest kilka gotowych definicji, ale można też tworzyć własne. W tym przykładzie należy wybrać powietrze (Air). Przycisk Initialise umożliwia definiowanie warunków początkowych analizy. Należy ustawić Specify values dla Velocity i Pressure i zostawić domyślne wartości (zera). Kolejnym etapem jest zdefiniowanie warunków brzegowych, rozpoczynając od wlotu. W tym celu można użyć przycisku Fluid boundary.
Następnie należy ustawić:
- Boundary: Inlet,
- Subtype: Uniform velocity,
- Boundary face list –> Select in model – zaznaczyć powierzchnię po stronie -X (bliżej kuli) i kliknąć Add,
- Velocity: Ux = 1e3 mm/s (czyli 1 m/s).
Po zatwierdzeniu trzeba w analogiczny sposób dodać kolejny warunek brzegowy – wylot:
- Boundary: Outlet,
- Sub-type: Static pressure,
- Boundary face list –> Select in model – zaznaczyć powierzchnię po stronie +X (dalej od kuli) i kliknąć Add,
- Pressure: 0 Pa.
Następnym warunkiem brzegowym, jaki należy dodać jest symetria:
- Boundary: Constraint,
- Subtype: Symmetry,
- Boundary face list –> Select in model – zaznaczyć powierzchnię po stronie -Y (od strony kuli) i kliknąć Add.
Ostatni warunek brzegowy do dodania to ściana bez poślizgu:
- Boundary: Wall,
- Subtype: No-slip (viscous),
- Boundary face list –> Select in model – zaznaczyć powierzchnię wycięcia kuli i kliknąć Add.
Pozostałe powierzchnie, bez przypisanych warunków brzegowych, będą miały domyślny warunek ściany z poślizgiem (wall, slip). Oczywiście można go również ręcznie zdefiniować i zmienić jego typ (np. na ścianę bez poślizgu – wall, no slip).
Ostatnim krokiem jest utworzenie siatki. Aby to zrobić, należy zaznaczyć obiekt Cut w drzewie i użyć przycisku CFD mesh. Dwukrotne kliknięcie obiektu Cut_Mesh pozwoli przejść do ustawień generowania siatki. Należy tam ustawić Mesh utility: cfMesh i Base element size: 10 mm. W przypadku używania meshera snappyHexMesh zamiast cfMesh, konieczne jest dodatkowo podanie współrzędnych punktu znajdującego się w domenie płynu.
Następnie trzeba kliknąć Write mesh case i Run mesher. Gdy w oknie Status pojawi się informacja Meshing completed, można użyć przycisku Load surface mesh, by dokonać wizualnej oceny gęstości siatki. Taka wizualizacja przedstawia tylko powierzchniową siatkę, aby obejrzeć właściwą siatkę objętościową należy skorzystać z przycisku Paraview, co spowoduje otwarcie siatki w zewnętrznym narzędziu do postprocessingu.
Po wyjściu z okna CFD Mesh należy zaznaczyć obiekt Cut_Mesh w drzewie i użyć przycisku Mesh refinement, żeby lokalnie zagęścić siatkę. Dalej trzeba ustawić Volume refinement, Relative element size: 0,5 i w oknie References –> Select from list wybrać Sphere a następnie Solid1.
Po zatwierdzeniu konieczny jest powrót do Cut_Mesh i ponowne wygenerowanie siatki (Write mesh case, Run mesher), aby można było ją zwizualizować (Load surface mesh). Lepsze lokalne zagęszczenie siatki można uzyskać korzystając z ustawień dostępnych dla Surface refinement lub definiując Volume refinement na dodatkowej bryle umieszczonej w domenie płynu. Jeśli na jakimkolwiek etapie przygotowywania analizy pewne obiekty wyświetlane w oknie modelu zasłaniają istotne cechy geometrii, możliwe jest ich ukrycie poprzez zaznaczenie w drzewie i wciśnięcie klawisza spacja. Ten sam przycisk służy do przywracania widoczności. Siatka utworzona w opisany tu sposób i przedstawiona na poniższym rysunku jest stosunkowo rzadka i dostosowana do potrzeb przykładu, tak żeby obliczenia nie trwały zbyt długo. Do symulacji wykonywanych na potrzeby rzeczywistych projektów konieczna jest znacznie gęstsza, bardziej dopracowana siatka.
Gdy wszystko jest przygotowane, czas przejść do uruchomienia analizy. Zmian ustawień przebiegu obliczeń można dokonać zaznaczając CfdSolver w drzewie. Poniżej, w zakładce Data, widoczne będą opcje, z których najważniejsze to:
- dla wszystkich analiz: Parallel Cores – liczba rdzeni do obliczeń równoległych,
- dla analiz przepływu nieustalonego: End Time (czas symulacji), Time Step (przyrost czasu), Transient Write Interval (częstotliwość zapisu wyników).
Aby uruchomić obliczenia, należy skorzystać z przycisku Solver job control i kliknąć Write (kliknięcie na tym etapie Edit powoduje otwarcie katalogu z plikami dla solvera, w których można dokonać ręcznych edycji w razie potrzeby – np. jeśli jakaś funkcjonalność OpenFOAM nie jest jeszcze wspierana w module CfdOF) a następnie Run. Może być konieczne zatwierdzenie komunikatu o przebudowaniu siatki. Po chwili pojawi się okno z wykresami residuów obrazujących zbieżność analizy. Po ukończeniu obliczeń (komunikat Simulation finished successfully w oknie Status) trzeba użyć przycisku Paraview, by otworzyć wyniki.
ParaView to bardzo rozbudowane narzędzie do obróbki wyników z różnych symulacji. Posiada setki wbudowanych filtrów i narzędzi do postprocessingu. Podstawową czynnością po otwarciu wyników jest obejrzenie wykresów konturowych prędkości i ciśnienia. Do przełączania między wyświetlanymi zmiennymi i sposobem wizualizacji (np. z siatką/bez) służą rozwijalne listy na górnym pasku oraz okno Properties aktualnego obiektu w drzewie. Legendę można wyświetlić przyciskiem Toggle Color Legend Visibility na górnym pasku lub jego odpowiednikiem w oknie Properties. Tam też znajduje się przycisk Choose preset, który pozwala zmienić schemat kolorów np. na klasyczną tęczę. Przyciski odtwarzacza na górnym pasku służą do zmiany wyświetlanej klatki wyników i sterowania ich animacjami.
Przy obróbce wyników symulacji CFD szczególnie przydatne mogą być następujące filtry w ParaView:
- Clip – tworzy przekrój, oprócz płaszczyzny dostępnych jest również kilka innych narzędzi do cięcia,
- Slice – narzędzie zbliżone do przekroju, ale wyświetla wyniki tylko na powierzchni obiektu tnącego,
- Stream Tracer – generuje tzw. linie prądu (streamlines) – bardzo popularny sposób wizualizacji w CFD, najlepiej użyć opcji Seed Type –> Point Cloud i ustawić odpowiednio kulę generującą linie prądu,
- Glyph – generuje strzałki mogące służyć do wizualizacji wielkości wektorowych,
- Contour – tworzy izopowierzchnie lub izolinie (w 2D),
- Threshold – wyświetla tylko te komórki siatki, w których wartość danej zmiennej mieści się w określonym zakresie,
- Calculator – tworzy nowe zmienne poprzez operacje na istniejących wynikach,
- Particle Tracer – aktywuje śledzenie cząsteczek przydatne w analizach przepływów nieustalonych,
- Probe Location – pokazuje wartości wybranych zmiennych we wskazanym punkcie,
- Reflect – tworzy lustrzane odbicie (kopię) modelu – przydatne do analiz korzystających z symetrii, jak w omawianym tu przypadku,
- Evenly Spaced Streamlines 2D – generuje linie prądu na 2-wymiarowej reprezentacji wyników (np. wycinku) na płaszczyźnie XY.
Działanie filtrów można często łączyć i np. nakładać izolinie na wycinek (Slice) albo wykorzystać zmienne uzyskane z kalkulatora czy odbicie lustrzane modelu w dalszych filtrach. Symbol oka przy każdym obiekcie w drzewie pozwala włączać i wyłączać jego widoczność. Przycisk Toggle advanced properties (symbol koła zębatego) w oknie Properties pokazuje zaawansowane ustawienia danego filtra.
ParaView posiada również wiele innych opcji dotyczących np. realistycznej wizualizacji – obsługa geometrii nakładanej na wyniki, tekstur, raytracingu, obrazów tła. Na poniższym rysunku przedstawione zostały linie prądu dla całej rozważanej objętości wokół kuli (analizowana połowa symetrycznego układu została skopiowana filtrem Reflect) z liniami prądu i geometrią kuli zaimportowaną jako plik .stl z programu FreeCAD.
Podsumowanie
Przedstawione w artykule środowisko OpenFOAM jest najlepszym darmowym rozwiązaniem do różnego rodzaju analiz przepływowych. Daje ogromne możliwości i jest powszechnie wykorzystywane w przemyśle, ale wymaga poświęcenia czasu na naukę jego obsługi. Rozpoczęcie pracy z tym narzędziem znacznie ułatwia opisane tu środowisko graficzne do preprocessingu – moduł CfdOF w programie FreeCAD. Jego możliwości w stosunku do OpenFOAM są nadal dość mocno ograniczone, ale nic nie stoi na przeszkodzie, żeby wstępnie przygotowywać modele łącznie z geometrią i siatką (co jest najtrudniejszym etapem) w tym module a następnie definiować dodatkowe cechy analizy edytując pliki wejściowe. Jest to też bardzo dobry sposób na naukę pracy w OpenFOAM. Środowisko to jest zwykle używane w systemie Linux a do pracy w systemie Windows korzysta się z maszyn wirtualnych (jak Oracle VM VirtualBox), ale przedstawione tu rozwiązanie pozwala uniknąć tej konieczności. Na koniec pozostaje zachęcić czytelników do samodzielnego przetestowania możliwości opisywanego oprogramowania i wdrożenia analiz CFD do procesu projektowania.