Kapitola Zadání Tento dokument obsahuje zadání pro semestrální programy z PAA. Vypracování alespoň jedné úlohy je nutnou podmínkou pro úspěšné složení zkoušky resp. získaní (klasifikovaného) zápočtu (viz. bílá kniha). Student musí osobně předvést vypracovanou úlohu podle níže uvedených zadání. To mimo jiné znamená, že student musí umět detailně vysvětlit svůj kód. Ten by měl být maximálně jednoduchý a přehledný. Vyučující si vyhrazuje právo neuznat vypracovanou úlohu, pokud kód obsahuje hrubé programátorské chyby a to i v případě, že kód je funkční. Není-li uvedeno jinak, lze programovat pouze v jazycích C/C++ nebo Fortran.. Paralelizace explicitního řešiče pro difuzní rovnici podle kapitoly 2. nastudujte explicitní schéma pro řešení difůzní rovnice proveďte implementaci sekvenčního řešiče Mersonovy metody popsané právě v kapitole 2. pomocí vhodné počáteční podmínky (např. u ini (x) = sign ( x + 0.)) proveďte porovnání s pseudoanalytickým řešením - tj. napočítejte příslušnou konvoluci pro určité časové hladiny funkce u (t) pro např. t = 0., 0.2, a zjistěte zda se výsledky shodují. Můžete také naměřit CPU čas nutný pro získání výsledku pomocí obou metod a určit, která je rychlejší. proveďte paralelizaci sekvenčího řešiče pomocí standardu MPI, kdy síť ω h rozdělíte na m m 2 stejných podoblastí m > m 2 > a v každou podoblast budete mapovat na jeden proces. Nezapomeňte, že pro každé napočítání pravé strany rovnice tj. funkce f ( t, u h) je nutné provést synchronizaci hodnot funkce u h na hranicích jednotlivých podoblastí.
porovnejte, zda paralelní řešič dává shodné výsledky jako sekvenční verze Pro uznání semestrálního programu je nutné vypracovat všechny výše uvedené body a osobně je předvést tzn. předvedení sekvenčního řešiče, srovnání s konvoluční metodou a předvedení paraleního řešiče. Pro vizualizaci výsledků doporučuji použít program Gnuplot, který dokáže číst a zobrazovat síťové funkce zapsané do obyčejného textového souboru ve formátu trojice x y f(x,y) na každém řádku. 2
Kapitola 2 Difuzní rovnice 2. Tvar rovnice a její pseudoanalytické řešení Pro oblast Ω R 2 hledáme funkci u = u (x, t) jako řešení parciální diferenciální rovnice u (x, t) u (x, t) t = 0 na Ω (0, T, u (x, 0) = u 0 (x) na Ω, (2.) kde Laplacův operátor je definován jako u (x, t) = g (x, t) na Ω 0, T, u (x) = 2 u (x) x 2 + 2 u (x) y 2, a Ω značí hranici oblasti Ω. Funkce u 0 (x) je daná počáteční podmínka a funkce g (x, t) je také daná a jde o okrajovou podmínku Dirichletova typu. Pseudoanalytické řešení této rovnice pro Ω R 2 má tvar u (x, t) = G 2t R (x y) u 0 (y) dy = ( G 2t u ) 0 (x), (2.2) 2 kde označuje Gaussovo jádro. ( ) G σ = 2πσ exp x 2, 2 2σ 2 2.2 Prostorová diskretizace pomocí metody konečných diferencí Pro jednoduchost nyní předpokládáme, že Ω 0, 0,. Za účelem prostorové diskretizace volíme numerickou síť o rozměrech N N 2, pro N, N 2 N + 3
danou jako její uzávěr a hranici ω h {x = (ih, jh 2 ) i =, N, j =, N 2 }, (2.3) ω h {x = (ih, jh 2 ) i = 0, N, j = 0, N 2 }, (2.4) ω h = ω h ω h, pro h = N a h 2 = N 2. Prostorovou diskretizace rovnice (2.2) lze provést pomocí metody konečných diferencí, metody konečných objemů nebo metody konečných prvků. V následujícím textu se budeme zabývat metodou konečných diferencí. Nejprve zavedeme síťovou funkci u h vztahem u h = u (x ), a následně aproximujeme Laplaceův operátor v rovnici (2.2) vztahem u (x ) = h u h uh i+,j 2u h + u h i,j h 2 čímž můžeme rovnici (2.2) převést do semidiskrétního tvaru du h dt Okrajové podmínky diskretizujeme snadno jako + uh i,j+ 2u h + u h i,j, (2.5) h 2 2 = h u h na ω h. (2.6) u h = g (x ) na ω h. (2.7) K úplnému numerickému řešení rovnice (2.2) nyní zbývá jen provést časovou diskretizaci. Zde se nabízejí dvě možnosti: explicítní schéma pomocí metody přímek implicitní schéma pomocí dopředné diskretizace v čase. 2.3 Metoda přímek pro difuzní rovnici Z přednášek z numerické matematiky víme, že obyčejné diferenciální rovnice tvaru ẏ (t) = f (t, y) lze řešit pomocí Rungových-Kuttových vzorců. V našem případě neřešíme jednu obyčejnou diferenciální rovnici, ale celou soustavu (2.5), tj. u h = h u h = f ( t, u h) na ω h, (2.8) u h = ġ (x ) = f ( t, u h) na ω h, (2.9) 4 (2.0)
Snadno vidíme, že jsme pouze zaměnili u za y a pravá strana f v našem případě vlastně nezávisí na t, ale pouze na u h. Záměrně píšeme, že f závisí na u h a nikoliv jen na u h neboť k napočítání aproximace Laplaceove operátoru potřebujeme kromě uzlové hodnoty u i čtyři další sousedy. V praxi je velice šikovné volit integrační metodu s automatickou vobou časového kroku τ. Jednou z nich je tzv. Mersonova metoda. Jde o jakousi modifikaci základních Rungových-Kuttových vzorců a nabízí integraci s přesností čtvrtého řádu v čase. Metoda spočívá v napočítání následujících síťových funkcí definovaných na ω h : k := τf ( t, u h) k 2 := τf (t + 3 τ, uh + 3 ) k k 3 := τf (t + 2 τ, uh + 6 k + 2 ) k2 k 4 := τf (t + 2 τ, uh + 8 k + 38 ) k3 k 5 := τf (t + τ, u h + 2 k 32 ) k3 + 2k 4 Pozor! Jelikož pravá strana f závisí na celé síťové funkci, není možné začít počítat k 2, dokud neznáme k na celém ω h a podobně pro ostatní k l pro l = 3, 4, 5! Následně počítáme odhad chyby, které se dopouštíme při integraci s časovým korkem τ E = max ω h 3 5 k 9 0 k3 + 4 5 k4 0 k5. Je-li tato chyba menší než-li zadaná tolerance ɛ, napočítáme nové u h pomocí u h := u h + ( ) k 6 + 4k 4 + k 5, (2.) a nastavíme t := t + τ. V každém případě pak upravíme časový krok τ jako { ( ɛ ) } 5 τ := min τ ω, T t. (2.2) E Pokud bylo E < ɛ, dojde ke zvětšení τ, jinak se časový kork zmenší. Celý výpočet pak opakujeme s novým τ. Pro parametr ω by mělo platit ω 0.8, 0.9 a ɛ 0.000. 2.4 Implicitní schéma Narozdíl od metody přímek se v této části omezíme na pevný časový krok τ, který ale může být zvolen výrazně větší, než u explicitního schématu, proto bývá 5.
implicitní schéma efektivnější z hlediska nároků na čas CPU. Diskretizaci časové derivace provedeme následujícím způsobem kde platí du (x ) dt un u n τ u n = u (x, nτ). = h u n, (2.3) Dostáváme tak vztah (pro jednoduchost nyní předpokládáme h = h 2 = h a N = N 2 = N) neboli u n u n τ = un i+,j 2u n + u n i,j h 2 u n τ h 2 ( u n i+,j + u n i,j+ + u n i,j + u n i,j 4u n + un i,j+ 2u n + u n i,j h 2 (2.4) ) = u n (2.5) pro i, j =, N. Jelikož neznámé jsou zde u n i+,j, u n i,j+, u n i,j, u n i,j a u n, jde vlastně o soustavu (N ) 2 rovnic. Okrajové podmínky mají tvar Přepíšeme-li nyní (2.5) na tvar u n = g (x, nτ) na ω h. (2.6) ( + 4λ) u n λu n i+,j λu n i,j+ λu n i,j λu n i,j = u n, (2.7) můžeme celou úlohu převést do maticového tvaru Ax = b. (2.8) kde uzlové proměnné u i j odpovídá (in +j)-tý sloupec resp. řádek. Jelikož matice A je symetrická a pro dostatečně malé λ resp. τ i pozitivně definitní, lze k řešení použít metodu konjugovaných gradientů. Ta má následujíc podobu. r 0 := b Ax 0 ; p 0 = r 0 2. pro j = 0,, až do konvergence počítej 3. α j := (r j, r j ) / (Ap j, p j ) 4. x j+ := x j + α j p j 5. r j+ := r j α j Ap j 6. β j := (r j+, r j+ ) / (r j, r j ) 7. p j+ := r j+ + β j p j. Matice A je řídká, proto do paměti ukládáme jen její nenulové prvky. Jelikož ty nezávisí na u je také možné napsat přímo funkci, která pro zadaný vektor napočítá jeho součin s maticí. 6