1
1
import sympy as sy
2
2
import numpy as np
3
3
import copy
4
- import sys
5
4
import re
6
5
7
6
8
- SIMPLE_FORM = True
7
+ SIMPLE_FORM = False
9
8
10
9
class BlockIterationGenerator ():
11
10
@@ -56,10 +55,10 @@ def checkResults(self, u):
56
55
for i in range (len (u )):
57
56
if gen .mode == 1 :
58
57
print ('Found rule: \n ' )
59
- print ('u_n+1^ k+1=' )
58
+ print ('u_{n+1}^{ k+1} =' )
60
59
tmp = gen .generateBlockRule ()
61
-
62
- if SIMPLE_FORM :
60
+
61
+ if SIMPLE_FORM :
63
62
dico = self .generateData (6 , 4 )
64
63
subDico = {}
65
64
prol = 1
@@ -73,7 +72,7 @@ def checkResults(self, u):
73
72
prol = prol * TCtoF
74
73
rest = TFtoC * rest
75
74
tmp = tmp .subs (subDico )
76
-
75
+
77
76
tmp = tmp .args
78
77
for i in range (len (tmp )):
79
78
print (' ' , str (tmp [i ]) if str (tmp [i ]).startswith ('-' ) or i == 0 else '+' + str (tmp [i ]))
@@ -85,8 +84,8 @@ def checkResults(self, u):
85
84
def generateData (self , n , L , pre_s = 1 , post_s = 0 ):
86
85
save_symbols = {}
87
86
u_0 = sy .Symbol (r'u_0' , commutative = False )
88
- phi = [sy .Symbol (f'\phi^ { i } ' , commutative = False ) for i in range (L )]
89
- chi = [sy .Symbol (f'\chi^ { i } ' , commutative = False ) for i in range (L )]
87
+ phi = [sy .Symbol (f'\phi_ { i } ' , commutative = False ) for i in range (L )]
88
+ chi = [sy .Symbol (f'\chi_ { i } ' , commutative = False ) for i in range (L )]
90
89
T_c_to_f = [sy .Symbol (f'T_{ i + 1 } ^{ i } ' , commutative = False ) for i in range (L )]
91
90
T_f_to_c = [sy .Symbol (f'T_{ i } ^{ i + 1 } ' , commutative = False ) for i in range (L )]
92
91
A = [sy .Matrix (np .eye (n , dtype = int ) * phi [i ]) + sy .Matrix (np .eye (n , k = - 1 , dtype = int ) * - chi [i ]) for i in
@@ -240,7 +239,7 @@ def check(self, expr: sy.Expr, n: int):
240
239
tmp_split = re .split ('_|\^' , unknowns [i ])
241
240
iteration = int (tmp_split [1 ])
242
241
block = int (tmp_split [2 ])
243
- tmp_block = f 'n' if n - int (block ) == 0 else f'n-{ n - int (block )} '
242
+ tmp_block = 'n' if n - int (block ) == 0 else f'n-{ n - int (block )} '
244
243
tmp_iter = f'k-{ self .k - iteration } ' if self .k - iteration != 0 else 'k'
245
244
tmp_str = f'u_{ tmp_block } ^{ tmp_iter } '
246
245
expr_str = expr_str .replace (unknowns [i ], tmp_str )
@@ -273,36 +272,18 @@ def generatingExpr(self, n: int):
273
272
274
273
def generateBlockRule (self ):
275
274
tmp = self .generater
276
- for key , val in self .translate .items ():
277
- if val [0 ] == 1 :
278
- if val [1 ] == 1 :
279
- st = f'u_n^k'
280
- elif val [1 ] > 1 :
281
- st = 'todo'
282
- elif val [1 ] == 0 :
283
- st = f'u_n^k+1'
284
- else :
285
- st = f'u_n^k'
286
- elif val [0 ] > 1 :
287
- if val [1 ] == 1 :
288
- st = f'u_n-{ val [0 ] - 1 } ^k'
289
- elif val [1 ] > 1 :
290
- st = 'todo'
291
- elif val [1 ] == 0 :
292
- st = f'u_n-{ val [0 ] - 1 } ^k+1'
293
- else :
294
- st = f'u_n-{ val [0 ] - 1 } ^k'
295
- else :
296
- st = f'u_n-{ val [0 ]} ^k-{ val [1 ]} '
297
275
276
+ def u (n , k ):
277
+ n = "" if n == 0 else f"+{ n } " if n > 0 else f"{ n } "
278
+ k = "" if k == 0 else f"+{ k } " if k > 0 else f"{ k } "
279
+ return "u_{n" + n + "}^{k" + k + "}"
280
+
281
+ for key , val in self .translate .items ():
282
+ st = u (1 - val [0 ], 1 - val [1 ])
298
283
tmp = tmp .replace (lambda expr : re .match (key , str (expr )),
299
284
lambda expr : sy .symbols (st , commutative = False ))
300
285
return tmp
301
286
302
287
303
288
# PararealGenerator(n=6)
304
- MultilevelGenerator (n = 20 , L = 2 , pre_smoothing = 10 , post_smoothing = 0 )
305
- # MultilevelGenerator(n=6, L=3, pre_smoothing=1, post_smoothing=0)
306
- # MultilevelGenerator(n=6, L=4, pre_smoothing=1, post_smoothing=0)
307
- # MultilevelGenerator(n=6, L=2, pre_smoothing=2, post_smoothing=0)
308
- # MultilevelGenerator(n=6, L=2, pre_smoothing=1, post_smoothing=1)
289
+ MultilevelGenerator (n = 6 , L = 3 , pre_smoothing = 1 , post_smoothing = 0 )
0 commit comments