diff --git a/bfps/tools.py b/bfps/tools.py index 81f500da051986e2da7b7c30948eeaa49fac868c..8c8a3c071b44df9c5628d97ecca156257face53c 100644 --- a/bfps/tools.py +++ b/bfps/tools.py @@ -69,4 +69,38 @@ def padd_with_zeros( b[n0-m0/2: , n1-m1/2: , :m2/2+1] = a[m0-m0/2: , m1-m1/2: , :m2/2+1] return b +try: + import sympy as sp + + def get_fornberg_coeffs( + x = None, + a = None): + N = len(a) - 1 + d = [] + for m in range(N+1): + d.append([]) + for n in range(N+1): + d[m].append([]) + for j in range(N+1): + d[m][n].append(sp.Rational(0)) + d[0][0][0] = sp.Rational(1) + c1 = sp.Rational(1) + for n in range(1, N+1): + c2 = sp.Rational(1) + for j in range(n): + c3 = a[n] - a[j] + c2 = c2*c3 + for m in range(n+1): + d[m][n][j] = ((a[n] - x)*d[m][n-1][j] - m*d[m-1][n-1][j]) / c3 + for m in range(n+1): + d[m][n][n] = (c1 / c2)*(m*d[m-1][n-1][n-1] - (a[n-1] - x)*d[m][n-1][n-1]) + c1 = c2 + coeffs = [] + for m in range(len(d)): + coeffs.append([]) + for j in range(len(d)): + coeffs[-1].append(d[m][N][j]) + return np.array(coeffs).astype(np.float) +except ImportError: + print('didn\'t find sympy.') diff --git a/tests/test_base.py b/tests/test_base.py index 23d1ebf18736a831b28e64cf3c9813c253ea60bd..0c747c346f15f1f027b7c075ba5ba1675c398de3 100755 --- a/tests/test_base.py +++ b/tests/test_base.py @@ -128,30 +128,32 @@ def launch( njobs = opt.njobs) return c -def acceleration_test(c): + +def acceleration_test(c, n = 3): import numpy as np import matplotlib.pyplot as plt + from bfps.tools import get_fornberg_coeffs d = c.get_data_file() pos = d['particles/tracers4/state'].value vel = d['particles/tracers4/velocity'].value acc = d['particles/tracers4/acceleration'].value - num_acc1 = (- vel[ :-2] + vel[2:])/(2*d['parameters/dt'].value*d['parameters/niter_part'].value) - num_acc2 = (pos[ :-2] - 2*pos[1:-1] + pos[2:])/((d['parameters/dt'].value*d['parameters/niter_part'].value)**2) - num_acc3 = (-vel[4:] + 8*vel[3:-1] - 8*vel[1:-3] + vel[:-4])/(12*d['parameters/dt'].value*d['parameters/niter_part'].value) - num_acc4 = (-pos[4:] + 16*pos[3:-1] - 30*pos[2:-2] + 16*pos[1:-3] - pos[:-4])/(12*(d['parameters/dt'].value*d['parameters/niter_part'].value)**2) - num_vel = (- pos[ :-2] + pos[2:])/(2*d['parameters/dt'].value*d['parameters/niter_part'].value) + fc = get_fornberg_coeffs(0, range(-n, n+1)) + dt = d['parameters/dt'].value*d['parameters/niter_part'].value + + print [len(range(n-i, vel.shape[0]-i-n)) for i in range(-n, n+1)] + num_acc1 = sum(fc[1, n-i]*vel[n-i:vel.shape[0]-i-n] for i in range(-n, n+1)) / dt + num_acc2 = sum(fc[2, n-i]*pos[n-i:pos.shape[0]-i-n] for i in range(-n, n+1)) / dt**2 - pid = np.unravel_index(np.argmax(np.abs(num_acc3 - acc[2:-2])), dims = num_acc3.shape)[1] + pid = np.unravel_index(np.argmax(np.abs(num_acc1 - acc[n:-n])), dims = num_acc1.shape)[1] fig = plt.figure() a = fig.add_subplot(111) col = ['red', 'green', 'blue'] for cc in range(3): - a.plot(num_acc1[2:, pid, cc], color = col[cc], dashes = (3, 4)) - a.plot(num_acc2[2:, pid, cc], color = col[cc], dashes = (2, 2)) - a.plot(num_acc3[1:, pid, cc], color = col[cc]) - a.plot(num_acc4[1:, pid, cc], color = col[cc], dashes = (3, 5)) - a.plot(acc[3:, pid, cc], color = col[cc], dashes = (1, 1)) + a.plot(num_acc1[1:, pid, cc], color = col[cc]) + a.plot(num_acc2[1:, pid, cc], color = col[cc], dashes = (2, 2)) + a.plot(acc[n+1:, pid, cc], color = col[cc], dashes = (1, 1)) + fig.tight_layout() fig.savefig(os.path.join(c.work_dir, 'acc_test_{0}.pdf'.format(c.simname))) return None