Îïèñàíèå ïðîãðàììû ellipt Öûáóëèí Èâàí 13 ìàÿ 2015 ã. Ñîäåðæàíèå 1 Îáùèå ñâåäåíèÿ 1 2 Ôîðìàò êîíôèãóðàöèîííîãî ôàéëà 2 3 Âèçóàëèçàöèÿ ðåøåíèÿ 2.1 Çàäàíèå ãðàíè÷íûõ óñëîâèé . . 2.2 Çàäàíèå îáëàñòåé . . . . . . . . 2.2.1 Çàäàíèå êðóãà . . . . . . 2.2.2 Çàäàíèå ìíîãîóãîëüíèêà 2.2.3 Îïåðàöèè ñ îáëàñòÿìè . . 2.3 Çàäàíèå óðàâíåíèÿ . . . . . . . . 2.4 Çàäàíèå ïàðàìåòðîâ ñåòêè . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 4 4 4 5 5 6 7 1 Îáùèå ñâåäåíèÿ Ïðîãðàììà ellipt ïðåäíàçíà÷åíà äëÿ ðåøåíèÿ ýëëèïòè÷åñêèõ óðàâíåíèé â äâóìåðíûõ îáëàñòÿõ. Îíà ïðåäëàãàåòñÿ â êà÷åñòâå çàìåíû ñóùåñòâóþùåé ïðîãðàììå Ellipt2D.exe, èñïîëüçîâàâøåéñÿ äëÿ âûïîëíåíèÿ òðåòüåé ëàáîðàòîðíîé ðàáîòû ðàíåå. Ôóíêöèîíàëüíî ïðîãðàììà ellipt ñîñòîèò èç áëîêà ãåíåðàöèè ðàñ÷åòíîé ñåòêè ïî îïèñàíèþ îáëàñòè íà ñïåöèàëüíîì ÿçûêå, áëîêà ïîñòðîåíèÿ ðàçíîñòíîé ñõåìû ñ ïîëîæèòåëüíîé àïïðîêñèìàöèåé è ðàñ÷åòíîãî áëîêà. Ðåçóëüòàò ðàáîòû ïðîãðàììû ñîõðàíÿåòñÿ â ôîðìàòå VTK, ñîâìåñòèìîì ñ ïðîãðàììîé âèçóàëèçàöèè Paraview. 1 Äëÿ ðàáîòû ïðîãðàììå íåîáõîäèìî ïåðåäàòü ôàéë ñ îïèñàíèåì çàäà÷è, íàïðèìåð â êîíñîëè Linux: user@host$ ./ellipt64 square.geom èëè â êîíñîëè (cmd.exe) Windows: C:\User> ellipt32.exe square.geom Ïðîãðàììà ñîáðàíà äëÿ Linux è Windows â 32 è 64 áèòíîì âàðèàíòå. Äëÿ îïèñàíèÿ îáëàñòè èñïîëüçóåòñÿ òåõíîëîãèÿ êîíñòðóêòèâíîé ãåîìåòðèè.  êà÷åñòâå áàçîâûõ äîñòóïíû âñåãî äâà ïðèìèòèâà êðóã è ìíîãîóãîëüíèê. Ê ëþáûì äâóì îáúåêòàì ìîæåò áûòü ïðèìåíåíà îäíà èç ñëåäóþùèõ îïåðàöèé: ïåðåñå÷åíèå, îáúåäèíåíèå èëè âû÷èòàíèå. Íà ãðàíèöå êàæäîãî îáúåêòà íåîáõîäèìî çàäàòü ãðàíè÷íîå óñëîâèå, äàæå åñëè ýòà ãðàíèöà íå áóäåò ïðèñóòñòâîâàòü ðåçóëüòèðóþùåé îáëàñòè. 2 Ôîðìàò êîíôèãóðàöèîííîãî ôàéëà Êîíôèãóðàöèîííûé ôàéë ÿâëÿåòñÿ ïðîñòûì òåêñòîâûì ôàéëîì íà ñïåöèàëüíîì ÿçûêå ïðîãðàììèðîâàíèÿ. Ïóñòûå ñòðîêè è ïåðåíîñû ñòðîê èãíîðèðóþòñÿ.  ôàéëå äîïóñòèìû êîììåíòàðèè, íà÷èíàþùèåñÿ ñ ñèìâîëà # è çàêàí÷èâàþùèåñÿ â êîíöå ñòðîêè. # Ýòî êîììåíòàðèé z = (0, 5) # Îïðåäåëÿåì òî÷êó x Ôàéë ñîñòîèò èç îïðåäåëåíèÿ ïðîèçâîëüíîãî ÷èñëà ïåðåìåííûõ, â òîì ÷èñëå ïåðåìåííûõ ìîæåò íå áûòü âîâñå. Îïðåäåëåíèå ïåðåìåííîé ñîñòîèò èç èìåíè ïåðåìåííîé ñëåâà îò çíàêà ðàâåíñòâà è çíà÷åíèÿ ñïðàâà. Êàæäàÿ ïåðåìåííàÿ ìîæåò ïðèíèìàòü îäíî èç ÷åòûðåõ òèïîâ çíà÷åíèé: • òî÷êà; • ãðàíè÷íîå óñëîâèå; • îáëàñòü; • óðàâíåíèå. 2 Ïîñëå îïðåäåëåíèé ïåðåìåííûõ äîëæíà èäòè ñòðîêà solve <equation> in <domain> meshsize <hint> [hbnd] [bndAspect] ãäå âìåñòî <equation> äîëæíî ñòîÿòü ëèáî óðàâíåíèå, ëèáî ïåðåìåííàÿ èìåþùàÿ òèï óðàâíåíèÿ. Àíàëîãè÷íî, âìåñòî <domain> äîëæíî ñòîÿòü îïðåäåëåíèå îáëàñòè ëèáî ïåðåìåííàÿ. Ïîñëåäíèå òðè âåëè÷èíû <hint>, [hbnd], [bndAspect] çàäàþò ðàçìåðû ñåòêè. Ïîñëåäíèå äâà ÷èñëà íåîáÿçàòåëüíû. Âåëè÷èíà hint çàäàåò õàðàêòåðíûé øàã âíóòðè îáëàñòè, hbnd øàã íà ãðàíèöå îáëàñòè, bndAspect ðàññòîÿíèå ìåæäó ïðèãðàíè÷íûìè ñëîÿìè òî÷åê ïî îòíîøåíèþ ê hbnd. Åñëè íå óêàçûâàòü bndAspect áóäåò èñïîëüçîâàíî ÷èñëî 1, åñëè íå óêàçàòü hbnd, îí áóäåò âûáðàí ðàâíûì hint. 2.1 Çàäàíèå ãðàíè÷íûõ óñëîâèé Äëÿ çàäàíèÿ ãðàíè÷íîãî óñëîâèÿ èñïîëüçóåòñÿ êëþ÷åâîå ñëîâî bndcond. Äàëåå â ôèãóðíûõ ñêîáêàõ óêàçûâàåòñÿ âåëè÷èíà, êîòîðàÿ äîëæíà îáíóëÿòüñÿ íà äàííîé ãðàíèöå. Ýòà âåëè÷èíà ìîæåò ïðåäñòàâëÿòü âûðàæåíèå, ñîäåðæàùåå êîîðäèíàòû òî÷êè íà ãðàíèöå x, y, çíà÷åíèå u è çíà∂u . Ïðèìåð: ÷åíèå íîðìàëüíîé ïðîèçâîäíîé ∂n dirichlet = bndcond { u } neumann = bndcond { dudn - sin(x) } robin = bndcond { dudn + 3 * u - x^2 - y^2 } Çäåñü çàäàíû òðè ðàçíûå ïåðåìåííûå dirichlet, neumann è robin, ïðåäñòàâëÿþùèå ñîáîé óñëîâèÿ Äèðèõëå, Íåéìàíà è Ðîáèíà: u∂D = 0 ∂u = sin x ∂n ∂D ∂u + 3u = x2 + y 2 . ∂n ∂D ∂u Ïîääåðæèâàþòñÿ òîëüêî óñëîâèÿ, ãäå ïåðåä u, ∂n ñòîÿò ïîñòîÿííûå êîýôôèöèåíòû. Ñâîáîäíûé ÷ëåí ìîæåò áûòü ëþáîé ôóíêöèåé x, y. 3 2.2 2.2.1 Çàäàíèå îáëàñòåé Çàäàíèå êðóãà ×òîáû çàäàòü êðóã èñïîëüçóåòñÿ êëþ÷åâîå ñëîâî circle. Çà íèì äîëæíû ñëåäîâàòü êîîðäèíàòû öåíòðà, ðàäèóñ è ãðàíè÷íîå óñëîâèå. # Êðóã ðàäèóñà 5 ñ öåíòðîì â òî÷êå (0, 0) ñ óñëîâèåì Äèðèõëå circ1 = circle (0, 0) radius 5 { u } z = (3, 5) neumann = { dudn } # Òî÷êà - öåíòð áóäóùåãî êðóãà # Óñëîâèÿ Íåéìàíà du/dn = 0 # Êðóã ðàäèóñà 10 ñ öåíòðîì â òî÷êå z è óñëîâèÿìè neumann circ2 = circle z radius 10 neumann 2.2.2 Çàäàíèå ìíîãîóãîëüíèêà Ìíîãîóãîëüíèê ìîæåò èìåòü ïðîèçâîëüíîå ÷èñëî âåðøèí, íå ìåíüøåå òðåõ. Íà êàæäîì ðåáðå ìíîãîóãîëüíèêà ìîæíî çàäàâàòü ñâîè ãðàíè÷íûå óñëîâèÿ. Îáõîä ìíîãîóãîëüíèêà äîëæåí ïðîèñõîäèòü ïðîòèâ ÷àñîâîé ñòðåëêè, èíà÷å åãî íîðìàëè îêàæóòñÿ âûâåðíóòûìè íàèçíàíêó. Íà÷àëî ìíîãîóãîëüíèêà óêàçûâàåòñÿ ñëîâîì polygon. ×òîáû óêàçàòü êîíåö ñïèñêà òî÷åê ìíîãîóãîëüíèêà èñïîëüçóåòñÿ close. Ìåæäó ïîñëåäîâàòåëüíûìè âåðøèíàìè ìíîãîóãîëüíèêà äîëæíû áûòü óêàçàíû ãðàíè÷íûå óñëîâèÿ íà ñîîòâåòñòâóþùåì ðåáðå. Ïîñëå ïîñëåäíåé âåðøèíû óêàçûâàþòñÿ ãðàíè÷íûå óñëîâèÿ íà ðåáðå, ñîåäèíÿþùåì åå ñ íà÷àëüíîé òî÷êîé (ìíîãîóãîëüíèê çàìêíóò). Ïðèìåðû ìíîãîóãîëüíèêîâ z1 = (0, 0) z2 = (1, 0) z3 = (0, 1) cond = bndcond { u - x - y } poly1 = polygon z1 cond z2 cond z3 cond close poly2 = polygon ( 1, 1) bndcond { u } (-1, 1) 4 bndcond { dudn } (-1, -1) bndcond { u - 1 } ( 1, -1) bndcond { dudn } close 2.2.3 Îïåðàöèè ñ îáëàñòÿìè Îáëàñòè ìîæíî ïåðåñåêàòü îïåðàöèåé intersect èëè *, îáúåäèíÿòü îïåðàöèåé union èëè + è âû÷èòàòü îïåðàöèåé subtract èëè -. Ïðè íåîáõîäèìîñòè ìîæíî áðàòü âûðàæåíèÿ â ñêîáêè. Ïðèîðèòåò âû÷èòàíèÿ è îáúåäèíåíèÿ îäèíàêîâ è ìåíüøå, ÷åì ó óìíîæåíèÿ. Ïðèìåðû îïåðàöèé ñ îáëàñòÿìè outer = circle (0, 0) radius 4 bndcond { u - 4 * sin(5 * atan2(y, x)) } inner = circle (0, 0) radius 2 bndcond { u } annulus = outer - inner # Êîëüöî - ðàçíîñòü äâóõ îêðóæíîñòåé p = polygon ( 1, 1) bndcond { u } (-1, 1) bndcond { u } (-1, -1) bndcond { u } ( 1, -1) bndcond { dudn } close c = circle (0, 0) radius 1.2 bndcond { dudn + u - 1 } # Îáëàñòü - ïåðåñå÷åíèå p è c - êðèâîóãîëüíûé âîñüìèóãîëüíèê solve elliptic { uxx + uyy } in p * c meshsize 0.05 2.3 Çàäàíèå óðàâíåíèÿ Óðàâíåíèå çàäàåòñÿ òàêèì æå ñïîñîáîì êàê è ãðàíè÷íûå óñëîâèÿ. Äëÿ çàäàíèÿ óðàâíåíèÿ èñïîëüçóåòñÿ êëþ÷åâîå ñëîâî elliptic, çà êîòîðûì ñëåäóåò âåëè÷èíà, êîòîðàÿ äîëæíà îáðàùàòüñÿ â íîëü â îáëàñòè.  óðàâíåíèå ìîãóò âõîäèòü ïåðåìåííûå uxx, uxy, uyy, ux, uy, u, à òàêæå êîîðäèíàòû òî÷êè x, y. Êîýôôèöèåíòû ïåðåä ïðîèçâîäíûìè uxx, uxy , uyy , ux, uy è çíà÷åíèåì u äîëæíû áûòü ïîñòîÿííûìè. Ñâîáîäíûé ÷ëåí ìîæåò áûòü ïðîèçâîëüíîé ôóíêöèåé êîîðäèíàò. Ïðèìåð: 5 poisson = { uxx + uyy - x - y } laplace = { uxx + uyy } Çàäàíû äâà óðàâíåíèÿ Ïóàññîíà ∆u = x + y è Ëàïëàñà 2.4 ∆u = 0. Çàäàíèå ïàðàìåòðîâ ñåòêè Êîíôèãóðàöèÿ ñåòêè çàäàåòñÿ òðåìÿ ïàðàìåòðàìè hint, hbnd è aspect. Âíóòðè îáëàñòè ñòðîèòñÿ ðàâíîìåðíàÿ òðåóãîëüíàÿ ñåòêà ñ øàãîì hint, íà ãðàíèöàõ ñòðîèòñÿ ñåòêà ñ øàãîì hbnd.  êàæäîé òî÷êå ãðàíèöû â íàïðàâëåíèè ïðîòèâ íîðìàëè (âíóòðü îáëàñòè) äîáàâëÿåòñÿ åùå òðè òî÷êè ñ øàãîì aspect · hbnd. Ðåêîìåíäóåòñÿ âûáèðàòü hbnd ≈ 0.7hint è aspect = 0.5 ÷ 1. Ïðîãðàììà äåëàåò äåñÿòü èòåðàöèé ïî óäàëåíèþ ïëîõèõ òî÷åê. Ïëîõèìè òî÷êàìè ñ÷èòàþòñÿ òî÷êè, â êîòîðûõ íå óäàåòñÿ àïïðîêñèìèðîâàòü ñõåìó ñ ïîëîæèòåëüíûìè êîýôôèöèåíòàìè. Êàê òîëüêî íà î÷åðåäíîé èòåðàöèè ïëîõèå òî÷êè íå îáíàðóæåíû, ïðîãðàììà ïåðåõîäèò ê ðåøåíèþ óðàâíåíèÿ. solve elliptic { uxx + uyy - 1 } in circle (0, 0) radius 1 bndcond { u } meshsize 0.1 0.07 0.6 Ïîëó÷åííàÿ ñåòêà èçîáðàæåíà íà ðèñóíêå. 6 3 Âèçóàëèçàöèÿ ðåøåíèÿ Ïðîãðàììà äåëàåò 107 èòåðàöèé, ñîõðàíÿÿ êàæäûå 10000 èòåðàöèé ðåøåíèå â ôàéëå ôîðìàòà VTK. Åñëè íà èòåðàöèÿõ ðåøåíèå ìåíÿåòñÿ â ðàâíîìåðíîé íîðìå ìåíåå ÷åì íà 10−6, ïðîöåññ îñòàíàâëèâàåòñÿ. Ñîõðàíÿåìûå ôàéëû èìåþò íàçâàíèÿ âèäà <èìÿ êîíôèãóðàöèîííîãî ôàéëà>.<íîìåð èòåðàöèè>.vtk Ôàéëû ïîìåùàþòñÿ â òó æå äèðåêòîðèþ, èç êîòîðîé áðàëñÿ êîíôèãóðàöèîííûé ôàéë, òî åñòü user@host $ ./ellipt64 ../square.geom áóäåò ñîõðàíÿòü ôàéëû square.geom.<n>.vtk íà óðîâåíü âûøå, òàì ãäå íàõîäèòñÿ square.geom. Äëÿ ïðîñìîòðà ôàéëîâ VTK èñïîëüçóåòñÿ ïðîãðàììà Paraview, êîòîðàÿ ìîæåò áûòü âçÿòà ñ îôèöèàëüíîãî ñàéòà http://www.paraview.org/download/ 7