Skip to content

Commit b6fb548

Browse files
author
Daniel Ruprecht
committed
1d acoustic now running correctly and showing expected convergence
1 parent 07ad3ef commit b6fb548

File tree

4 files changed

+38
-67
lines changed

4 files changed

+38
-67
lines changed

examples/acoustic_1d_imex/ProblemClass.py

Lines changed: 15 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,7 @@
1717
from pySDC.Problem import ptype
1818
from 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

2622
def u_initial(x):
2723
return np.sin(x)
@@ -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, 2*np.pi, 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, 2.0*np.pi, 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

examples/acoustic_1d_imex/buildFDMatrix.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def getHorizontalDx(N, dx, order):
3030
coeff = 1.0/60.0
3131
zero_pos = 5
3232
else:
33-
print "Order "+order+" not implemented."
33+
print "Order "+str(order)+" not implemented."
3434

3535
first_col = np.zeros(N)
3636

examples/acoustic_1d_imex/plotconvdata.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,6 @@
1515
nsteps = np.append(nsteps, int(items[1]))
1616
error = np.append(error, float(items[2]))
1717

18-
print order
19-
print nsteps
20-
print error
21-
2218
assert np.size(order)==np.size(nsteps), 'Found different number of entries in order and nsteps'
2319
assert np.size(nsteps)==np.size(error), 'Found different number of entries in nsteps and error'
2420

@@ -31,11 +27,11 @@
3127
order_plot = np.zeros(3)
3228

3329
for ii in range(0,3):
34-
order_plot[ii] = order[3*ii]
30+
order_plot[ii] = order[N*ii]
3531
for jj in range(0,N):
36-
error_plot[ii,jj] = error[3*ii+jj]
37-
nsteps_plot[ii,jj] = nsteps[3*ii+jj]
38-
convline[ii,jj] = error_plot[ii,0]*(float(nsteps_plot[ii,0])/float(nsteps_plot[ii,jj]))**order[3*ii+jj]
32+
error_plot[ii,jj] = error[N*ii+jj]
33+
nsteps_plot[ii,jj] = nsteps[N*ii+jj]
34+
convline[ii,jj] = error_plot[ii,0]*(float(nsteps_plot[ii,0])/float(nsteps_plot[ii,jj]))**order_plot[ii]
3935

4036
color = [ 'r', 'b', 'g' ]
4137
fig = plt.figure(figsize=(8,8))
@@ -44,6 +40,9 @@
4440
plt.loglog(nsteps_plot[ii,:], convline[ii,:], '-', color=color[ii])
4541

4642
plt.legend()
47-
plt.xlabel(r'$N_t$')
43+
plt.xlabel(r'Number of time step $N_t$')
4844
plt.ylabel('Relative error')
45+
plt.xlim([0.9*np.min(nsteps_plot), 1.1*np.max(nsteps_plot)])
4946
plt.show()
47+
fig.savefig('sdc_fwsw_convergence.pdf',bbox_inches='tight')
48+

examples/acoustic_1d_imex/runconvergence.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@
3434

3535
# This comes as read-in for the problem class
3636
pparams = {}
37-
pparams['nvars'] = [(2,500)]
38-
pparams['cadv'] = 0.1
37+
pparams['nvars'] = [(2,250)]
38+
pparams['cadv'] = 0.05
3939
pparams['cs'] = 1.0
40-
pparams['order_adv'] = 4
41-
40+
pparams['order_adv'] = 5
41+
4242
# This comes as read-in for the transfer operations
4343
tparams = {}
4444
tparams['finter'] = True
@@ -56,20 +56,26 @@
5656
#description['transfer_class'] = mesh_to_mesh_1d
5757
#description['transfer_params'] = tparams
5858

59-
Nsteps = [20, 40, 50, 80]
60-
order = 2
59+
Nsteps = [3, 4, 6, 8, 10, 12, 15, 18, 20]
60+
order = 4
6161
error = np.zeros(np.size(Nsteps))
6262

6363
# setup parameters "in time"
6464
t0 = 0
65-
Tend = 5.5
65+
Tend = 1.0
6666

6767
if order==2:
6868
file = open('conv-data.txt', 'w')
6969
else:
7070
file = open('conv-data.txt', 'a')
7171

72-
description['num_nodes'] = (order+2)/2
72+
if order==2:
73+
description['num_nodes'] = 2
74+
elif order==3:
75+
description['num_nodes'] = 3
76+
elif order==4:
77+
description['num_nodes'] = 3
78+
7379
sparams['maxiter'] = order
7480

7581
# quickly generate block of steps

0 commit comments

Comments
 (0)