Описание альтернативной программы

advertisement
Îïèñàíèå ïðîãðàììû 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
Download