Now integrate() can return the full trajectory and plotted in the Python; improved readablity

This commit is contained in:
Yohai Meiron 2020-04-12 21:37:03 -04:00
parent a2219af116
commit a624814a0c
5 changed files with 144 additions and 106 deletions

30
plot.py
View file

@ -4,21 +4,33 @@ import ctypes, subprocess
recompile = True
if recompile:
p = subprocess.Popen('g++ -shared -o libmain.so -fPIC main.cpp -lgsl'.split())
p = subprocess.Popen('g++ -shared -o libmain.so -fPIC loadtxt.cpp main.cpp -lgsl'.split())
p.wait()
if p.returncode != 0: raise RuntimeError(p.returncode)
libmain = ctypes.CDLL('./libmain.so')
def integrate(y0, t_max):
y0 = (ctypes.c_double*6)(*y0)
y = (ctypes.c_double*6)()
status = libmain.integrate(y0, ctypes.c_double(t_max), y)
def integrate(y0, t_max, step_size=None):
y0 = (ctypes.c_double*6)(*y0)
if step_size is None: step_size = t_max
size = int(t_max // step_size) + 1
y = (ctypes.c_double*size*6)()
status = libmain.integrate(y0, ctypes.c_double(t_max), ctypes.c_double(step_size), y)
y = np.array(y).reshape(size,6)
return np.array(y), status
gsl_success = libmain.gsl_success()
#t_array = linspace(plot_tmin, plot_tmax, plot_points)
#r_array = empty_like(t_array)
from pylab import *
t_max = 10
ic = [80,0,0,0,80,0]
res = integrate(ic, t_max, step_size=1/4096)
x, y, z, vx, vy, vz = res[0].T
zzz = x[-1]
plot(x,y)
res = integrate([10,0,0,0,200,0], 2.245)
print(res, gsl_success)
res = integrate(ic, t_max)
x, y, z, vx, vy, vz = res[0].T
plot(x,y,'o')
print(zzz - x[-1])
# gca().set_aspect('equal')
show()