def test_mesh1(): m = Mesh(-1, 1, 5, 2) pts, p = m.get_mesh_data() assert (abs(pts - array([-1, -0.6, -0.2, 0.2, 0.6, 1])) < eps).all() assert (abs(p - array([2, 2, 2, 2, 2])) < eps).all() m = Mesh(-1, 1, 4, 1) pts, p = m.get_mesh_data() assert (abs(pts - array([-1, -0.5, 0, 0.5, 1])) < eps).all() assert (abs(p - array([1, 1, 1, 1])) < eps).all()
def test_mesh1(): m = Mesh(-1, 1, 5, 2) pts, p = m.get_mesh_data() assert (abs(pts - array([-1, -0.6, -0.2, 0.2, 0.6, 1])) < eps).all() assert (abs(p - array([2, 2, 2, 2, 2])) < eps).all() m = Mesh(-1, 1, 4, 1) pts, p = m.get_mesh_data() assert (abs(pts - array([-1, -0.5, 0, 0.5, 1])) < eps).all() assert (abs(p - array([1, 1, 1, 1])) < eps).all()
def test_mesh3(): m = Mesh([0, 1, 3, 4], [2, 2, 2]) pts, p = m.get_mesh_data() assert (abs(pts - array([0, 1, 3, 4])) < eps).all() assert (abs(p - array([2, 2, 2])) < eps).all() m = Mesh([-1, -0.5, 0, 0.5, 1], [2, 2, 2, 2]) pts, p = m.get_mesh_data() assert (abs(pts - array([-1, -0.5, 0, 0.5, 1])) < eps).all() assert (abs(p - array([2, 2, 2, 2])) < eps).all()
def radial_dirac_equation_adapt(params, error_tol=1e-8): if params["mesh_uniform"]: pts = create_uniform_mesh(params["a"], params["b"], n_elem=params["el_num"]) else: pts = create_log_mesh(params["a"], params["b"], par=params["mesh_par1"], n_elem=params["el_num"]) orders = [params["el_order"]] * (len(pts) - 1) mesh = Mesh(pts, orders) conv_graph = [] l = params["l"] Z = params["Z"] N_eig = params["eig_num"] #exact_energies=[-1.*Z**2/(2*n**2) for n in range(1+l,N_eig+1+l)] #old_energies = None try: for i in range(10000): print "-" * 80 print "adaptivity iteration:", i mesh.set_bc_right_dirichlet(0, 0) pts, orders = mesh.get_mesh_data() print "Current mesh:" print pts print orders #stop N_dof, energies, eigs = solve_dirac(mesh, l=l, Z=Z, eqn_type=eqn_type, eig_num=N_eig) for n in range(1, 51): print "%d %10.5f" % (n, energies[n - 1]) break conv_graph.append((N_dof, energies)) # This doesn't work well: if old_energies is not None: err = max(abs(old_energies - energies)) print "Maximum error in energies:", err if err < error_tol: break #err = max(abs(energies - exact_energies)) #print "Maximum error in energies:", err #if err < error_tol: # break old_energies = energies # exact_energies = array(exact_energies) # print energies - exact_energies mesh = adapt_mesh(mesh, eigs, l=l, Z=Z, adapt_type=params["adapt_type"]) finally: plot_conv(conv_graph, exact=exact_energies, l=l)
def radial_schroedinger_equation_adapt(params, error_tol=1e-8): if params["mesh_uniform"]: pts = create_uniform_mesh(params["a"], params["b"], n_elem=params["el_num"]) else: pts = create_log_mesh(params["a"], params["b"], par=params["mesh_par1"], n_elem=params["el_num"]) orders = [params["el_order"]]*(len(pts)-1) mesh = Mesh(pts, orders) conv_graph = [] l = params["l"] Z = params["Z"] N_eig = params["eig_num"] exact_energies=[-1.*Z**2/(2*n**2) for n in range(1+l,N_eig+1+l)] old_energies = None eqn_type = params["eqn_type"] try: for i in range(10000): print "-"*80 print "adaptivity iteration:", i if eqn_type == "rR": mesh.set_bc_left_dirichlet(0, 0) mesh.set_bc_right_dirichlet(0, 0) # Use zero dirichlet for eqn_type="R" as well, just to make sure # that we agree with sle1d mesh.set_bc_right_dirichlet(0, 0) pts, orders = mesh.get_mesh_data() print "Current mesh:" print pts print orders #stop N_dof, energies, eigs = solve_schroedinger(mesh, l=l, Z=Z, eqn_type=eqn_type, eig_num=N_eig) for n in range(1, N_eig+1): print "%d %10.5f" % (n, energies[n-1]) conv_graph.append((N_dof, energies)) # This doesn't work well: if old_energies is not None: err = max(abs(old_energies - energies)) print "Maximum error in energies:", err if err < error_tol: break #err = max(abs(energies - exact_energies)) #print "Maximum error in energies:", err #if err < error_tol: # break old_energies = energies # exact_energies = array(exact_energies) # print energies - exact_energies mesh = adapt_mesh(mesh, eigs, l=l, Z=Z, adapt_type=params["adapt_type"]) finally: pass #plot_conv(conv_graph, exact=exact_energies, l=l) return [e for e in energies if e < 0]
def radial_dirac_equation_adapt(params, error_tol=1e-8): if params["mesh_uniform"]: pts = create_uniform_mesh(params["a"], params["b"], n_elem=params["el_num"]) else: pts = create_log_mesh(params["a"], params["b"], par=params["mesh_par1"], n_elem=params["el_num"]) orders = [params["el_order"]]*(len(pts)-1) mesh = Mesh(pts, orders) conv_graph = [] l = params["l"] Z = params["Z"] N_eig = params["eig_num"] #exact_energies=[-1.*Z**2/(2*n**2) for n in range(1+l,N_eig+1+l)] #old_energies = None try: for i in range(10000): print "-"*80 print "adaptivity iteration:", i mesh.set_bc_right_dirichlet(0, 0) pts, orders = mesh.get_mesh_data() print "Current mesh:" print pts print orders #stop N_dof, energies, eigs = solve_dirac(mesh, l=l, Z=Z, eqn_type=eqn_type, eig_num=N_eig) for n in range(1, 51): print "%d %10.5f" % (n, energies[n-1]) break conv_graph.append((N_dof, energies)) # This doesn't work well: if old_energies is not None: err = max(abs(old_energies - energies)) print "Maximum error in energies:", err if err < error_tol: break #err = max(abs(energies - exact_energies)) #print "Maximum error in energies:", err #if err < error_tol: # break old_energies = energies # exact_energies = array(exact_energies) # print energies - exact_energies mesh = adapt_mesh(mesh, eigs, l=l, Z=Z, adapt_type=params["adapt_type"]) finally: plot_conv(conv_graph, exact=exact_energies, l=l)
def radial_schroedinger_equation_adapt(params, error_tol=1e-8): if params["mesh_uniform"]: pts = create_uniform_mesh(params["a"], params["b"], n_elem=params["el_num"]) else: pts = create_log_mesh(params["a"], params["b"], par=params["mesh_par1"], n_elem=params["el_num"]) orders = [params["el_order"]] * (len(pts) - 1) mesh = Mesh(pts, orders) conv_graph = [] l = params["l"] Z = params["Z"] N_eig = params["eig_num"] exact_energies = [ -1. * Z**2 / (2 * n**2) for n in range(1 + l, N_eig + 1 + l) ] old_energies = None eqn_type = params["eqn_type"] try: for i in range(10000): print "-" * 80 print "adaptivity iteration:", i if eqn_type == "rR": mesh.set_bc_left_dirichlet(0, 0) mesh.set_bc_right_dirichlet(0, 0) # Use zero dirichlet for eqn_type="R" as well, just to make sure # that we agree with sle1d mesh.set_bc_right_dirichlet(0, 0) pts, orders = mesh.get_mesh_data() print "Current mesh:" print pts print orders #stop N_dof, energies, eigs = solve_schroedinger(mesh, l=l, Z=Z, eqn_type=eqn_type, eig_num=N_eig) for n in range(1, N_eig + 1): print "%d %10.5f" % (n, energies[n - 1]) conv_graph.append((N_dof, energies)) # This doesn't work well: if old_energies is not None: err = max(abs(old_energies - energies)) print "Maximum error in energies:", err if err < error_tol: break #err = max(abs(energies - exact_energies)) #print "Maximum error in energies:", err #if err < error_tol: # break old_energies = energies # exact_energies = array(exact_energies) # print energies - exact_energies mesh = adapt_mesh(mesh, eigs, l=l, Z=Z, adapt_type=params["adapt_type"]) finally: pass #plot_conv(conv_graph, exact=exact_energies, l=l) return [e for e in energies if e < 0]