» Blog » Podrelaksacja warunków brzegowych w ANSYS Fluent

Podrelaksacja warunków brzegowych w ANSYS Fluent

Jednym z podstawowych powodów przez który mogą wystąpić problemy ze zbieżnością solwera CFD jest zadanie na starcie zbyt dużego obciążenia układu. Szczególnie, gdy rozwiązujemy zagadnienie w stanie nieustalonym, założenie 100% wartości warunku brzegowego może sprawić, że rozwiązywanie zadania będzie niestabilne jak 3-latek przed spaniem. W jaki sposób zatem użytkownik może radzić sobie z takimi problemami?

Stabilny start

Jeżeli Czytelnikowi nie znane są takie sytuacje wyobraźmy sobie na przykład analizę mieszalnika. Wirnik obraca się z prędkością 60 obrotów na minutę, co daje 10 obrotów na sekundę. Startując z analizą ze stacjonarnym płynem, nagły przeskok łopatek mieszadła spowoduje olbrzymie skoki ciśnienia i spektakularny błąd solwera. Oczywiście, można ratować się małymi krokami czasowymi, ale najczęściej zależy nam na jak najszybszym otrzymaniu wyników.

W przeciwieństwie do 3-latków solwer Fluenta można w pewnym stopniu kontrolować. W zależności od sytuacji, można stosować kilka różnych metod. Jeśli mowa o analizie niestacjonarnej, częstą praktyką jest przeliczenie wstępnego modelu w stanie ustalonym. Staramy się przy tym zastosować te same warunki brzegowe i ustawienia (nie zawsze da się przenieść ustawienia w stu procentach ale robimy to w miarę możliwości). Wynik takiej symulacji służy później jako punkt startowy do docelowej analizy transient. Naturalnie podstawowym założeniem jest to, że nie interesuje nas proces rozruchu urządzenia a czas już po osiągnięciu quasi-ustalonego stanu.

Z kolei w przypadku analizy ustalonej najczęstszą praktyką jest stopniowe zwiększenie wartości warunku brzegowego.

Przykładowy przebieg stopniowego zwiększenia wartości warunku brzegowego został przedstawiony na rysunku po poniżej.

Procedurę taką można wykonać ręcznie: iterować umowną, niewielką liczbę kroków i po każdym zatrzymaniu solwera zwiększać o kilkadziesiąt procent wartość warunku. Całość uparcie powtarzamy aż dojdziemy do 100% wartości. W efekcie powstanie schodkowy przebieg wartości warunku. To ile iteracji zrobić i o ile procent zwiększać wartości nie jest niestety kwestią uniwersalną i dla każdego przypadku należy określić ją metodą prób i błędów. Procedurę można również wykonać automatycznie za pomocą Execute Command, lub pliku journal.

Naturalnie, są metody bardziej eleganckie i zautomatyzowane. Jedną z bardziej przystępnych jest użycie pliku profilowego. Tak samo jako klasyczny plik profilowy przestrzenny (zawierający w sobie pola X, Y, Z, wartość warunku), możliwe jest założenie profilu zmiennego w czasie.

Poniżej stronie został przedstawiony przykladowy profil zmienny w czasie.

Dużym ograniczeniem tej metody jest to, że nie możliwe jest zadanie profilu, który zmienia się w funkcji iteracji solwera. Nie jest to zatem metoda, której wolno użyć dla modeli stanu ustalonego. Plik trzeba również ręcznie modyfikować w przypadku chęci zmiany wartości końcowej lub liczby iteracji rozbiegowych.

Więcej o profilach można przeczytać w dokumentacji Fluenta w rozdziale 7.8.

Wykorzystanie UDF

Do podrelaksacji warunku można również użyć funkcji użytkownika UDF. Makro N_ITER zwraca aktualną liczbę iteracji, natomiast CURRENT_TIME czas symulacji. Nie ma wobec tego przeszkód aby stosować tę metodę zarówno do obliczeń stacjonarnych jak i niestacjonarnych. Poniżej znajduje się przykładowy kod opisujący profil zmienny po iteracjach (Uwaga! N_ITER nie można używać w trybie interpretowanym).

#include „udf.h” DEFINE_PROFILE  (mflow,  thread,  x){face_t f;real t = N_ITER;  begin_f_loop  (f,  thread){if (t < 10)F_PROFILE  (f,  thread,  x) = t / 10 * 75;elseF_PROFILE  (f,  thread,  x) = 75;}end_f_loop  (f,  thread)}

  Oczywiście UDFy bywają ciężkim kawałkiem chleba. Przytoczony przykład jest jednak na tyle prosty, że nawet nie znając nazbyt świata funkcji użytkownika, Czytelnik może z łatwością zastosować tę metodę do swoich aplikacji. Z pewnością metoda ta jest bardziej wygodna w stosunku do ustawiania ręcznego, natomiast względem profili łatwiej czasami zmienić przebieg funkcji w jednej linijce kodu niż poprawiać cały plik tekstowy. Znając jednak powszechną niechęć użytkowników do UDFów, porównywalną do ogólnej niechęci populacji do rodzynek w serniku, zaprezentujemy jeszcze jedno rozwiązanie problemu. Z prawej strony pokazany został przykładowy przebieg warunku brzegowego z UDF-a.

Wyraź się! Czyli Expressions w ANSYS FLUENT

Od wersji 2019 R1 we Fluencie dostępne są wyrażenia (Expressions). Funkcjonalność znana z CFXa i AIMa pozwala na napisanie prostych funkcji użytkownika (nie, to nie UDFy) bezpośrednio w interfejsie graficznym Fluenta. Brak wyrażeń przez wiele lat powodował, że chcąc stosować nawet lekko niestandardowe warunki często należało sięgać po UDFy (które, jak już ustaliliśmy nie cieszą się opinią łatwych do opanowania). Przez to dla dużej części klientów ANSYSa Fluent wydawał się mroczny, posępny i mało dostępny.

Składnia wyrażeń we Fluencie zbliżona jest do tej znanej z AIMa. Mamy więc dostęp do większości zmiennych przepływowych, czasu i iteracji symulacji, funkcji redukcyjnych (max, min, średnia itp.), trygonometrycznych czy procedury if.

Przekładając zatem funkcję UDF na język wyrażeń Fluenta będzie to wyglądało następująco:

IF( iter < 10 , iter / 10 * 75 [kg/s] , 75 [kg/s] )

A więc kilkanaście linijek UDFa zamieniamy na jedną prostą formułę. Takie wyrażenie podpinamy następnie do warunku brzegowego i gotowe.

Więcej o tym, jak tworzyć wyrażenia we Fluencie przeczytamy w dokumentacji.

Naturalnie, zamiast liniowej możemy zastosować inną, dowolną funkcję. Do tego zadania dobrze nadaje się funkcja sinus, która przy swoich ekstremach charakteryzuje się niższym gradientem niż funkcja liniowa, co jeszcze bardziej wygładza stabilność rozwiązania na początku i końcu kroku obciążenia.

Żeby układ wyrażeń był czytelny i łatwy do kontroli możemy określić dodatkowe elementy. Przede wszystkim, wprowadzimy maksymalna wartość warunku oraz ilość iteracji po której chcemy, aby wartość warunku osiągnęła maksimum:

it_max = 10mflow = 75 [kg /s]

Następnie definiujemy jednostkową funkcję podrelaksacji, opartą np. na funkcji sinusoidalnej. Aby precyzyjnie ją określić, najlepiej wystartować z gołej funkcji sinus (Funkcja 1):

sinus_relax = sin (iter)

Mnożąc argument funkcji razy π skrócimy okres funkcji tak, aby dla iteracji równej 1 funkcja zwracała wartość 0. Jednocześnie dzielimy argument przez it_max (Funkcja 2):

sinus_relax = sin (iter * PI / it_max)

Dodatkowo argument funkcji przesuwamy o 0.5 PI aby maksymalna i minimalna wartość zawierały się w przedziale 0 – 10 iteracji (Funkcja 3):

sinus_relax = sin (iter * PI / it_max – 0.5 * PI)

Kolejny krok to przeskalowanie funkcji o 0.5 i dodanie do wartości zwrotnej 0.5 (Funkcja 4).

sinus_relax = sin (iter * PI / it_max – 0.5 * PI) * 0.5 + 0.5

Przebiegi tych czterech kroków pokazano na wykresie poniżej:

Powyższy proces może na pierwszy rzut oka wydawać się skomplikowany, dlatego proponujemy przygotować i przetestować sobie funkcję jednostkową wcześniej, korzystając z aplikacji MS Excel lub narzędzia Desmos.

Ostatecznie funkcja trafia do wyrażenia:

mflow_relax = IF( iter < it_max , sinus_relax * mflow , mflow )

Tak zdefiniowane wyrażenia bardzo łatwo modyfikować. Na przykład, chcąc wydłużyć czas rozbiegu warunku wystarczy zmienić wyrażenie iter_max. Zaznaczyć trzeba również, że podobną funkcję można byłoby zastosować przez UDF, lub przygotowując plik profilowy (przy założeniu analizy transient). Poniżej pokazano przykładowy przebieg funkcji relaksacyjnej z wykorzystaniem funkcji sinus.

Ponadto, stworzone w ten sposób wyrażenia można zapisać do zewnętrznego pliku .tsv i zaimportować do kolejnej sesji Fluenta (co zostało pokazane na rysunku poniżej).

Podsumowanie

Podrelaksacja warunków brzegowych to jeden ze sposobów zwiększenia stabilności solwera. Do dyspozycji użytkownika jest kilka metod. Ręczna zmiana wartości warunku jest najprostsza, jednak wymagająca największego zaangażowania podczas obliczeń. Zadanie profilu również nie jest skomplikowane, choć wymaga przygotowania pliku tekstowego z przebiegiem funkcji. Wadami tego rozwiązania są mała elastyczność (konieczność zmiany całego pliku przy modyfikacjach) oraz brak możliwości stosowania go do stanu ustalonego. UDFy to rozwiązanie, które ma największe możliwości, ale charakteryzuje się tzw. wysokim progiem wejścia. Dobrym kompromisem są niedawno dodane wyrażenia, które może nie mają aż tylu możliwości co UDFy, ale bardzo łatwo je opanować i z pewnością posiadają bardziej czytelną składnie. Ostatecznie wszystko zależy od umiejętności użytkownika, czasu który mamy na wykonanie zadania oraz wymagań co do funkcjonalności modelu (np. parametryzacja modelu).

Już na samym końcu zostało zaprezentowane porównanie różnych przebiegów funkcji.

Autor: Maciej Kryś, MESco Sp. z o.o.