Beispiel #1
0
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()
Beispiel #2
0
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()
Beispiel #3
0
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()
Beispiel #4
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)
Beispiel #5
0
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]
Beispiel #6
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)
Beispiel #7
0
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]