140 likes | 295 Views
Stromové kódy. Jakub Havlík a Milan Holec. Nástin problému. Výběr vhodného algoritmu při simulacích mnoha částic Částice – částice anebo částice – síť? Když částice – částice, tak jaký algoritmus? Není zbytečné simulovat interakce všech částic se všemi částicemi?
E N D
Stromové kódy Jakub Havlík a Milan Holec
Nástin problému • Výběr vhodného algoritmu při simulacích mnoha částic • Částice – částice anebo částice – síť? • Když částice – částice, tak jaký algoritmus? • Není zbytečné simulovat interakce všech částic se všemi částicemi? • Odpověď : „Ano je. Všechno jde dělat chytře místo složitě“
Proč stromové algoritmy • Základní myšlenka:Máme-li velkou skupinu částic, která je velmi vzdálená od ostatních částic, pak silový příspěvek této skupiny můžeme aproximovat silovým příspěvkem jedné částice s hmotnosti rovnou součtu hmotností částic ve skupině a s hmotným středem umístěným v hmotném středu skupiny částic.
První příklad • Pro velikou vzdálenost obou skupin částic a malé úhly theta se nevyplatí provádět všechny čtyři interakce červená-modrá, červená-červená, modrá-červená, modrá-modrá, ale jak je znázorněno vedle rozdělíme simulovanou plochu na čtyři kvadranty a napočítáme pouze dvě interakce modrá-červená a červená-modrá.
Konstrukce stromu • při konstrukci stromu nejdříve uzavřeme prostor částic do čtverce (obdélníku), který je dostatečně velký, aby v něm částice během celé simulace zůstaly – root cell • poté začneme čtverec dělit na menší a menší pravoúhelníky • simulací v 1D tak z rodičovské buňky vzniknou dvě stejné děti – dvě buňky – binarytree, ve 2D vzniknou 4 buňky (obvykle čtverce) – quadtree a ve 3D z jedné rodičovské buňky vznikne 8 menších, každá o objemu 1/8 rodičovské buňky – octtree • takto postupujeme rekurzivně tak dlouho, dokud nemáme každou částici zvlášť v jedné buňce
Základní názvosloví • Definice oblasti:Oblast je část simulované plochy a to vždy část obdélníková. Je rozdělena na 4 kvadranty. Tato oblast může a nemusí být nadále rozdělena na další 4 pod-oblasti, každá podle příslušného kvadrantu. První oblastí je celá simulovaná plocha. • Definice listu:Listem rozumím poslední oblast stromu, na které už nenavazují žádné další oblasti.
Vysvětlující obrázky Quadtree - každý uzel se rozdělí na 4 stejné poduzly Quadtree – prostor dělíme tak dlouho, dokud není každá částice v buňce sama
Výpočty – část 1 • Celková hmotnost a umístění hmotného středu je jednoduché pro listy – je to přesně ta hodnota a pozice částice uvnitř listu • Pro uzly jsou tyto hodnoty určeny z jejich subbuněk ale pouze pro první úroveň! ( pro 2D jsou tak tyto hodnoty určeny ze 4 subbuněk, ve 3D z 8)
Výpočty – část 2 • Teď už můžeme počítat interakce částic – ty budou dvou druhů • výpočet silových příspěvků od individuálních částic, které jsou blízko naší částici • výpočtem silového příspěvku od hmotného středu sady buněk stromu, které jsou velmi vzdálené od naší částice To, jestli vybereme metodu a nebo b záleží na parametru ca, který je pevně zvolen • Při výpočtu interakcí postupujeme od kořene rekursivně k poduzlům a listům. • Pro snížení výpočtů je dovoleno, mít na každé úrovni jen maximálně 9 buněk, které potřebují dále rozdělit. Výpočet další úrovně se pak redukuje na 27 operací (2*3*2*3-9). Na každé úrovní je pak výpočetní náročnost 27 O(1).
Zhodnocení • hloubka stromu je určena jako min(b, log(n)) a celková náročnost je tedy O(nmin(b, log(n))) • toto zjednodušení dokáže velmi zredukovat počet výpočtů až o několik řádů !!! (v závislosti na počtu částic) • stromové kódy jsou přesnější než metoda částice – síť, ale méně přesné než metoda částice – částice • vyžadují navíc pomocné uskladnění dat • Algoritmus Barnes – Hut využívá stromové struktury a je hojně užíván zejména v astrofyzice
Dodatek 1 – Barnes - Hut Algoritmus • Vytvoř quadtree nebo octtree • Postupuj ve směru od listů ke kořeni a počítej hmotnost a hmotný střed pro každý uzel • Postupuj směrem od kořene k listům a pro každou částici spočítej sílu během postupu Bod 2 můžeme schématicky rozepsat: Počítej aproximace (N) pokud N je list pak konec; pro každý subuzel n uzlu N proveď -> počítej aproximace (n) M:=0, cm:= (0,0) Pro každý subuzel n uzlu N proveď M:=M + hmotnost n, cm:= cm + hmotnost n*pozice n konec cm:=1/M *cm Hmotnost N := M Pozice N := cm konec
Dodatek 2 – Paralelní výpočty • Problém mezi komunikace částic mezi procesory • Malá datová propustnost může být problém mezi počítači s malou pamětí • Vytvoří se lokální stromy na každém procesoru • A posílají se pouze základní informace o stromech • Velice výhodné při počítání obrovského počtu částic (až 109. • Ukázka klíče buňky(listu)
Odkazy http://ocw.mit.edu/NR/rdonlyres/Mathematics/18-337JSpring-2005/7F272796-9A83-44EF-AF25-0366CA296EA4/0/chapter_9.pdfhttp://www.cita.utoronto.ca/~dubinski/treecode/natreecode.pdfhttp://www.sweb.cz/labirlab/plasma/tree_cods.htmhttp://chaos.swarthmore.edu/research/Tree_Codes.pdfhttp://library.lanl.gov/cgi-bin/getfile?00326635.pdfhttp://www.amara.com/papers/nbody.html#tcuhttp://delivery.acm.org/10.1145/370000/369033/a2-hu.pdf?key1=369033&key2=3073965021&coll=GUIDE&dl=GUIDE,ACM&CFID=59550468&CFTOKEN=38354691http://library.lanl.gov/cgi-bin/getfile?22-09.pdf http://www.cs.berkeley.edu/~demmel/cs267/lecture26/lecture26.htmlhttp://www.cita.utoronto.ca/~dubinski/treecode/treecode.html