Projekt 6: Równanie Poissona - rozwiązanie metodą algebraiczną. Tomasz Chwiej 9 sierpnia 18 1 Wstęp 1.1 Dyskretyzacja n y V V 1 V 3 1 j= i= 1 V 4 n x Rysunek 1: Geometria układu i schemat siatki obliczeniowej (docelowej). Potencjały V 1, V, V 3, V 4 określają warunki brzegowe Dirichleta, ρ 1, ρ to gęstości ładunku, ε 1, ε - stałe dielektryczne w obszarze lewym i prawym. Potencjał w 4 narożnych czerwonych węzłach nie wpływa na rozwiązanie i może mieć w nich dowolną wartość. Na zajęciach rozwiążemy równanie Poissona dla układu pokazanego na Rys.1 postępując następująco: i) zdyskretyzujemy równanie na regularnej siatce przy użyciu ilorazów różnicowych, ii) zapiszemy równanie jako układ równań liniowych z macierzą rzadką, iii) układ równań rozwiążemy stosując metody dla macierzy rzadkich. Ogólne rów. Poissona dla obszaru obejmującego różne wartości stałej dielektrycznej zapisujemy jako ε V = ρ (1) ε V + ε V = ρ () Dyskretyzujemy rów. Poissona stosując ilorazy różnicowe: d f dx = f i+1 f i +f i 1 x (dokładność O( x )) oraz df dx = f i+1 f i x (gorsza dokładność O( x) ale skok ε dokonuje się na jednym oczku siatki). Przyjmujemy oznaczenia x = y = (3) x i = i, i =, 1,,..., n x (4) y i = j, j =, 1,,..., n y (5) V (x, y) V (x i, y j ) V i,j (6) ρ(x, y) ρ(x i, y j ) ρ i,j (7) ε(x, y) ε(x i, y j ) ε i,j (8) 1
wówczas równanie zdyskretyzowane ma postać ( Vi+1,j V i,j + V i 1,j ε i,j + V ) i,j+1 V i,j + V i,j 1 ( εi+1,j ε i,j V i+1,j V i,j + + ε ) i,j+1 ε i,j V i,j+1 V i,j = ρ i,j (9) 1. Algebraizacja równania Równanie (9) zapiszemy w postaci macierzowej. Najpierw dokonamy reindekscaji węzłów, węzły ponumeryjemy tak aby każdemu odpowiadał jeden indeks (l) zamiast dwóch (i,j) l = i + j (n x + 1), (i =, 1,..., n x ; j =, 1,,..., n y ) (1) l =, 1,,..., N 1, N = (n x + 1) (n y + 1) (11) przejście w drugą stronę l (i, j) (przydatne np. przy sprządzaniu map potencjału) j = ( ) l floor n x + 1 (wyznaczamy część całkowitą) (1) i = l j (n x + 1) (13) Równanie (9) zapiszemy w postaci macierzowej (algebraicznej) w której mnożenie l-tego wiersza A przez V przebiega jak poniżej A V = b (14) a l,l nx 1 V l nx 1 + a l,l 1 V l 1 + a l,l V l + a l,l+1 V l+1 + a l,l+nx+1 V l+nx+1 = b l (15) a elementy macierzowe są zdefiniowane następująco a l,l nx 1 = ε l (16) a l,l 1 = ε l (17) a l,l = ε l + ε l+1 + ε l+nx+1 (18) a l,l+1 = ε l+1 (19) a l,l+nx+1 = ε l+n x+1 () Macierz układu jest macierzą rzadką, 5-przekątniową (zob. Rys.). Zmianę stałej dielektrycznej w przestrzeni określa poniższa relacja ε l = { ε1, i n x / ε, i > n x / (1) 1.3 Warunki brzegowe Dirichleta Zastosujemy warunki brzegowe Dirichelta tj. ustalone wartości potencjału w węzłach leżących na brzegu obszaru (rys. 1). Dla węzła leżącego na brzegu (indeks k na rys.) WB wprowadzamy następująco: a k,k nx 1 = a k,k 1 = a k,k+1 = a k,k+nx+1 = (zerowanie wiersza poza diagonalą) () a k,k = 1 (diagonala) (3) b k = V B (wartość potencjału na danym brzegu) (4)
k = V k V B Rysunek : Macierz układu jest macierzą rzadką 5-przekątniową. Zadania do wykonania Macierz układu zapiszemy w formacie CSR (compressed sparse row) indeksując elementy zaczynając od. Układ rozwiążemy stosując metodę GMRES używając procedury numerycznej napisanej w języku C. Aby sprawnie rozwiązać problem proszę postępować według poniższych wskazówek 1. Ustalamy początkowe wartości parametrów: =.1, n x = n y = 4, ε 1 = ε = 1, V 1 = V 3 = 1, V = V 4 = 1, ρ 1 (x, y) = ρ x,y =, N = (n x + 1)(n y + 1). Tworzymy 3 wektory definiujące macierz układu: a,ia ia,ja oraz wektor wyrazów wolnych b i wektor rozwiązań V gdzie: a to wektor typu double o 5 N elementach (niezerowe wartości el. macierzowych) ja to wektor typu int o 5 N elementach (przechowuje informacje o numerach kolumn) ia - wektor typu int, ilość elementów N +1 (wskaźniki do elementów rozpoczynających dany wiersz). Uwaga: po utworzeniu wektora ia wszystkie jego elementy wypełniamy wartością 1. b i V to wektory typu double o N elementach 3. Wyznaczamy niezerowe elementy macierzy A oraz wektora wyrazów wolnych b uwzględniając WB Dirichleta zgodnie z algorytmem przedstawionym w sekcji (3). W celu sprawdzenia poprawności wypełnienia macierzy A i wektora b należy zapisać je do pliku, podając niezerowe elementy l, i l, j l, a[l] (dla macierzy) oraz l, i l, j l, b[l] (dla wektora). pkt. 4. Rozwiązujemy układ równań z macierzą rzadką stosując procedurę (dołączyć pliki: mgmres.c i mgmres.h) void pmgmres_ilu_cr ( int N, int nz_num, int ia [], int ja [], double a[], double V[], double b[], int itr_max, int mr, double tol_abs, double tol_rel ) Opis znaczenia argumentów znaleźć można w pliku mgmres.c. Wraz ze zmianą n x i n y zmieniają się: N - rozmiar układu (wzór 11) oraz nz num - ilość elementów niezerowych w macierzy A (przedostatnia instrukcja w algorytmie w sekcji 3), dla pozostałych parametrów można przyjąć następujące wartości: itr max = 5, mr = 5, tol abs = 1 8, tol rel = 1 8. 5. Sporządzić mapy potencjału dla ε 1 = ε = 1, V 1 = V 3 = V = V 4 = 1, ρ (1) = ρ () = i trzech siatek: a) n x = n y = 5, b) n x = n y = 1, c) n x = n y =. 5 pkt. 6. Ustalamy wartości parametrów: n x = n y = 1, V 1 = V 3 = V = V 4 =, x max = n x, 3
y max = n y, σ = x max /1 oraz ( ρ (1) (x, y) = (+1) exp (x.5 x max) σ (y.5 y max) ) σ ( ρ () (x, y) = ( 1) exp (x.75 x max) σ (y.5 y max) ) σ (5) (6) Znaleźć rozkłady potencjału dla 3 przypadków: a) ε 1 = 1 i ε = 1, b) ε 1 = 1 i ε = oraz c) ε 1 = 1 i ε = 1. Za przedstawienie 3 map potencjału 3 pkt. 3 Algorytm wypełniania macierzy rzadkiej w formacie CSR + WB Dirichleta Po utworzeniu tablic: a, ia, ja oraz wektora wyrazów wolnych b, ich elementy wypełniamy zgodnie z poniższym algorytmem inicjalizacja : k = -1 // numeruje niezerowe elementy A FOR l= TO l<n STEP 1 DO int brzeg = // wskaźnik położenia : - środek obszaru ; 1- brzeg double vb =. // potencjal na brzegu IF(i ==) THEN // lewy brzeg vb=v1 IF(j== ny) THEN // górny brzeg vb=v IF(i== nx) THEN // prawy brzeg vb=v3 IF(j ==) THEN // dolny brzeg vb=v4 // wypełniamy od razu wektor wyrazów wolnych b[l]= -(ρ (1) l +ρ () l ); // jeśli w środku jest gęstość IF( brzeg ==1) THEN b[ l]= vb; // wymuszamy wartość potencjału na brzegu // wypełniamy elementy macierzy A 4
ia[ l ]= -1; // wskaźnik dla pierwszego el. w wierszu // lewa skrajna przekatna IF(l-nx -1 >= AND brzeg == ) THEN if(ia[l] <) ia[l]=k a[k]=a l,l nx 1 ja[k]=l n x 1 ENDIF // poddiagonala IF(l -1 >= AND brzeg == ) THEN if(ia[l] <) ia[l]=k a[k]=a l,l 1 ja[k]=l 1 // diagonala if(ia[l] <) ia[l]=k IF( brzeg ==) THEN a[k]=a l,l ELSE a[k ]=1 ja[k]=l // naddiagonala IF(l<N AND brzeg == ) THEN a[k]=a l,l+1 ja[k]=l + 1 // prawa skrajna przekątna IF(l<N n x 1 AND brzeg == ) THEN a[k]=a l,l+nx+1 ja[k]=l + n x + 1 END DO nz_ num = k +1 // ilosc niezerowych elementow (1 element ma indeks ) ia[n]= nz_num 4 Przykładowe rozwiązania 5
5 4 3 1 nx=ny=5 v5.dat u 1::3 example 1 5-5 1 3 4 5-1 Rysunek 3: n x = n y = 5, ρ (1) = ρ () =, ε 1 = ε = 1 1 8 6 4 nx=ny=1, e1=1, e= g_e1.dat u 1::3 example 4 6 8 1.8.6.4. -. -.4 -.6 -.8 Rysunek 4: n x = n y = 1, ρ (1) = ρ (), ε 1 = 1, ε = 6