Algorytm p-adaptacji

Celem algorytmu p adaptacji jest zwiększenie dokładności aproksymacji na siatkach obliczeniowych poprzez zwiększenie stopnia wielomianów rozpiętych na siatce obliczeniowej. Algorytm p adaptacji możliwy jest do zaimplementowania dopiero wtedy kiedy skonstruujemy takie funkcje bazowe rozpięte na elementach skończonych, dla których możliwe jest podnoszenie stopnia wielomianów. W przypadku tradycyjnych funkcji B-spline, opisywanych szerzej w tym podręczniku, możliwe jest jedynie globalne podniesienie stopnia funkcji B-spline na lokalnym patchu elementów skończonych. Innymi słowy, załóżmy że mamy wektor węzłów opisujący bazę B-spline'ów drugiego stopnia o ciągłości C1 w kierunku osi  \( x \)  [0 0 0 1 2 3 4 4 4], oraz identyczny wektor węzłów opisujący bazę B-spline'ów drugiego stopnia w kierunku osi  \( y \)  [0 0 0 1 2 3 4 4 4]. Wektory te rozpinają dwie jednowymiarowe bazy funkcji B-spline w kierunku poszczególnych osi  \( B^x_{1;2}(x),...,B^x_{6;2}(x); B^y_{1;2}(y),...,B^y_{6;2}(y) \) które poprzez iloczyn tensorowy definiują bazę dwuwymiarowych funkcji bazowych  \( \{ B^x_{i;2}(x)B^y_{j;2}(y)\}i=1,...,6;j=1,...,6 \) Możliwe są następujące p adaptacje:

Możemy oczywiście podnosić stopnie funkcji bazowych w jednym lub w drugim kierunku o dowolny stopień (o ile nasz program komputerowy potrafi wygenerować B-spline wyższego stopnia bez problemu). W przypadku funkcji B-spline nie ma możliwości mieszania stopni wielomianów bez umieszczania  \( C^0 \) separatorów pomiędzy funkcjami B-spline. Możliwe jest natomiast mieszanie patchów (grup elementów) przedzielonych separatorami, na których wielomiany B-spline mają różną ciągłość. Na przykład  załóżmy że mamy wektor węzłów opisujący bazę B-spline'ów drugiego stopnia o ciągłości C1 na 2 elementach w kierunku osi  \( x \) oraz wektor węzłów opisujący bazę B-spline'ów trzeciego stopnia o ciągłości C2 na kolejnych 2 elementach w kierunku osi  \( x \) czyli [0 0 0 1 2 2 2] [2 2 2 2 3 4 4 4 4]. Wektory te rozpinają razem bazę  \( B^x_{1;2}(x),...,B^x_{6;2}(x); B^y_{1;2}(y),...,B^y_{6;2}(y) \) Wektory te możemy "złożyć" z bazą B-spline'ów drugiego stopnia w kierunku osi  \( y \)  [0 0 0 1 2 3 4 4 4], czyli   \( B^x_{1;2}(x),...,B^x_{6;2}(x); B^y_{1;2}(y),...,B^y_{6;2}(y) \). Wektory te rozpinają bazę funkcji B-spline w kierunku osi  \( x \) w następujący sposób  \( B^x_{1;2}(x),B^x_{2;2}(x),B^x_{3;2}(x),B^x_{4;2}(x),B^x_{5;3}(x),B^x_{6;3}(x),B^x_{7;3}(x),B^x_{8;3}(x),B^x_{9;3}(x) \). Poprzez  iloczyn tensorowy otrzymujemy bazę dwuwymiarowych funkcji bazowych  \( \{ B^x_{i;2}(x)B^y_{j;2}(y)\}i=1,...,4;j=1,...,6 \} \cup \{ B^x_{i;2}(x)B^y_{j;2}(y)\}i=5,...,9;j=1,...,6 \} \) Zauważmy że grupy elementów sklejone w ten sposób nie dają ciągłej aproksymacji w punkcie 2. Z lewej strony mamy jeden wielomian osiągający maksymalną wartość 1 w punkcie 2, z prawej strony mamy drugi inny wielomian osiągający maksymalną wartość 1 w punkcie 2. Para wektorów węzłów [0 0 0 1 2 2 2] [2 2 2 2 3 4 4 4 4] jest równoważna wektorowi [0 0 0 1 2 2 2 2 3 4 4 4 4]. Oczywiście algorytm interpretujący taki wektor węzłów musi zauważyć że począwszy od węzła 2 który powtórzony został 4 razy, zwiększa nam się stopień wielomianów o 1. Dodatkowo, ostatni wielomian w pierszej podgrupie elementów (wielomian  \( B^x_{4;2}(x) \) należało by scalić z pierwszym wielomianem w drugiej podgrupie elementów  \( B^x_{5;3}(x) \). Scalenie takie jest możliwe ponieważ pierwsze i ostatnie człony B-spline'ów są identycznymi wielomianami niezależnie od ich stopnia. Uzyskamy wtedy wielomian drugiego stopnia  \( B^x_{4;2}(x) \) który rozpościera się na ostatni element w pierwszej podgrupie i na pierwszy element w drugiej podgrupie. Nasze bazy wyglądają więc teraz tak  \( B^x_{1;2}(x),B^x_{2;2}(x),B^x_{3;2}(x),B^x_{4;2}(x),B^x_{5;3}(x),B^x_{6;3}(x),B^x_{7;3}(x),B^x_{8;3}(x) \).  \( B^x_{1;2}(x),...,B^x_{6;2}(x); B^y_{1;2}(y),...,B^y_{6;2}(y) \)  \( \{ B^x_{i;2}(x)B^y_{j;2}(y)\}i=1,...,4;j=1,...,6 \} \cup \{ B^x_{i;2}(x)B^y_{j;2}(y)\}i=5,...,8;j=1,...,6 \} \)

Jeśli dany element wymaga modyfikcji stopnia wielomianów w celu polepszenia jakości aproksymacji, możliwy jest jeden z trzech opisanych scenariuszy, podniesenie stopnia funkcji bazowych w kierunku osi  \( x \), podniesienie stopnia funkcji bazowych w kierunku osi  \( y \), lub podniesnie stopnia w obydwu kierunkach. W algorytmie adaptacyjnym zazwyczaj nie wykonuje się adaptacji na wszystkich elementach siatki, ale jedynie na tych elementach na których błąd jest większy niż 33 procent błedu maksymalnego (liczonego po wszystkich elementach). Jest to oczywiście arbitralnie przyjęta wartość. W zaproponowanej wersji algorytmu próbujemy najpierw wykonać adaptację w obydwu kierunkach (podnieść stopień wielomianu o 1 w obydwu kierunkach), a następnie (jeśli nie jest to wskazane) próbujemy podnieść stopień wielomianów w jednym z dwóch kierunków. Jest to oczywiście pzykładowa wersja algorytmu, możliwe są różne modyfikacje. Najbardziej zaawansowaną wersją algorytmu adaptacyjnego jest algorytm hp adaptacji opisany w innym module. Scalając ze sobą wiele patchów (grup elementów) na których rozpięte są różne wielomiany B-spline, uzyskamy siatkę obliczeniową na której możliwe będą lokalne modyfikacje stopnia funkcji B-spline, na przykład stosując opisany algorytm p-adaptacji. Gdy patch elementowy składa się z jednego elementu, funkcje bazowe rozpięte na tym elemencie odpowiadają klasycznemu algorytmowi p-adaptacji pracującemu na wielomianach Lagrange'a. Dzieje się tak dlatego, iż wektory węzłów w których każdy element oddzielony jest  \( C^0 \) separatem, tak jak ma to miejsce w klasycznych wielomianach Lagrange'a. Obie bazy generują wówczas identyczną przestrzeń wielomianów. Matematyczne właściwości algorytmu p-adaptacji opisał po raz pierwszy prof. Ivo Babuśka z Uniwersytetu Teksańskiego w Austin [1].


Klasyczna i izogeometryczna metoda elementów skończonych

Rozdział 6. Przetwarzanie siatek obliczeniowych

Algorytm hp-adaptacji

Algorytm automatycznej hp adaptacji został po raz pierwszy szczegółowo opisany w książkach prof. Leszka Demkowicza, matematyka polskiego pochodzenia, pracującego na Uniwersytecie Teksańskim w Austin. Analizę właściwości matematycznych algorytmu hp-adaptacji dokonał prof. Ivo Babuška, amerykanin czeskiego pochodzenia, również pracujący na Uniwersytecie Teksańskim w Austin [1] [2] [3] [4].

Algorytm hp-adaptacji zilustrowany jest na rysunkach Rys. 1 - Rys. 5. Konwencja przyjęta podczas rysowania siatek obliczeniowych jest następująca. Kolory na rysunkach Rys. 1, Rys. 3 i Rys. 5 oznaczają stopnie wielomianów rozpiętych na krawędziach i wnętrzach elementów. Na każdej krawędzi ustalony jest jeden stopień wielomianu, natomiast na każdym wnętrzu elementu ustalone są stopień w kierunku poziomym oraz stopień w kierunku pionowym. Na przykład, na rysunku Rys. 1 wszystkie wielomiany na wszystkich krawędziach mają stopień 2, oraz wszystkie wielomiany na wnętrzach wszystkich elementów mają stopień 2 w kierunku pionowym i poziomym. Na rysunku  Rys. 3  wszystkie wielomiany na wszystkich krawędziach mają stopień 3, oraz wszystkie wielomiany na wnętrzach wszystkich elementów mają stopień 3 w kierunku pionowym i poziomym. Z koleji na rysunku Rys. 5  przeglądając elementy wierszami od lewej do prawej strony, w pierwszym wierszu na pierwszym elemencie wszystkie wielomiany na krawędziach mają stopień 2, z wyjątkiem wielomianu na dolnej krawędzi elementu, który ma stopień 1. Na pierwszym elemencie wielomiany we wnętrzu mają stopień 2 w kierunku pionowym i poziomym. Na drugim elemencie, na krawędziach lewej, górnej i dolnej, wielomiany mają stopień 2, natomiast we wnętrzu stopień 3 w kierunku pionowym i stopień 2 w kierunku poziomym. Na trzecim i czwartym elemencie wszystkie wielomiany na krawędziach mają stopień 3. Podobnie wielomiany we wnętrzach w kierunkach pionowym i poziomym. W drugim wierszu elementów, pierwszy element (czyli piąty globalnie) posiada wielomiany stopnia 3 na lewej i prawej krawędzi, wielomian stopnia 1 na górnej i dolnej krawędzi. We wnętrzu element ten posiada wielomiany stopnia 1 w kierunku poziomym i wielomiany stopnia 3 w kierunku pionowym. Drugi element w drugim wierszu posiada stopień wielomianu 2 w kierunku poziomym oraz stopień wielomianu 3 w kierunku pionowym. Na trzecim i czwartym elemncie wszystkie wielomiany na wszystkich krawędziach mają stopień 3, oraz wszystkie wielomiany na wnętrzach wszystkich elementów mają stopień 3 w kierunku pionowym i poziomym. Pozostałe elementy w trzecim i czwartym wierszu mają wielomiany rozłożone symetrycznie w stosunku do wielomianów w pierwszym i drugim wierszu na pierwszym i drugim elemencie. W jaki sposób dokonywany jest wybór optymalnego sposobu adaptacji pojedynczego elementu? Zauważmy że w przypadku algorytmu hp adaptacji mamy wiele możliwości modyfikacji pojedynczego elementu:

Ponadto dla każdego połamanego elementu możliwa jest modyfikacja stopnia wielomianów we wnętrzu elementu

Stopnie na krawędziach zmodyfikowanych elementów ustalane są na podstawie reguły minimum. Innymi słowy stopień wielomianu na krawędzi dzielonej przez dwa sąsiadujące elementy ustalany jest jako minimum stopni we wnętrzu elementów w odpowiednim kierunku. Dla krawędzi pionowej otoczonej przez dwa elementy  \( (p^1_h,p^2_v) \) oraz  \( (p^2_h,p^2_v)  \) ustalamy stopień  \( p=\textrm{min} \{ p^1_v,p^2,v\} \). Dla krawędzi poziomej otoczonej przez dwa elementy  \( (p^1_h,p^2_v) \) oraz  \( (p^2_h,p^2_v)  \) ustalamy stopień  \( p=\textrm{min} \{ p^1_h,p^2,h\} \). Mamy więc bardzo dużo możliwości adaptacji pojedynczego elementu (szacując na podstawie wymienionych możliwych rodzajów adaptacji mamy 4 (modyfikacje stopnia elementu bez łamania elementu) + 4*4 (połamanie elementu na dwa elementy w kierunku poziomym i po cztery możliwości modyfikacji stopnia każdego elementu) + 4*4 (połamanie elementu na dwa elementy w kierunku pionowym i po cztery możliwości modyfikacji stopnia każdego elementu) + 4*4*4*4 (połamanie elementu na cztery elementy i po cztery możliwości modyfikacji stopnia każdego elementu). W sumie 4+4*4+4*4+4*4*4*4=292 możliwości. W jaki sposób podejmowana jest decyzja o wyborze rodzaju adaptacji pojedynczego elementu? Decyzja podejmowana jest zgodnie z następującym algorytmem.

Innymi słowy, wybieramy taki rodzaj adaptacji dla elementu, który pozwala uzyskać największy spadek błędu najmniejszym kosztem. Wielkość ta reprezentowana jest przez prędkość spadku błędu, która rośnie wraz ze spadkiem błędu, ale maleje wraz z poniesionym kosztym (z liczbą funkcji dodaną do elemetu, ponieważ koszt obliczenia na danym elemencie zależy od liczby niewiadomych, które są współczynnikami funkcji bazowych). Algorytm ten zilustrowany jest na rysunku Rys. 6

Dla przykładowego problemu transportu ciepła na obszarze w kształcie litery L możliwe jest uzyskanie siatki hp adaptacyjnej która pozwala na rozwiązanie problemu z błędem względnym 0.0001. Siatka taka przedstawiona jest na rysunkach Rys. 7 - Rys. 13

Algorytm automatycznej hp adaptacji jest więc bardzo skomplikowany i trudny do zaimplementowania. Dlaczego więc wart jest on naszego zainteresowania? Rozważmy możliwe różne algorytmy adaptacyjne dla przykładowego problemu transportu ciepła na obszarze w kształcie litery L, czyli

Jeśli narysujemy wykres zbieżności tych algorytmów w taki sposób, że na osi poziomej umieścimy rozmiar siatki rozumiany jako liczbę funkcji bazowych na całej siatce, co odpowiada liczbie niewiadomych współczynników tych funkcji bazowych czyli rozmiarowi macierzy układu równań do rozwiązania, a na osi pionowej błąd wzgłędny liczony w normie H1 pomiędzy rozwiązaniem na siatce rzadkiej i siatce gęstej  \(  \|u_{h,p}-u_{h/2,p+1}\|_{H^1}=\frac{\int_{\Omega} (u_{h,p}-u_{h/2,p+1})^2+(\frac{\partial (u_{h,p}-u_{h/2,p+1}}{\partial x})^2+(\frac{\partial (u_{h,p}-u_{h/2,p+1}}{\partial x})^2 }{\int_{\Omega} (u_{h/2,p+1})^2+(\frac{\partial (u_{h/2,p+1}}{\partial x})^2+(\frac{\partial (u_{h/2,p+1}}{\partial x})^2 }  \) wówczas okaże się że jedynie algorytm automatycznej hp adaptacji posiada cechę zbieżności eksponencjalnej. Jest on zdecydowanie najszybszy, i potrafi rozwiązać zadany problem obliczeniowy z dokładnością niemożliwą do uzyskania przez inne algorytmy adaptacyjne.

W praktyce większość problemów inżynieryjnych wymaga dokładności z zakresu 5 procent i wielomianów kwadratowych. Są jednak takie zadania obliczeniowe, gdzie wysoka dokładność rozwiązania jest niezbędna. Przykładem takich zadań obliczeniowych są na przykład symulacje przepływów wokół skrzydeł samolotów, które wymagają bardzo bardzo dużej dokładności w warstwie przyściennej na skrzydłach samolotu, lub symulacje propagacji fal elektromagnetzcznych w warstwach górotworu, w celu identyfikacji złóż ropy naftowej, które wymagają bardzo dużej dokładności w okolicy anteny odbiorczej.


Aproksymacja na siatce z wiszącymi węzłami

Problem aproksymacji na siatce z wiszącymi węzłami został dokładnie przedstawiony w pracy [1]. Rozważmy teraz przypadek siatki, w której mamy jeden duży element  \( [0,2]\times[1,3] \) oraz dwa małe elementy  \( [0,1]\times[0,1] \) oraz  \( [0,1]\times[1,2] \). Najprostszy sposób skonstruowania funkcji bazowych na takich elementach to liniowe funkcje B-spline (które defakto odpowiadają liniowym wielomianom Lagrange'a). Uzyskujemy je poprzez rozpięcie wektorów węzłów [0 0 1 1 2 2] w kierunu osi  \( x \) oraz [0 0 1 1] w kierunku osi  \( y \)y, dla dwóch małych elementów oraz [0 0 2 2] w kierunku osi  \( x \) oraz [1 1 3 3] w kierunku osi  \( y \). Zauważmy że nasze wektory węzłów [0 0 1 1 2 2] oraz [0 0 1 1] rozpinają następujące funkcje bazowe  \( B^x_{1;1}(x),B^x_{2;1}(x), B^x_{3;1}(x); B^y_{1;1}(y),...,B^y_{1;2}(y) \) na małych elementach, co poprzez ich przemnożenie (skonstruowanie iloczynu tensorowego) daje dwuwymiarowe funkcje bazowe  \( B^x_{1;1}(x)B^y_{1;1}(y), B^x_{1,1}(x)B^y_{1;2}(y), B^x_{2;1}(x)B^y_{1;1}(y), B^x_{2,1}(x)B^y_{1;2}(y) \) na pierwszym małym elemencie, oraz  \( B^x_{2;1}(x)B^y_{1;1}(y), B^x_{2,1}(x)B^y_{1;2}(y), B^x_{3;1}(x)B^y_{1;1}(y), B^x_{3,1}(x)B^y_{1;2}(y) \) na drugim małym elemencie. Ponadto, na dużym elemencie nasze wektory węzłów [0 0 2 2] i [1 1 3 3] rozpinają funkcje bazowe  \( B^x_{4;1}(x),B^x_{5;1}(x);B^y_{3;1}(y),...,B^y_{4;2}(y)  \). Iloczyn  tensorowy tych jednowymiarowych funkcji bazowych daje następujące dwuwymiarowe funkcje bazowe  \( B^x_{4;1}(x)B^y_{3;1}(y), B^x_{4,1}(x)B^y_{4;2}(y), B^x_{5;1}(x)B^y_{3;1}(y), B^x_{5,1}(x)B^y_{4;2}(y) \). Oznaczmy przez  \( B_1^{small1} \) zawężenie funkcji bazowej  \( B^x_{1;1}(x)B^y_{2;1}(y) \) do wspólnej krawędzi na pierwszym małym elemencie Rys. 1, oraz przez   \( B_1^{small2} \) zawężenie funkcji bazowej  \( B^x_{2;1}(x)B^y_{2;1}(y) \) do wspólnej krawędzi na drugim małym elemencie Rys. 1. Oznaczmy również przez   \( B_1^{big} \) zawężenie funkcji bazowej  \( B^x_{4;1}(x)B^y_{3;1}(y) \) do wspólnej krawędzi na dużym elemencie  Rys. 1. Oznaczmy przez  \( B_2^{small1} \) zawężenie funkcji bazowej  \( B^x_{2;1}(x)B^y_{2;1}(y) \) do wspólnej krawędzi na pierwszym elemencie Rys. 2, oraz przez  \( B_2^{small2} \) zawężenie funkcji bazowej  \( B^x_{3;1}(x)B^y_{2;1}(y) \) do wspólnej krawędzi na drugim elemencie Rys. 2. Oznaczmy również przez   \( B_2^{big} \) zawężenie funkcji bazowej  \( B^x_{5;1}(x)B^y_{3;1}(y) \) do wspólnej krawędzi na dużym elemencie Rys. 2.

Powstaje wówczas następujący problem. Jeśli chcemy aproksymować jakąś funkcję ciągłą (na przykład pole skalarne temperatury) nad taką siatką obliczeniową, nasza aproksymacja powinna być ciągła. W przypadku grup elementów jednorodnego rozmiaru, funkcje bazowe B-spline rozpinają się w sposób naturalny na wielu elementach, i aproksymacja na granicach elementów jest naturalnie ciągła. W przypadku elementów podzielonych na mniejsze elementy, które dzielą krawędzie z większym elementem, tak jak ma to miejsce w naszym przypadku, mamy szereg lokalnych funkcji na dużym i małych elementach, które nie dość że nie są ze sobą posklejane poprzez krawędź, to jeszcze jest ich różna liczba z jednej i z drugiej strony, i mają one inne wykresy nad współdzieloną krawędzią. Wierzchołek pomiędzy dwoma małymi elementami na wspólnej krawędzi, znajdujący się na środku dużego elementu nazywa się wiszącym węzłem (ang. hanging node) lub związanym węzłem (ang. constrained node). Jest tak dlatego, że funkcje bazowe które są nad nim rozpięte na małych elementach, muszą zostać użyte do dostosowania aproksymacji dla dużej funkcji bazowej na dużym elemencie. W jaki sposób wykonujemy takie "dostosowanie"? W naszym przypadku używamy lokalnych funkcji bazowych na małych elementach do zamapowania odpowiadających im dużych funkcji bazowych na dużych elementach. W naszym przypadku, wystarczy zamapować funkcje   \( B_1^{big}(x,y) \) poprzez kombinację liniową funkcji  \( B_1^{small1}(x,y),B_1^{small2}(x,y),B_2^{small1}(x,y),B_2^{small2}(x,y) \). Innymi słowy musimy znaleźć takie współczynniki  \( b_1^{small1},b_1^{small2},b_2^{small1},b_2^{small2} \) żeby  \( B_1^big(x,y) =b_1^{small1}B_1^{small1}(x,y)+b_1^{small2}B_1^{small2}(x,y)+b_2^{small1}B_2^{small1}(x,y)+b_2^{small2}B_2^{small2}(x,y) \), dla  \( x\in(0,2)y=1 \) czyli rozpiętych na wspólnej krawędzi.Proces ten zilustrowany jest na Rys. 3. Widać tutaj że kombinacja ta to  \( B_1^big(x,y) =1.0*B_1^{small1}(x,y)+0.5*B_1^{small2}(x,y)+0.5*B_2^{small1}(x,y) \), czyli 1.0, 0.5, 0.5, 0.0. Ponadto musimy zamapować funkcje   \( B_2^{big}(x,y) \) poprzez kombinację liniową funkcji  \( B_1^{small1}(x,y),B_1^{small2}(x,y),B_2^{small1}(x,y),B_2^{small2}(x,y) \). Innymi słowy musimy znaleźć takie współczynniki  \( c_1^{small1},c_1^{small2},c_2^{small1},c_2^{small2} \) żeby  \( B_2^big(x,y) =c_1^{small1}B_1^{small1}(x,y)+c_1^{small2}B_1^{small2}(x,y)+c_2^{small1}B_2^{small1}(x,y)+c_2^{small2}B_2^{small2}(x,y) \), dla  \( x\in(0,2)y=1 \) czyli rozpiętych na wspólnej krawędzi. Proces ten zilustrowany jest na Rys. 4. Widać tutaj że kombinacja ta to  \( B_2^big(x,y) =0.5*B_1^{small2}(x,y)+0.5*B_2^{small1}(x,y)+1.0*B_2^{small2}(x,y)+ \), czyli 0.0, 0.5, 0.5, 1.0.


Analiza izogeometryczna na siatkach adaptacyjnych

Siatki adaptacyjne zbudowane z elementów prostokątnych o różnej wielkości również umożliwiają przeprowadzanie obliczeń za pomocą analizy izogeometrycznej. Po pierwsze, jeśli grupy elementów różnego rozmiaru zostaną przedzielone za pomocą  \( C^0 \) separatorów, wówczas na każdym bloku elementów możemy wygenerować wektory węzłów opisujące funkcje bazowe, i scalić je tak jak opisano to w rozdziale Aproksymacja na siatkach z wiszącymi węzłami. Innym szeroko stosowanym podejściem jest stosowanie funkcji bazowych T-spline. Zostały one wynalezione w 2003 roku przez Thomasa Sederberga i innych autorów [1]. Doczekały się one nawet patentu w USA [2]. Funkcje T-spline stosuje się w analizie izogeometrycznej [3]. Są one modyfikacją funkcji B-spline która pozwala na rozpinanie ich na siatkach adaptacyjnych. Każda funkcja B-spline rozpina się na szeregu segmentów w kierunku poziomym i pionowym, które określają grupę elementów na których jest ona rozpięta (na których przyjmuje niezerowe wartości). Punkt w którym przyjmuje ona wartość maksymalną, znajduje się albo na środku elementu (w przypadku funkcji B-spline parzystego rzędu) lub na wierzchołku znajdującym się na granicy elementów (w przypadku funkcji B-spline nieparzystego rzędu). Możemy więc myśleć o funkcjach B-spline jako o funkcjach związanych ze środkami elementów lub wierzchołkami siatki (w zależności od stopnia funkcji B-spline). Funkcja B-spline rzędu  \( p \) rozpina się na  \( 2p-1 \) elementach. Na przyklad dla funkcji B-spline rzędu drugiego mamy  \( 2*2-1=3 \) elementy, czyli 1 element na którym znajduje się środek (maksimum funkcji) oraz 1 element z lewej strony i 1 element z prawej strony. Gdyby narysować linię poziomą od środka funkcji B-spline w lewą i prawą, i znaleźć przecięcia tej linii z krawędziami elementów, wówczas dla B-spline'a drugiego stopnia musimy znaleźć 2 przecięcia z lewej i 2 przecięcia z prawej strony, i dostaniemy wszystkie segmentyy rozpięte na elementach na których rozpina się nasz B-spline. Ideą funkcji T-spline jest uogólnienie tej ideii na siatki adaptowalne. Rozważmy dla ustalenia uwagi parzysty stopień funkcji T-spline. Jeśli mamy siatkę adaptowaną, z elementami o różnym rozmiarze, wówczas możemy związać każdą funkcje T-spline ze środkiem jakiegoś elementu. Następnie wzdłuż linii w kierunku pionowym i poziomym znajdujemy przecięcia z krawędziami elementów. Dla T-spline'a drugiego stopnia musimy znaleźć 2 przecięcia w każdą stronę. W ten sposób dostajemy 3 segmenty w kierunku pionowym i poziomym, na których rozpinamy funkcje T-spline zgodnie ze wzorem na funkcje B-spline. Bierzemy po prostu 4 punkty i wsadzamy do wzoru na funkcje B-spline. Proces określania segmentów pionowych i poziomych dla funkcji T-spline zilustrowany jest na Rys. 1.

Taki sposób definicji funkcji T-spline na siatce adaptowanej w kierunku punktu, tak jak przedstawiono to na Rys. 1 posiada jedną wadę. Zauważmy, że jeśli będziemy chcieli zastosować nasze funkcje T-spline do aproksymacji, będziemy musiei zbudować macierz w której wiersze i kolumny reprezentują poszczególne funkcje T-spline, natomiast wyrazy tej macierzy oznaczają całki z iloczynów tych funkcji i ich wartości. Całki te są niezerowe jeśli odpowiadające im funkcje T-spline przecinają się. Dla przykładowego zestawu funkcji T-spline wygenerowana macierz (na przykład dla problemu projekcji bitmapy lub dla problemu transportu ciepła) wygląda tak jak przestawiono to na Rys. 1. Widać że macierz ta jest stosunkowo gęsta. W celu zredukowania obszarów na których określone są funkcje T-spline, wprowadza się rozszerzenia przedłużające krawędzie na których wiszą węzły w siatce adaptacyjnej (po angielsku te przedłużenia nazywa się "T-junction extensions"). Jest to zilustrowane na Rys. 2. Po zmodyfikowaniu siatki, przez dodanie tych dodatkowych krawędzi, mówi się że siatka jest teraz "odpowiednia do analizy" (po angielsku "analysis suitable"). Idea algorytmu modyfikacji siatki pod funkcje T-spline opisana jest szczegółowo w pracy [4].

Po zmodyfikowaniu siatki, generujemy nowe funkcje T-spline, patrz Rys. 3.

Nowo wygenerowane funkcje T-splines generują siatkę obliczeniową która jest większa ale żadsza, tak jak przedstawiono to na Rys. 4.


Implementacja w MATLABie adaptacyjnego algorytmu projekcji bitmapy

W module tym przedstawiamy kod w MATLABie obliczający L2 projekcję bitmapy, stosując adaptacyjną metodę elementów skończonych. W szczególności kod ten posiada implementacje algorytmu h-adaptacji w MATLABie. Wykonanie kodu możliwe jest również w darmowym środowisku Octave.

W celu uruchomienia kodów, zapisujemy je w katalogu roboczym Octave. Ustawiamy zmienne ze ścieżką do pliku wejściowego w formacie tif  \( filename = 'C://Users/Maciej/Dropbox/bitmapa.tif' \) następnie podajemy ilość elementów siatki w kierunku osi x i y, oraz stopnie funkcji B-spline w tych kierunkach  \( elementsx=4 \),  \( elementsy=4 \) oznaczają rozmiar początkowej siatki. Wpisujemy maksymalny błąd przybliżenia  \( maxerror=0.5 \), maksymalną liczbę iteracji adaptacji  \( maxlevel=4 \) oraz wskazujemy czy krawędzie siatki mają zostać narysowane  \( edges=1 \). Następnie uruchamiamy pierwszą procedure  \( bitmap\_h(filename,elementsx,elementsy,maxerror,maxlevel,edges) \). Kod po wykonaniu sekwencji adaptacji rysuje bitmapę w otwartym okienku.

Autorzy kodów w MATLABie: Marcin Łoś i Maciej Woźniak.


Rozdział 7. Metoda elementów skończonych dla problemów niestacjonarnych i nieliniowych

Problemy niestacjonarne

W przypadku problemów niestacjonarnych poszukiwane rozwiązanie zależy zarówno od czasu jak i przestrzeni. W ogólnej postaci silnej, w której problem obliczeniowy opisany jest równaniem różniczkowym cząstkowym  \(  \frac{\partial u\left(x,y;t\right)}{\partial t}-{\cal L }\left(u\left(x,y;t\right)\right)=f(x,y;t)  \) pojawia się teraz pochodna względem czasu  \(  \frac{\partial u\left(x,y;t\right)}{\partial t }  \) reprezentująca zmiany w czasie poszukiwanego pola skalarnego  \(  \Omega\times [0,t] \ni \left(x,t\right)\rightarrow u\left(x,y;t\right)\in R   \) Znaczenie poszukiwanego pola zależy od rodzaju rozwiązywanego problemu. Rodzaj rozwiązywanego problemu "zakodowany" jest w operatorze  \(  {\cal L }\left(u\left(x,y;t\right)\right) \), opisującym modelowane zjawisko fizyczne za pomocą operatorów różniczkowych. Podobnie jak podczas rozwiązywania problemów stacjonarnych (nie zmieniających się czasie) konieczne jest podanie warunków brzegowych (czyli podanie informacji o tym co dzieje się na brzegu symulowanego obszaru). Dodatkowo, w przypadku symulacji problemów niestacjonarnych, konieczne jest podanie warunku początkowego (czyli podanie informacji o tym jaki stan miało modelowane zjawisko na początku symulacji)  \(  u(x,y;0)=u_0(x,y) \) W równaniu występuje również prawa strona  \(  f(x,y;t)  \) opisująca "siłę" dostarczającą energii (pędu, masy, etc. w zależności od modelowanego zjawiska) do układu. Istnieją dwie metodologie rozwiązywania zadań niestacjonarnych. W pierwszej najpierw dokonuje się dyskretyzacji względem czasu, a potem względem przestrzeni. W drugiej, najpierw dokonuje się dyskretyzacji w przestrzeni, a potem po czasie (metoda ta nazywa się metodą linii - method of lines). W naszych rozważaniach użyjemy pierwszej metody. W celu rozwiązania problemu niestacjonarnego, wprowadzamy kroki czasowe  \( t_0=0 < t_1 < t_2 < \cdots t_{k-1} < t < t_{k+1}< \cdots < t_N  \) oraz stany modelowanego zjawiska w poszczególnych krokach czasowych, reprezentowane przez pole skalarne  \(  u(t)   \)  \( u_0=u(t_0), u_1=u(t_1), u_2=u(t_2), \cdots, u_{k-1}=u(t_{k-1}), u_k=u(t_k), u_{k+1}=u(t_{k+1}), \cdots, u_N=u(t_N)  \) Pochodną po czasie przybliżamy za pomocą  metody różnic skończonych  \( \frac{\partial u}{\partial t} \approx \frac{u_{t+1}-u_t}{dt }  \) Dostajemy więc równanie  \( \frac{u_{t+1}-u_t}{dt} - \mathcal{L}(u) = f  \) Powstaje teraz pytanie, w jakiej chwili czasowej wziąć stan modelowanego zjawiska, reprezentowany przez pole skalarne  \(  u(t)   \). Mamy kilka możliwości:

Pierwszy sposób daje nam metodę explicite, zwaną również metodą Eulera (forward Euler).  \( \frac{u_{t+1}-u_t}{dt} - \mathcal{L}(u_t) = f  \) Drugi sposób daje nam metodę implicite, zwaną również wstecznym Eulerem (backward Euler).  \( \frac{u_{t+1}-u_t}{dt} - \mathcal{L}(u_{t+1 }) = f  \) Trzeci sposób daje nam metodę implicite, w zależności od sposobu zdefiniowania kombinacji liniowej, będzie to metoda Cranka-Nicolson, lub metoda alpha.  \( \frac{u_{t+1}-u_t}{dt} - \mathcal{L}(\alpha u_{t} + (1-\alpha) u_{t+1}) = f  \)

Metody explicite pozwalają zawsze na szybkie rozwiązanie w czasie liniowym, jednak można w nich stosować jedynie małe kroki czasowe (w przeciwnym wypadku symulacja zacznie zachowywać się niestabilnie). Metody implicite pozwalają na stosowanie większych kroków czasowych (jeśli są bezwzględnie stabilne, sprawdzenie czego wymaga zaawansowanej wiedzy matematycznej). Metody implicite zazwyczaj wymagają drogich solwerów. W podręczniku tym pokazuje jak uzyskać solwery o czasie liniowym do metod implicite. Metody te wywodzą się od całej rodziny metod zwanych metodami Rungego-Kutty [1]


Uogólnienie problemu izogeometrycznej L2 projekcji do rozwiązywania zadań niestacjonarnych

Zauważmy, że zastosowane metody Eulera sprowadza się do wykonania sekwencji izogeometrycznych L2 projekcji, podobnie jak w przypadku obliczania projekcji bitmapy. Tym razem jednak naszą "bitmapą" jest stan ukłądu w poprzedniej chwili, plus zmiany wywołane przez "fizykę" modelowanego zjawiska w czasie kroku czasowego, plus zmiany wywołane siłą działającą na nasz system w czasie kroku czasowego. Sposób traktowania równania niestacjonarnego jako sekwencje izogeometrycznych projekcji został opisany w pracy "IGA-ADS: Isogeometric analysis FEM using ADS solver" [1]. Żeby opracować solwer wykorzystujący metodę Eulera w izogeometrycznej metodzie elementów skończonych, musimy przetransformować sformułowanie silne w sformułowanie słabe. Przemnażamy więc nasze równanie przez funkcje testujące  \(      (u_{t+1},w) = (u_t + dt * \mathcal{L}(u_t)+ dt* f_t,w)  \) Do aproksymacji stanu naszego systemu w danej chwili czasowej użyjemy kombinacji liniowej funkcji B-spline. W tym celu wybieramy bazę dwuwymiarowych funkcji B-spline, określając wektory węzłów w kierunku osi układu współrzędnych. Dla ustalenia uwagi możemy wybrać dwuwymiarową bazę funkcji B-spline drugiego stopnia  \(  \{B^x_{i,2}(x)B^y_{j,2}(y)\}_{i=1,...,N_x;j=1,...,N_y}  \) Będą one stosowane do aproksymacja symulowanego pola skalarnego w aktualnej chwili czasowej  \(  u(x,y;t+1)\approx \sum_{i=1,...,N_x;j=1,...,N_y} u^{t+1}_{i,j } B^x_i(x)B^y_j(y) \) Podobnie do testowania użyjemy funkcji bazowych B-spline:  \(  \{ B^x_k(x)B^y_l(y) \}_{k=1,...,N_x;l=1,...,N_y }  \) Nasze równanie wygląda teraz identycznie jak problem dwuwymiarowek izgeometrycznej L2 projekcji  \(  \sum_{i=1,...,N_x;j=1,...,N_y} u^{t+1}_{i,j } (B^x_i(x)B^y_j(y),B^x_k(x)B^y_l(y))=RHS \quad \forall k=1,...,N_x; l=1,...,N_y \) Nasza prawa strona nie jest jednak bitmapą, ale projekcją sumy trzech elementów:

W metodzie explicite macierz układu to macierz masowa  \( \{ M_x \otimes M_y  \}_{i,j,k,l}= \int B^x_i(x)B^x_k(x)B^y_j(y)B^y_l(y) =  \int B^x_i(x)B^y_j(y)B^x_k(x)B^y_l(y) = {\bf M}_{i,j,k,l }  \) która posiada strukturę produktu Kroneckera i może ona zostać sfaktoryzowana w czasie liniowym przez solwer zmiennokierunkowy. Wadą metody explicite jest fakt, iż pojedynczy krok czasowy nie może być za długi, inaczej metoda będzie niestabilna. Objawiać się to będzie eksplozją symulacji numerycznej. Wynika to z tak zwanego warunku Courant'a–Friedrichs'a–Lewy'ego (CFL condition). W ogólnym przypadku mówi on że symulacja numeryczna w której modelujemy pole skalarne  \( u(x,t)  \) jest stabilna jeśli  \(  C= \frac{u * dt}{ h} < C_{max }  \) gdzie  \( u = max u(x,t)  \) oznacza maksymalną wartość symulowanego pola,  \(  dt  \)  oznacza długość kroku czasowego  \( h  \) oznacza rozmiar elementu siatki (co w przypadku analizy izogeometrycznej wynika z wartości punkt w wektorze węzłów), oraz  \( C_{max} \) jest pewną stałą wynikającą z rozwiązywanego problemu. Praktyczne znaczenie tego warunku jest następujące. Jeśli będziemy zwiększać liczbę elementów siatki (zwiększać liczbę punktów w wektorze węzłów) wówczas  \(  h \) będzie się zmniejszać i żeby nasza symulacja nie "eksplodowała" musimy zmniejszać krok czasowy. Jest to duże ograniczenie, ponieważ oznacza to że zwiększanie dokładności w przestrzeni wymusza zmniejszanie rozmiarów kroków czasowych, co oznacza większy koszt symulacji. Pewnym rozwiązaniem tego problemu jest stosowanie symulacji implicite ze schematami umożliwiającymi stosowanie solwerów zmiennokierunkowych.


Przykłady operatorów różniczkowych i prawej strony dla różnych niestacjonarnych problemów fizycznych

Żeby sformułować problem niestacjonarny, należy zdefiniować operator lewej strony oraz funkcję prawej strony  \(  {\cal L }\left(u\left(x,y;t\right)\right) = {\cal F }(x,y,z)  \) Przykładowe operatory różniczkowe  \(  {\cal L }\left(u\left(x,y;t\right)\right)  \) w sformułowaniach niestacjonarnych opisują różne modelowane zjawiska fizyczne. Dodatkowo skomentujemy znaczenie fizyczne warunków brzegowych i początkowych. Wymieniamy tutaj przykłady operatorów liniowych i nieliniowych.


Metoda explicite

W metodzie Eulera stosowanej do rozwiązywania problemów niestacjonarnych, operator różniczkowy opisujący "fizykę" symulowanego zjawiska obliczany jest w poprzedniej chwili czasowej  \(    \frac{u_{t+1}-u_t}{dt} - \mathcal{L}({u_t}) = {f_{t+1}}  \) Tak więc wszystkie człony równania obliczane są na podstawie stanu w chwili poprzedniej, i wykonywana jest jedynie korekta stanu w chwili aktualnej:  \(      u_{t+1} = u_t + dt * \mathcal{L}(u_t)+ dt* f_{t+1}  \) Wybieramy tak zwane funkcje testujące  \(  w  \)  i przemnażamy nasze równanie  \(      \left(u_{t+1},w\right) =\left( u_t + dt * \mathcal{L}(u_t)+ dt* f_{t+1},w\right)  \) Symbol  \(      \left(u,w\right)  \) oznacza tutaj iloczyn skalarny w przestrzeni  \(  L^2  \) czyli całkowanie (natomiast w następnym wzorze nawias oznacza "zwyczajny" nawias)  \(   \int_{\Omega} ( u_{t+1} w ) dxdy =\int_{\Omega} ( u_t + dt * \mathcal{L}(u_t)+ dt* f_{t+1}) w dxdy  \) Zauważmy że nasz problem ma podobną strukurę jak problem projekcji bitmapy  \(      \left(u_{t+1}(x,y),w(x,y)\right) =\left( BITMAPA(x,y),w(x,y)\right)  \) i tak naprawdę możemy użyć tego samego kodu, który zamiast czytać piksele bitmapy, będzie próbkował prawą stronę "piksel po pikselu". Jak wygląda więc dokładnie nasze równanie i prawa strona? Do aproksymacji stanu naszego systemu w danej chwili czasowej użyjemy kombinacji liniowej funkcji B-spline. W tym celu wybieramy bazę dwuwymiarowych funkcji B-spline, określając wektory węzłów w kierunku osi układu współrzędnych, na przykład  dwuwymiarową bazę funkcji B-spline drugiego stopnia  \(  \{B^x_{i,2}(x)B^y_{j,2}(y)\}_{i=1,...,N_x;j=1,...,N_y} u_{i,j }  \) Będą one stosowane do aproksymacji symulowanego pola skalarnego aktualnej chwili czasowej  \(  u(x,y;t+1)\approx \sum_{i=1,...,N_x;j=1,...,N_y}  u^{t+1}_{i,j} B^x_i(x)B^y_j(y) \) i w poprzedniej chwili czasowej  \(  u(x,y;t)\approx \sum_{i=1,...,N_x;j=1,...,N_y} u^t_{i,j } B^x_i(x)B^y_j(y) \) Podobnie do testowania użyjemy funkcji bazowych B-spline:  \(  w(x,y) \in \{ B^x_k(x)B^y_l(y) \}_{k=1,...,N_x;l=1,...,N_y} w^{k,l } \) Zakładając że operator różniczkowy  \(  {\cal L }  \) opisujący "fizykę" jest liniowy, nasze równanie wygląda teraz następująco:  \(  \sum_{i=1,...,N_x;j=1,...,N_y} u^{t+1}_{i,j } (B^x_i(x)B^y_j(y),B^x_k(x)B^y_l(y))=  \)  \( = \sum_{i=1,...,N_x;j=1,...,N_y} u^{t}_{i,j } (B^x_i(x)B^y_j(y),B^x_k(x)B^y_l(y))+ \)  \( +dt * \sum_{i=1,...,N_x;j=1,...,N_y} u^{t}_{i,j }  \mathcal{L}(B^x_i(x)B^y_j(y),B^x_k(x)B^y_l(y))+dt*(f_{t+1}(x,y),B^x_k(x)B^y_l(y)) \\ \forall k=1,...,N_x; l=1,...,N_y \). Nie ustalamy tutaj konkretnego problemu, wyprowadzenia zaprezentowane tutaj dotyczą dowolnego problemu fizycznego który da się zasymulować opisaną metodą. Na przykład dla problemu transportu ciepła mamy  \( \sum_{i=1,...,N_x;j=1,...,N_y} u^{t+1}_{i,j } (B^x_i(x)B^y_j(y),B^x_k(x)B^y_l(y))= \)  \( = \sum_{i=1,...,N_x;j=1,...,N_y} u^{t}_{i,j } (B^x_i(x)B^y_j(y),B^x_k(x)B^y_l(y))+ \).  \( +dt *\sum_{i=1,...,N_x;j=1,...,N_y}u^{t}_{i,j }\left(\left(\frac{\partial^2 (B^x_i(x)B^y_j(y))}{\partial x^2}+dt*\frac{\partial^2 (B^x_i(x)B^y_j(y))}{\partial y^2 }\right),B^x_k(x)B^y_l(y)\right)+ \)  \( +(f_{t+1}(x,y),B^x_k(x)B^y_l(y)) \quad \forall k=1,...,N_x; l=1,...,N_y \) czyli pamiętając że symbol  \(      \left(u,w\right)  \) oznacza tutaj iloczyn skalarny w przestrzeni  \(  L^2  \) czyli całkowanie, mamy (w następnym wzorze nawias oznacza "zwyczajny" nawias)  \( \sum_{i=1,...,N_x;j=1,...,N_y} u^{t+1}_{i,j } \int_{\Omega} B^x_i(x)B^y_j(y) B^x_k(x)B^y_l(y) dxdy = \)  \( = {\color{blue} \sum_{i=1,...,N_x;j=1,...,N_y} u^{t}_{i,j } \int_{\Omega} B^x_i(x)B^y_j(y)B^x_k(x)B^y_l(y) dxdy}+ \)  \( +dt *{\color{red} \sum_{i=1,...,N_x;j=1,...,N_y}u^{t}_{i,j } \int_{\Omega } \left( \frac{\partial^2 (B^x_i(x)B^y_j(y))} {\partial x^2 }+\frac{\partial^2 (B^x_i(x)B^y_j(y)) }{\partial y^2 } \right) B^x_k(x)B^y_l(y) dxdy}+ \)  \( +dt*\int_{\Omega}(f_{t+1}(x,y)B^x_k(x)B^y_l(y))dxdy \quad \forall k=1,...,N_x; l=1,...,N_y \) Wracając do analogii z bitmapą, mamy  \(      \int_{\Omega} u_{t+1}(x,y) w(x,y) dxdy =\int_{\Omega} BITMAPA(x,y)w(x,y) dxdy  \) czyli nasza "funkcja bitmapy" dana jest  \( BITMAPA(x,y)={\color{blue} \sum_{i=1,...,N_x;j=1,...,N_y} u^{t}_{i,j } B^x_i(x)B^y_j(y) } + \)  \( +{\color{red} \sum_{i=1,...,N_x;j=1,...,N_y} u^{t}_{i,j } dt \left( \frac{\partial^2 (B^x_i(x)B^y_j(y))}{\partial x^2}+\frac{\partial^2 (B^x_i(x)B^y_j(y))}{\partial y^2 } \right) } +dt*f_{t+1}(x,y) \) i tak naprawdę możemy użyć tego samego kodu, który zamiast czytać piksele bitmapy, będzie próbkował powyższą prawą stronę "piksel po pikselu". Zazwczaj po prawej stronie możemy odcałkować przez części czerwony człon (zakładając że dziedzina jest na tyle duża że całka po brzegu może zostać zignorowana, ponieważ modelowane pole lub jej pochodne są tam zerowe)  \( \sum_{i=1,...,N_x;j=1,...,N_y} u^{t+1}_{i,j } \int_{\Omega} B^x_i(x)B^y_j(y) B^x_k(x)B^y_l(y) dxdy = \)  \( ={\color{blue} \sum_{i=1,...,N_x;j=1,...,N_y} u^{t}_{i,j } \int_{\Omega} B^x_i(x)B^y_j(y)B^x_k(x)B^y_l(y) dxdy}+ \)  \( -dt *{\color{red} \sum_{i=1,...,N_x;j=1,...,N_y}u^{t}_{i,j } \int_{\Omega }\left( \frac{\partial (B^x_i(x)B^y_j(y))}{\partial x}+\frac{\partial (B^x_i(x)B^y_j(y))}{\partial y } \right) \left( \frac{\partial (B^x_k(x)B^y_l(y))}{\partial x}+\frac{\partial (B^x_k(x)B^y_l(y))}{\partial y } \right) dxdy}+ \)  \( +dt*\int_{\Omega}(f_{t+1}(x,y)B^x_k(x)B^y_l(y))dxdy \quad \forall k=1,...,N_x; l=1,...,N_y \)

Zauważmy że człony (czerwony i niebieski) w których obliczamy wartości rozwiązania z chwili poprzedniej, oznaczają próbkowanie sumy wszystkich B-spline'ów przemnożonych przez współczynniki obliczone w poprzednim kroku czasowym. Całkowanie takie przeprowadza się zgodnie z rozdziałem "Sformułowanie wariacyjne a całkowanie numeryczne". W szczególności zauważmy, że całki te rozbić można na sumę całek po poszczególnych elementach siatki, i na danym elemencie siatki określonych jest jedynie   \(  (p+1)^2 \) funkcji bazowych B-spline, gdzie   \(  p  \) oznacza stopień funkcji B-spine.

Symulacje metodą explicite mają ograniczenie na rozmiar kroku czasowego. Zwiększanie dokładności przestrzennej (zwiększanie rozmiaru siatki metody elementów skończonych do rozwiązania problemu projekcji prawej strony na lewą stronę) wymaga zmniejszania rozmiaru kroku czasowego, w przeciwnym wypadku symulacja zacznie zachowywać się niestabilnie (mówiąc potocznie symulacja "eksploduje"). Jest to wyrażone przez warunek Courant'a-Friedrichsa-Lewiego (CFL).  \( \frac{u dt}{dx} < C_{max } \) gdzie  \( u \) oznacza maksymalną wartość symulowanego zjawiska (tradycyjnie oznacza maksymalną prędkość dzięki temu warunek ma postać bezwymiarową co dotyczy tylko zadań z dominującą konwekcją i stałym lub zmiennym w czasie polem prędkości),  \( dt \) oznacza długość kroku czasowego,  \( dx \) oznacza rozmiar elementu (średnicę elementu). Warunek CFL został oryginalnie zaproponowany dla metody różnic skończonych, jednakże działa on również dla metody elementów skończonych. Stała  \( C_{max } \) nie może zostać przekroczona przez iloraz  \( \frac{u dt}{dx} \).

Jeśli tak się stanie (na przykład krok czasowy będzie za duży) wówczas symulacja zacznie zachowywać się niestabilnie (mówiąc potocznie "eksploduje")  [1]

Poniżej załączam przykłady dwóch symulacji propagacji fal dla materiału spręzystego policzone metodą explicite. W pierwszym przypadku warunek CFL nie jest spełniony, w drugim przypadku jest spełniony. Zostały one policzone kodem IGA-ADS [2]


Metoda implicite

W metodzie implicite zwanej "backward Euler", służącej do rozwiązywania problemów niestacjonarnych, operator różniczkowy opisujący "fizykę" modelowanego zjawiska obliczany jest w "aktualnej" chwili czasowej.  \(    \frac{u_{t+1}-u_t}{dt} - \mathcal{L}({u_{t+1}}) = {f_{t+1}}  \) Tak więc w każdym kroku czasowym konieczne jest rozwiązanie równania na stan następny  \(      u_{t+1}   \). Prześledźmy działanie metody backward Euler w przypadku stosowania izogeometrycznej metody elementów skończonych. Żeby opracować solwer wykorzystujący metodę implicite w izogeometrycznej metodzie elementów skończonych, musimy przetransformować sformułowanie silne w sformułowanie słabe. Przemnażamy więc nasze równanie przez funkcje testujące  \(      (u_{t+1},w) - (dt * \mathcal{L}(u_{t+1}),w) = (u_t+dt* f_{t+1},w)  \) Do aproksymacji stanu naszego systemu w danej chwili czasowej użyjemy kombinacji liniowej funkcji B-spline. W tym celu wybieramy bazę dwuwymiarowych funkcji B-spline, określając wektory węzłów w kierunku osi układu współrzędnych, na przykład  dwuwymiarową bazę funkcji B-spline drugiego stopnia  \(  \{B^x_{i,2}(x)B^y_{j,2}(y)\}_{i=1,...,N_x;j=1,...,N_y} u_{i,j }  \) Będą one stosowane do aproksymacji symulowanego pola skalarnego aktualnej chwili czasowej  \(  u(x,y;t)\approx \sum_{i=1,...,N_x;j=1,...,N_y} u^t_{i,j } B^x_i(x)B^y_j(y) \) Podobnie do testowania użyjemy funkcji bazowych B-spline:  \(  w(x,y) \in \{ B^x_k(x)B^y_l(y) \}_{k=1,...,N_x;l=1,...,N_y} w^{k,l } \) Zakładając że operator różniczkowy  \(  {\cal L }  \) opisujący "fizykę" jest liniowy, nasze równanie wygląda teraz następująco:  \(  \sum_{i=1,...,N_x;j=1,...,N_y} u^{t+1}_{i,j } (B^x_i(x)B^y_j(y)-dt * \mathcal{L}(B^x_i(x)B^y_j(y)),B^x_k(x)B^y_l(y))=RHS \\ \forall k=1,...,N_x; l=1,...,N_y \). Nie ustalamy tutaj konkretnego problemu, wyprowadzenia zaprezentowane tutaj dotyczą dowolnego problemu fizycznego który da się zasymulować opisaną metodą. Na przykład dla problemu transportu ciepła mamy  \( \sum_{i=1,...,N_x;j=1,...,N_y} u^{t+1}_{i,j } \\ (B^x_i(x)B^y_j(y)-dt *\left(\frac{\partial^2 (B^x_i(x)B^y_j(y))}{\partial x^2}+\frac{\partial^2 (B^x_i(x)B^y_j(y))}{\partial y^2 }\right),B^x_k(x)B^y_l(y))=RHS \\ \forall k=1,...,N_x; l=1,...,N_y \). Dzięki sformułowaniu słabemu możemy scałkować przez części  \( \sum_{i=1,...,N_x;j=1,...,N_y} u^{t+1}_{i,j } \\ \left( (B^x_i(x)B^y_j(y),B^x_k(x)B^y_l(y)) - dt *(\frac{\partial (B^x_i(x)B^y_j(y))}{\partial x},\frac{\partial (B^x_k(x)B^y_l(y))}{\partial x}) -dt* (\frac{\partial (B^x_i(x)B^y_j(y))}{\partial y},\frac{\partial (B^x_k(x)B^y_l(y))}{\partial y }) \right)=RHS \\ \forall k=1,...,N_x; l=1,...,N_y \). Dzięki strukturze produktu tensorowego funkcji B-spline oraz dzięki temu że pochodna w kierunku y z funkcji B-spline w kierunku osi x daje 0 (ponieważ funkcje te są stałe w kierunku osi y) i podobnie dla pochodnej w kierunku y z funkcji B-spline w kierunku osi x mamy  \( \sum_{i=1,...,N_x;j=1,...,N_y} u^{t+1}_{i,j } \\ \left( (B^x_i(x)B^y_j(y),B^x_k(x)B^y_l(y)) - dt *(\frac{\partial B^x_i(x)}{\partial x}B^y_j(y),\frac{\partial B^x_k(x)}{\partial x}B^y_l(y)) -dt* (B^x_i(x)\frac{\partial B^y_j(y)}{\partial y},B^x_k(x)\frac{\partial B^y_l(y)}{\partial y }) \right)=RHS \\ \forall k=1,...,N_x; l=1,...,N_y \). Zauważmy że nasz układ równań do rozwiązania to  \(  \left(M_x \otimes M_y-dt* S_x \otimes M_y -dt* M_x \otimes S_y\right) u^{t+1} = F(t) \) gdzie  \( \{ M_x \otimes M_y  \}_{i,j,k,l}= \int B^x_i(x)B^x_k(x)B^y_j(y)B^y_l(y) =  \int B^x_i(x)B^y_j(y)B^x_k(x)B^y_l(y) = {\bf M}_{i,j,k,l }  \) to macierz masowa będąca iloczynem Kroneckera dwóch jednowymiarowych macierzy masowych,  \(  \{ S_x \otimes M_y\}_{i,j,k,l} =  \int \frac{\partial B^x_i(x)}{\partial x}\frac{\partial B^x_k(x)}{\partial x}B^y_j(y)B^y_l(y) =  \int \frac{\partial B^x_i(x)}{\partial x}B^y_j(y)\frac{\partial B^x_k(x)}{\partial x }B^y_l(y)  \) to iloczyn Kronecker jednowymiarowej macierzy sztywności i jednowymiarowej macierzy masowej, oraz  \(  \{  M_x \otimes S_y \}_{i,j,k,l} =  \int B^x_i(x) B^x_k(x) \frac{\partial B^y_j(y)}{\partial y} \frac{\partial B^y_l(y)}{\partial y } = \int B^x_i(x)\frac{\partial B^y_j(y)}{\partial y}B^x_k(x)\frac{\partial B^y_l(y)}{\partial y }  \) to iloczyn Kroneckera jednowymiarowej macierzy masowej i jednowymiarowej macierzy sztywności. Każdą z tych macierzy potrafimy sfaktoryzować w czasie liniowym stosując algorytm solwera zmienno-kierunkowego. Jednakże faktoryzacja ich sumy w czasie liniowym nie jest już możliwa. Jest to możliwe dopiero gdy wprowadzimy schemat kroków czasowych który umożliwia rozdzielenie macierzy na podmacierze w  podkrokach czasowych tak aby koszt faktoryzacji pozostawał liniowy. Schemat Peaceman'a-Rachford'a pozwala na rozdzielenie kroku czasowego na dwa podkroki  \(  \left(M_x \otimes M_y-dt* S_x \otimes M_y\right) u^{t+1/2} = F(t+1/2)+\left(dt* M_x \otimes S_y\right) u^{t}  \)  \(  \left(M_x \otimes M_y-dt* M_x \otimes S_y\right) u^{t+1} = F(t+1/2)+\left(dt* S_x \otimes M_y\right) u^{t+1/2 }  \) gdzie możemy scalić macierze lewej strony w jedną macierz o strukturze produktu Kroneckera, która może zostać sfaktoryzowana w czasie liniowym za pomocą algorytmu solwera zmienno-kierunkowego  \(  \left(M_x-dt* S_x \right)\otimes M_y u^{t+1/2} = F(t+1/2)+\left(dt* M_x \otimes S_y\right) u^{t}  \)  \(  M_x \otimes \left( M_y-dt* S_y\right) u^{t+1} = F(t+1/2)+\left(dt* S_x \otimes M_y\right) u^{t+1/2 }  \) Funkcja prawej strony reprezentuje tutaj zmiany wywołane przez siłę działającą na system w czasie kroku czasowego. Jest ona sumą dwóch elementów:


Schemat Cranka-Nicolson

Wprowadzamy kroki czasowe  \( t_0=0 < t_1 < t_2 < \cdots t_{k-1} < t < t_{k+1}< \cdots < t_N  \) oraz stany modelowanego zjawiska w poszczególnych krokach czasowych, reprezentowane przez pole skalarne  \(  u(t)   \)  \( u_0=u(t_0), u_1=u(t_1), u_2=u(t_2), \cdots, u_{k-1}=u(t_{k-1}), u_k=u(t_k), u_{k+1}=u(t_{k+1}), \cdots, u_N=u(t_N)  \) Pochodną po czasie przybliżamy za pomocą  metody różnic skończonych  \( \frac{\partial u}{\partial t} \approx \frac{u_{t+1}-u_t}{dt }  \) Dostajemy więc równanie  \( \frac{u_{t+1}-u_t}{dt} - \mathcal{L}(u) = f  \) Metoda implicite zwaną metodą Cranka-Nicolson (wynalezioną przez Panią Phyllis Nicolson, brytyjską matematyczkę i Johna Cranka, amerykańskiego matematyka i fizyka w roku 1947) (zwracamy uwagę iż Phyllis Nicolson była kobietą, i nazwa "metoda Cranka-Nicolsona" używana czasami w języku polskim nie jest poprawna) działa w sposób następujący [1]. W metodzie tej nasz operator różniczkowy stosujemy do średniej wartości stanu poprzedniego i następnego:  \(    \frac{u_{t+1}-u_t}{dt} - \mathcal{L}(\frac{1}{2}(u_t+u_{t+1})) = {f_{t+1}}  \). Jeśli operator różniczkowy jest liniowy, możemy wtedy rozdzialić go na dwa człony  \(   u_{t+1} -dt \frac{1}{2}\mathcal{L}(u_{t+1}) = u_t+dt{f_{t+1}}+ dt\frac{1}{2}\mathcal{L}(u_t)  \) zostawiając po lewej stronie naszą "niewiadomą"  \(      u_{t+1}   \). Następnie stosujemy solwer izogeometrycznej metody elementów skończonych. Żeby opracować solwer wykorzystujący metodę implicite w izogeometrycznej metodzie elementów skończonych, musimy przetransformować sformułowanie silne w sformułowanie słabe. Przemnażamy więc nasze równanie przez funkcje testujące  \(   (u_{t+1},w) -dt \frac{1}{2}(\mathcal{L}(u_{t+1}),w) = (u_t,w)+dt({f_{t+1}},w)+ dt\frac{1}{2}(\mathcal{L}(u_t),w)  \) Do aproksymacji stanu naszego systemu w danej chwili czasowej użyjemy kombinacji liniowej funkcji B-spline. W tym celu wybieramy bazę dwuwymiarowych funkcji B-spline, określając wektory węzłów w kierunku osi układu współrzędnych. Na przykład  możemy wybrać dwuwymiarową bazę funkcji B-spline drugiego stopnia  \(  \{B^x_{i,2}(x)B^y_{j,2}(y)\}_{i=1,...,N_x;j=1,...,N_y} u_{i,j }  \) Będą one stosowane do aproksymacja symulowanego pola skalarnego w aktualnej chwili czasowej  \(  u(x,y;t+1)\approx \sum_{i=1,...,N_x;j=1,...,N_y} u^{t+1}_{i,j } B^x_i(x)B^y_j(y) \) Podobnie do testowania użyjemy funkcji bazowych B-spline:  \(  w(x,y) \in \{ B^x_k(x)B^y_l(y) \}_{k=1,...,N_x;l=1,...,N_y} w^{k,l } \) Zakładając że operator różniczkowy opisujący "fizykę" jest liniowy, czyli  \(  {\cal  L}(\alpha u+\beta w)=\alpha {\cal L}(u)+\beta {\cal L}(w) \) nasze równanie wygląda teraz następująco:  \(  \sum_{i=1,...,N_x;j=1,...,N_y} u^{t+1}_{i,j } (B^x_i(x)B^y_j(y)-dt  \frac{1}{2} \mathcal{L}(B^x_i(x)B^y_j(y)),B^x_k(x)B^y_l(y))=RHS \\ \forall k=1,...,N_x; l=1,...,N_y \). Na przykład dla problemu transportu ciepła mamy  \( \sum_{i=1,...,N_x;j=1,...,N_y} u^{t+1}_{i,j } \\ (B^x_i(x)B^y_j(y)-dt \frac{1}{2} \left(\frac{\partial^2 (B^x_i(x)B^y_j(y))}{\partial x^2}+\frac{\partial^2 (B^x_i(x)B^y_j(y))}{\partial y^2 }\right),B^x_k(x)B^y_l(y))=RHS \\ \forall k=1,...,N_x; l=1,...,N_y \).  Dzięki sformułowaniu słabemu możemy scałkować przez części  \( \sum_{i=1,...,N_x;j=1,...,N_y} u^{t+1}_{i,j } \\ \left( (B^x_i(x)B^y_j(y),B^x_k(x)B^y_l(y)) - dt \frac{1}{2}(\frac{\partial (B^x_i(x)B^y_j(y))}{\partial x},\frac{\partial (B^x_k(x)B^y_l(y))}{\partial x}) -dt* (\frac{\partial (B^x_i(x)B^y_j(y))}{\partial y},\frac{\partial (B^x_k(x)B^y_l(y))}{\partial y }) \right)=RHS \\ \forall k=1,...,N_x; l=1,...,N_y \). Dzięki strukturze produktu tensorowego funkcji B-spline oraz dzięki temu że pochodna w kierunku y z funkcji B-spline w kierunku osi x daje 0 (ponieważ funkcje te są stałe w kierunku osi y) i podobnie dla pochodnej w kierunku y z funkcji B-spline w kierunku osi x mamy  \( \sum_{i=1,...,N_x;j=1,...,N_y} u^{t+1}_{i,j } \\ \left( (B^x_i(x)B^y_j(y),B^x_k(x)B^y_l(y)) - dt \frac{1}{2}(\frac{\partial B^x_i(x)}{\partial x}B^y_j(y),\frac{\partial B^x_k(x)}{\partial x}B^y_l(y)) -dt* (B^x_i(x)\frac{\partial B^y_j(y)}{\partial y},B^x_k(x)\frac{\partial B^y_l(y)}{\partial y }) \right)=RHS \\ \forall k=1,...,N_x; l=1,...,N_y \). Zauważmy że nasz układ równań do rozwiązania to  \(  \left(M_x \otimes M_y-dt \frac{1}{2} S_x \otimes M_y -dt* M_x \otimes S_y\right) u^{t+1} = F(t) \) gdzie  \( \{ M_x \otimes M_y  \}_{i,j,k,l}= \int B^x_i(x)B^x_k(x)B^y_j(y)B^y_l(y) =  \int B^x_i(x)B^y_j(y)B^x_k(x)B^y_l(y) = {\bf M}_{i,j,k,l }  \) to macierz masowa będąca iloczynem Kroneckera dwóch jednowymiarowych macierzy masowych,  \(  \{ S_x \otimes M_y\}_{i,j,k,l} =  \int \frac{\partial B^x_i(x)}{\partial x}\frac{\partial B^x_k(x)}{\partial x}B^y_j(y)B^y_l(y) =  \int \frac{\partial B^x_i(x)}{\partial x}B^y_j(y)\frac{\partial B^x_k(x)}{\partial x }B^y_l(y)  \) to iloczyn Kronecker jednowymiarowej macierzy sztywności i jednowymiarowej macierzy masowej, oraz  \(  \{  M_x \otimes S_y \}_{i,j,k,l} =  \int B^x_i(x) B^x_k(x) \frac{\partial B^y_j(y)}{\partial y} \frac{\partial B^y_l(y)}{\partial y } = \int B^x_i(x)\frac{\partial B^y_j(y)}{\partial y}B^x_k(x)\frac{\partial B^y_l(y)}{\partial y }  \) to iloczyn Kroneckera jednowymiarowej macierzy masowej i jednowymiarowej macierzy sztywności. Każdą z tych macierzy potrafimy sfaktoryzować w czasie liniowym stosując algorytm solwera zmienno-kierunkowego. Jednakże faktoryzacja ich sumy w czasie liniowym nie jest już możliwa. Jest to możliwe dopiero gdy wprowadzimy schemat kroków czasowych który umożliwia rozdzielenie macierzy na podmacierze w  podkrokach czasowych tak aby koszt faktoryzacji pozostawał liniowy. Schemat Peaceman'a-Reachford'a pozwala na rozdzielenie kroku czasowego na dwa podkroki  \(  \left(M_x \otimes M_y-dt \frac{1}{2} S_x \otimes M_y\right) u^{t+1/2} = F(t+1/2)+\left(dt \frac{1}{2} M_x \otimes S_y\right) u^{t}  \)  \(  \left(M_x \otimes M_y-dt \frac{1}{2} M_x \otimes S_y\right) u^{t+1} = F(t+1/2)+\left(dt \frac{1}{2} S_x \otimes M_y\right) u^{t+1/2 }  \) gdzie możemy scalić macierze lewej strony w jedną macierz o strukturze produktu Kroneckera, która może zostać sfaktoryzowana w czasie liniowym za pomocą algorytmu solwera zmienno-kierunkowego  \(  \left(M_x-dt \frac{1}{2} S_x \right)\otimes M_y u^{t+1/2} = F(t+1/2)+\left(dt \frac{1}{2} M_x \otimes S_y\right) u^{t}  \)  \(  M_x \otimes \left( M_y-dt \frac{1}{2} S_y\right) u^{t+1} = F(t+1/2)+\left(dt \frac{1}{2} S_x \otimes M_y\right) u^{t+1/2 }  \) Przyglądnijmy się na koniec jak wygląda operator prawej strony Funkcja prawej strony reprezentuje tutaj zmiany wywołane przez siłę działającą na system w czasie kroku czasowego, plus dodatkowo zmiany wywołane przez fizykę zjawiska w poprzednim kroku czasowym  \(   (u_{t+1},w) -dt \frac{1}{2}(\mathcal{L}(u_{t+1}),w) = (u_t,B^x_k(x)B^y_l(y))+dt({f_{t+1}},B^x_k(x)B^y_l(y))+ dt\frac{1}{2}(\mathcal{L}(u_t),B^x_k(x)B^y_l(y))  \) W szczególności nasza prawa strona nie jest jednak bitmapą, ale projekcją sumy trzech elementów:


Schemat alpha

W metodzie implicite zwanej schematem alfa, służącej do rozwiązywania problemów niestacjonarnych, nasz operator różniczkowy opisujący "fizykę" symulowanego zjawiska, stosujemy do kombinacji liniowej wartości stanu poprzedniego i następnego:  \(    \frac{u_{t+1}-u_t}{dt} - \mathcal{L}(\alpha u_t+(1-\alpha)u_{t+1})) = {f_{t+1}}  \). Jeśli operator różniczkowy jest liniowy, możemy wtedy rozdzialić go na dwa człony  \(   u_{t+1} -dt \alpha \mathcal{L}(u_{t+1}) = u_t+dt{f_{t+1}}+ dt(1-\alpha)\mathcal{L}(u_t)  \) zostawiając po lewej stronie naszą "niewiadomą"  \(      u_{t+1}   \). Zauważmy że dla wartości alfa=1 schemat ten jest schematem implicte Eulera (tak zwany backward Euler), dla wartości alfa=0 jest on schematem explicite (tak zwany schemat Eulera) a dla wartości alfa=1/2 jest on schematem Cranka-Nicolson (który też jest schemate implicite). Schemat Eulera został po raz pierwszy opisany w 1768 roku w podręczniku Leonharda Eulera. Schemat Cranka-Nicolson został wynaleziony w 1947 roku przez Phyllis Nicolson, brytyjską matematyczkę i Johna Cranka, amerykańskiego matematyka i fizyka [1], [2] . Następnie stosujemy solwer izogeometrycznej metody elementów skończonych. Żeby opracować solwer wykorzystujący metodę implicite w izogeometrycznej metodzie elementów skończonych, musimy przetransformować sformułowanie silne w sformułowanie słabe. Przemnażamy więc nasze równanie przez funkcje testujące  \(   (u_{t+1},w) -dt \alpha(\mathcal{L}(u_{t+1}),w) = (u_t,w)+dt({f_{t+1}},w)+ dt(1-\alpha)(\mathcal{L}(u_t),w)  \) Do aproksymacji stanu naszego systemu w danej chwili czasowej użyjemy kombinacji liniowej funkcji B-spline. W tym celu wybieramy bazę dwuwymiarowych funkcji B-spline, określając wektory węzłów w kierunku osi układu współrzędnych. Dla ustalenia uwagi możemy wybrać dwuwymiarową bazę funkcji B-spline drugiego stopnia  \(  \{B^x_{i,2}(x)B^y_{j,2}(y)\}_{i=1,...,N_x;j=1,...,N_y} u_{i,j }  \) Będą one stosowane do aproksymacja symulowanego pola skalarnego aktualnej chwili czasowej  \(  u(x,y;t+1)\approx \sum_{i=1,...,N_x;j=1,...,N_y} u^{t+1}_{i,j } B^x_i(x)B^y_j(y) \) Podobnie do testowania użyjemy funkcji bazowych B-spline:  \(  w(x,y) \in \{ B^x_k(x)B^y_l(y) \}_{k=1,...,N_x;l=1,...,N_y} w^{k,l } \) Zakładając że operator różniczkowy opisujący "fizykę" jest liniowy, nasze równanie wygląda teraz następująco:  \(  \sum_{i=1,...,N_x;j=1,...,N_y} u^{t+1}_{i,j } (B^x_i(x)B^y_j(y)-dt  \alpha \mathcal{L}(B^x_i(x)B^y_j(y)),B^x_k(x)B^y_l(y))=RHS \\ \forall k=1,...,N_x; l=1,...,N_y \). Na przykład dla problemu transportu ciepła mamy  \( \sum_{i=1,...,N_x;j=1,...,N_y} u^{t+1}_{i,j } \\ (B^x_i(x)B^y_j(y)-dt \alpha \left(\frac{\partial^2 (B^x_i(x)B^y_j(y))}{\partial x^2}+\frac{\partial^2 (B^x_i(x)B^y_j(y))}{\partial y^2 }\right),B^x_k(x)B^y_l(y))=RHS \\ \forall k=1,...,N_x; l=1,...,N_y \).  Dzięki sformułowaniu słabemu możemy scałkować przez części  \( \sum_{i=1,...,N_x;j=1,...,N_y} u^{t+1}_{i,j } \\ \left( (B^x_i(x)B^y_j(y),B^x_k(x)B^y_l(y)) - dt \alpha(\frac{\partial (B^x_i(x)B^y_j(y))}{\partial x},\frac{\partial (B^x_k(x)B^y_l(y))}{\partial x}) -dt* (\frac{\partial (B^x_i(x)B^y_j(y))}{\partial y},\frac{\partial (B^x_k(x)B^y_l(y))}{\partial y }) \right)=RHS \\ \forall k=1,...,N_x; l=1,...,N_y \). Dzięki strukturze produktu tensorowego funkcji B-spline oraz dzięki temu że pochodna w kierunku y z funkcji B-spline w kierunku osi x daje 0 (ponieważ funkcje te są stałe w kierunku osi y) i podobnie dla pochodnej w kierunku y z funkcji B-spline w kierunku osi x mamy  \( \sum_{i=1,...,N_x;j=1,...,N_y} u^{t+1}_{i,j } \\ \left( (B^x_i(x)B^y_j(y),B^x_k(x)B^y_l(y)) - dt \alpha (\frac{\partial B^x_i(x)}{\partial x}B^y_j(y),\frac{\partial B^x_k(x)}{\partial x}B^y_l(y)) -dt* (B^x_i(x)\frac{\partial B^y_j(y)}{\partial y},B^x_k(x)\frac{\partial B^y_l(y)}{\partial y }) \right)=RHS \\ \forall k=1,...,N_x; l=1,...,N_y \). Zauważmy że nasz układ równań do rozwiązania to  \(  \left(M_x \otimes M_y-dt \alpha S_x \otimes M_y -dt* M_x \otimes S_y\right) u^{t+1} = F(t) \) gdzie  \( \{ M_x \otimes M_y  \}_{i,j,k,l}= \int B^x_i(x)B^x_k(x)B^y_j(y)B^y_l(y) =  \int B^x_i(x)B^y_j(y)B^x_k(x)B^y_l(y) = {\bf M}_{i,j,k,l }  \) to macierz masowa będąca iloczynem Kroneckera dwóch jednowymiarowych macierzy masowych,  \(  \{ S_x \otimes M_y\}_{i,j,k,l} =  \int \frac{\partial B^x_i(x)}{\partial x}\frac{\partial B^x_k(x)}{\partial x}B^y_j(y)B^y_l(y) =  \int \frac{\partial B^x_i(x)}{\partial x}B^y_j(y)\frac{\partial B^x_k(x)}{\partial x }B^y_l(y)  \) to iloczyn Kronecker jednowymiarowej macierzy sztywności i jednowymiarowej macierzy masowej, oraz  \(  \{  M_x \otimes S_y \}_{i,j,k,l} =  \int B^x_i(x) B^x_k(x) \frac{\partial B^y_j(y)}{\partial y} \frac{\partial B^y_l(y)}{\partial y } = \int B^x_i(x)\frac{\partial B^y_j(y)}{\partial y}B^x_k(x)\frac{\partial B^y_l(y)}{\partial y }  \) to iloczyn Kroneckera jednowymiarowej macierzy masowej i jednowymiarowej macierzy sztywności. Każdą z tych macierzy potrafimy sfaktoryzować w czasie liniowym stosując algorytm solwera zmienno-kierunkowego. Jednakże faktoryzacja ich sumy w czasie liniowym nie jest już możliwa. Jest to możliwe dopiero gdy wprowadzimy schemat kroków czasowych który umożliwia rozdzielenie macierzy na podmacierze w  podkrokach czasowych tak aby koszt faktoryzacji pozostawał liniowy. Schemat Peaceman'a-Reachford'a pozwala na rozdzielenie kroku czasowego na dwa podkroki  \(  \left(M_x \otimes M_y-dt \alpha S_x \otimes M_y\right) u^{t+1/2} = F(t+1/2)+\left(dt (1-\alpha) M_x \otimes S_y\right) u^{t}  \)  \(  \left(M_x \otimes M_y-dt \alpha M_x \otimes S_y\right) u^{t+1} = F(t+1/2)+\left(dt (1-\alpha) S_x \otimes M_y\right) u^{t+1/2 }  \) gdzie możemy scalić macierze lewej strony w jedną macierz o strukturze produktu Kroneckera, która może zostać sfaktoryzowana w czasie liniowym za pomocą algorytmu solwera zmienno-kierunkowego  \(  \left(M_x-dt \alpha S_x \right)\otimes M_y u^{t+1/2} = F(t+1/2)+\left(dt (1-\alpha) M_x \otimes S_y\right) u^{t}  \)  \(  M_x \otimes \left( M_y-dt \alpha S_y\right) u^{t+1} = F(t+1/2)+\left(dt (1-\alpha) S_x \otimes M_y\right) u^{t+1/2 }  \) Przyglądnijmy się na koniec jak wygląda operator prawej strony Funkcja prawej strony reprezentuje tutaj zmiany wywołane przez siłe działającą na system w czasie kroku czasowego, plus dodatkowo zmiany wywołane przez fizykę zjawiska w poprzednim kroku czasowym  \(   (u_{t+1},w) -dt (1-\alpha)(\mathcal{L}(u_{t+1}),w) = (u_t,B^x_k(x)B^y_l(y))+dt({f_{t+1}},B^x_k(x)B^y_l(y))+ dt(1-\alpha)(\mathcal{L}(u_t),B^x_k(x)B^y_l(y))  \) W szczególności nasza prawa strona nie jest jednak bitmapą, ale projekcją sumy trzech elementów:


Przykład niestacjonarnego problemu liniowego: propagacja zanieczyszczeń

Przykładowym problemem niestacjonarnym liniowym jest zagadnienie symulacji propagacji zanieczyszczeń [1] W problemie tym obliczamy pole skalarne koncentracji zanieczyszczeń  \(  {\cal R}^3 \ni (x,y,z)\times [0,T] \rightarrow c(x,y,z;t) \in {\cal R } \) takiego że  \(  \frac{\partial c}{\partial t } + u \cdot \nabla c - \nabla \cdot (K \nabla c) = e   \) co po rozpisaniu daje nam  \(  \frac{\partial c}{\partial t} + u_x\frac{\partial c}{\partial x}+u_y\frac{\partial c}{\partial y}+u_z\frac{\partial c}{\partial z} - \frac{\partial}{\partial x} \left( K_x \frac{\partial c}{\partial x}\right) -\frac{\partial}{\partial y} \left( K_y \frac{\partial c}{\partial y }\right) -\frac{\partial}{\partial z}\left( K_z \frac{\partial c}{\partial z } \right) \) W powyższym wzorze pierwszy człon  \(  \frac{\partial c}{\partial t } \) to zmiany pola koncentracji zanieczyszczeń w czasie, drugi człon  \(   u_x\frac{\partial c}{\partial x}+u_y\frac{\partial c}{\partial y } +u_z\frac{\partial c}{\partial z }   \) to człon adwekcji (zwany też konwekcją) który oznacza transport zanieczyszczeń przez wiatr, reprezentowany przez zadane pole wektrowe  \(  {\cal R}^3 \ni (x,y,z)\times [0,T] \rightarrow (u_x(x,y,z;t,,u_y(x,y,z;t);u_z(x,y,z;t))) \in {\cal R }^3   \), trzeci człon  \(  - \frac{\partial}{\partial x} \left( K_x \frac{\partial c}{\partial x} \right)-\frac{\partial}{\partial y} \left( K_y \frac{\partial c}{\partial y }\right) -\frac{\partial}{\partial z} \left( K_z \frac{\partial c}{\partial z } \right)  \) oznacza dyfuzję czyli samoistny transport cząstek zanieczyszczeń na zasadzie zjawiska dyfuzji. Wszystkie człony operatora różniczkowego opisującego proces propagacji zaniczyszczeń są liniowe, czyli  \(  {\cal L}(c_1+c_2)={\cal L}(c_1)+{\cal L }(c_2)  \). Dzięki temu możemy zbudować układ równań liniowych i zastosować solwery i algorytmy opisane w podręczniku. Prawa strona oznacza źródła emisji, i jest ona dodatnia w miejscach w których znajduje się źródło zanieczyszczeń (na przykład komin). Współczynniki dyfuzji   \(  (K_x,K_y,K_z)  \) oznaczają prędkość dyfuzji w kierunkach x,y i z. W celu rozwiązania problemu konwekcji-dyfuzji musimy jeszcze określić co dzieje się na brzegu obszaru. Możemy na przykład przyjąć prędkość napływu zanieczyszczeń  na brzegu obszaru  \(  \frac {\partial c} {\partial x}n_x+ \frac{\partial c}{\partial y }n_y+\frac{\partial c}{\partial z }n_z=g   \)  gdzie  \(  (n_x,n_y,n_z)   \)  to wektor jednostkowy prostopadły do brzegu. Musimy również podać warunek początkowy (początkową koncentracje zanieczyszczeń)  \(  c(x,0)=0  \). Na końcu podajemy dwie przykładowe symulacje, pierwszą prezentującą napływ zanieczyszczeń z zachodu na dolinę Krakowską dla obszaru otrzymanego poprzez wygenerowanie siatki czworościennej na podstawie danych topograficznych z bazy NASA oraz drugą symulację prezentującą rozwiewanie dymu z komina poprzez wiatr o zmiennym kierunku. Zostały one policzone kodami opisanymi w artykułach z bibliografii [2]:


Implementacja w MATLABie schematu alpha dla problemu transportu ciepła

Poniżej przedstawiam kod MATLABa wykonujący symulacje dla schematu alfa dla dwuwymiarowego problemu transportu ciepła.

Wykonanie kodu możliwe jest również w darmowym środowisku Octave.

W linii 621 podajemy rozmiar kroku czasowego  \(  dt=0.01 \), w linii 622 podajemy parametr  \(  alpha=0.5  \), pamiętając że alpha=0 to metoda explicite Euler, alpha=1 to metoda implicite Euler, alpha=0.5 to metoda Crancka-Nicolson. W linii 623 podajemy liczbę kroków czasowych  \(   K = 20;  \) Kod można uruchomić w darmowym środowisku Octave. Kod uuchamia się otwierając go w Octave oraz wpisując komendę  \( heat\_time \) Podczas działania kod wypisuje kolejne kroki czasowe Iter 1, t = 0.010000 Iter 2, t = 0.020000 Iter 3, t = 0.030000 ... W każdej chwili czasowej w katalogu bieżącym kod generuje plik out_*.png, np. out_0.png out_1.png out_2.png ... zawierające rozwiązania z poszczególnych kroków czasowych.


Przykład niestacjonarnego problemu nieliniowego: przepływ nieliniowy w ośrodku niejednorodnym

Przykładowy problem niestacjonarny opisany w tym module to problem przepływu nieliniowego w ośrodku niejednorodnym [1].

Przykładowe symulacje, pierwszą, w której na środku obszaru złóża  umieszczono pompę pompującą która wypełnia cały obszar cieczą pod ciśnieniem, oraz drugą symulacje, w której trzy pompy ssące odsysają ciecz z ropą wpompowaną wcześniej do złoża, przedstawiono na filmach. Zostały one policzone kodem opisanym w artykułach z bibliografii opisanej w pozycji [2].


Rozdział 8. Matematyczne sformułowanie metody elementów skończonych

Przestrzenie funkcyjne

Definicja 1: Przestrzenie funkcyjne nad obszarem jednowymiarowym

Dla  \(   \Omega = \left(x_l, x_r\right) \subset {\cal R}  \)
 \(   L^2(\Omega) = \{ v:\Omega \rightarrow {\cal R} : \int_{\Omega} v(x)^2 dx < \infty \}  \)
wraz z normą  \(   \|u\|_{L^2(\Omega)}^2 =  \int_{\Omega} u(x)^2 dx   \)
i iloczynem skalarnym  \(   \left(u,v\right) L^2(\Omega) =\int_{\Omega} u(x)v(x) dx  \)
 \(   H^1(\Omega) = \{v:\Omega \rightarrow {\cal R}  : \int_{\Omega} v(x)^2+\frac{dv(x)}{dx}^2 dx < \infty \}  \)
gdzie pochodna  \(   \frac{dv(x)}{dx}  \) rozumiana jest w słabym sensie, to znaczy definiujemy ją poprzez wzór na całkowanie przez częsci  \(   \int_{\Omega} u\frac{dv(x)}{dx} dx = -  \int_{\Omega} \frac{du(x)}{dx} v dx  \) dla wszystkich "smukłych" funkcji  \(   u \in C^\infty_0(\Omega) = \{v:\Omega \rightarrow {\cal R}  : \int_{\Omega} v(x)^2+\frac{dv(x)}{dx}^2 dx < \infty \}  \) nieskończenie wiele razy różniczkowalnych określonych na domkniętych poprzedziałach  \(   (a,b) \subset \Omega  \).
W przestrzeni  \(   H^1(\Omega) \) definiujemy normę  \(   \|u\|_{H^1(\Omega)}^2 =  \int_{\Omega} u(x)^2+\frac{du(x)}{dx}^2 dx   \) i iloczyn skalarnym  \(   \left(u,v\right)_{H^1(\Omega)} =\int_{\Omega} u(x)v(x)+\frac{du(x)}{dx}\frac{dv(x)}{dx} dx   \)
 \(   H^1_0(\Omega) = \{v:\Omega \rightarrow {\cal R}  : \int_{\Omega} v(x)^2+\frac{dv(x)}{dx}^2 dx < \infty; v(0)=0 \}  \)
wraz z normą  \(   \|u\|_{H_0^1(\Omega)}^2 =  \int_{\Omega} \frac{du(x)}{dx}^2 dx   \)
i iloczynem skalarnym  \(   \left(u,v\right) H_0^1(\Omega) =\int_{\Omega} \frac{du(x)}{dx}\frac{dv(x)}{dx} dx   \)

Definicja 2: Przestrzenie funkcyjne na dwuwymiarowym obszarem

Dla  \(   \Omega \subset  {\cal R}^2  \)
 \(   L^2(\Omega) = \{ v:\Omega \rightarrow {\cal R} : \int_{\Omega} v(x_1,x_2)^2 dx_1dx_2 < \infty \}  \)
wraz z normą  \(   \|u\|^2_{L^2(\Omega)} =  \int_{\Omega} v(x_1,x_2)^2 dx_1dx_2   \)
i iloczynem skalarnym   \(   \left(u,v\right)_{L^2(\Omega)} =  \int_{\Omega} u(x_1,x_2)v(x_1,x_2) dx_1dx_2   \)
 \(   H^1(\Omega) = \{v:\Omega \rightarrow {\cal R}  : \int_{\Omega} (v(x_1,x_2)^2+\frac{dv(x_1,x_2)}{dx_1}^2+\frac{dv(x_1,x_2)}{dx_2}^2 )dx_1dx_2 < \infty \}  \) gdzie pochodne
 \(   \frac{dv(x_1,x_2)}{dx_i},i=1,2  \) rozumiemy w sensie słabym
 \(  \int_\Omega u(x_1,x_2) \frac{dv(x_1,x_2)}{dx_i} dx_1 dx_2= -  \int_\Omega \frac{du(x_1,x_2)}{dx_i}  v(x_1,x_2) dx_1 dx_2 \). Innymi słowy są one definiowane za pomocą całkowania przez części z funkcjami gładkimi  \( u \in C^\infty_0(\Omega) \) nieskończenie wiele razy różniczkowalnymi określonymi na obszarze zwartym zawartym w  \(   \Omega  \).
W przestrzeni
 \(   H^1(\Omega)  \) definiujemy normę  \(   \|u\|^2_{H^1(\Omega)} =  \int_{\Omega} \left( u(x_1,x_2)^2+\frac{du(x_1,x_2)}{dx_1}^2+\frac{du(x_1,x_2)}{dx_2}^2\right) dx_1dx_2   \)
i iloczyn skalarny   \(   \left(u,v\right)_{H^1(\Omega)} =  \int_{\Omega} \left( u(x_1,x_2)v(x_1,x_2) +\frac{du(x_1,x_2)}{dx_1}\frac{dv(x_1,x_2)}{dx_1}+\frac{du(x_1,x_2)}{dx_2}\frac{dv(x_1,x_2)}{dx_2}\right)dx_1dx_2   \).
 \(   H^1_0(\Omega) = \{v:\Omega \rightarrow {\cal R}  : \int_{\Omega} (v(x_1,x_2)^2+\frac{dv(x_1,x_2)}{dx_1}^2+\frac{dv(x_1,x_2)}{dx_2}^2) dx_1dx_2 < \infty, tr v(x_1,x_2)=0 \}  \)
wraz z normą  \(   \|u\|^2_{H^1_0(\Omega)} =  \int_{\Omega} \left( \frac{du(x_1,x_2)}{dx_1}^2+\frac{du(x_1,x_2)}{dx_2}^2\right) dx_1dx_2   \)
i iloczynem skalarnym   \(   \left(u,v\right)H^1_0(\Omega) =  \int_{\Omega} \left( \frac{du(x_1,x_2)}{dx_1}\frac{dv(x_1,x_2)}{dx_1}+\frac{du(x_1,x_2)}{dx_2}\frac{dv(x_1,x_2)}{dx_2}\right)dx_1dx_2   \)
gdzie operator śladu oznacza określanie wartości funkcji na brzegu, co w przypadku funkcji będących elementami przestrzeni Sobolewa wymaga wprowadzania klas równoważności funkcji równych co do wartości całki.


Jednowymiarowy element skończony

W rozdziale tym podajemy ścisłe matematyczne definicje związane z klasyczną metodą elementów skończonych. W szczególności, definicje elementu skończonego zostały podane przez Ciarleta w 1978 roku, oraz w kontekście adaptacyjnej metody elementów skończonych przez Demkowicza w 2007 roku [1] [2].

Poniżej podajemy obydwie te definicje. Definicja Ciarleta używa pojęcia stopni swobody, natomiast definicja Demkowicza używa pojęcia funkcji kształtu i operatora interpolacji przez projekcję. Pokażemy następnie zależności pomiędzy tymi dwoma definicjami, z których wynika iż są one równoważne. Element skończony zdefiniujemy najpierw w jedym wymiarze, dla referencyjnego (często zwanego również wzorcowym) elementu skończonego zdefiniowanego na przedziale  \(  \hat{K}=[0,1] \subset {\cal R}  \),  a następnie uogólnimy tą definicję na dowolny element zdefiniowany na dowolnym przedziale  \(  K=[ x_l,x_r ] \subset {\cal R}  \).

Elementów referencyjnych używa się do całkowania sformułowań słabych. Elementy referencyjne mają regularny kształt. Element referencyjny odwzorowywany jest na dany element, a jego geometria opisana jest odwzorowaniem mapy z elementu referencyjnego na dany element. W całkach jakobian tego odwzorowania reprezentuje skalowanie pola (objętości) elementu referencyjnego na dany element.

Definicja 1: Jednowymiarowy referencyjny element skończony (na podstawie Demkowicz 2007)

Jednowymiarowym referencyjnym elementem skończonym nazywamy trójkę
 \(  \left( \hat{K}, X\left(\hat{K}\right), \Pi_p \right)  \)
zdefiniowaną za pomocą następujących czterech kroków

Geometria:  \(  \hat{K}=[0,1] \subset {\cal R}  \)
Wybór węzłów:  \(  \hat{a}_1, \hat{a}_2  \) węzły związane z wierzchołkami 0 i 1 elementu, oraz  \(  \hat{a}_3  \) węzeł związany z wnętrzem (0,1) elementu
Definicja funkcji kształtu elementu  \(  X \left( \hat{K}\right)=span \{ \hat{\chi}_j \in {\cal P}^p\left(\hat{K}\right),j=1,...,p+1 \}  \) gdzie  \(  {\cal P}^p\left(\hat{K}\right)  \) to wielomiany stopnia  \( p  \) określone na przedziale  \( \hat{K} =(0,1)  \) oraz  \(  \hat{\chi}_1(\xi)=1-\xi  \),  \(  \hat{\chi}_2(\xi)=\xi  \),  \(  \hat{\chi}_3(\xi)=(1-\xi)\xi  \),  \(  \hat{\chi}_l(\xi)=(1-\xi)\xi(2\xi-1)^{l-3} \quad l=4,...,p+1  \).
Definicja operatora interpolacji przez operator projekcji  \(  \Pi_p:H^1\left( \hat{K} \right) \rightarrow X\left( \hat{K}\right)  \). Dla danej funkcji  \(  u \in H^1\left(\hat{K} \right)  \), jej interpolant bazujący na projekcji to  \(  \Pi_pu\in X\left( \hat{K}\right)  \) jest zdefiniowany poprzez następujące warunki:
 \(  \Pi_p u(\hat{a}_1)=u(\hat{a}_1)  \)
 \(  \Pi_p u(\hat{a}_2)=u(\hat{a}_2)  \)
 \(  \|  \Pi_p u -u \|_{H^1_0(0,1)}\rightarrow min  \)
gdzie  \(  \|  \Pi_p u  -u \|_{H^1_0(0,1)} = \int_0^1 \left( \left( \Pi_p u \right)' -u' \right)^2 d\xi   \)  to norma w przestrzeni Sobolewa  \(  H^1_0(0,1)  \).

Definicja 2: Jednowymiarowy referencyjny element skończony (na podstawie Ciarlet 1978)

Jednowymiarowym referencyjnym elementem skończonym nazywamy trójkę
 \(  \left( \hat{K}, V^*\left(\hat{K}\right), X\left(\hat{K}\right) \right)  \)
zdefiniowaną za pomocą następujących czterech kroków

Geometria:  \(  \hat{K}=\left(0,1\right) \in {\cal R}  \)
Wybór węzłów:  \(  \hat{a}_1, \hat{a}_2  \) węzły związane z wierzchołkami 0 i 1 elementu, oraz  \(  \hat{a}_3  \) węzeł związany z wnętrzem (0,1) elementu
Definicja przestrzeni stopni swobody   \(  V^* \left( \hat{K}\right) = span \{ \psi_i \}_{i=1,...,p+1}  \) jako przestrzeni dualnej do   \(  V\left( \hat{K} \right)   \).Kojarzymy stopnie swobody z węzłami elementu oraz z wnętrzem elementu  \( \psi_1 : V\left(\hat{K}\right) \ni f \rightarrow f(\hat{a}_1)\in R  \),   \( \psi_2 : V\left(\hat{K}\right) \ni f \rightarrow f(\hat{a}_2)\in R  \),  \( \psi_3 : V\left(\hat{K}\right) \ni f \rightarrow 3 \int_{\hat{a}_3} f'(\xi) (1-2\xi)d\xi \in R  \). Możliwe jest rozszerzenie tej definicji na dalsze stopnie swobody (tutaj podajemy definicję dla  \(  p=2   \).
Konstrukcja przestrzeni aproksymacyjnej  \(  X\left(\hat{K}\right)  \subset V\left(\hat{K}\right)   \). Przestrzeń aproksymacyjna jest rozpięta przez bazę wielomianów będącą bazą dualną do bazy stopni swobody
 \(  \psi_i\left(\chi_j\right) = \delta_{ij}  \)

Definicja 3: Jednowymiarowy element skończony (definicja przez funkcje kształtu i operator interpolacji przez projekcję)

Jednowymiarowym elementem skończonym nazywamy trójkę
 \(  \left( K, X\left(K \right), \Pi_p \right)  \)
zdefiniowaną za pomocą następujących czterech kroków

Geometria:  \(  K=[ x_l,x_r] \subset {\cal R}, x_l,x_r \in {\cal R}  \)
Wybór węzłów:  \( a_1, a_2  \) węzły związane z wierzchołkami  \(   x_l,x_r   \) elementu, oraz  \(  a_3  \) węzeł związany z wnętrzem   \(  K=[ x_l,x_r] {\cal R}  \) elementu
Definicja funkcji kształtu elementu  \(  X \left( K\right)=\{ \chi = \hat{\chi} \cdot x_K^{-1}, \hat{\chi} \in X\left(\hat{K}\right) \}  \) gdzie  \(  x_K:\hat{K} \rightarrow K   \) to odwzorowanie z elementu wzrocowego   \( K=[0,1]  \) na element  \( K=[x_l,x_r]  \) dane  \( \hat{K} \ni \xi \rightarrow x_K\left(\xi\right)=x_l+(x_r-x_l)=x\in K  \)
Definicja operatora interpolacji bazującego na operatorze projekcji  \(  \Pi_p:H^1\left( \hat{K} \right) \rightarrow X\left( \hat{K}\right)  \) zdefiniowanego analogicznie do Definicji 1.


Jednowymiarowe sformułowania silne i słabe dla problemu eliptycznego

Definicja 1: Sformułowanie silne dla jednowymiarowe problemu eliptycznego

  Dla obszaru  \(   \Omega=(0,l) \subset {\cal R}  \) szukamy pola skalarnego  \(   \Omega \ni x \rightarrow u(x) \in {\cal R}  \) będącego funkcją gładką  \(   u \in C^0  \) taką że   \(  -\left(a(x)u'(x)\right)'+b(x)u'(x)+c(x)u(x)=f(x) \textrm{ dla } x\in (0,l) \) wraz z warunkiem brzegowym Dirichleta
  \(   u(0)=u_0  \) i warunkiem brzegowym Robina  \(   a(l)u'(l)+\beta_l u(l)=\gamma_l  \) gdzie  \(   u_0,\beta_l,\gamma_l \in{\cal R}  \),  \(  \Omega \ni x \rightarrow a(x),b(x),c(x), f(x) \in {\cal R}  \) zadane funkcje  \(  a \in C^1, b,c,f \in C^0  \).

Definicja 2: Rozszerzenie warunku brzegowego Dirichleta dla jednowymiarowego problemu eliptycznego

Wprowadzamy funkcję  \(  \tilde{u}(x) = (1-\frac{x}{l})u_0  \) taką że  \(  \tilde{u}(0)=u_0  \).

Definicja 3: Sformułowanie słabe dla jednowymiarowego problemu eliptycznego

Dla obszaru  \(   \Omega=(0,l) \subset {\cal R}  \) dla którego brzeg podzielony jest na fragment brzegu Dirichleta w  \(  x=0  \) i fragment brzegu Robina w  \(  x=l  \), szukamy pola skalarnego  \(  u \in V  \) takiego że   \(   B(u,v)=L(v)-B(\hat{u},v) \quad \forall v\in V  \) gdzie   \(   B(u,v)=\int_0^l \left( a(x) u'(x) v'(x) +b(x)u'(x)v(x)+c(x)u(x)v(x)\right)dx + \beta u(l)v(l)  \) oraz  \(  L(v)=\int_0^l  f(x) v(x)dx + \gamma v(l)  \) oraz  \(  \tilde{u}  \) jest rozszerzeniem warunku brzegowego Dirichleta na cały obszar, oraz  \(  V=\{u\in H^1(\Omega): u(0)=0 \}  \).


Jednowymiarowa metoda elementów skończonych

Siatka referencyjna używana jest do szacownia błędu względnego na siatce obliczeniowej. Często kiedy opisuje się siatkę obliczeniową w kontekście siatki referencyjnej, nazywa się ją siatką rzadka, a siatkę referencyjną siatką gęstą, powstaje ona bowiem poprzez połamanie elementów na mniejsze elementy i zwiększenie stopnia aproksymacji wielomianowej o jeden.

Definicja 1: Jednowymiarowa siatka obliczeniowa

Siatka obliczeniowa to skończona rodzina  \(  T_{hp} \) elementów skończonych  \(  T_{hp}=\{ \left(K, X\left(K\right), \Pi_p \right) \}_K  \) takich że  \(   \cup_{K \in T_{hp} } = \Omega  \),  \(  \textrm{meas} K_i \cap K_j = K_i \textrm{ dla } i=j; 0 \textrm{ dla } i \neq j  \)

Definicja 2: Jednowymiarowa siatka referencyjna

Dla danej siatki obliczeniowej   \(  \{ T_{hp }= \left(K, X\left(K\right), \Pi_p \right)  \}_K  \) siatka referencyjna to rodzina  \(  T_{\frac{h}{2}p+1} \) elementów skończonych
 \(   T_{\frac{h}{2}p+1}=\{ \left( K, X\left(K\right), \Pi_p \right) \}_K { }  \) takich że
 \(  \forall K \in T_{ \frac{h}{2}p+1} \exists  K_1,K_2 \in {\cal P}(T_{hp },K)  \) takie że
 \(  K=K_1 \cup K_2, \textrm{meas}K_1\cap K_2=0  \),
 \(  X(K_1),X(K_2) \in {\cal P}(T_{hp },X(K)), dim X(K)=dimX(K_1)+1=dimX(K_2)+1  \) gdzie  \(  {\cal P } (T_{hp},K )   \) i  \(  {\cal P }(T_{hp},X(K))  \) oznaczają projekcje na pierwszy i drugi komponent   \(  \left( K, X\left( K \right), \Pi_p \right)  \). Wzór wymiaru przestrzeni funkcji kształtu na nowych dwóch elementach wynika z dodania jednej nowej funkcji kształtu, stosownie poprzez zwiększenie stopnia wielomianu o 1 we wnętrzu elementu.

Definicja 3: Przestrzeń aproksymacyjna nad jednowymiarową siatką obliczeniową

Przestrzeń aproksymacyjna nad  jednowymiarową siatką obliczeniową   \(  T_{hp}=\{ \left(K, X\left(K\right), \Pi_p \right) \}_K  \)  to
  \(  V_{hp }= \{ v \in C(\Omega): \forall K \in {\cal P }( T_{hp},K): {\cal P }( v,K) \in X(K) \}  \)
gdzie  \(   {\cal P }( T_{hp},K)   \) to zbiór przedziałów reprezentujących  geometrię elementów wyciągnięty z trójki reprezentującej jednowymiarową siatkę obliczeniową,   \(  {\cal P }( v,K)   \) to projekcja funkcji na przedział reprezentujący geometrię elementu.

Definicja 4: Odwzorowania definiujące składanie lokalnych funkcji kształtu na globalne funkcje bazowe nad siatką obliczeniową

Niech  \(  T_{hp}=\{ \left(K, X\left(K\right), \Pi_p \right) \}_K  \)  oznacza jednowymiarową siatkę obliczeniową.
Niech  \(  \{ e_i^{hp} \}_i  \) oznacza bazę przestrzeni  \(  V_{hp }= span\{ e_i^{hp} \}   \).
Niech  \(  \chi^K_k \in X \left( K\right)  \) oznacza funkcje kształtu nad elementem  \(  K  \).
Wówczas  \(  \forall K \in {\cal P }( T_{hp},K), \forall i, \exists k : {\cal P}(e_i^{hp},K) = \chi^K_k  \).
Istnieje odwzorowanie odwrotne  \(  {\cal I}^2 \ni (k,K)\rightarrow i(k,K)\in {\cal I}  \) które przypisuje numer
 \(  i(k,K)  \) globalnej i-tej funkcji bazowej związanej z lokalną   \( k \)-tą funkcją kształtu nad elementem  \(  K  \).
W przypadkach rozpatrywanych w tym podręczniku, odwzorowanie to jest izomorficzne.

Definicja 5: Przestrzeń aproksymacyjna nad jednowymiarową siatką referencyjną

Przestrzeń aproksymacyjna nad  jednowymiarową siatką obliczeniową   \(  T_{\frac{h}{2}p+1}=\{ \left(K, X\left(K\right), \Pi_p \right) \}_K  \)  to
  \(  V_{\frac{h}{2}p+1 }= \{ v \in C(\Omega): \forall K \in {\cal P }( T_{\frac{h}{2}p+1},K): {\cal P }( v,K) \in X(K) \}  \)
gdzie  \(   {\cal P }( T_{\frac{h}{2}p+1},K)   \) to zbiór przedziałów reprezentujących  geometrię elementów wyciągnięty z trójki reprezentującej jednowymiarową siatkę obliczeniową,   \(  {\cal P }( v,K)   \) to projekcja funkcji na przedział reprezentujący geometrię elementu.

Definicja 6: Odwzorowania definiujące składanie lokalnych funkcji kształtu na globalne funkcje bazowe nad siatką referencyjną

Niech  \(  T_{\frac{h}{2}p+1}=\{ \left(K, X\left(K\right), \Pi_p \right) \}_K  \)  oznacza jednowymiarową siatkę referencyjną.
Niech  \(  \{ e_i^{\frac{h}{2}p+1} \}_i  \) oznacza bazę przestrzeni  \(  V_{\frac{h}{2}p+1 }= span\{ e_i^{\frac{h}{2}p+1} \}   \).
Niech  \(  \chi^K_k \in X \left( K\right)  \) oznacza funkcje kształtu nad elementem  \(  K  \).
Wówczas  \(  \forall K \in {\cal P }( T_{\frac{h}{2}p+1},K), \forall i, \exists k : {\cal P}(e_i^{\frac{h}{2}p+1},K) = \chi^K_k  \).
Istnieje odwzorowanie odwrotne  \(  {\cal I}^2 \ni (k,K)\rightarrow i(k,K)\in {\cal I}  \) które przypisuje numer
 \(  i(k,K)  \) globalnej i-tej funkcji bazowej związanej z lokalną   \( k \)-tą funkcją kształtu nad elementem  \(  K  \).
W przypadkach rozpatrywanych w tym podręczniku, odwzorowanie to jest izomorficzne.

Definicja 7: Problem metody elementów skończonych nad jednowymiarową siatką obliczeniową

Dla danej siatki obliczeniowej   \(  T_{hp}=\{ \left(K, X\left(K\right), \Pi_p \right) \}_K  \) znaleźć współczynniki  \(  \{ u^{hp}_i \}_{i=1,...,N^{hp}}  \) rozwiązania przybliżonego   \(  V \supset V_{hp } \ni u_{hp }=\sum_{i=1,...,N^{hp } } u_i^{hp } e_i^{hp }  \) takie że  \(   \sum_{i=m,...,N^{hp } } u_m^{hp } B(e_m^{hp},e_n^{hp})=L(e_n^{hp}), n=1,...,N^{hp} \) gdzie   \(   B(e_m^{hp},e_n^{hp})=\int_0^l \left( a(x) \frac{de_m^{hp}(x)}{dx} \frac{de_n^{hp}(x)}{dx} +b(x)\frac{de_m^{hp}(x)}{dx}e_n^{hp}(x)+c(x)e_m^{hp}(x)e_n^{hp}(x)\right)dx + \beta e_m^{hp}(l)e_n^{hp}(l)  \) oraz  \(  L(e_n^{hp})=\int_0^l f(x) e_n^{hp}(x)dx + \gamma e_n^{hp}(l)  \). Baza  \(  \{ e^{hp}_i \}_{i=1,...,N^{hp}}  \) przestrzeni aproksymacyjnej  \( V_{hp}  \) uzyskana jest poprzez sumowanie funkcji kształtu z przestrzeni  \(   X\left(K\right)  = {\cal P}(T_{hp},X(K))  \) dla poszczególnych elemetów z siatki  \(  T_{hp}  \) w globalne funkcje bazowe.

Definicja 8: Problem metody elementów skończonych nad jednowymiarową siatką referencyjną

Dla danej siatki obliczeniowej   \(  T_{\frac{h}{2}p+1}=\{ \left(K, X\left(K\right), \Pi_p \right) \}_K  \) znaleźć współczynniki  \(  \{ u^{\frac{h}{2}p+1}_i \}_{i=1,...,n^{\frac{h}{2}p+1}}  \) rozwiązania przybliżonego   \(  V \supset V_{\frac{h}{2}p+1 } \ni u_{\frac{h}{2}p+1 }=\sum_{i=1,...,N^{\frac{h}{2}p+1 } } u_i^{\frac{h}{2}p+1 } e_i^{\frac{h}{2}p+1 }  \) takie że  \(   \sum_{m=1,...,N^{\frac{h}{2}p+1 } } u_m^{\frac{h}{2}p+1 }  B(e_m^{\frac{h}{2}p+1},e_n^{\frac{h}{2}p+1})=L(e_n^{\frac{h}{2}p+1}), n=1,...,N^{hp} \) gdzie   \(   B(e_m^{\frac{h}{2}p+1},e_n^{\frac{h}{2}p+1})=\int_0^l \left( a(x) \frac{de_m^{\frac{h}{2}p+1}(x)}{dx} \frac{de_n^{\frac{h}{2}p+1}(x)}{dx} +b(x)\frac{de_m^{\frac{h}{2}p+1}(x)}{dx}e_n^{\frac{h}{2}p+1}(x)+c(x)e_m^{\frac{h}{2}p+1}(x)e_n^{\frac{h}{2}p+1}(x)\right)dx +\\+ \beta e_m^{\frac{h}{2}p+1}(l)e_n^{hp}(l)  \) oraz  \(  L(e_n^{\frac{h}{2}p+1})=\int_0^l f(x) e_n^{\frac{h}{2}p+1}(x)dx + \gamma e_n^{\frac{h}{2}p+1}(l)  \).
Baza  \(  \{ e^{\frac{h}{2}p+1}_i \}_{i=1,...,N^{\frac{h}{2}p+1}}  \) przestrzeni aproksymacyjnej  \( V_{hp}  \) uzyskana jest poprzez sumowanie funkcji kształtu z przestrzeni  \(   X\left(K\right)  = {\cal P}(T_{\frac{h}{2}p+1},X(K))  \) dla poszczególnych elemetów z siatki  \(  T_{\frac{h}{2}p+1}  \) w globalne funkcje bazowe.


Przykład jednowymiarowej metody elementów skończonych


Dwuwymiarowy element skończony

Definicja 1: Dwuwymiarowy referencyjny element skończony

Dwuwymiarowym referencyjnym elementem skończonym nazywamy trójkę
 \(  \left( \hat{K}, X\left(\hat{K}\right), \Pi_p \right)  \)
zdefiniowaną za pomocą następujących czterech kroków

Geometria:  \(  \hat{K}=[0,1]^2 \subset {\cal R}^2  \)
Wybór węzłów:  \(  \hat{a}_1, \hat{a}_2, \hat{a}_3, \hat{a}_4,   \) węzły związane z wierzchołkami elementu (0,0), (1,0), (1,1) i (0,1),   \(  \hat{a}_5,  \hat{a}_6,  \hat{a}_7,  \hat{a}_8  \) węzły związane z krawędziami elementu, oraz   \(   \hat{a}_9  \) węzeł związany z wnętrzem elementu.
Definicja funkcji kształtu elementu  \(  X \left( \hat{K}\right)=span \{ \hat{\phi}_j(\xi_1,\xi_2) \in {\cal Q}^{(p_h,p_v)}\left(\hat{K}\right),j=1,...,(p_h+1)(p_v+1) \}  \) gdzie  \(  {\cal Q}^{(p_h,p_v)}\left(\hat{K}\right) \) to wielomiany stopnia  \( p_h  \) względem zmiennej   \( \xi_1  \) oraz stopnia  \( p_v  \) względem zmiennej   \( \xi_2  \), określone na  \( \hat{K}=[0,1]^2  \). Dla funkcji kształtu skojarzonych z węzłami krawędziowymi elementów, wprowadzamy stopnie wielomianów  \(  p_1,p_3\leq p_h; p_2,p_4 \leq p_v  \). Definiujemy wierzchołkowe funkcje kształtu \(  \hat{\phi}_1(\xi_1,\xi_2)=\hat{\chi}_1(\xi_1)\hat{\chi}_1(\xi_2)  \),  \(  \hat{\phi}_2(\xi_1,\xi_2)=\hat{\chi}_2(\xi_1)\hat{\chi}_1(\xi_2)  \),  \(  \hat{\phi}_3(\xi_1,\xi_2)=\hat{\chi}_2(\xi_1)\hat{\chi}_2(\xi_2)  \),  \(  \hat{\phi}_4(\xi_1,\xi_2)=\hat{\chi}_1(\xi_1)\hat{\chi}_2(\xi_2)  \), następnie definiujemy krawędziowe funkcje kształtu,  \(  \hat{\phi}_{5,j}(\xi_1,\xi_2)=\hat{\chi}_{2+j}(\xi_1)\hat{\chi}_1(\xi_2), j=1,...,p_1-1  \),  \(  \hat{\phi}_{6,j}(\xi_1,\xi_2)=\hat{\chi}_2(\xi_1)\hat{\chi}_{2+j}(\xi_2), j=1,...,p_2-1  \),  \(  \hat{\phi}_{7,j}(\xi_1,\xi_2)=\hat{\chi}_{2+j}(\xi_1)\hat{\chi}_2(\xi_2), j=1,...,p_3-1  \),  \(  \hat{\phi}_{8,j}(\xi_1,\xi_2)=\hat{\chi}_1(\xi_1)\hat{\chi}_{2+j}(\xi_2), j=1,...,p_4-1  \), dodatkowo definiujemy funkcje kształtu związaną z wnętrzem elementu  \(  \hat{\phi}_{9,i,j}(\xi_1,\xi_2)=\hat{\chi}_{2+i}(\xi_1)\hat{\chi}_{2+j}(\xi_2), i=1,...,p_h-1;j=1,...,p_v-1  \).
Definicja operatora interpolacji bazującego na operatorze projekcji  \(  \Pi_p:H^1\left( \hat{K} \right) \rightarrow X\left( \hat{K}\right)  \). Dla danej funkcji  \(  u \in H^1\left(\hat{K} \right)  \), jej interpolant bazujący na projekcji to  \(  \Pi_pu\in X\left( \hat{K}\right)  \) jest zdefiniowany poprzez następujące warunki:
 \(  \Pi_p u(0,0)=u(0,0)  \)
 \(  \Pi_p u(1,0)=u(1,0)  \)
 \(  \Pi_p u(0,1)=u(0,1)  \)
 \(  \Pi_p u(1,1)=u(1,1)  \)
 \(  \|  \Pi_p u  -u \|_{H^1_0(\hat{K})}\rightarrow min  \)
gdzie  \(  \| \Pi_p u -u \|_{H^1_0(\hat{K})} = \int_{\hat{K}} \left( \left( \Pi_p u \right)' -u' \right)^2 d\xi_1d\xi_2   \)  to norma w przestrzeni Sobolewa  \(  H^1_0(\hat{K})  \).

Definicja 2: Dwuwymiarowy element skończony

Dwuwymiarowym elementem skończonym nazywamy czwórkę
 \(  \left( K, X\left(K\right), \Pi_p \right)  \)
zdefiniowaną za pomocą następujących czterech kroków

Geometria:  \(  K \subset {\cal R}^2  \)
Wybór węzłów:  \(  a_1, a_2, a_3, a_4,   \) węzły związane z wierzchołkami elementu,   \(  a_5,  a_6,  a_7,  a_8  \) węzły związane z krawędziami elementu, oraz   \(  a_9  \) węzeł związany z wnętrzem elementu.
Definicja funkcji kształtu elementu  \(  X \left( K\right)=\{ \phi(x_1,x_2) = \hat{\phi} \cdot x_K^{-1}(x_1,x_2), \hat{\phi} \in X\left(\hat{K}\right) \}  \) gdzie  \(  x_K:\hat{K} \rightarrow K   \) to odwzorowanie z elementu wzrocowego   \( \hat{K}=[0,1]^2  \) na element  \( K\subset {\cal R}^2  \) dane  \( \hat{K} \ni (\xi_1,\xi_2) \rightarrow x_K\left(\xi_1,\xi_2 \right)=(x_1,x_2)\in K  \)
Definicja operatora interpolacji bazującego na operatorze projekcji  \(  \Pi_p:H^1\left( K \right) \rightarrow X\left( K \right)  \). Dla danej funkcji  \(  u \in H^1\left(K \right)  \), jej interpolant bazujący na projekcji to  \(  \Pi_pu\in X\left( K\right)  \) jest zdefiniowany poprzez następujące warunki:
 \(  \Pi_p u(a_1)=u(a_1)  \)
 \(  \Pi_p u(a_2)=u(a_2)  \)
 \(  \Pi_p u(a_3)=u(a_3)  \)
 \(  \Pi_p u(a_4)=u(a_4)  \)
 \(  \|  \Pi_p u  -u \|_{H^1_0(K)}\rightarrow min  \)
gdzie  \(  \| \Pi_p u -u \|_{H^1_0(K)} = \int_{K} \left( \left( \Pi_p u \right)' -u' \right)^2 dx_1dx_2   \)  to norma w przestrzeni Sobolewa  \(  H^1_0(K)  \).


Dwuwymiarowe sformułowania silne i słabe dla problemu eliptycznego

Definicja 1: Sformułowanie silne dwuwymiarowego problemu brzegowego eliptycznego

Znaleźć   \(  {\cal R}^2 \supset \Omega \ni (x_1,x_2) \rightarrow u(x_1,x_2) \in {\cal R}   \) takie że
  \(  -\sum_{i=1,2} \frac{\partial}{\partial x_i} \left( \sum_{j=1,2} a_{ij}(x_1,x_2) \frac{\partial u(x_1,x_2)}{\partial x_j}  \right) +\sum_{j=1,2} b_j(x_1,x_2)\frac{\partial u(x_1,x_2)}{\partial x_j} + c(x_1,x_2) u(x_1,x_2) =f(x_1,x_2)  \)
 \(  u(x_1,x_2)= u_D(x_1,x_2) \textrm{ dla } (x_1,x_2) \in \Gamma_D  \)
  \(  \sum_{j=1,2} a_{ij}(x_1,x_2) \frac{\partial u(x_1,x_2)}{\partial x_j} n_i=g(x_1,x_2)  \textrm{ dla } (x_1,x_2) \in \Gamma_N \)
  \(  \sum_{j=1,2} a_{ij}(x_1,x_2) \frac{\partial u(x_1,x_2)}{\partial x_j} n_i + \beta(x_1,x_2) u(x_1,x_2)=g(x_1,x_2)  \textrm{ dla } (x_1,x_2) \in \Gamma_R \) gdzie
 \(  a{ij}, b_j, c,f :  {\cal R}^2 \supset \Omega \ni (x_1,x_2) \rightarrow a_{ij}(x_1,x_2),b_j(x_1,x_2),c(x_1,x_2),f(x_1,x_2) \in {\cal R}   \)
to dane funkcje oraz
 \(  u_D :  {\cal R}^2 \supset \Gamma_D \ni (x_1,x_2) \rightarrow u_D(x_1,x_2) \in  {\cal R}   \)
 \(  g :  {\cal R}^2 \supset \Gamma_N \cup \Gamma_R \ni (x_1,x_2) \rightarrow g(x_1,x_2) \in  {\cal R}   \)
 \(  \beta :  {\cal R}^2 \supset  \Gamma_R \ni (x_1,x_2) \rightarrow \beta(x_1,x_2) \in  {\cal R}   \)
to dane funkcje, oraz brzeg obszaru podzielony jest na fragment na którym określono warunek brzegowy Dirichleta, Neumanna i Robina
 \(   \partial \Omega = \Gamma_D \cup \Gamma_N \cup \Gamma_R   \).

Definicja 2: Sformułowanie słabe dwuwymiarowego problemu brzegowego eliptycznego

Znaleźć   \(  u \in V   \) takie że
  \(  B(u,v)=L(v)-B(\hat{u},v) \quad \forall v \in V  \) gdzie
 \(  B(u,v)= \int_{\Omega} \left(  \sum_{i=1,2} \sum_{j=1,2} a_{ij}(x_1,x_2) \frac{\partial u(x_1,x_2) }{\partial x_j } \frac{\partial v(x_1,x_2) }{\partial x_j } +  \\+\sum_{j=1,2} b_j(x_1,x_2) \frac{\partial u(x_1,x_2) }{\partial x_j } v(x_1,x_2) +c (x_1,x_2 )u(x_1,x_2) \right) dx_1 dx_2 +  \)
 \(  +\int_{\Gamma_R} \beta(x_1,x_2) u(x_1,x_2) v(x_1,x_2) ds  \)
 \(  L(v)= \int_{\Omega} f(x_1,x_2)v(x_1,x_2) dx_1 dx_2 + \int_{\Gamma_R} g(x_1,x_2)  v(x_1,x_2) ds  \)
gdzie  \(  \hat{u}_D  \) to rozszerzenie warunku brzegowego Dirichleta  \(  tr \left( \hat{u} \right) = u_D  \) na cały obszar  \(  \Omega  \) oraz
 \(   V = \{ v \in L^2(\Omega):\int_{\Omega} \| v \|^2 +\| \nabla v \|^2 dx_1 dx_2 < \infty, tr(v)=0 \textrm{ on } \Gamma_D \}  \).


Dwuwymiarowa metoda elementów skończonych

Siatka referencyjna używana jest do szacownia błędu względnego na siatce obliczeniowej. Często kiedy opisuje się siatkę obliczeniową w kontekście siatki referencyjnej, nazywa się ją siatką rzadką, a siatkę referencyjną siatką gęstą, powstaje ona bowiem poprzez połamanie elementów na mniejsze elementy i zwiększenie stopnia aproksymacji wielomianowej o jeden.

Definicja 1: Dwuwymiarowa siatka obliczeniowa

 Siatka obliczeniowa to skończenie wymiarowa rodzina  \(  T_{hp} \) elementów skończonych  \(  T_{hp}=\{ \left(K, X\left(K\right), \Pi_p \right) \}_K  \), takich że
 \(   \cup_{K \in T_{hp}} = \Omega  \),  \(  \textrm{ meas} K_i \cap K_j = K_i \textrm{ dla } i=j; 0 \textrm{ dla } i \neq j  \)

Definicja 2: Dwuwymiarowa siatka referencyjna

 Dla danej siatki obliczeniowej  \(  T_{hp}= \{ \left(K, X\left(K\right), \Pi_p \right)  \}_K  \) siatka referencyjna to rodzina  \(  T_{\frac{h}{2}p+1} \) elementów skończonych  \(   T_{\frac{h}{2}p+1}=\{ \left(K, X\left(K\right), \Pi_p \right) \}_K  \), takich że
 \(   \forall K \in T_{\frac{h}{2}p+1} \exists  K_1,K_2,K_3,K_4 \in {\cal P}(T_{hp},K)  \), takie że
 \(  K=K_1\cup K_2 \cup K_3 \cup K_4, \textrm{meas}K_i \cap K_j=K_i \textrm{ dla } i=j; 0 \textrm{ dla } i \neq j \),
 \(  X(K_1),X(K_2),X(K_3),X(K_4) \in {\cal P}(T_{hp},X(K)), dim X(K)=\\ dim(K_1)+7=dim(K_2)+7=dim(K_3)+7=dim(K_4)+7  \), gdzie
 \(  {\cal P}(T_{hp},K)   \) i  \(  {\cal P}(T_{hp},X(K))  \) oznaczają projekcje na pierwszy i drugi komponent   \(  \left(K, X\left(K\right), \Pi_p \right)  \).
Wzór wymiaru przestrzeni funkcji kształtu na nowych czterech elementach wynika z dodania siedmiu nowych funkcji kształtu, stosownie poprzez zwiększenie stopnia wielomianów o 1 we wnętrzu elementu w kierunku poziomym i pionowym (co daje w sumie trzy dodatkowe wielomiany - jeden ze stopniem zwiększonym w kierunku pionowym, drugi ze stopniem zwiększonym w kierunku poziomym, i trzeci ze stopniami zwiększonymi w obydwu kierunkach oraz 4 nowe funkcje kształtu uzyskane poprzez dodanie nowych wielomianów na krawędziach elementów, ze stopniem wielomianów zwiększonych o 1).

Definicja 3: Przestrzeń aproksymacyjna nad dwuwymiarową siatką obliczeniową

Przestrzeń aproksymacyjna nad dwuwymiarową siatką obliczeniową  \(  T_{hp}=\{ \left(K, X\left(K\right), \Pi_p \right) \}_K  \) to
  \(  V_{hp }= \{ v \in C(\Omega): \forall K \in {\cal P }( T_{hp},K): {\cal P }( v,K) \in X(K) \}  \),
gdzie  \(   {\cal P }( T_{hp},K)   \) to zbiór przedziałów reprezentujących geometrię elementów wyciągniętych z trójki reprezentującej dwuwymiarową siatkę obliczeniową,  \(  {\cal P }( v,K)   \) to projekcja funkcji na przedział reprezentujący geometrię elementu.

Niech  \(  T_{hp}=\{ \left(K, X\left(K\right), \Pi_p \right) \}_K  \) oznacza dwuwymiarową siatkę obliczeniową.
Niech  \(  \{ e_i^{hp} \}_i  \) oznacza bazę przestrzeni  \(  V_{hp }= span\{ e_i^{hp} \}   \).
Niech  \(  \chi^K_k \in X \left( K\right)  \) oznacza funkcje kształtu nad elementem  \(  K  \).
Wówczas  \(  \forall K \in {\cal P }( T_{hp},K), \forall i, \exists k : {\cal P}(e_i^{hp},K) = \chi^K_k  \).
Istnieje odwzorowanie odwrotne  \(  {\cal I}^2 \ni (k,K)\rightarrow i(k,K)\in {\cal I}  \), które przypisuje numer
 \(  i(k,K)  \) globalnej i-tej funkcji bazowej związanej z lokalną   \( k \)-tą funkcją kształtu nad elementem  \(  K  \).
W przypadkach rozpatrywanych w tym podręczniku, odwzorowanie to jest izomorficzne.

Definicja 5: Przestrzeń aproksymacyjna nad dwuwymiarową siatką referencyjną

Przestrzeń aproksymacyjna nad dwuwymiarową siatką obliczeniową  \(  T_{\frac{h}{2}p+1}=\{ \left(K, X\left(K\right), \Pi_p \right) \}_K  \)  to
  \(  V_{\frac{h}{2}p+1 }= \{ v \in C(\Omega): \forall K \in {\cal P }( T_{\frac{h}{2}p+1},K): {\cal P }( v,K) \in X(K) \}  \),
gdzie  \(   {\cal P }( T_{\frac{h}{2}p+1},K)   \) to zbiór przedziałów reprezentujących  geometrię elementów wyciągniętych z trójki reprezentującej dwuwymiarową siatkę obliczeniową,  \(  {\cal P }( v,K)   \) to projekcja funkcji na przedział reprezentujący geometrię elementu.

Niech  \(  T_{\frac{h}{2}p+1}=\{ \left(K, X\left(K\right), \Pi_p \right) \}_K  \) oznacza dwuwymiarową siatkę referencyjną.
Niech  \(  \{ e_i^{\frac{h}{2}p+1} \}_i  \) oznacza bazę przestrzeni  \(  V_{\frac{h}{2}p+1 }= span\{ e_i^{\frac{h}{2}p+1} \}  \).
Niech  \(  \chi^K_k \in X \left( K\right)  \) oznacza funkcje kształtu nad elementem  \(  K  \).
Wówczas  \(  \forall K \in {\cal P }( T_{\frac{h}{2}p+1},K), \forall i, \exists k : {\cal P}(e_i^{\frac{h}{2}p+1},K) = \chi^K_k  \).
Istnieje odwzorowanie odwrotne  \(  {\cal I}^2 \ni (k,K)\rightarrow i(k,K)\in {\cal I}  \), które przypisuje numer
 \(  i(k,K)  \) globalnej i-tej funkcji bazowej związanej z lokalną   \( k \)-tą funkcją kształtu nad elementem  \(  K  \).
W przypadkach rozpatrywanych w tym podręczniku, odwzorowanie to jest izomorficzne.

Definicja 7: Przestrzeń aproksymacyjna nad dwuwymiarową siatką referencyjną

Przestrzeń aproksymacyjna nad dwuwymiarową referencyjną siatką obliczeniową  \(  T_{\frac{h}{2}p+1}=\{ \left(K, X\left(K\right), \Pi_p \right) \}_K  \), to  \(  V_{\frac{h}{2}p+1}=span \{ e_j^{\frac{h}{2}p+1} : \forall K \in {\cal P}(T_{\frac{h }{2}p+1},K), \forall \phi_j \in X(K), \exists ! e_i^{\frac{h}{2}p+1} :{\cal P }( e_i^{\frac{h}{2}p+1 },K)=\psi_k \}  \), gdzie  \(  e_i^{\frac{h}{2}p+1}   \) to globalna funkcja bazowa (element bazy przestrzeni  \(  V_{\frac{h}{2}p+1}  \) ) oraz   \(  \psi_k   \) to lokalna funkcja kształtu nad elementem   \(  K  \),
 \(  {\cal I}^2 \ni (k,K)\rightarrow i(k,K)\in {\cal I}  \) to odwzorowanie przypisujące numer  \(  i(k,K)  \) globalnej funkcji bazowej związanej z lokalną   \( k \)-tą funkcją kształtu nad elementem  \(  K  \).

Definicja 8: Problem metody elementów skończonych nad dwuwymiarową siatką obliczeniową

Dla danej siatki obliczeniowej   \(  T_{hp}=\{ \left(K, X\left(K\right), \Pi_p \right) \}_K  \) znaleźć współczynniki  \(  \{ u^{hp}_i \}_{i=1,...,N^{hp}}  \) rozwiązania przybliżonego   \(  V \supset V_{hp } \ni u_{hp }=\sum_{i=1,...,N^{hp } } u_i^{hp } e_i^{hp }  \), takie że  \(   \sum_{m=1,...,N^{hp } } u_m^{hp } B(e_m^{hp},e_n^{hp})=L(e_n^{hp}) n=1,...,N^{hp}  \), gdzie
 \(  B(e_m^{hp},e_n^{hp})= \int_{\Omega} \left(  \sum_{i=1,2} \sum_{j=1,2} a_{ij}(x_1,x_2) \frac{\partial e_m^{hp}(x_1,x_2) }{\partial x_j } \frac{\partial e_n^{hp}(x_1,x_2) }{\partial x_j }\right. \\ \left. +  \sum_{j=1,2} b_j(x_1,x_2) \frac{\partial e_m^{hp}(x_1,x_2) }{\partial x_j } e_n^{hp}(x_1,x_2) +c (x_1,x_2 )e_n^{hp}(x_1,x_2) \right) dx_1 dx_2 +  \)
 \(  +\int_{\Gamma_R} \beta(x_1,x_2) e_m^{hp}(x_1,x_2) e_n^{hp}(x_1,x_2) ds  \)
 \(  L(e_n^{hp})= \int_{\Omega} f(x_1,x_2)e_n^{hp}(x_1,x_2) dx_1 dx_2 + \int_{\Gamma_R} g(x_1,x_2)  e_n^{hp}(x_1,x_2) ds  \).
Baza  \(  \{ e^{hp}_i \}_{i=1,...,N^{hp}}  \) przestrzeni aproksymacyjnej  \( V_{hp}  \) uzyskana jest poprzez sumowanie funkcji kształtu z przestrzeni  \(   X\left(K\right)  = {\cal P}(T_{hp},X(K))  \) dla poszczególnych elemetów z siatki  \(  T_{hp}  \) w globalne funkcje bazowe.

Definicja 9: Problem metody elementów skończonych nad dwuwymiarową siatką referencyjną

Dla danej siatki obliczeniowej   \(  T_{\frac{h}{2}p+1}=\{ \left(K, X\left(K\right), \Pi_p \right) \}_K  \) znaleźć współczynniki  \(  \{ u^{\frac{h}{2}p+1}_i \}_{i=1,...,n^{\frac{h}{2}p+1}}  \) rozwiązania przybliżonego   \(  V \supset V_{\frac{h}{2}p+1 } \ni u_{\frac{h}{2}p+1 }=\sum_{i=1,...,N^{\frac{h}{2}p+1 } } u_i^{\frac{h}{2}p+1 } e_i^{\frac{h}{2}p+1 }  \), takie że  \(   \sum_{m=1,...,N^{\frac{h}{2}p+1 } } u_m^{\frac{h}{2}p+1 }  B(e_m^{\frac{h}{2}p+1},e_n^{\frac{h}{2}p+1})=L(e_n^{\frac{h}{2}p+1}) n=1,...,N^{hp} \)
 \(  B(e_m^{\frac{h}{2}p+1},e_n^{\frac{h}{2}p+1})= \int_{\Omega} \left(  \sum_{i=1,2} \sum_{j=1,2} a_{ij}(x_1,x_2) \frac{\partial e_m^{\frac{h}{2}p+1}(x_1,x_2) }{\partial x_j } \frac{\partial e_n^{\frac{h}{2}p+1}(x_1,x_2) }{\partial x_j }\right. \\ \left. +  \sum_{j=1,2} b_j(x_1,x_2) \frac{\partial e_m^{\frac{h}{2}p+1}(x_1,x_2) }{\partial x_j } e_n^{\frac{h}{2}p+1}(x_1,x_2) +c (x_1,x_2 )e_n^{\frac{h}{2}p+1}(x_1,x_2) \right) dx_1 dx_2 +  \)
 \(  +\int_{\Gamma_R} \beta(x_1,x_2) e_m^{\frac{h}{2}p+1}(x_1,x_2) e_n^{\frac{h}{2}p+1}(x_1,x_2) ds  \)
 \(  L(e_n^{\frac{h}{2}p+1})= \int_{\Omega} f(x_1,x_2)e_n^{\frac{h}{2}p+1}(x_1,x_2) dx_1 dx_2 + \int_{\Gamma_R} g(x_1,x_2)  e_n^{\frac{h}{2}p+1}(x_1,x_2) ds  \).
Baza  \(  \{ e^{\frac{h}{2}p+1}_i \}_{i=1,...,N^{\frac{h}{2}p+1}}  \) przestrzeni aproksymacyjnej  \( V_{hp}  \) uzyskana jest poprzez sumowanie funkcji kształtu z przestrzeni  \(   X\left(K\right)  = {\cal P}(T_{\frac{h}{2}p+1},X(K))  \) dla poszczególnych elemetów z siatki  \(  T_{\frac{h}{2}p+1}  \) w globalne funkcje bazowe.