This repository has been archived by the owner on Feb 20, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 26
/
Copy pathoned_nonlinear.py
114 lines (89 loc) · 2.91 KB
/
oned_nonlinear.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
##1D linear convection
import matplotlib.pyplot as plt
import numpy
import time
import pickle
from numbapro import autojit, cuda, jit, float32
###1-D Nonlinear convection implemented using Numpy
def NonLinNumpy(u, un, nx, nt, dx, dt):
###Run through nt timesteps and plot/animate each step
for n in range(nt): ##loop across number of time steps
un[:] = u[:]
u[1:] = -un[1:]*dt/dx*(un[1:]-un[:-1])+un[1:]
return u
###1-D Nonlinear convection implemented using 'vanilla' Python
def NonLinVanilla(u, nx, nt, dx, dt):
for n in range(nt):
for i in range(1,nx-1):
u[i+1] = -u[i]*dt/dx*(u[i]-u[i-1])+u[i]
return u
###1-D Nonlinear convection implemented using Numba JIT compiler (similar to LLVM)
@autojit
def NonLinNumba(u,un, nx, nt, dx, dt):
for n in range(nt):
for i in range(1,nx):
un[i] = -u[i]*dt/dx*(u[i]-u[i-1])+u[i]
return un
###1-D Nonlinear convection implemented using NumbaPro CUDA-JIT
@jit(argtypes=[float32[:], float32, float32, float32[:]], target='gpu')
def NonLinCudaJit(u, dx, dt, un):
tid = cuda.threadIdx.x
blkid = cuda.blockIdx.x
blkdim = cuda.blockDim.x
i = tid + blkid * blkdim
if i >= u.shape[0]:
return
un[i] = -u[i]*dt/dx*(u[i]-u[i-1])+u[i]
def main():
##System Conditions
nx = 8192
nt = 300
c = 1
xmax = 15.0
dx = xmax/(nx-1)
sigma = 0.25
dt = sigma*dx
##Initial Conditions for wave
ui = numpy.ones(nx) ##create a 1xn vector of 1's
ui[.5/dx:1/dx+1]=2 ##set hat function I.C. : .5<=x<=1 is 2
un = numpy.ones(nx)
t1 = time.time()
u = NonLinNumpy(ui, un, nx, nt, dx, dt)
t2 = time.time()
print "Numpy version took: %.6f seconds" % (t2-t1)
numpytime = t2-t1
#plt.plot(numpy.linspace(0,xmax,nx),u[:],marker='o',lw=2)
t1 = time.time()
u = NonLinNumba(ui, un, nx, nt, dx, dt)
t2 = time.time()
print "Numbapro Vectorize version took: %.6f seconds" % (t2-t1)
vectime = t2-t1
#plt.plot(numpy.linspace(0,xmax,nx),u[:],marker='o',lw=2)
u = numpy.ones(nx)
u[:] = ui[:]
griddim = 320, 1
blockdim = 768, 1, 1
NonLinCudaJit_conf = NonLinCudaJit[griddim, blockdim]
t1 = time.time()
for t in range(nt):
NonLinCudaJit(u, dx, dt, un)
t2 = time.time()
print "Numbapro Cuda version took: %.6f seconds" % (t2-t1)
cudatime = t2-t1
#plt.plot(numpy.linspace(0,xmax,nx),u[:],marker='o',lw=2)
#f = open('times', 'a')
#f.write(str(nx) + '\n')
# f.write(str(numpytime) + '\n')
# f.write(str(vectime) + '\n')
#f.write(str(cudatime) + '\n')
#f.close()
###Don't uncomment this unless nx < 500
# t1 = time.time()
# u = NonLinVanilla(ui, nx, nt, dx, dt)
# t2 = time.time()
# print "Vanilla version took: %.6f seconds" % (t2-t1)
#
# plt.plot(numpy.linspace(0,xmax,nx),u[:],marker='o',lw=2)
#plt.show()
if __name__ == "__main__":
main()