1
+ import numpy as np
2
+ import matplotlib .pyplot as plt
3
+ from numba import jit
1
4
2
- class FSM ():
3
-
4
- def __init__ (self ):
5
-
6
-
5
+ @jit (nopython = True )
6
+ def gsi (isweepStart , isweepEnd , istep , jsweepStart , jsweepEnd , jstep , u ):
7
+ bx = len (u )- 1
8
+ by = len (u [0 ])- 1
9
+ for i in range (isweepStart , isweepEnd , istep ):
10
+ for j in range (jsweepStart , jsweepEnd , jstep ):
11
+ # Local Solver
12
+ if not ((i == 0 ) or (i == bx )):
13
+ a = min (u [i - 1 ][j ], u [i + 1 ][j ])
14
+ else :
15
+ if ((i == 0 )):
16
+ a = min (u [i ][j ], u [i + 1 ][j ])
17
+ else :
18
+ a = min (u [i ][j ], u [i - 1 ][j ])
19
+ if not ((j == 0 ) or (j == by )):
20
+ b = min (u [i ][j - 1 ], u [i ][j + 1 ])
21
+ else :
22
+ if ((j == 0 )):
23
+ b = min (u [i ][j ], u [i ][j + 1 ])
24
+ else :
25
+ b = min (u [i ][j ], u [i ][j - 1 ])
26
+ ubar = inf
27
+ if (abs (a - b ) >= f [i ][j ]* h ):
28
+ ubar = min (a ,b ) + f [i ][j ]* h
29
+ else :
30
+ ubar = (a + b + np .sqrt (2 * (f [i ][j ]* h )** 2 - (a - b )** 2 ))/ 2
31
+ u [i ][j ] = min (ubar , u [i ][j ])
32
+ return u
33
+ def norm_2 (mat1 , mat2 , h ):
34
+ return np .sqrt (sum (sum (abs (mat1 - mat2 ) ** 2 ))* h ** 2 )
7
35
36
+
8
37
if __name__ == "__main__" :
9
- print ("-" )
38
+ gridNum = 500
39
+ center = round ((gridNum )/ 2.0 )
40
+ inf = 10 ** 6 # Assign Large positive value as Sup-Viscosity Solution
41
+ h = 0.02 #
42
+ u = np .zeros ((gridNum + 1 , gridNum + 1 ))
43
+ f = np .zeros ((gridNum + 1 , gridNum + 1 ))
44
+ for i in range (0 , gridNum + 1 , 1 ):
45
+ for j in range (0 , gridNum + 1 , 1 ):
46
+ u [i ][j ] = inf
47
+ # ------ A Layer Model ----------------------
48
+ for i in range (0 , gridNum + 1 , 1 ):
49
+ for j in range (0 , gridNum + 1 , 1 ):
50
+ if i < center :
51
+ f [i ][j ] = 1 / 1
52
+ else :
53
+ f [i ][j ] = 1 / 2
54
+ #---------------------------------------------
55
+ src_x = 0
56
+ src_y = 0
57
+ u [src_x ][src_y ] = 0
58
+ # --------------------------------------------
59
+ dict1 = {
60
+ "1" : [gridNum ,- 1 ,0 , gridNum ,- 1 ,0 ],
61
+ "2" : [gridNum ,- 1 ,0 , 0 ,1 ,gridNum + 1 ],
62
+ "3" : [0 , 1 ,gridNum + 1 , gridNum ,- 1 ,0 ],
63
+ "4" : [0 , 1 ,gridNum + 1 , 0 ,1 ,gridNum + 1 ]
64
+ }
65
+ MaxIteration = 3 # In simple model error less than tolerance after 1-2 Iteration
66
+ last_u = u .copy ()
67
+ # While(error<tolerance)
68
+ for i in range (MaxIteration ):
69
+ [isweepStart ,istep ,isweepEnd ,jsweepStart ,jstep , jsweepEnd ] = dict1 ["1" ]
70
+ u = gsi (isweepStart , isweepEnd , istep , jsweepStart , jsweepEnd , jstep , u )
71
+ [isweepStart ,istep ,isweepEnd ,jsweepStart ,jstep , jsweepEnd ] = dict1 ["2" ]
72
+ u = gsi (isweepStart , isweepEnd , istep , jsweepStart , jsweepEnd , jstep , u )
73
+ [isweepStart ,istep ,isweepEnd ,jsweepStart ,jstep , jsweepEnd ] = dict1 ["3" ]
74
+ u = gsi (isweepStart , isweepEnd , istep , jsweepStart , jsweepEnd , jstep , u )
75
+ [isweepStart ,istep ,isweepEnd ,jsweepStart ,jstep , jsweepEnd ] = dict1 ["4" ]
76
+ u = gsi (isweepStart , isweepEnd , istep , jsweepStart , jsweepEnd , jstep , u )
77
+ print (norm_2 (u , last_u ,h ))
78
+ last_u = u .copy ()
79
+ print ('---------------' )
80
+
81
+ # ------ Show some figure ----------------------
82
+ fig = plt .figure (figsize = (5 , 5 ), dpi = 300 )
83
+ ax = plt .gca ()
84
+ plt .imshow (u )
85
+ ax .invert_yaxis ()
86
+ plt .title ("FSM" )
87
+ cbar = plt .colorbar (fraction = 0.05 , pad = 0.05 )
88
+ plt .show ()
89
+
90
+ fig = plt .figure (figsize = (5 , 5 ), dpi = 300 )
91
+ ax = plt .gca ()
92
+ print (len (u ))
93
+ wait_item = abs (u )
94
+ ctr = plt .contour (wait_item , levels = 14 ,rightside_up = True )
95
+ plt .clabel (ctr ,fontsize = 6 ,colors = ('r' ))
96
+ k = plt .imshow (1 / f )
97
+ plt .show ()
98
+
0 commit comments