def jump_index(V_ang, x, y, z, num, nr, rofi): my_inter_func = RegularGridInterpolator((x, y, z), V_ang) lebn = lebedev_num_list[num] lebx = np.zeros(lebn) leby = np.zeros(lebn) lebz = np.zeros(lebn) lebw = np.zeros(lebn) call_lebedev.lebedev(lebn, lebx, leby, lebz, lebw) Vr_omega = np.zeros((nr, lebn)) Vomega_r_dr = np.zeros((lebn, nr)) Vomega_r_dr2 = np.zeros((lebn, nr)) for r in range(nr): Vr_omega[r] = my_inter_func(np.array([lebx, leby, lebz]).T * rofi[r]) Vomega_r = Vr_omega.T for omega in range(lebn): Vomega_r_dr[omega] = np.gradient(Vomega_r[omega], rofi) Vomega_r_dr2[omega] = np.gradient(Vomega_r_dr[omega], rofi) for r in range(nr): print(Vomega_r[1730][r]) print("dr") for r in range(nr): print(Vomega_r_dr[1730][r]) for r in range(nr): print(Vomega_r_dr2[1730][r]) plt.plot(rofi, Vomega_r[1730], marker=".") plt.plot(rofi, Vomega_r_dr[1730] / 20, marker=".") plt.plot(rofi, Vomega_r_dr2[1730] / 500, marker=".") plt.show()
def __init__(self,num): self.lebedev_num = lebedev_num_list[num] self.lebedev_x = np.zeros(self.lebedev_num) self.lebedev_y = np.zeros(self.lebedev_num) self.lebedev_z = np.zeros(self.lebedev_num) self.lebedev_w = np.zeros(self.lebedev_num) call_lebedev.lebedev(self.lebedev_num,self.lebedev_x,self.lebedev_y,self.lebedev_z,self.lebedev_w)
def main(): # make environment pot_region = (2 / np.sqrt(3), 2 / np.sqrt(3), 2 / np.sqrt(3)) radius = np.sqrt(pot_region[0]**2 + pot_region[1]**2 + pot_region[2]**2) region = (radius, radius, radius) nr = 201 gridpx = 200 gridpy = 200 gridpz = 200 x, y, z = grid(gridpx, gridpy, gridpz, region) xx, yy, zz = np.meshgrid(x, y, z) #make mesh #linear mesh #r =np.linspace(0.0001,region,nr) #log mesh a = np.log(2) / (nr - 1) b = radius / (np.e**(a * (nr - 1)) - 1) rofi = np.array([b * (np.e**(a * i) - 1) for i in range(nr)]) # make potential V = makepotential(xx, yy, zz, pot_region, pottype="cubic", potbottom=-1, potshow_f=False) # surface integral V_radial = surfaceintegral(x, y, z, rofi, V, method="lebedev_py", potshow_f=False) vofi = np.array(V_radial) # select method of surface integral # make basis node_open = 1 node_close = 2 LMAX = 10 all_basis = [] for lvalsh in range(LMAX): l_basis = [] # for open channel val = 1. slo = 0. for node in range(node_open): basis = Basis(nr) emin = -10. emax = 100. basis.make_basis(a, b, emin, emax, lvalsh, node, nr, rofi, slo, vofi, val) l_basis.append(basis) # for close channel val = 0. slo = -1. for node in range(node_close): basis = Basis(nr) emin = -10. emax = 100. basis.make_basis(a, b, emin, emax, lvalsh, node, nr, rofi, slo, vofi, val) l_basis.append(basis) all_basis.append(l_basis) with open("wavefunc.dat", mode="w") as fw_w: fw_w.write("#r, l, node, open or close = ") for l_basis in all_basis: for nyu_basis in l_basis: fw_w.write(str(nyu_basis.l)) fw_w.write(str(nyu_basis.node)) if nyu_basis.open: fw_w.write("open") else: fw_w.write("close") fw_w.write(" ") fw_w.write("\n") for i in range(nr): fw_w.write("{:>13.8f}".format(rofi[i])) for l_basis in all_basis: for nyu_basis in l_basis: fw_w.write("{:>13.8f}".format(nyu_basis.g[i])) fw_w.write("\n") hsmat = np.zeros( (LMAX, LMAX, node_open + node_close, node_open + node_close), dtype=np.float64) lmat = np.zeros( (LMAX, LMAX, node_open + node_close, node_open + node_close), dtype=np.float64) qmat = np.zeros( (LMAX, LMAX, node_open + node_close, node_open + node_close), dtype=np.float64) for l1 in range(LMAX): for l2 in range(LMAX): if l1 != l2: continue for n1 in range(node_open + node_close): for n2 in range(node_open + node_close): if all_basis[l1][n1].l != l1 or all_basis[l2][n2].l != l2: print("error: L is differnt") sys.exit() hsmat[l1][l2][n1][n2] = integrate( all_basis[l1][n1].g[:nr] * all_basis[l2][n2].g[:nr], rofi, nr) * all_basis[l1][n1].e lmat[l1][l2][n1][ n2] = all_basis[l1][n1].val * all_basis[l2][n2].slo qmat[l1][l2][n1][ n2] = all_basis[l1][n1].val * all_basis[l2][n2].val print("\nhsmat") print(hsmat) print("\nlmat") print(lmat) print("\nqmat") print(qmat) #make not spherical potential my_radial_interfunc = interpolate.interp1d(rofi, V_radial) #V_ang = np.where(np.sqrt(xx * xx + yy * yy + zz * zz) < rofi[-1] , V - my_radial_interfunc(np.sqrt(xx * xx + yy * yy + zz * zz)),0. ) #my_V_ang_inter_func = RegularGridInterpolator((x, y, z), V_ang) my_V_inter_func = RegularGridInterpolator((x, y, z), V) #WARING!!!!!!!!!!!!!!!!!!!!!! """ Fujikata rewrote ~/.local/lib/python3.6/site-packages/scipy/interpolate/interpolate.py line 690~702 To avoid exit with error "A value in x_new is below the interpolation range." """ #!!!!!!!!!!!!!!!!!!!!!!!!!!! #mayavi.mlab.plot3d(xx,yy,V_ang) # mlab.contour3d(V_ang,color = (1,1,1),opacity = 0.1) # obj = mlab.volume_slice(V_ang) # mlab.show() #for V_L fw_umat_vl = open("umat_vl_all.dat", mode="w") for LMAX_k in range(10, 13): fw_umat_vl_2 = open("umat_vl_L" + str(LMAX_k) + ".dat", mode="w") t1 = time.time() umat = np.zeros((node_open + node_close, node_open + node_close, LMAX, LMAX, 2 * LMAX + 1, 2 * LMAX + 1), dtype=np.complex64) #LMAX_k = 3 fw_umat_vl.write(str(LMAX_k)) igridnr = 201 leb_r = np.linspace(0, radius, igridnr) lebedev_num = lebedev_num_list[-8] V_L = np.zeros((LMAX_k, 2 * LMAX_k + 1, igridnr), dtype=np.complex64) leb_x = np.zeros(lebedev_num) leb_y = np.zeros(lebedev_num) leb_z = np.zeros(lebedev_num) leb_w = np.zeros(lebedev_num) lebedev(lebedev_num, leb_x, leb_y, leb_z, leb_w) theta = np.arccos(leb_z) phi = np.where( leb_x**2 + leb_y**2 != 0., np.where(leb_y >= 0, np.arccos(leb_x / np.sqrt(leb_x**2 + leb_y**2)), np.pi + np.arccos(leb_x / np.sqrt(leb_x**2 + leb_y**2))), 0.) for i in range(igridnr): V_leb_r = my_V_inter_func( np.array([leb_x, leb_y, leb_z]).T * leb_r[i]) * leb_w for k in range(LMAX_k): for q in range(-k, k + 1): V_L[k][q][i] = 4 * np.pi * np.sum( V_leb_r * sph_harm(q, k, phi, theta).conjugate()) """ for k in range(LMAX_k): for q in range(-k,k+1): print("k = ",k,"q = ", q) plt.plot(leb_r,V_L[k][q].real,marker=".") plt.show() sys.exit() """ g_ln = np.zeros((node_open + node_close, LMAX, igridnr), dtype=np.float64) for n1 in range(node_open + node_close): for l1 in range(LMAX): my_radial_g_inter_func = interpolate.interp1d( rofi, all_basis[l1][n1].g[:nr]) g_ln[n1][l1] = my_radial_g_inter_func(leb_r) C_kq = np.zeros( (LMAX, LMAX, 2 * LMAX + 1, 2 * LMAX + 1, LMAX_k, 2 * LMAX_k + 1), dtype=np.float64) for l1 in range(LMAX): for l2 in range(LMAX): for m1 in range(-l1, l1 + 1): for m2 in range(-l2, l2 + 1): for k in range(1, LMAX_k): for q in range(-k, k + 1): C_kq[l1][l2][m1][m2][k][q] = (-1)**( -m1) * np.sqrt( (2 * l1 + 1) * (2 * l2 + 1)) * Wigner3j( l1, 0, k, 0, l2, 0).doit() * Wigner3j( l1, -m1, k, q, l2, m2).doit() #print(l1,l2,m1,m2,k,q,C_kq[l1][l2][m1][m2][k][q]) count = 0 for l1 in range(LMAX): for l2 in range(LMAX): for m1 in range(-l1, l1 + 1): for m2 in range(-l2, l2 + 1): for n1 in range(node_open + node_close): for n2 in range(node_open + node_close): for k in range(1, LMAX_k): for q in range(-k, k + 1): umat[n1][n2][l1][l2][m1][m2] += simps( g_ln[n1][l1] * V_L[k][q] * g_ln[n2][l2], leb_r) * C_kq[l1][ l2][m1][m2][k][q] * np.sqrt( (2 * k + 1) / (4 * np.pi)) fw_umat_vl.write("{:>15.8f}".format( umat[n1][n2][l1][l2][m1][m2].real)) fw_umat_vl_2.write("{:>15.8f}".format(count)) fw_umat_vl_2.write("{:>15.8f}\n".format( umat[n1][n2][l1][l2][m1][m2].real)) count += 1 t2 = time.time() print("LMAX = ", LMAX_k, " time = ", t2 - t1) fw_umat_vl_2.close() fw_umat_vl.write("\n") fw_umat_vl.close()