1717from pySDC .Problem import ptype
1818from pySDC .datatype_classes .mesh import mesh , rhs_imex_mesh
1919
20- # Sharpclaw imports
21- from clawpack import pyclaw
22- from clawpack import riemann
23-
24- from getFDMatrix import getFDMatrix
20+ from buildWave1DMatrix import getWave1DMatrix , getWave1DAdvectionMatrix
2521
2622def u_initial (x ):
27- return np .sin (2.0 * np . pi * x )
23+ return np .sin (x )
2824# return np.exp(-0.5*(x-0.5)**2/0.1**2)
2925
3026class acoustic_1d_imex (ptype ):
@@ -60,29 +56,13 @@ def __init__(self, cparams, dtype_u, dtype_f):
6056 # invoke super init, passing number of dofs, dtype_u and dtype_f
6157 super (acoustic_1d_imex ,self ).__init__ (self .nvars ,dtype_u ,dtype_f )
6258
63- riemann_solver = riemann .advection_1D # NOTE: This uses the FORTRAN kernels of clawpack
64- self .solver = pyclaw .SharpClawSolver1D (riemann_solver )
65- self .solver .weno_order = 5
66- self .solver .time_integrator = 'Euler' # Remove later
67- self .solver .kernel_language = 'Fortran'
68- self .solver .bc_lower [0 ] = pyclaw .BC .periodic
69- self .solver .bc_upper [0 ] = pyclaw .BC .periodic
70- self .solver .cfl_max = 1.0
71- assert self .solver .is_valid ()
72-
73- x = pyclaw .Dimension (0.0 , 1.0 , self .nvars [1 ], name = 'x' )
74- self .domain = pyclaw .Domain (x )
75- self .state = pyclaw .State (self .domain , self .solver .num_eqn )
76- self .mesh = self .state .grid .x .centers
59+ self .mesh = np .linspace (0.0 , 1.0 , self .nvars [1 ], endpoint = False )
7760 self .dx = self .mesh [1 ] - self .mesh [0 ]
78- self .A = - self .cs * getFDMatrix (self .nvars [1 ], self .order_adv , self .dx )
79-
80- self .state .problem_data ['u' ] = self .cadv
8161
82- solution = pyclaw . Solution (self .state , self .domain )
83- self .solver . setup ( solution )
84-
85-
62+ self . Dx = - self . cadv * getWave1DAdvectionMatrix (self .nvars [ 1 ] , self .dx , self . order_adv )
63+ self .Id , A = getWave1DMatrix ( self . nvars [ 1 ], self . dx , [ 'periodic' , 'periodic' ], [ 'periodic' , 'periodic' ] )
64+ self . A = - self . cs * A
65+
8666 def solve_system (self ,rhs ,factor ,u0 ,t ):
8767 """
8868 Simple linear solver for (I-dtA)u = rhs
@@ -97,9 +77,7 @@ def solve_system(self,rhs,factor,u0,t):
9777 solution as mesh
9878 """
9979
100- M1 = sp .hstack ( (sp .eye (self .nvars [1 ]), - factor * self .A ) )
101- M2 = sp .hstack ( (- factor * self .A , sp .eye (self .nvars [1 ])) )
102- M = sp .vstack ( (M1 , M2 ) )
80+ M = self .Id - factor * self .A
10381
10482 b = np .concatenate ( (rhs .values [0 ,:], rhs .values [1 ,:]) )
10583
@@ -124,26 +102,12 @@ def __eval_fexpl(self,u,t):
124102 """
125103
126104
105+ b = np .concatenate ( (u .values [0 ,:], u .values [1 ,:]) )
106+ sol = self .Dx .dot (b )
107+
127108 fexpl = mesh (self .nvars )
109+ fexpl .values [0 ,:], fexpl .values [1 ,:] = np .split (sol , 2 )
128110
129- # Copy values of u into pyClaw state object
130- self .state .q [0 ,:] = u .values [0 ,:]
131-
132- # Evaluate right hand side
133- tmp = self .solver .dqdt (self .state )
134- fexpl .values [0 ,:] = tmp .reshape (self .nvars [1 :])
135-
136- # Copy values of u into pyClaw state object
137- self .state .q [0 ,:] = u .values [1 ,:]
138-
139- # Evaluate right hand side
140- tmp = self .solver .dqdt (self .state )
141- fexpl .values [1 ,:] = tmp .reshape (self .nvars [1 :])
142-
143-
144- # DEBUGGING
145- # fexpl.values[0,:] = 0.0*self.mesh
146- # fexpl.values[1,:] = 0.0*self.mesh
147111 return fexpl
148112
149113
@@ -159,9 +123,11 @@ def __eval_fimpl(self,u,t):
159123 implicit part of RHS
160124 """
161125
126+ b = np .concatenate ( (u .values [0 ,:], u .values [1 ,:]) )
127+ sol = self .A .dot (b )
128+
162129 fimpl = mesh (self .nvars ,val = 0 )
163- fimpl .values [0 ,:] = self .A .dot (u .values [1 ,:])
164- fimpl .values [1 ,:] = self .A .dot (u .values [0 ,:])
130+ fimpl .values [0 ,:], fimpl .values [1 ,:] = np .split (sol , 2 )
165131
166132 return fimpl
167133
@@ -194,9 +160,16 @@ def u_exact(self,t):
194160 exact solution
195161 """
196162
163+ sigma_0 = 0.1
164+ k = 7.2 * np .pi
165+ x_0 = 0.75
166+ x_1 = 0.25
167+
197168 me = mesh (self .nvars )
198- me .values [0 ,:] = 0.5 * u_initial (self .mesh - (self .cadv + self .cs )* t ) + 0.5 * u_initial (self .mesh - (self .cadv - self .cs )* t )
199- me .values [1 ,:] = 0.5 * u_initial (self .mesh - (self .cadv + self .cs )* t ) - 0.5 * u_initial (self .mesh - (self .cadv - self .cs )* t )
169+ #me.values[0,:] = 0.5*u_initial(self.mesh - (self.cadv + self.cs)*t) + 0.5*u_initial(self.mesh - (self.cadv - self.cs)*t)
170+ #me.values[1,:] = 0.5*u_initial(self.mesh - (self.cadv + self.cs)*t) - 0.5*u_initial(self.mesh - (self.cadv - self.cs)*t)
171+ me .values [0 ,:] = np .exp (- np .square (self .mesh - x_0 - self .cs * t )/ (sigma_0 * sigma_0 )) + np .exp (- np .square (self .mesh - x_1 - self .cs * t )/ (sigma_0 * sigma_0 ))* np .cos (k * (self .mesh - self .cs * t )/ sigma_0 )
172+ me .values [1 ,:] = me .values [0 ,:]
200173 return me
201174
202175
0 commit comments