Peano
Loading...
Searching...
No Matches
MathUtils.py
Go to the documentation of this file.
1# This file is part of the ExaHyPE2 project. For conditions of distribution and
2# use, please see the copyright notice at www.peano-framework.org
3import mpmath as mp
4import math
5import sympy
6import re
7
8
10 # ****************************************
11 # ****************************************
12 # ****** Matrix/Vector operations ********
13 # ****************************************
14 # ****************************************
15
16 @staticmethod
18 """Transpose a matrix M"""
19 return [[M[j][i] for j in range(len(M))] for i in range(len(M[0]))]
20
21 @staticmethod
22 def matrixDot(A, B):
23 """A dot B"""
24 return [
25 [sum([A[n][k] * B[k][m] for k in range(len(B))]) for m in range(len(B[0]))]
26 for n in range(len(A))
27 ]
28
29 @staticmethod
31 """M^-1"""
32 return MathUtils.matrixInverse_Pivot(M)
33
34 @staticmethod
36 """Compute a matrix inverse using a pivot algorithm"""
37 n = len(M)
38 # c = (M|Id)
39 c = [[0.0 for _ in range(2 * n)] for _ in range(n)]
40 for i in range(n):
41 for j in range(n):
42 c[i][j] = M[j][i]
43 c[i][j + n] = 0.0
44 c[i][i + n] = 1.0
45
46 # Forward elimination and row swapping (if necessary)
47 for i in range(n):
48 ml = i
49 mlV = math.fabs(c[i][i])
50 for j in range(i + 1, n):
51 if math.fabs(c[j][i]) > mlV:
52 ml = j
53 mlV = math.fabs(c[j][i])
54 for k in range(0, 2 * n):
55 tmp = c[ml][k]
56 c[ml][k] = c[i][k]
57 c[i][k] = tmp
58
59 if c[i][i] == 0.0:
60 raise ValueError("MatrixInverse: Matrix is singular")
61
62 piv = 1.0 / c[i][i]
63 for k in range(0, 2 * n):
64 c[i][k] *= piv
65 for j in range(i + 1, n):
66 tmp = c[j][i]
67 for k in range(0, 2 * n):
68 c[j][k] -= tmp * c[i][k]
69
70 # Back substitution
71 for i in range(n - 1, -1, -1):
72 for j in range(i - 1, -1, -1):
73 tmp = c[j][i]
74 for k in range(0, 2 * n):
75 c[j][k] -= tmp * c[i][k]
76
77 return [[c[i][j + n] for i in range(n)] for j in range(n)]
78
79 @staticmethod
80 def vectorPad(v, padSize):
81 """zero-pad a vector"""
82 if padSize <= 0:
83 return v
84 return v + [0.0 for _ in range(padSize)]
85
86 @staticmethod
87 def matrixPadAndFlatten_RowMajor(M, padSize):
88 """
89 a b c
90 d e f
91 => a b c 0 d e f 0
92 """
93 result = []
94 for i in range(len(M)):
95 result += MathUtils.vectorPad(M[i], padSize)
96 return result
97
98 @staticmethod
99 def matrixPadAndFlatten_ColMajor(M, padSize):
100 """
101 a b c
102 d e f
103 => a d 0 b e 0 c f 0
104 """
105 return MathUtils.matrixPadAndFlatten_RowMajor(
106 MathUtils.matrixTranspose(M), padSize
107 )
108
109 # ****************************************
110 # ****************************************
111 # *********** Gauss-Legendre *************
112 # ****************************************
113 # ****************************************
114 @staticmethod
115 def getGaussLegendre(nDof):
116 """Return Gauss-Legendre weights, points"""
117 if nDof < 1:
118 raise ValueError("order must be positive")
119
120 maxOrder = 15
121 if nDof > maxOrder + 1:
122 raise ValueError("order is currently limited to {}".format(maxOrder))
123
124 if nDof == 1:
125 return [1.0], [0.5]
126
127 if nDof == 2:
128 return [0.5, 0.5], [
129 0.2113248654051871177454256097490212721761991243649365619906988368,
130 0.7886751345948128822545743902509787278238008756350634380093011632,
131 ]
132
133 if nDof == 3:
134 return [
135 0.2777777777777777777777777777777777777777777777777777777777777778,
136 0.4444444444444444444444444444444444444444444444444444444444444444,
137 0.2777777777777777777777777777777777777777777777777777777777777778,
138 ], [
139 0.1127016653792583114820734600217600389167078294708409173412426234,
140 0.5,
141 0.8872983346207416885179265399782399610832921705291590826587573766,
142 ]
143
144 if nDof == 4:
145 return [
146 0.1739274225687269286865319746109997036176743479169467702462646598,
147 0.3260725774312730713134680253890002963823256520830532297537353402,
148 0.3260725774312730713134680253890002963823256520830532297537353402,
149 0.1739274225687269286865319746109997036176743479169467702462646598,
150 ], [
151 0.06943184420297371238802675555359524745213731018514118119213903955,
152 0.3300094782075718675986671204483776563997120651145428237035230116,
153 0.6699905217924281324013328795516223436002879348854571762964769884,
154 0.9305681557970262876119732444464047525478626898148588188078609605,
155 ]
156
157 if nDof == 5:
158 return [
159 0.1184634425280945437571320203599586813216300011062070077914139441,
160 0.2393143352496832340206457574178190964561477766715707699863638337,
161 0.2844444444444444444444444444444444444444444444444444444444444444,
162 0.2393143352496832340206457574178190964561477766715707699863638337,
163 0.1184634425280945437571320203599586813216300011062070077914139441,
164 ], [
165 0.04691007703066800360118656085030351743717404461873456856311885673,
166 0.2307653449471584544818427896498955975163566965472200218988841865,
167 0.5,
168 0.7692346550528415455181572103501044024836433034527799781011158135,
169 0.9530899229693319963988134391496964825628259553812654314368811433,
170 ]
171
172 if nDof == 6:
173 return [
174 0.0856622461895851725201480710863664467634112507420219911993177199,
175 0.1803807865240693037849167569188580558307609463733727411448696201,
176 0.23395696728634552369493517199477549740582780288460526765581266,
177 0.23395696728634552369493517199477549740582780288460526765581266,
178 0.1803807865240693037849167569188580558307609463733727411448696201,
179 0.0856622461895851725201480710863664467634112507420219911993177199,
180 ], [
181 0.03376524289842398609384922275300269543261713114385508756372519174,
182 0.1693953067668677431693002024900473264967757178024149645927366471,
183 0.3806904069584015456847491391596440322906946849299893249093024177,
184 0.6193095930415984543152508608403559677093053150700106750906975823,
185 0.8306046932331322568306997975099526735032242821975850354072633529,
186 0.9662347571015760139061507772469973045673828688561449124362748083,
187 ]
188
189 if nDof == 7:
190 return [
191 0.06474248308443484663530571633954100916429370112997333198860431936,
192 0.1398526957446383339507338857118897912434625326132993822685070163,
193 0.1909150252525594724751848877444875669391825417669313673755417255,
194 0.2089795918367346938775510204081632653061224489795918367346938776,
195 0.1909150252525594724751848877444875669391825417669313673755417255,
196 0.1398526957446383339507338857118897912434625326132993822685070163,
197 0.06474248308443484663530571633954100916429370112997333198860431936,
198 ], [
199 0.02544604382862073773690515797607436879961453116469110822561544804,
200 0.129234407200302780068067613359605796462926176429304869940022324,
201 0.2970774243113014165466967939615192683263089929503149368064783741,
202 0.5,
203 0.7029225756886985834533032060384807316736910070496850631935216259,
204 0.870765592799697219931932386640394203537073823570695130059977676,
205 0.974553956171379262263094842023925631200385468835308891774384552,
206 ]
207
208 if nDof == 8:
209 return [
210 0.05061426814518812957626567715498109505769704552584247852950184903,
211 0.1111905172266872352721779972131204422150654350256247823629546446,
212 0.1568533229389436436689811009933006566301644995013674688451319725,
213 0.1813418916891809914825752246385978060970730199471652702624115338,
214 0.1813418916891809914825752246385978060970730199471652702624115338,
215 0.1568533229389436436689811009933006566301644995013674688451319725,
216 0.1111905172266872352721779972131204422150654350256247823629546446,
217 0.05061426814518812957626567715498109505769704552584247852950184903,
218 ], [
219 0.01985507175123188415821956571526350478588238284927398086418011131,
220 0.1016667612931866302042230317620847815814141341920175839649148525,
221 0.2372337950418355070911304754053768254790178784398035711245714504,
222 0.4082826787521750975302619288199080096666210935435131088414057632,
223 0.5917173212478249024697380711800919903333789064564868911585942368,
224 0.7627662049581644929088695245946231745209821215601964288754285496,
225 0.8983332387068133697957769682379152184185858658079824160350851475,
226 0.9801449282487681158417804342847364952141176171507260191358198887,
227 ]
228
229 if nDof == 9:
230 return [
231 0.04063719418078720598594607905526182533783086039120537535555383844,
232 0.09032408034742870202923601562145640475716891086602024224916795324,
233 0.1303053482014677311593714347093164248859201022186499759699985011,
234 0.1561735385200014200343152032922218327993774306309523227770055828,
235 0.1651196775006298815822625346434870244394053917863441672965482489,
236 0.1561735385200014200343152032922218327993774306309523227770055828,
237 0.1303053482014677311593714347093164248859201022186499759699985011,
238 0.09032408034742870202923601562145640475716891086602024224916795324,
239 0.04063719418078720598594607905526182533783086039120537535555383844,
240 ], [
241 0.01591988024618695508221189854816356497529759975403733522498834408,
242 0.08198444633668210285028510596513256172794664093766200194781401018,
243 0.1933142836497048013456489803292629076071396975297176535635935289,
244 0.3378732882980955354807309926783316957140218696315134555864762616,
245 0.5,
246 0.6621267117019044645192690073216683042859781303684865444135237384,
247 0.8066857163502951986543510196707370923928603024702823464364064711,
248 0.9180155536633178971497148940348674382720533590623379980521859898,
249 0.9840801197538130449177881014518364350247024002459626647750116559,
250 ]
251
252 if nDof == 10:
253 return [
254 0.03333567215434406879678440494666589642893241716007907256434744081,
255 0.07472567457529029657288816982884866620127831983471368391773863438,
256 0.1095431812579910219977674671140815962293859352613385449404782718,
257 0.1346333596549981775456134607847346764298799692304418979002816381,
258 0.1477621123573764350869464973256691647105233585134268006771540149,
259 0.1477621123573764350869464973256691647105233585134268006771540149,
260 0.1346333596549981775456134607847346764298799692304418979002816381,
261 0.1095431812579910219977674671140815962293859352613385449404782718,
262 0.07472567457529029657288816982884866620127831983471368391773863438,
263 0.03333567215434406879678440494666589642893241716007907256434744081,
264 ], [
265 0.01304673574141413996101799395777397328586502665380894038439396665,
266 0.06746831665550774463395165578825347573622849251733477373902013408,
267 0.1602952158504877968828363174425632121153526440825952661675914055,
268 0.2833023029353764046003670284171079188999640811718767517486492434,
269 0.4255628305091843945575869994351400076912175702896541521460053732,
270 0.5744371694908156054424130005648599923087824297103458478539946268,
271 0.7166976970646235953996329715828920811000359188281232482513507566,
272 0.8397047841495122031171636825574367878846473559174047338324085945,
273 0.9325316833444922553660483442117465242637715074826652262609798659,
274 0.9869532642585858600389820060422260267141349733461910596156060333,
275 ]
276
277 if nDof == 11:
278 return [
279 0.02783428355808683324137686022127428936425781284844907417419214284,
280 0.06279018473245231231734714961197005009880789569770175033196700541,
281 0.09314510546386712571304882071582794584564237402010170589075320209,
282 0.1165968822959952399592618524215875697158990861584792545136598611,
283 0.1314022722551233310903444349452545976863823388015722781900276857,
284 0.1364625433889503153572417641681710945780209849473918737988002057,
285 0.1314022722551233310903444349452545976863823388015722781900276857,
286 0.1165968822959952399592618524215875697158990861584792545136598611,
287 0.09314510546386712571304882071582794584564237402010170589075320209,
288 0.06279018473245231231734714961197005009880789569770175033196700541,
289 0.02783428355808683324137686022127428936425781284844907417419214284,
290 ], [
291 0.01088567092697150359803099943857130461428879554010779228709946701,
292 0.05646870011595235046242111534803636668416212438734280751629447223,
293 0.1349239972129753379532918739844232709751784689869348440108108302,
294 0.2404519353965940920371371652706952227598864424400357554895386943,
295 0.3652284220238275138342340072995692376601890687804738591880371841,
296 0.5,
297 0.6347715779761724861657659927004307623398109312195261408119628159,
298 0.7595480646034059079628628347293047772401135575599642445104613057,
299 0.8650760027870246620467081260155767290248215310130651559891891698,
300 0.9435312998840476495375788846519636333158378756126571924837055278,
301 0.989114329073028496401969000561428695385711204459892207712900533,
302 ]
303
304 if nDof == 12:
305 return [
306 0.0235876681932559135973079807425085301585145369974235447802526735,
307 0.05346966299765921548012735909699811210728508673516244000256302105,
308 0.08003916427167311316732626477167953593600586524543208895494977208,
309 0.1015837133615329608745322279048991882532590736372950731992972829,
310 0.1167462682691774043804249494624390281297049860998774373652617489,
311 0.1245735229067013925002812180214756054152304512848094156976755016,
312 0.1245735229067013925002812180214756054152304512848094156976755016,
313 0.1167462682691774043804249494624390281297049860998774373652617489,
314 0.1015837133615329608745322279048991882532590736372950731992972829,
315 0.08003916427167311316732626477167953593600586524543208895494977208,
316 0.05346966299765921548012735909699811210728508673516244000256302105,
317 0.0235876681932559135973079807425085301585145369974235447802526735,
318 ], [
319 0.009219682876640374654725454925359588519922400093134244768658939096,
320 0.04794137181476257166076706694045190373120164539335122672296211966,
321 0.1150486629028476564815530833935909620075371249905341811677904679,
322 0.2063410228566912763516487905297328598154507429759737592448645602,
323 0.3160842505009099031236542316781412193718199293322951893441000602,
324 0.4373832957442655422637793152680734350083015418472778633935391226,
325 0.5626167042557344577362206847319265649916984581527221366064608774,
326 0.6839157494990900968763457683218587806281800706677048106558999398,
327 0.7936589771433087236483512094702671401845492570240262407551354398,
328 0.8849513370971523435184469166064090379924628750094658188322095321,
329 0.9520586281852374283392329330595480962687983546066487732770378803,
330 0.9907803171233596253452745450746404114800775999068657552313410609,
331 ]
332
333 if nDof == 13:
334 return [
335 0.02024200238265793976001079610049303002099327287249443406752330375,
336 0.04606074991886422395721088797689856046184199993111841954419577367,
337 0.06943675510989361923180088843443573381093135913164911382317750825,
338 0.08907299038097286914002334599804899775640632533050825149339722014,
339 0.10390802376844425115626160965302638169329130459975177460955556,
340 0.1131415901314486192060450930198883092173788688077785099324842744,
341 0.1162757766154369550972947576344179740783137386533989930593327197,
342 0.1131415901314486192060450930198883092173788688077785099324842744,
343 0.10390802376844425115626160965302638169329130459975177460955556,
344 0.08907299038097286914002334599804899775640632533050825149339722014,
345 0.06943675510989361923180088843443573381093135913164911382317750825,
346 0.04606074991886422395721088797689856046184199993111841954419577367,
347 0.02024200238265793976001079610049303002099327287249443406752330375,
348 ], [
349 0.007908472640705925263585275596445194467504719037062545652996339786,
350 0.04120080038851101739672608174964024380476260494415835205235732717,
351 0.09921095463334504360289675520857005484719213760474998505130764307,
352 0.178825330279829889678007696502242174964151300869211571305428796,
353 0.2757536244817765735610435739361800660990391662791210605208585263,
354 0.3847708420224326029672359394510055823942288120582344182653692511,
355 0.5,
356 0.6152291579775673970327640605489944176057711879417655817346307489,
357 0.7242463755182234264389564260638199339009608337208789394791414737,
358 0.821174669720170110321992303497757825035848699130788428694571204,
359 0.9007890453666549563971032447914299451528078623952500149486923569,
360 0.9587991996114889826032739182503597561952373950558416479476426728,
361 0.9920915273592940747364147244035548055324952809629374543470036602,
362 ]
363
364 if nDof == 14:
365 return [
366 0.0175597301658759315159164380690958903098528046385636382907499451,
367 0.04007904357988010490281663853142715479184889269729738260069953274,
368 0.06075928534395159234470740453623831297833467284503733614553769627,
369 0.07860158357909676728480096931192107830283401866866168748465852194,
370 0.09276919873896890687085829506257851812446130146866582951001746253,
371 0.1025992318606478019829620328306090278551695306547097258584486451,
372 0.1076319267315788950979382216581300176374987790270644001098881963,
373 0.1076319267315788950979382216581300176374987790270644001098881963,
374 0.1025992318606478019829620328306090278551695306547097258584486451,
375 0.09276919873896890687085829506257851812446130146866582951001746253,
376 0.07860158357909676728480096931192107830283401866866168748465852194,
377 0.06075928534395159234470740453623831297833467284503733614553769627,
378 0.04007904357988010490281663853142715479184889269729738260069953274,
379 0.0175597301658759315159164380690958903098528046385636382907499451,
380 ], [
381 0.006858095651593830579201366647973599161954296380387059177964594111,
382 0.03578255816821324133180443031106286776148039479508119064101877626,
383 0.08639934246511750340510262867480251948014944926245940921964547288,
384 0.1563535475941572649259900984903329312307993936264146621903667557,
385 0.2423756818209229540173546407244056688455573587153469815242476155,
386 0.3404438155360551197821640879157622665828693982330780217016749064,
387 0.4459725256463281689668776748900826261940241972628812214795894693,
388 0.5540274743536718310331223251099173738059758027371187785204105307,
389 0.6595561844639448802178359120842377334171306017669219782983250936,
390 0.7576243181790770459826453592755943311544426412846530184757523845,
391 0.8436464524058427350740099015096670687692006063735853378096332443,
392 0.9136006575348824965948973713251974805198505507375405907803545271,
393 0.9642174418317867586681955696889371322385196052049188093589812237,
394 0.9931419043484061694207986333520264008380457036196129408220354059,
395 ]
396
397 if nDof == 15:
398 return [
399 0.01537662099805863417731419678860220886087407241671703713211414275,
400 0.03518302374405406235463370822533366923335401637716535991295364646,
401 0.05357961023358596750593477334293465170777185787905099034351119456,
402 0.06978533896307715722390239725551416126042513765775562160119556432,
403 0.08313460290849696677660043024060440556545009004920645366093259528,
404 0.09308050000778110551340028093321141225311300613896420140774786366,
405 0.09921574266355578822805916322191966240934627997877099674236896396,
406 0.101289120962780636440310099983759657419331079004738678398352058,
407 0.09921574266355578822805916322191966240934627997877099674236896396,
408 0.09308050000778110551340028093321141225311300613896420140774786366,
409 0.08313460290849696677660043024060440556545009004920645366093259528,
410 0.06978533896307715722390239725551416126042513765775562160119556432,
411 0.05357961023358596750593477334293465170777185787905099034351119456,
412 0.03518302374405406235463370822533366923335401637716535991295364646,
413 0.01537662099805863417731419678860220886087407241671703713211414275,
414 ], [
415 0.006003740989757285755217140706693709426513591438119255000001242206,
416 0.03136330379964704784612052614489526437800186324234777104931846182,
417 0.07589670829478639189967583961289157431687191263150368295213622062,
418 0.1377911343199149762919069726930309951845503527079487182242882896,
419 0.2145139136957305762313866313730446793808068018586251975733672915,
420 0.302924326461218315051396314509477265818623611920650872484417328,
421 0.3994029530012827388496858483027018960935817727686811601920251377,
422 0.5,
423 0.6005970469987172611503141516972981039064182272313188398079748623,
424 0.697075673538781684948603685490522734181376388079349127515582672,
425 0.7854860863042694237686133686269553206191931981413748024266327085,
426 0.8622088656800850237080930273069690048154496472920512817757117104,
427 0.9241032917052136081003241603871084256831280873684963170478637794,
428 0.9686366962003529521538794738551047356219981367576522289506815382,
429 0.9939962590102427142447828592933062905734864085618807449999987578,
430 ]
431
432 if nDof == 16:
433 return [
434 0.01357622970587704742589028622800905175613368778338039899530515954,
435 0.03112676196932394643142191849718884713749325417645342895065175791,
436 0.04757925584124639240496255380112311317763175159185632907841114361,
437 0.06231448562776693602623814109600821007244342961110133997237529521,
438 0.07479799440828836604075086527373927448524553410391823340271098109,
439 0.08457825969750126909465603951517998110581973670801414087254146784,
440 0.09130170752246179443338183398460996969177811182732464120924757219,
441 0.0947253052275342481426983616041415525734544941979514875187566226,
442 0.0947253052275342481426983616041415525734544941979514875187566226,
443 0.09130170752246179443338183398460996969177811182732464120924757219,
444 0.08457825969750126909465603951517998110581973670801414087254146784,
445 0.07479799440828836604075086527373927448524553410391823340271098109,
446 0.06231448562776693602623814109600821007244342961110133997237529521,
447 0.04757925584124639240496255380112311317763175159185632907841114361,
448 0.03112676196932394643142191849718884713749325417645342895065175791,
449 0.01357622970587704742589028622800905175613368778338039899530515954,
450 ], [
451 0.005299532504175033701922913274833686286862964171177434974388047634,
452 0.02771248846338371196100579223269582745443036370446369953722317397,
453 0.06718439880608412805976605114380343380633230757623664594824428722,
454 0.1222977958224984830524494025762788658230931717712484951091214115,
455 0.1910618777986781257766641179756044905040588911171711029481013222,
456 0.2709916111713863068287902785082112132299841934822382545494226245,
457 0.359198224610370543384769749269751946756965254614700099725582633,
458 0.4524937450811812799073403322875209684348234721554672716513900914,
459 0.5475062549188187200926596677124790315651765278445327283486099086,
460 0.640801775389629456615230250730248053243034745385299900274417367,
461 0.7290083888286136931712097214917887867700158065177617454505773755,
462 0.8089381222013218742233358820243955094959411088828288970518986778,
463 0.8777022041775015169475505974237211341769068282287515048908785885,
464 0.9328156011939158719402339488561965661936676924237633540517557128,
465 0.972287511536616288038994207767304172545569636295536300462776826,
466 0.9947004674958249662980770867251663137131370358288225650256119524,
467 ]
468
469 # ****************************************
470 # ****************************************
471 # *********** Gauss-Lobatto **************
472 # ****************************************
473 # ****************************************
474 @staticmethod
475 def getGaussLobatto(nDof):
476 """Return Gauss-Lobatto weights, points"""
477 if nDof < 1:
478 raise ValueError("order must be positive")
479
480 maxOrder = 15
481 if nDof > maxOrder + 1:
482 raise ValueError("order is currently limited to {}".format(maxOrder))
483
484 if nDof == 1:
485 return [1.0], [0.5]
486
487 if nDof == 2:
488 return [0.5, 0.5], [1.0, 0.0]
489
490 if nDof == 3:
491 return [
492 0.1666666666666666666666666666666666666666666666666666666666666667,
493 0.6666666666666666666666666666666666666666666666666666666666666667,
494 0.1666666666666666666666666666666666666666666666666666666666666667,
495 ], [1.0, 0.5, 0.0]
496
497 if nDof == 4:
498 return [
499 0.08333333333333333333333333333333333333333333333333333333333333333,
500 0.4166666666666666666666666666666666666666666666666666666666666667,
501 0.4166666666666666666666666666666666666666666666666666666666666667,
502 0.08333333333333333333333333333333333333333333333333333333333333333,
503 ], [
504 1.0,
505 0.7236067977499789696409173668731276235440618359611525724270897245,
506 0.2763932022500210303590826331268723764559381640388474275729102755,
507 0.0,
508 ]
509
510 if nDof == 5:
511 return [
512 0.05,
513 0.2722222222222222222222222222222222222222222222222222222222222222,
514 0.3555555555555555555555555555555555555555555555555555555555555556,
515 0.2722222222222222222222222222222222222222222222222222222222222222,
516 0.05,
517 ], [
518 1.0,
519 0.8273268353539885718991462281234291777846040411977122787576601517,
520 0.5,
521 0.1726731646460114281008537718765708222153959588022877212423398483,
522 0.0,
523 ]
524
525 if nDof == 6:
526 return [
527 0.03333333333333333333333333333333333333333333333333333333333333333,
528 0.1892374781489234901583064041060123262381623469486258303271944257,
529 0.277429188517743176508360262560654340428504319718040836339472241,
530 0.277429188517743176508360262560654340428504319718040836339472241,
531 0.1892374781489234901583064041060123262381623469486258303271944257,
532 0.03333333333333333333333333333333333333333333333333333333333333333,
533 ], [
534 1.0,
535 0.8825276619647323464255014869796690751828678442680521196637911779,
536 0.6426157582403225481570754970204395359595017363632126959098752083,
537 0.3573842417596774518429245029795604640404982636367873040901247917,
538 0.1174723380352676535744985130203309248171321557319478803362088221,
539 0.0,
540 ]
541
542 if nDof == 7:
543 return [
544 0.02380952380952380952380952380952380952380952380952380952380952381,
545 0.1384130236807829740053502031450331467488136400899412345912671195,
546 0.2158726906049313117089355111406811389654720741957730511230185948,
547 0.2438095238095238095238095238095238095238095238095238095238095238,
548 0.2158726906049313117089355111406811389654720741957730511230185948,
549 0.1384130236807829740053502031450331467488136400899412345912671195,
550 0.02380952380952380952380952380952380952380952380952380952380952381,
551 ], [
552 1.0,
553 0.915111948139283464936016106983732569793585182435998045795406606,
554 0.7344243967353571069018859409543831647027987358359223785513347297,
555 0.5,
556 0.2655756032646428930981140590456168352972012641640776214486652703,
557 0.08488805186071653506398389301626743020641481756400195420459339398,
558 0.0,
559 ]
560
561 if nDof == 8:
562 return [
563 0.01785714285714285714285714285714285714285714285714285714285714286,
564 0.1053521135717530196914960328878781622276730830805238840416702908,
565 0.1705613462417521823821203385538740858875554878027908047375010369,
566 0.2062293973293519407835264857011048947419142862595424540779715294,
567 0.2062293973293519407835264857011048947419142862595424540779715294,
568 0.1705613462417521823821203385538740858875554878027908047375010369,
569 0.1053521135717530196914960328878781622276730830805238840416702908,
570 0.01785714285714285714285714285714285714285714285714285714285714286,
571 ], [
572 1.0,
573 0.9358700742548033076687228806103317190518903348384916774597076428,
574 0.7958500907165711510722553656989765949728504947586662483711297957,
575 0.6046496089512394343843286301726756276477727025433405494454233462,
576 0.3953503910487605656156713698273243723522272974566594505545766538,
577 0.2041499092834288489277446343010234050271495052413337516288702043,
578 0.06412992574519669233127711938966828094810966516150832254029235721,
579 0.0,
580 ]
581
582 if nDof == 9:
583 return [
584 0.01388888888888888888888888888888888888888888888888888888888888889,
585 0.08274768078040276252316986001460415291955361461257967072311179727,
586 0.1372693562500808676403528092896863629706256104932546432683968145,
587 0.1732142554865231725575657660698591439737663531254582030152941094,
588 0.18575963718820861678004535147392290249433106575963718820861678,
589 0.1732142554865231725575657660698591439737663531254582030152941094,
590 0.1372693562500808676403528092896863629706256104932546432683968145,
591 0.08274768078040276252316986001460415291955361461257967072311179727,
592 0.01388888888888888888888888888888888888888888888888888888888888889,
593 ], [
594 1.0,
595 0.9498789977057300786561726222091689790257401477830522112146563342,
596 0.8385931397553688767229427135456712253555148238069532897704816877,
597 0.6815587319130890793553760343543296065103211388004390751601368654,
598 0.5,
599 0.3184412680869109206446239656456703934896788611995609248398631346,
600 0.1614068602446311232770572864543287746444851761930467102295183123,
601 0.05012100229426992134382737779083102097425985221694778878534366576,
602 0.0,
603 ]
604
605 if nDof == 10:
606 return [
607 0.01111111111111111111111111111111111111111111111111111111111111111,
608 0.06665299542553505556311358537769644905481293749889870744394545177,
609 0.1124446710315632260597289108655239213769564569808753205698293669,
610 0.1460213418398418789377911286872219461037441948438537722956863553,
611 0.163769880591948728328255263958446572353375299565261088579427715,
612 0.163769880591948728328255263958446572353375299565261088579427715,
613 0.1460213418398418789377911286872219461037441948438537722956863553,
614 0.1124446710315632260597289108655239213769564569808753205698293669,
615 0.06665299542553505556311358537769644905481293749889870744394545177,
616 0.01111111111111111111111111111111111111111111111111111111111111111,
617 ], [
618 1.0,
619 0.9597669540832294069144663304111690670767715377231379357448130723,
620 0.8693869325527525375015530874299153625080925506884633427325544965,
621 0.7389624749052222478305875463656289989433864466652832344571284198,
622 0.5826394788331935123131098829790867666155751717747418655664497861,
623 0.4173605211668064876868901170209132333844248282252581344335502139,
624 0.2610375250947777521694124536343710010566135533347167655428715802,
625 0.1306130674472474624984469125700846374919074493115366572674455035,
626 0.04023304591677059308553366958883093292322846227686206425518692771,
627 0.0,
628 ]
629
630 if nDof == 11:
631 return [
632 0.009090909090909090909090909090909090909090909090909090909090909091,
633 0.05480613663349743223070172479017535502473707182363836539885294066,
634 0.09358494089015260205407076094971745978459711881256415930366621872,
635 0.124024052132014157020042433210936376671836584823856939627991361,
636 0.1434395623895040443396112016657676155918267737279659141710584574,
637 0.1501087977278453468929659405849882040358230834421310611786802263,
638 0.1434395623895040443396112016657676155918267737279659141710584574,
639 0.124024052132014157020042433210936376671836584823856939627991361,
640 0.09358494089015260205407076094971745978459711881256415930366621872,
641 0.05480613663349743223070172479017535502473707182363836539885294066,
642 0.009090909090909090909090909090909090909090909090909090909090909091,
643 ], [
644 1.0,
645 0.9670007152040295671661370680496918172699586650549811129458133766,
646 0.8922417368315722093112089080542290517535987275470318108413176704,
647 0.782617663498102503235481984738875832141526072781008487845578624,
648 0.6478790677934696957159557577795287544705032171743020547339496869,
649 0.5,
650 0.3521209322065303042840442422204712455294967828256979452660503131,
651 0.217382336501897496764518015261124167858473927218991512154421376,
652 0.1077582631684277906887910919457709482464012724529681891586823296,
653 0.03299928479597043283386293195030818273004133494501888705418662336,
654 0.0,
655 ]
656
657 if nDof == 12:
658 return [
659 0.007575757575757575757575757575757575757575757575757575757575757576,
660 0.04584225870659806533417129706703964315515307070889136931061275311,
661 0.07898735278218505758233553135017013412555315821172857986311633305,
662 0.1062542088805105726791510386834331350976728113826704167480374016,
663 0.1256378015996006401466222060737980916667192386749018227851616431,
664 0.1357026204553480885001441692498014201973259634460502355354961116,
665 0.1357026204553480885001441692498014201973259634460502355354961116,
666 0.1256378015996006401466222060737980916667192386749018227851616431,
667 0.1062542088805105726791510386834331350976728113826704167480374016,
668 0.07898735278218505758233553135017013412555315821172857986311633305,
669 0.04584225870659806533417129706703964315515307070889136931061275311,
670 0.007575757575757575757575757575757575757575757575757575757575757576,
671 ], [
672 1.0,
673 0.9724496361114411117037900691516093568056282759750136618569459485,
674 0.9096396608220033391743207908584513303452333289518221447116583631,
675 0.8164380765159303388312024272218279291219218727007504964825767823,
676 0.699765470482674466132174895783483450263874016397653518243968836,
677 0.568276466427463777432030927869846948449207055641029192725790783,
678 0.431723533572536222567969072130153051550792944358970807274209217,
679 0.300234529517325533867825104216516549736125983602346481756031164,
680 0.1835619234840696611687975727781720708780781272992495035174232177,
681 0.09036033917799666082567920914154866965476667104817785528834163694,
682 0.02755036388855888829620993084839064319437172402498633814305405146,
683 0.0,
684 ]
685
686 if nDof == 13:
687 return [
688 0.00641025641025641025641025641025641025641025641025641025641025641,
689 0.03890084337340946389679449416656679253391740874675146052331287294,
690 0.06749096334480417455995738129468544462808634604633970926140225038,
691 0.09182343260177504600374712937340536162323684348411899957251376073,
692 0.1103838967830550430427670041896981487336314366669976023658147041,
693 0.122007895153338178229289074180078106265631100208278030113407599,
694 0.125965424666723368022069320770619471918173216874515575814277113,
695 0.122007895153338178229289074180078106265631100208278030113407599,
696 0.1103838967830550430427670041896981487336314366669976023658147041,
697 0.09182343260177504600374712937340536162323684348411899957251376073,
698 0.06749096334480417455995738129468544462808634604633970926140225038,
699 0.03890084337340946389679449416656679253391740874675146052331287294,
700 0.00641025641025641025641025641025641025641025641025641025641025641,
701 ], [
702 1.0,
703 0.9766549233210819559484527323777245758132539443486815925946863014,
704 0.9231737823259361584329628035493766797890183298572043128443235063,
705 0.8430942345408787130363795197831777764645880990621922135313456729,
706 0.741454910545668100873468616818466810386096631059295005238862046,
707 0.6246434650531199962843368501871134907444056562464879296492579543,
708 0.5,
709 0.3753565349468800037156631498128865092555943437535120703507420457,
710 0.258545089454331899126531383181533189613903368940704994761137954,
711 0.1569057654591212869636204802168222235354119009378077864686543271,
712 0.07682621767406384156703719645062332021098167014279568715567649367,
713 0.02334507667891804405154726762227542418674605565131840740531369857,
714 0.0,
715 ]
716
717 if nDof == 14:
718 return [
719 0.005494505494505494505494505494505494505494505494505494505494505495,
720 0.03341864224884064231703533037302641252882102672534121692222483303,
721 0.05829332794935582577049833532732511500235292745003663959760895324,
722 0.08001092588147607120641049899379732025190127481644053508436702227,
723 0.09741307468670805932016588918794225607431437802593237813822327477,
724 0.109563126504885377435581261977083806479166057229437913068072572,
725 0.1158063972342285294448141786463195951579498302583058226840088392,
726 0.1158063972342285294448141786463195951579498302583058226840088392,
727 0.109563126504885377435581261977083806479166057229437913068072572,
728 0.09741307468670805932016588918794225607431437802593237813822327477,
729 0.08001092588147607120641049899379732025190127481644053508436702227,
730 0.05829332794935582577049833532732511500235292745003663959760895324,
731 0.03341864224884064231703533037302641252882102672534121692222483303,
732 0.005494505494505494505494505494505494505494505494505494505494505495,
733 ], [
734 1.0,
735 0.9799675226336304506775500810077121945331957592863239681820791169,
736 0.9339005269151736255001101014541321066249361765472180673794130921,
737 0.8644342995456630702923362002604407978286697658471609013061219826,
738 0.775319701464323527658311352929540317231069159776957066911896457,
739 0.6713620066713564225219517018208373224165567670701533732774574164,
740 0.5581659344418519338293883548680800839707545221281403841016624303,
741 0.4418340655581480661706116451319199160292454778718596158983375697,
742 0.3286379933286435774780482981791626775834432329298466267225425836,
743 0.224680298535676472341688647070459682768930840223042933088103543,
744 0.1355657004543369297076637997395592021713302341528390986938780174,
745 0.06609947308482637449988989854586789337506382345278193262058690795,
746 0.02003247736636954932244991899228780546680424071367603181792088307,
747 0.0,
748 ]
749
750 if nDof == 15:
751 return [
752 0.004761904761904761904761904761904761904761904761904761904761904762,
753 0.02901494651430062454844029201264099771784336341300745188628787274,
754 0.05083003516285903380183308539440035774049179685830295249610959702,
755 0.07025584990121405473022340282183644531174217730120397909471137254,
756 0.08639482362680047452603854970417529367831783151340264536420857385,
757 0.09849361798230667804625017325370329743180197541674521423484253266,
758 0.1059867929634104600637150384886104583118278726971801315913895439,
759 0.108524058174407824757475107125456775806426156076505726855377205,
760 0.1059867929634104600637150384886104583118278726971801315913895439,
761 0.09849361798230667804625017325370329743180197541674521423484253266,
762 0.08639482362680047452603854970417529367831783151340264536420857385,
763 0.07025584990121405473022340282183644531174217730120397909471137254,
764 0.05083003516285903380183308539440035774049179685830295249610959702,
765 0.02901494651430062454844029201264099771784336341300745188628787274,
766 0.004761904761904761904761904761904761904761904761904761904761904762,
767 ], [
768 1.0,
769 0.9826229632519192863979256960348005888538250679985466700362492292,
770 0.9425410221114881494127008157411148259943570426037389864086908153,
771 0.8817598449759076003520592379881458090886842601576451683773528025,
772 0.803126602734922855561764969318366753589865516879959892842914752,
773 0.7103190273568362404609484693692902064921691027462151841925466805,
774 0.6076769776818971191128397231364588563260789506015205317372525738,
775 0.5,
776 0.3923230223181028808871602768635411436739210493984794682627474262,
777 0.2896809726431637595390515306307097935078308972537848158074533195,
778 0.196873397265077144438235030681633246410134483120040107157085248,
779 0.1182401550240923996479407620118541909113157398423548316226471975,
780 0.05745897788851185058729918425888517400564295739626101359130918466,
781 0.01737703674808071360207430396519941114617493200145332996375077079,
782 0.0,
783 ]
784
785 if nDof == 16:
786 return [
787 0.004166666666666666666666666666666666666666666666666666666666666667,
788 0.02542518050295995270162245978272765724693591376889349195640334722,
789 0.04469684866296540049552604008304185746694360501889948923847233214,
790 0.0621276910662570491747681663286566003871990156349497701053386364,
791 0.07701349040358214040782247024249725772270812099182066142850652273,
792 0.08874595669585206265053783476417888507915737258808560675748197508,
793 0.09684501191260179215845679942676101515317899700920366259183295667,
794 0.1009791540891149357445995627054700602772103083214806512552975631,
795 0.1009791540891149357445995627054700602772103083214806512552975631,
796 0.09684501191260179215845679942676101515317899700920366259183295667,
797 0.08874595669585206265053783476417888507915737258808560675748197508,
798 0.07701349040358214040782247024249725772270812099182066142850652273,
799 0.0621276910662570491747681663286566003871990156349497701053386364,
800 0.04469684866296540049552604008304185746694360501889948923847233214,
801 0.02542518050295995270162245978272765724693591376889349195640334722,
802 0.004166666666666666666666666666666666666666666666666666666666666667,
803 ], [
804 1.0,
805 0.9847840231351089664761213691837296206944953732519173650343393661,
806 0.9496002665467360464973141307599247383749988045225722127122137059,
807 0.8960041459309075319655441354815728529040369139900995113422053249,
808 0.8261943514412465447339416098202907401607790064147871686928906421,
809 0.7430297109435688058909453929234373484444886521491262856883284338,
810 0.6499152344503816040491767273611503239077304884538888323271550488,
811 0.5506631367609747239215165025229588812666204572000955699587751001,
812 0.4493368632390252760784834974770411187333795427999044300412248999,
813 0.3500847655496183959508232726388496760922695115461111676728449512,
814 0.2569702890564311941090546070765626515555113478508737143116715662,
815 0.1738056485587534552660583901797092598392209935852128313071093579,
816 0.1039958540690924680344558645184271470959630860099004886577946751,
817 0.05039973345326395350268586924007526162500119547742778728778629411,
818 0.01521597686489103352387863081627037930550462674808263496566063386,
819 0.0,
820 ]
821
822 # ****************************************
823 # ****************************************
824 # *************** ADERDG *****************
825 # ****************************************
826 # ****************************************
827 @staticmethod
828 def baseFunc1d(xi, xin, N):
829 """
830 Computes the ADER-DG basis functions and their first derivative.
831
832 Args:
833 xi:
834 The reference element point the basis functions are evaluated at.
835 Here, xi refers to the greek letter that is often used as a reference element coordinate.
836 xin:
837 The reference element nodes corresponding to the nodal basis functions.
838 N:
839 Number of nodal basis functions (=order+1).
840 Returns:
841 phi:
842 Basis function values.
843 phi_xi:
844 First derivatives of the basis functions.
845 """
846 phi = [1.0] * N
847 phi_xi = [0.0] * N
848 for m in range(0, N):
849 for j in range(0, N):
850 if j == m:
851 continue
852 phi[m] = phi[m] * (xi - xin[j]) / (xin[m] - xin[j])
853 for i in range(0, N):
854 if i == m:
855 continue
856 tmp = 1.0
857 for j in range(0, N):
858 if j == i:
859 continue
860 if j == m:
861 continue
862 tmp = tmp * (xi - xin[j]) / (xin[m] - xin[j])
863 phi_xi[m] += tmp / (xin[m] - xin[i])
864 return phi, phi_xi
865
866 @staticmethod
867 def assembleStiffnessMatrix(xGPN, wGPN, N):
868 """
869 Computes the (reference) element stiffness matrix for an approximation of
870 order N.
871
872 Args:
873 xGPN:
874 Gauss-Legendre nodes (N nodes).
875 wGPN:
876 Gauss-Legendre weights (N weights).
877 N:
878 Number of nodal basis functions (=order+1).
879 Returns:
880 K_xi:
881 The (reference) element stiffness matrix.
882 """
883 # init matrix with zero
884 Kxi = [[0 for _ in range(N)] for _ in range(N)]
885
886 for i in range(0, N):
887 phi, phi_xi = MathUtils.baseFunc1d(xGPN[i], xGPN, N)
888 for k in range(0, N):
889 for l in range(0, N):
890 Kxi[k][l] += wGPN[i] * phi_xi[k] * phi[l]
891
892 return Kxi
893
894 @staticmethod
895 def assembleK1(Kxi, xGPN, N):
896 """
897 Computes the difference between the reference element mass operator
898 evaluated at point xi=1.0 and the element stiffness matrix.
899
900 Args:
901 K_xi:
902 The (reference) element stiffness matrix for a approximation of
903 order N.
904 xGPN:
905 Gauss-Legendre nodes (N nodes).
906 N:
907 Order of approximation corresponding to N+1 nodal basis functions.
908 Returns:
909 K1:
910 <unknown>
911 """
912 phi1, _ = MathUtils.baseFunc1d(1.0, xGPN, N)
913 FRm = [[0 for _ in range(N)] for _ in range(N)]
914
915 for k in range(0, N):
916 for l in range(0, N):
917 FRm[k][l] = phi1[k] * phi1[l]
918
919 return [[FRm[i][j] - Kxi[i][j] for j in range(N)] for i in range(N)]
920
921 @staticmethod
922 def assembleMassMatrix(xGPN, wGPN, N):
923 """
924 Computes the (reference) element mass matrix for an approximation of
925 order N.
926
927 Args:
928 xGPN:
929 Gauss-Legendre nodes (N nodes).
930 wGPN:
931 N Gauss-Legendre weights (N weights).
932 N:
933 Number of nodal basis functions (=order+1).
934 Returns:
935 M_xi:
936 The (reference) element mass matrix.
937 """
938 # init matrix with zeros
939 MM = [[0 for _ in range(N)] for _ in range(N)]
940
941 for i in range(0, N):
942 phi, _ = MathUtils.baseFunc1d(xGPN[i], xGPN, N)
943 for k in range(0, N):
944 for l in range(0, N):
945 MM[k][l] += wGPN[i] * phi[k] * phi[l]
946
947 return MM
948
949 @staticmethod
950 def assembleDiscreteDerivativeOperator(MM, Kxi):
951 """
952 Computes some derivative values for debugging purposes.
953
954 Args:
955 MM:
956 The (reference) element mass matrix for a approximation of
957 order N.
958 Kxi:
959 The (reference) element stiffness matrix for a approximation of
960 order N.
961
962 Returns:
963 dudx:
964 Derivative values for debugging purposes.
965 """
966 dudx = MathUtils.matrixDot(
967 MathUtils.matrixInverse(MM), MathUtils.matrixTranspose(Kxi)
968 )
969 return dudx
970
971 @staticmethod
972 def assembleFineGridProjector1d(xGPN, j, N):
973 """
974 Transforms the degrees of freedom located on a coarse grid edge
975 nodes to degrees of freedoms located on nodes of a fine grid edge.
976 The difference in levels is 1.
977
978 Let us denote by P the 1d fine grid projector (=1d equidistantGridProjector). The fine grid DoF
979 are computed according to:
980
981 u^{fine;j}_i = sum_{m} P^{j}_im u^{coarse}_m
982
983 Args:
984 xGPN:
985 Gauss-Legendre nodes (N nodes).
986 j:
987 Index of one the three subintervals: 0,1, or 2.
988 N:
989 Number of nodal basis functions (=order+1).
990 Returns:
991 equidistantGridProjector:
992 The corresponding degrees of freedom located at nodes of an equidistant grid over (0,1).
993 """
994 fineGridProjector1d = [[0 for _ in range(N)] for _ in range(N)]
995
996 for i in range(0, N): # Eq. basis
997 phi_i, _ = MathUtils.baseFunc1d((xGPN[i] + j) / 3.0, xGPN, N)
998 for m in range(0, N): # DG basis
999 fineGridProjector1d[m][i] = phi_i[m]
1000 return fineGridProjector1d
1001
1002 @staticmethod
1003 def LagrangBasisPoly(x, order, i, xi=None):
1004 """
1005 Returns the i-th Lagrange basis polynomial as symbolic expression.
1006 Algorithm was obtained from https://wanglongqi.github.io/python/2014/03/24/implement-of-lagrange-polynomial/.
1007
1008 Parameters
1009 ----------
1010 x: symbolic variable
1011 Symbolic variable.
1012 order : number
1013 Order of the Lagrange basis polynomial.
1014 xi : number
1015 The node the basis polynomial should pass through
1016 i : number
1017 The node we are interested in.
1018 Returns
1019 -------
1020 Li: symbolic expression
1021 The i-th Lagrange basis polynomial as symbolic expression.
1022 """
1023 if xi == None:
1024 print("Please specify some quadrature nodes")
1025 raise
1026 index = list(range(order + 1))
1027 index.pop(i)
1028 symbolic_function = sympy.prod([(x - xi[j]) / (xi[i] - xi[j]) for j in index])
1029 return symbolic_function
1030
1031 @staticmethod
1032 def assembleBasisFunction(quadNodes):
1033 order = len(quadNodes) - 1
1034 mp2 = mp.mp.clone()
1035 mp2.dps = 64
1036 x2 = quadNodes.copy()
1037
1038 for i, xi in enumerate(x2):
1039 x2[i] = mp2.mpf(xi)
1040
1041 res = ""
1042
1043 for m in range(0, order + 1):
1044 s = sympy.symbols("s")
1045 res += "\ndouble basisFunction_" + str(m) + "(const double& s) {\n"
1046 refphi = MathUtils.LagrangBasisPoly(s, order, m, x2)
1047
1048 ret = " return %s;" % sympy.simplify(refphi)
1049 ret = re.sub(r"s\*\*([0-9]+)", r"pow(s,\1)", ret)
1050 res += ret + "\n}\n"
1051
1052 res += "\ndouble (*basisFunction[" + str(order + 1) + "])(const double& s){\n"
1053 for m in range(0, order):
1054 res += " basisFunction_" + str(m) + ","
1055 res += " basisFunction_" + str(order) + "\n};\n"
1056
1057 return res
1058
1059 # ****************************************
1060 # ****************************************
1061 # *************** Limiter ****************
1062 # ****************************************
1063 # ****************************************
1064 @staticmethod
1065 def assembleQuadratureConversion(fromQ, toQ, N):
1066 """Return base conversion matrix"""
1067 conversionMat = [[0.0 for _ in range(N)] for _ in range(N)]
1068 for i in range(0, N):
1069 phi, _ = MathUtils.baseFunc1d(toQ[i], fromQ, N)
1070 for j in range(0, N):
1071 conversionMat[j][i] = phi[j] # check order
1072 return conversionMat
1073
1074 @staticmethod
1075 def assembleDGToFV(nodes, weights, N, Nlim):
1076 """Return conversion matrix from DG grid to FV grid"""
1077 dg2fv = [[0.0 for _ in range(Nlim)] for _ in range(N)]
1078 dxi = 1.0 / float(Nlim)
1079 xLeft = 0.0
1080 xi = 0.0
1081 for i in range(0, Nlim):
1082 xLeft = i * dxi
1083 for j in range(0, N):
1084 xi = xLeft + dxi * nodes[j]
1085 phi, _ = MathUtils.baseFunc1d(xi, nodes, N)
1086 for k in range(0, N):
1087 dg2fv[k][i] += weights[j] * phi[k]
1088 return dg2fv
1089
1090 @staticmethod
1091 def assembleFVToDG(dg2fv, weights, N, Nlim):
1092 """Return conversion matrix from FV grid to DG grid"""
1093 fv2dg = [[0.0 for _ in range(N)] for _ in range(Nlim)]
1094 lsqm = [[0.0 for _ in range(N + 1)] for _ in range(N + 1)]
1095 lsqrhs = [[0.0 for _ in range(Nlim)] for _ in range(N + 1)]
1096
1097 dxi = 1.0 / float(Nlim)
1098
1099 for i in range(0, N):
1100 for j in range(0, N):
1101 for k in range(0, Nlim):
1102 lsqm[j][i] += 2 * dg2fv[i][k] * dg2fv[j][k]
1103 lsqm[N][i] = weights[i]
1104 for i in range(0, N):
1105 lsqm[i][N] = -weights[i]
1106 lsqm[N][N] = 0.0
1107
1108 ilsqm = MathUtils.matrixInverse(lsqm)
1109
1110 for i in range(0, Nlim):
1111 for j in range(0, N):
1112 lsqrhs[j][i] = 2 * dg2fv[j][i]
1113 lsqrhs[N][i] = dxi
1114
1115 for i in range(0, Nlim):
1116 for j in range(0, N):
1117 for k in range(0, N + 1):
1118 fv2dg[i][j] += ilsqm[j][k] * lsqrhs[k][i]
1119
1120 return fv2dg
vectorPad(v, padSize)
zero-pad a vector
Definition MathUtils.py:80
matrixInverse_Pivot(M)
Compute a matrix inverse using a pivot algorithm.
Definition MathUtils.py:35
matrixTranspose(M)
Transpose a matrix M.
Definition MathUtils.py:17