def __hyperplane_eval_iso_2p5D(I, x, r, k0, k1, w0, arr): ''' k[i0,i1,i2] = k0[i1]*w0[i0] + k1[i2]*w1[i0] ''' i0, i1, i2 = cuda.grid(3) tmp = 0 K0 = k0[i1] * w0[i0, 0] K1 = k0[i1] * w0[i0, 1] K2 = k1[i2] for ii in range(x.shape[0]): norm = (K0 * K0 + K1 * K1 + K2 * K2) / (r[ii, 0] * r[ii, 0]) if norm < 30: IP = x[ii, 0] * K0 + x[ii, 1] * K1 + x[ii, 2] * K2 tmp += I[ii] * c_exp(-.5 * norm) * c_exp(complex(0, -IP)) arr[i0, i1, i2] = tmp
def __grid_eval_iso(I, x, r, k0, k1, k2, arr): ''' I*exp(-|rk|^2/2)*exp(-(x\cdot k)i) ''' i0, i1, i2 = cuda.grid(3) tmp = 0 for ii in range(x.shape[0]): norm = (k0[i0] * k0[i0] + k1[i1] * k1[i1] + k2[i2] * k2[i2]) / (r[ii, 0] * r[ii, 0]) if norm < 30: IP = x[ii, 0] * k0[i0] + x[ii, 1] * k1[i1] + x[ii, 2] * k2[i2] tmp += I[ii] * c_exp(-.5 * norm) * c_exp(complex(0, -IP)) arr[i0, i1, i2] = tmp
def __grid_eval_aniso(I, x, r, k0, k1, k2, arr): ''' I*exp(-|rk|^2/2)*exp(-(x\cdot k)i) ''' i0, i1, i2 = cuda.grid(3) tmp = 0 for ii in range(x.shape[0]): rk0 = r[ii, 0] * k0[i0] rk1 = r[ii, 3] * k0[i0] + r[ii, 1] * k1[i1] rk2 = r[ii, 5] * k0[i0] + r[ii, 4] * k1[i1] + r[ii, 2] * k2[i2] norm = rk0 * rk0 + rk1 * rk1 + rk2 * rk2 if norm < 30: IP = x[ii, 0] * k0[i0] + x[ii, 1] * k1[i1] + x[ii, 2] * k2[i2] tmp += I[ii] * c_exp(-.5 * norm) * c_exp(complex(0, -IP)) arr[i0, i1, i2] = tmp
def __hyperplane_eval_aniso_2p5D(I, x, r, k0, k1, w0, arr): ''' k[i0,i1,i2] = k0[i1]*w0[i0] + k1[i2]*w1[i0] ''' i0, i1, i2 = cuda.grid(3) tmp = 0 K0 = k0[i1] * w0[i0, 0] K1 = k0[i1] * w0[i0, 1] K2 = k1[i2] for ii in range(x.shape[0]): rk0 = r[ii, 0] * K0 rk1 = r[ii, 3] * K0 + r[ii, 1] * K1 rk2 = r[ii, 5] * K0 + r[ii, 4] * K1 + r[ii, 2] * K2 norm = rk0 * rk0 + rk1 * rk1 + rk2 * rk2 if norm < 30: IP = x[ii, 0] * K0 + x[ii, 1] * K1 + x[ii, 2] * K2 tmp += I[ii] * c_exp(-.5 * norm) * c_exp(complex(0, -IP)) arr[i0, i1, i2] = tmp
def q4(): "For question 4 of the assignment." domain = np.linspace(-.5, .5, 128) f1 = lambda x: (1-0.9*c_exp(-24j*pi*x)-0.5*c_exp(-2j*pi*x)+\ 0.045*c_exp(-26j*pi*x)) f2 = lambda x: (1 - 0.5 * c_exp(-2j * pi * x)) f3 = lambda x: (1 - 0.9 * c_exp(-4j * pi * x)) g1 = lambda y: 1 / (np.absolute(f1(y))**2) g2 = lambda y: 1 / (np.absolute(f2(y))**2) g3 = lambda y: 1 / (np.absolute(f3(y))**2) pts1 = [g1(i) for i in domain] pts2 = [g2(i) for i in domain] pts3 = [g3(i) for i in domain] plt.plot(domain, pts1) plt.title("Spectral Density Q4PB") plt.show() plt.plot(domain, pts2) plt.title("Spectral Density Q4PC, Part 1") plt.show() plt.plot(domain, pts3) plt.title("Spectral Density Q4PC, Part 2") plt.show()
def q6(): "For question 6 of the assignment." domain = np.linspace(-.5, .5, 128) f1 = lambda x: (1 - 0.99 * c_exp(-6j * pi * x)) g1 = lambda y: 1 / (np.absolute(f1(y))**2) pts1 = [g1(i) for i in domain] plt.plot(domain, pts1) plt.title("Spectral Density Q6PA") plt.show() helper_func = lambda x: (2 * (sin(2 * pi * x) * (1 / tan(pi * x))) - 1) / 3 trans_func = lambda y: helper_func(y)**2 f2 = lambda x: g1(x) * trans_func(x) pts2 = [f2(i) for i in domain] plt.plot(domain, pts2) plt.title("Spectral Density Q6PD") plt.show() df = pd.DataFrame(pts1) new_data = pd.rolling_mean(df, window=3) plt.plot(domain, new_data) plt.show()
def __derivs_iso_aux(I, x, r, K, g, dg, ddg): ''' No mixed terms so we have: g = I*exp(-|k/r|^2/2)*exp(-(x\cdot k)i) = I*G dg/dI = G dg/dx_j = -ik_jg dg/dr = +(k/r^2)(k/r)g = |k/r|^2g/r ddg/dII = 0 ddg/dxx = -kk g ddg/drr = |k|^2g(|k|^2/r^6 - 3/r^4) = (|k/r|^2-3)|k/r|^2g/r^2 ddg/dIx_j = -ik_jG ddg/dIr = |k/r|^2G/r ddg/dxr = -ik (dg/dr) ''' rk = cuda.local.array((3, ), f4) rk[0] = K[0] / r rk[1] = K[1] / r rk[2] = K[2] / r N = rk[0] * rk[0] + rk[1] * rk[1] + rk[2] * rk[2] if N > 60: g[0] = 0 for i in range(10): dg[i] = 0 for j in range(10): ddg[i, j] = 0 return G = c_exp(complex(-.5 * N, -(x[0] * K[0] + x[1] * K[1] + x[2] * K[2]))) g[0] = I * G # d/dI dg[0] = G # d^2/dI^2 ddg[0, 0] = 0 # d^2/dx^2 for i in range(3): for j in range(i, 3): ddg[1 + i, 1 + j] = -K[i] * K[j] * g[0] # d^2/dr^2 ddg[4, 4] = (N - 3) * N * g[0] / (r * r) # d^2/dIdx for i in range(3): ddg[0, 1 + i] = complex(0, -K[i]) * G # d/dx for i in range(3): dg[1 + i] = I * ddg[0, 1 + i] # d^2/dIdr ddg[0, 4] = N * G / r # d/dr dg[4] = ddg[0, 4] * I # d^2/dxdr for i in range(3): ddg[1 + i, 4] = complex(0, -K[i]) * dg[4] # Symetrise for i in range(5): for j in range(i): ddg[i, j] = ddg[j, i]
def __derivs_aniso_aux(I, x, r, K, g, dg, ddg): ''' No mixed terms so we have: g = I*exp(-|rk|^2/2)*exp(-(x\cdot k)i) = I*G dg/dI = G dg/dx_j = -ik_jg dg/dr_{j0,j1} = -rkg (drk/dr_{j0,j1}) = -(rk)_{j0}k_{j1}g ddg/dII = 0 ddg/dxx = -kk g ddg/dr_{j0,j1}r_{j2,j3} = (rk)_{j0}(rk)_{j2}k_{j1}k_{j3} g - k_{j1}k_{j3}g \delta_{j0==j2} ddg/dIx_j = -ik_jG ddg/dIr_j = -(rk)_{j0}k_{j1}G ddg/dxr = -ik (dg/dr) ''' rk = cuda.local.array((3, ), f4) ind0 = cuda.local.array((6, ), i4) ind1 = cuda.local.array((6, ), i4) ind0[0], ind0[1], ind0[2] = 0, 1, 2 ind0[3], ind0[4], ind0[5] = 1, 2, 2 ind1[0], ind1[1], ind1[2] = 0, 1, 2 ind1[3], ind1[4], ind1[5] = 0, 1, 0 rk[0] = r[0] * K[0] rk[1] = r[3] * K[0] + r[1] * K[1] rk[2] = r[5] * K[0] + r[4] * K[1] + r[2] * K[2] N = -.5 * (rk[0] * rk[0] + rk[1] * rk[1] + rk[2] * rk[2]) if N < -30: g[0] = 0 for i in range(10): dg[i] = 0 for j in range(10): ddg[i, j] = 0 return G = c_exp(complex(N, -(x[0] * K[0] + x[1] * K[1] + x[2] * K[2]))) g[0] = I * G # d/dI dg[0] = G # d^2/dI^2 ddg[0, 0] = 0 # d^2/dx^2 for i in range(3): for j in range(i, 3): ddg[1 + i, 1 + j] = -K[i] * K[j] * g[0] # d^2/dr^2 for i in range(6): i0, i1 = ind0[i], ind1[i] ddg[4 + i, 4 + i] = g[0] * (rk[i0] * K[i1] * rk[i0] * K[i1] - K[i1] * K[i1]) for j in range(i + 1, 6): j0, j1 = ind0[j], ind1[j] if i0 == j0: ddg[4 + i, 4 + j] = g[0] * (rk[i0] * K[i1] * rk[j0] * K[j1] - K[i1] * K[j1]) else: ddg[4 + i, 4 + j] = g[0] * rk[i0] * K[i1] * rk[j0] * K[j1] # d^2/dIdx for i in range(3): ddg[0, 1 + i] = complex(0, -K[i]) * G # d/dx for i in range(3): dg[1 + i] = I * ddg[0, 1 + i] # d^2/dIdr for i in range(6): i0, i1 = ind0[i], ind1[i] ddg[0, 4 + i] = -rk[i0] * K[i1] * G # d/dr for i in range(6): dg[4 + i] = ddg[0, 4 + i] * I # d^2/dxdr for i in range(3): for j in range(6): ddg[1 + i, 4 + j] = complex(0, -K[i]) * dg[4 + j] # Symetrise for i in range(10): for j in range(i): ddg[i, j] = ddg[j, i]