13 grudnia 2018


Wolno dostępne oprogramowanie OpenFOAM (Open Field Operation And Manipulation) służy do symulacji rozległej klasy zagadnień związanych z przepływem płynów. Dla użytkowników mających podstawowe umiejętności programistyczne system ten może być atrakcyjnym substytutem oprogramowania komercyjnego. Celem tego artykułu jest podanie podstawowych informacji, które umożliwią rozpoczęcie użytkowania programu.

Krzysztof Nakonieczny

OpenFOAM w wersji źródłowej nie ma graficznego interfejsu użytkownika lecz jest tak zaprogramowanym (w języku C++) środowiskiem, że z łatwością można je użytkować posługując się na przemian wierszem poleceń i standardowym menedżerem plików pod dowolną dystrybucją systemu Linuks. Omawiane w artykule operacje wykonywane są w pakiecie zainstalowanym w katalogu domowym użytkownika, w podkatalogu o nazwie OpenFOAM, który z kolei rozgałęzia się na trzy katalogi o standardowych nazwach, zawierających numer wersji oprogramowania (w tym przypadku jest to wersja 4.1): OpenFOAM-4.1, ThirdParty-4.1 oraz user-4.1.

fig1
Rys. 1 Katalogi ogólnotematyczne w strukturze katalogu tutorials

Za pomocą menedżera plików (można także wszystkie te operacje przeprowadzić przy użyciu tylko wiersza poleceń) należy skopiować niezbędne pliki z katalogu źródłowego OpenFOAM-4.1/tutorials/Y/... do katalogu użytkownika user-4.1/run/, przy czym Y jest symbolem jednego z katalogów ogólnotematycznych, pokazanych na rysunku 1 (np. combustion [spalanie], compressible [przepływy płynów ściśliwych], DNS [bezpośrednia symulacja numeryczna równaniami N-S], heatTransfer [wymiana ciepła], incompressible [przepływy płynów nieściśliwych], multiphase [przepływy wielofazowe] i inne). Katalogi te mają głębszą strukturę o liczbie poziomów zależnej od rodzaju zagadnienia.

Na najniższym poziomie znajdują się katalogi konkretnych zadań obliczeniowych X, prezentowane przykładowo na rysunku 2.

fig2
Rys. 2 Przykładowe zadania obliczeniowe w zakresie płynów nieściśliwych, rozwiązywane solverem pimpleFoam

W dalszej części przywoływany będzie przykład TJunction, ilustrujący zastosowanie pakietu OpenFOAM do obliczania przepływu płynu nieściśliwego przez rozgałęzienia przewodów.
Wszelkie zmiany w plikach źródłowych najlepiej wprowadzać już po skopiowaniu danego zadania X do katalogu run użytkownika. Niekiedy brak jest w wybranym katalogu któregoś z plików standardowych. Akurat w przypadku TJunction nie ma pliku uruchomiającego obliczenia Allrun, który można skopiować z sąsiedniego przykładu TJunctionFan i dostosować do potrzeb bieżących, uzyskując jego formę widoczną na rysunku 3.

fig3
Rys. 3 Postać skryptu uruchamiającego obliczenia, zawartego w pliku Allrun

Przykładowa procedura użytkowania systemu
Krok 1: W terminalu należy wywołać polecenie of41 (należy uczynić to każdorazowo po nowym uruchomieniu terminala – odtąd w systemie widoczne są zmienne środowiskowe), a następnie cd $FOAM_TUTORIALS, które przenosi użytkownika do katalogu tematycznego Y - skąd wybierany jest przykład obliczeniowy X najbardziej zbliżony do zagadnienia jakie ma być realizowane. W razie potrzeby należy uzupełnić zawartość docelowego katalogu X o brakujące elementy. Podstawowe elementy każdego przykładu obliczeniowego to katalogi: ‘0’ (zawierający dane początkowe parametrów płynu, np. ciśnienia czy prędkości), ‘constant’ (zawierający charakterystykę płynu i modelu turbulencji), ‘system’ (zawierający plik z danymi do sterowania przebiegiem obliczeń oraz pliki definicyjne geometrii obiektu oraz równań i metodyki ich rozwiązania – do pierwszego uruchomienia zadania obliczeniowego nie potrzeba w nie ingerować, chyba że użytkownik potrafi dobrać bardziej optymalne wartości parametrów).
Krok 2: Należy skopiować katalog wybranego przykładu obliczeniowego (w omawianym przykładzie X  TJunction), wraz z całą jego zawartością, do podkatalogu wykonawczego run w katalogu użytkownika – za pomocą myszy w menedżerze plików lub korzystając z wiersza poleceń.

fig4
Rys. 4 Zmienne sterujące obliczeniami – zestawione w pliku controlDict

Krok 3: Z poziomu menedżera plików, przechodząc do skopiowanego katalogu X oraz do jego podkatalogów, dostosowujemy parametry obliczeń według potrzeb, edytując i modyfikując poszczególne zapisy w pliku sterującym obliczeniami (X/system/controlDict – Rys. 4), w plikach definicyjnych geometrii (X/system/blockMeshDict – Rys. 5 a,b,c – na następnej stronie), własności fizycznych (X/constant/transportProperties – w tym przypadku podawany jest tylko rodzaj płynu: Newtonian, i jednostka oraz wartość kinematycznego współczynnika lepkości), modelu turbulencji (X/constant/turbulenceProperties – Rys. 6), czy innych, specyficznych dla danego przykładu obliczeniowego.

fig5a

fig5b

fig5c
Rys. 5 Opis prostszych przypadków geometrii obszaru obliczeniowego zestawiony w pliku blockMeshDict zawiera: (a) współrzędne wierzchołków (vertices), (b) definicje elementarnych bloków geometrycznych (blocks), obejmujące typ bryły (hex) oraz sposób i nierównomierność jej podziału w trzech kierunkach, a także ewentualnie definicje krawędzi (edges) oraz (c) opis brzegu obszaru (boundary), zawierający nazwy poszczególnych elementów z definicjami ich typu (patch lub wall) i przynależnymi powierzchniami (faces)

fig6
Rys. 6 W pliku turbulenceProperties określamy parametr simulationType (do wyboru pomiędzy RAS, LES lub laminar ; w tym trzecim przypadku nie potrzeba dodawać dalszych charakterystyk) oraz jego charakterystykę (model turbulencji – dla symulacji RAS może to być kEpsilon lub model z rodziny kOmega opisany w dokumentacji)

W razie potrzeby modyfikujemy wartości początkowe parametrów płynu (pól), np. ciśnienia p, prędkości U – podawanej jak każdy wektor w postaci trójki składowych (Ux Uy Uz) – oraz innych, zapisane w plikach o charakterystycznych nazwach w podkatalogu X/0 (ewentualnie w podkatalogu X/0.orig, zależnie od przyjętego w pliku Allrun sposobu realizacji obliczeń).
Krok 4: Obliczenia uruchamiamy wpisując w wierszu poleceń ./Allrun (kropka w zapisie jest potrzebna).
Krok 5: Wyniki obliczeń znajdziemy w postaci źródłowej w katalogach 0, 1, 2,... . Kolejne cyfry – użyte tutaj tylko przykładowo jako kolejne liczby naturalne – oznaczają w istocie czasy rejestracji parametrów płynu, wynikające z ustawienia zmiennych sterujących startTime [początek obliczeń], writeControl [sterowanie zapisem] oraz writeInterval [odstęp czasowy zapisu] w pliku controlDict. Można także wyniki analizować graficznie, wywołując w terminalu polecenie paraFoam, które uruchomi program graficzny instalowany standardowo w systemie OpenFOAM.
Przebieg wdrażania przykładowego problemu obliczeniowego do symulacji komputerowej ilustruje zestaw instrukcji wiersza poleceń pokazany na rysunku 7.

fig7
Rys. 7 Zapis operacji wykonanych podczas uruchamiania przykładowego zadania obliczeniowego X=TJunction

Program graficzny
W OpenFOAM do analizy graficznej wykorzystuje się wolno dostępne oprogramowanie ParaView. Jest ono wywoływane przez polecenie wewnętrzne pakietu paraFoam, z poziomu terminala otwartego w katalogu, gdzie wykonywano symulację.
Program ParaView, po wpisaniu w terminalu polecenia paraFoam, uruchamiany jest w trybie pełnoekranowym i w głównym oknie pojawia się menu główne, trzy paski poziome zawierające wybór funkcji graficznych oraz okna podrzędne o nazwach:
– Layout#1 [układ nr1] – główne okno graficzne z układem współrzędnych,
– Properties [właściwości] – okno z parametrami sterującymi oraz
– Pipeline Browser [katalog liniowy] – okno wydobywane na zewnątrz po naciśnięciu ikonki usytuowanej w narożniku i zawierające informację o otwartych aktualnie zbiorach danych (Rys. 8).

fig8
Rys. 8 Pierwotny wygląd ekranu po uruchomieniu programu ParaView i wstępnym zaakceptowaniu ustawień przyciskiem Apply

Jeżeli są już otwarte różne zbiory danych, poprzez naciśnięcie ‘oka’ znajdującego się z lewej strony nazwy zbioru można wyłączyć dany zbiór z podglądu lub włączyć go z powrotem (jest to przydatne np. przy analizie linii prądu, gdy widoczna geometria obiektu je „zasłania”).
Pierwszy od góry pasek w oknie głównym zawiera standardowe zakładki, służące do sterowania plikami (File), edycją (Edit), wyglądem (View) oraz specyficzne dla tego edytora, służące do generowania zbiorów danych (Sources), przetwarzania danych (Filters), czy ułatwiające dostęp do zaawansowanych narzędzi (Tools). Kolejne paski poziome zawierają ikonki lub zakładki podrzędne, służące do definiowania niektórych parametrów grafiki. Okno Properties ma podświetlony na zielono przycisk Apply [zastosuj], którym zatwierdzamy ustawienia parametrów dla aktualnie wybranego zbioru danych, i jego naciśnięcie powoduje wyświetlenie w oknie Layout#1 obiektu geometrycznego reprezentującego obszar obliczeniowy. Może to być cały obszar lub dowolny wybór jego elementów składowych (jeżeli obiekt składa się z elementów), co definiujemy w zakładce Mesh Parts [elementy siatki] okna Properties pokazanego na rysunku 8 (standardowym wyborem początkowym jest internalMesh [siatka wewnętrzna]).