def test_matrix(): set_verbose(False) mesh = Mesh() mesh.load(domain_mesh) mesh.refine_element(0) shapeset = H1Shapeset() pss = PrecalcShapeset(shapeset) # create an H1 space space = H1Space(mesh, shapeset) space.set_uniform_order(5) space.assign_dofs() # initialize the discrete problem wf = WeakForm(1) set_forms(wf) solver = DummySolver() sys = LinSystem(wf, solver) sys.set_spaces(space) sys.set_pss(pss) # assemble the stiffness matrix and solve the system sln = Solution() sys.assemble() A = sys.get_matrix()
def test_example_03(): set_verbose(False) mesh = Mesh() mesh.load(domain_mesh) mesh.refine_element(0) shapeset = H1Shapeset() pss = PrecalcShapeset(shapeset) # create an H1 space space = H1Space(mesh, shapeset) space.set_uniform_order(5) from hermes2d.examples.c03 import set_bc set_bc(space) space.assign_dofs() # initialize the discrete problem wf = WeakForm(1) set_forms(wf) solver = DummySolver() sys = LinSystem(wf, solver) sys.set_spaces(space) sys.set_pss(pss) # assemble the stiffness matrix and solve the system sln = Solution() sys.assemble() sys.solve_system(sln) assert abs(sln.l2_norm() - 0.25493) < 1e-4 assert abs(sln.h1_norm() - 0.89534) < 1e-4
def test_ScalarView_mpl_unknown(): mesh = Mesh() mesh.load(domain_mesh) mesh.refine_element(0) shapeset = H1Shapeset() pss = PrecalcShapeset(shapeset) # create an H1 space space = H1Space(mesh, shapeset) space.set_uniform_order(5) space.assign_dofs() # initialize the discrete problem wf = WeakForm(1) set_forms(wf) solver = DummySolver() sys = LinSystem(wf, solver) sys.set_spaces(space) sys.set_pss(pss) # assemble the stiffness matrix and solve the system sys.assemble() A = sys.get_matrix() b = sys.get_rhs() from scipy.sparse.linalg import cg x, res = cg(A, b) sln = Solution() sln.set_fe_solution(space, pss, x) view = ScalarView("Solution")
def test_example_08(): from hermes2d.examples.c08 import set_bc, set_forms set_verbose(False) mesh = Mesh() mesh.load(cylinder_mesh) #mesh.refine_element(0) #mesh.refine_all_elements() mesh.refine_towards_boundary(5, 3) shapeset = H1Shapeset() pss = PrecalcShapeset(shapeset) # create an H1 space xvel = H1Space(mesh, shapeset) yvel = H1Space(mesh, shapeset) press = H1Space(mesh, shapeset) xvel.set_uniform_order(2) yvel.set_uniform_order(2) press.set_uniform_order(1) set_bc(xvel, yvel, press) ndofs = 0 ndofs += xvel.assign_dofs(ndofs) ndofs += yvel.assign_dofs(ndofs) ndofs += press.assign_dofs(ndofs) xprev = Solution() yprev = Solution() xprev.set_zero(mesh) yprev.set_zero(mesh) # initialize the discrete problem wf = WeakForm(3) set_forms(wf, xprev, yprev) solver = DummySolver() sys = LinSystem(wf, solver) sys.set_spaces(xvel, yvel, press) sys.set_pss(pss) #dp.set_external_fns(xprev, yprev) # visualize the solution EPS_LOW = 0.0014 for i in range(3): psln = Solution() sys.assemble() sys.solve_system(xprev, yprev, psln)
def test_example_07(): from hermes2d.examples.c07 import set_bc, set_forms set_verbose(False) mesh = Mesh() mesh.load(sample_mesh) #mesh.refine_element(0) #mesh.refine_all_elements() #mesh.refine_towards_boundary(5, 3) shapeset = H1Shapeset() pss = PrecalcShapeset(shapeset) # create an H1 space xdisp = H1Space(mesh, shapeset) ydisp = H1Space(mesh, shapeset) xdisp.set_uniform_order(8) ydisp.set_uniform_order(8) set_bc(xdisp, ydisp) ndofs = xdisp.assign_dofs(0) ndofs += ydisp.assign_dofs(ndofs) # initialize the discrete problem wf = WeakForm(2) set_forms(wf) solver = DummySolver() sys = LinSystem(wf, solver) sys.set_spaces(xdisp, ydisp) sys.set_pss(pss) xsln = Solution() ysln = Solution() old_flag = set_warn_integration(False) sys.assemble() set_warn_integration(old_flag) sys.solve_system(xsln, ysln) E = float(200e9) nu = 0.3 stress = VonMisesFilter(xsln, ysln, E / (2*(1 + nu)), (E * nu) / ((1 + nu) * (1 - 2*nu)))
def test_example_02(): set_verbose(False) mesh = Mesh() mesh.load(domain_mesh) mesh.refine_element(0) shapeset = H1Shapeset() pss = PrecalcShapeset(shapeset) # create an H1 space space = H1Space(mesh, shapeset) space.set_uniform_order(5) space.assign_dofs() # initialize the discrete problem wf = WeakForm(1) set_forms(wf) solver = DummySolver() sys = LinSystem(wf, solver) sys.set_spaces(space) sys.set_pss(pss)
def test_example_04(): from hermes2d.examples.c04 import set_bc set_verbose(False) mesh = Mesh() mesh.load(domain_mesh) # mesh.refine_element(0) # mesh.refine_all_elements() mesh.refine_towards_boundary(5, 3) shapeset = H1Shapeset() pss = PrecalcShapeset(shapeset) # create an H1 space space = H1Space(mesh, shapeset) space.set_uniform_order(5) set_bc(space) space.assign_dofs() xprev = Solution() yprev = Solution() # initialize the discrete problem wf = WeakForm() set_forms(wf, -4) solver = DummySolver() sys = LinSystem(wf, solver) sys.set_spaces(space) sys.set_pss(pss) # assemble the stiffness matrix and solve the system sys.assemble() sln = Solution() sys.solve_system(sln) assert abs(sln.l2_norm() - 1.22729) < 1e-4 assert abs(sln.h1_norm() - 2.90006) < 1e-4
def test_example_05(): from hermes2d.examples.c05 import set_bc from hermes2d.examples.c05 import set_forms as set_forms_surf set_verbose(False) mesh = Mesh() mesh.load(domain_mesh) mesh.refine_towards_vertex(3, 12) shapeset = H1Shapeset() pss = PrecalcShapeset(shapeset) # create an H1 space space = H1Space(mesh, shapeset) space.set_uniform_order(4) set_bc(space) space.assign_dofs() xprev = Solution() yprev = Solution() # initialize the discrete problem wf = WeakForm(1) set_forms(wf, -1) set_forms_surf(wf) sln = Solution() solver = DummySolver() sys = LinSystem(wf, solver) sys.set_spaces(space) sys.set_pss(pss) sys.assemble() sys.solve_system(sln) assert abs(sln.l2_norm() - 0.535833) < 1e-4 assert abs(sln.h1_norm() - 1.332908) < 1e-4
def test_example_07(): from hermes2d.examples.c07 import set_bc, set_forms set_verbose(False) P_INIT = 2 # Initial polynomial degree of all mesh elements. mesh = Mesh() mesh.load(get_07_mesh()) # Initialize the shapeset and the cache shapeset = H1Shapeset() pss = PrecalcShapeset(shapeset) # create finite element space space = H1Space(mesh, shapeset) space.set_uniform_order(P_INIT) set_bc(space) # Enumerate basis functions space.assign_dofs() # weak formulation wf = WeakForm(1) set_forms(wf) # matrix solver solver = DummySolver() # Solve the problem sln = Solution() ls = LinSystem(wf, solver) ls.set_spaces(space) ls.set_pss(pss) ls.assemble() ls.solve_system(sln)
def poisson_solver(mesh_tuple): """ Poisson solver. mesh_tuple ... a tuple of (nodes, elements, boundary, nurbs) """ set_verbose(False) mesh = Mesh() mesh.create(*mesh_tuple) mesh.refine_element(0) shapeset = H1Shapeset() pss = PrecalcShapeset(shapeset) # create an H1 space space = H1Space(mesh, shapeset) space.set_uniform_order(5) space.assign_dofs() # initialize the discrete problem wf = WeakForm(1) set_forms(wf) solver = DummySolver() sys = LinSystem(wf, solver) sys.set_spaces(space) sys.set_pss(pss) # assemble the stiffness matrix and solve the system sys.assemble() A = sys.get_matrix() b = sys.get_rhs() from scipy.sparse.linalg import cg x, res = cg(A, b) sln = Solution() sln.set_fe_solution(space, pss, x) return sln
def test_example_11(): from hermes2d.examples.c11 import set_bc, set_wf_forms, set_hp_forms # The following parameters can be changed: In particular, compare hp- and # h-adaptivity via the ADAPT_TYPE option, and compare the multi-mesh vs. single-mesh # using the MULTI parameter. P_INIT = 1 # Initial polynomial degree of all mesh elements. MULTI = True # MULTI = true ... use multi-mesh, # MULTI = false ... use single-mesh. # Note: In the single mesh option, the meshes are # forced to be geometrically the same but the # polynomial degrees can still vary. SAME_ORDERS = True # SAME_ORDERS = true ... when single-mesh is used, # this forces the meshes for all components to be # identical, including the polynomial degrees of # corresponding elements. When multi-mesh is used, # this parameter is ignored. THRESHOLD = 0.3 # This is a quantitative parameter of the adapt(...) function and # it has different meanings for various adaptive strategies (see below). STRATEGY = 1 # Adaptive strategy: # STRATEGY = 0 ... refine elements until sqrt(THRESHOLD) times total # error is processed. If more elements have similar errors, refine # all to keep the mesh symmetric. # STRATEGY = 1 ... refine all elements whose error is larger # than THRESHOLD times maximum element error. # STRATEGY = 2 ... refine all elements whose error is larger # than THRESHOLD. # More adaptive strategies can be created in adapt_ortho_h1.cpp. ADAPT_TYPE = 0 # Type of automatic adaptivity: # ADAPT_TYPE = 0 ... adaptive hp-FEM (default), # ADAPT_TYPE = 1 ... adaptive h-FEM, # ADAPT_TYPE = 2 ... adaptive p-FEM. ISO_ONLY = False # Isotropic refinement flag (concerns quadrilateral elements only). # ISO_ONLY = false ... anisotropic refinement of quad elements # is allowed (default), # ISO_ONLY = true ... only isotropic refinements of quad elements # are allowed. MESH_REGULARITY = -1 # Maximum allowed level of hanging nodes: # MESH_REGULARITY = -1 ... arbitrary level hangning nodes (default), # MESH_REGULARITY = 1 ... at most one-level hanging nodes, # MESH_REGULARITY = 2 ... at most two-level hanging nodes, etc. # Note that regular meshes are not supported, this is due to # their notoriously bad performance. MAX_ORDER = 10 # Maximum allowed element degree ERR_STOP = 0.5 # Stopping criterion for adaptivity (rel. error tolerance between the # fine mesh and coarse mesh solution in percent). NDOF_STOP = 40000 # Adaptivity process stops when the number of degrees of freedom grows over # this limit. This is mainly to prevent h-adaptivity to go on forever. # Problem constants E = 200e9 # Young modulus for steel: 200 GPa nu = 0.3 # Poisson ratio lamda = (E * nu) / ((1 + nu) * (1 - 2 * nu)) mu = E / (2 * (1 + nu)) # Load the mesh xmesh = Mesh() ymesh = Mesh() xmesh.load(get_bracket_mesh()) # initial mesh refinements xmesh.refine_element(1) xmesh.refine_element(4) # Create initial mesh for the vertical displacement component, # identical to the mesh for the horizontal displacement # (bracket.mesh becomes a master mesh) ymesh.copy(xmesh) # Initialize the shapeset and the cache shapeset = H1Shapeset() xpss = PrecalcShapeset(shapeset) ypss = PrecalcShapeset(shapeset) # Create the x displacement space xdisp = H1Space(xmesh, shapeset) set_bc(xdisp) xdisp.set_uniform_order(P_INIT) # Create the x displacement space ydisp = H1Space(ymesh, shapeset) set_bc(ydisp) ydisp.set_uniform_order(P_INIT) # Enumerate basis functions ndofs = xdisp.assign_dofs() ydisp.assign_dofs(ndofs) # Initialize the weak formulation wf = WeakForm(2) set_wf_forms(wf) # Matrix solver solver = DummySolver() # adaptivity loop it = 1 done = False cpu = 0.0 x_sln_coarse = Solution() y_sln_coarse = Solution() x_sln_fine = Solution() y_sln_fine = Solution() # Calculating the number of degrees of freedom ndofs = xdisp.assign_dofs() ndofs += ydisp.assign_dofs(ndofs) # Solve the coarse mesh problem ls = LinSystem(wf, solver) ls.set_spaces(xdisp, ydisp) ls.set_pss(xpss, ypss) ls.assemble() ls.solve_system(x_sln_coarse, y_sln_coarse) # View the solution -- this can be slow; for illustration only stress_coarse = VonMisesFilter(x_sln_coarse, y_sln_coarse, mu, lamda) # Solve the fine mesh problem rs = RefSystem(ls) rs.assemble() rs.solve_system(x_sln_fine, y_sln_fine) # Calculate element errors and total error estimate hp = H1OrthoHP(xdisp, ydisp) set_hp_forms(hp) err_est = hp.calc_error_2(x_sln_coarse, y_sln_coarse, x_sln_fine, y_sln_fine) * 100 # Show the fine solution - this is the final result stress_fine = VonMisesFilter(x_sln_fine, y_sln_fine, mu, lamda)
def test_example_09(): from hermes2d.examples.c09 import set_bc, temp_ext, set_forms # The following parameters can be played with: P_INIT = 1 # polynomial degree of elements INIT_REF_NUM = 4 # number of initial uniform refinements TAU = 300.0 # time step in seconds # Problem constants T_INIT = 10 # temperature of the ground (also initial temperature) FINAL_TIME = 86400 # length of time interval (24 hours) in seconds # Global variable TIME = 0 # Load the mesh mesh = Mesh() mesh.load(get_cathedral_mesh()) # for i in range(INIT_REF_NUM): # mesh.refine_all_elements() # mesh.refine_towards_boundary(2, 5) # Set up shapeset shapeset = H1Shapeset() pss = PrecalcShapeset(shapeset) # Set up spaces space = H1Space(mesh, shapeset) set_bc(space) space.set_uniform_order(P_INIT) # Enumerate basis functions space.assign_dofs() # Set initial condition tsln = Solution() tsln.set_const(mesh, T_INIT) # Weak formulation wf = WeakForm(1) set_forms(wf, tsln) # Matrix solver solver = DummySolver() # Linear system ls = LinSystem(wf, solver) ls.set_spaces(space) ls.set_pss(pss) # Visualisation sview = ScalarView("Temperature", 0, 0, 450, 600) # title = "Time %s, exterior temperature %s" % (TIME, temp_ext(TIME)) # Tview.set_min_max_range(0,20); # Tview.set_title(title); # Tview.fix_scale_width(3); # Time stepping nsteps = int(FINAL_TIME / TAU + 0.5) rhsonly = False # Assemble and solve ls.assemble() rhsonly = True ls.solve_system(tsln)
sln = Solution() rsln = Solution() solver = DummySolver() view = ScalarView("Solution") mview = MeshView("Mesh") graph = [] iter = 0 print "Calculating..." while 1: space.assign_dofs() sys = LinSystem(wf, solver) sys.set_spaces(space) sys.set_pss(pss) sys.assemble() sys.solve_system(sln) dofs = sys.get_matrix().shape[0] if interactive_plotting: view.show(sln, lib="mayavi", filename="a%02d.png" % iter) if show_mesh: mview.show(mesh, lib="mpl", method="orders", filename="b%02d.png" % iter) rsys = RefSystem(sys) rsys.assemble() rsys.solve_system(rsln) hp = H1OrthoHP(space) error_est = hp.calc_error(sln, rsln) * 100
yomview = MeshView() while(not done): print ("\n---- Adaptivity step %d ---------------------------------------------\n" % it) it += 1 # Calculating the number of degrees of freedom ndofs = xdisp.assign_dofs() ndofs += ydisp.assign_dofs(ndofs) print("xdof=%d, ydof=%d\n" % (xdisp.get_num_dofs(), ydisp.get_num_dofs()) ) # Solve the coarse mesh problem ls = LinSystem(wf, solver) ls.set_spaces(xdisp, ydisp) ls.set_pss(xpss, ypss) ls.assemble() ls.solve_system(x_sln_coarse, y_sln_coarse, lib="scipy") # View the solution -- this can be slow; for illustration only stress_coarse = VonMisesFilter(x_sln_coarse, y_sln_coarse, mu, lamda) #sview.set_min_max_range(0, 3e4) sview.show(stress_coarse, lib='mayavi') #xoview.show(xdisp, lib='mayavi') #yoview.show(ydisp, lib='mayavi') xomview.show(xmesh, space=xdisp, lib="mpl", method="orders", notebook=False) yomview.show(ymesh, space=ydisp, lib="mpl", method="orders", notebook=False) # Solve the fine mesh problem rs = RefSystem(ls) rs.assemble()
def test_example_12(): from hermes2d.examples.c12 import set_bc, set_forms from hermes2d.examples import get_example_mesh # The following parameters can be changed: P_INIT = 1 # Initial polynomial degree of all mesh elements. THRESHOLD = 0.6 # This is a quantitative parameter of the adapt(...) function and # it has different meanings for various adaptive strategies (see below). STRATEGY = 0 # Adaptive strategy: # STRATEGY = 0 ... refine elements until sqrt(THRESHOLD) times total # error is processed. If more elements have similar errors, refine # all to keep the mesh symmetric. # STRATEGY = 1 ... refine all elements whose error is larger # than THRESHOLD times maximum element error. # STRATEGY = 2 ... refine all elements whose error is larger # than THRESHOLD. # More adaptive strategies can be created in adapt_ortho_h1.cpp. ADAPT_TYPE = 0 # Type of automatic adaptivity: # ADAPT_TYPE = 0 ... adaptive hp-FEM (default), # ADAPT_TYPE = 1 ... adaptive h-FEM, # ADAPT_TYPE = 2 ... adaptive p-FEM. ISO_ONLY = False # Isotropic refinement flag (concerns quadrilateral elements only). # ISO_ONLY = false ... anisotropic refinement of quad elements # is allowed (default), # ISO_ONLY = true ... only isotropic refinements of quad elements # are allowed. MESH_REGULARITY = -1 # Maximum allowed level of hanging nodes: # MESH_REGULARITY = -1 ... arbitrary level hangning nodes (default), # MESH_REGULARITY = 1 ... at most one-level hanging nodes, # MESH_REGULARITY = 2 ... at most two-level hanging nodes, etc. # Note that regular meshes are not supported, this is due to # their notoriously bad performance. ERR_STOP = 0.01 # Stopping criterion for adaptivity (rel. error tolerance between the # fine mesh and coarse mesh solution in percent). NDOF_STOP = 40000 # Adaptivity process stops when the number of degrees of freedom grows # over this limit. This is to prevent h-adaptivity to go on forever. # Load the mesh mesh = Mesh() mesh.load(get_example_mesh()) # mesh.load("hermes2d/examples/12.mesh") # Initialize the shapeset and the cache shapeset = H1Shapeset() pss = PrecalcShapeset(shapeset) # Create finite element space space = H1Space(mesh, shapeset) set_bc(space) space.set_uniform_order(P_INIT) # Enumerate basis functions space.assign_dofs() # Initialize the weak formulation wf = WeakForm(1) set_forms(wf) # Matrix solver solver = DummySolver() # Adaptivity loop it = 0 ndofs = 0 done = False sln_coarse = Solution() sln_fine = Solution() # Solve the coarse mesh problem ls = LinSystem(wf, solver) ls.set_spaces(space) ls.set_pss(pss) ls.assemble() ls.solve_system(sln_coarse) # Solve the fine mesh problem rs = RefSystem(ls) rs.assemble() rs.solve_system(sln_fine) # Calculate element errors and total error estimate hp = H1OrthoHP(space) err_est = hp.calc_error(sln_coarse, sln_fine) * 100
def calc(threshold=0.3, strategy=0, h_only=False, error_tol=1, interactive_plotting=False, show_mesh=False, show_graph=True): mesh = Mesh() mesh.create([ [0, 0], [1, 0], [1, 1], [0, 1], ], [ [2, 3, 0, 1, 0], ], [ [0, 1, 1], [1, 2, 1], [2, 3, 1], [3, 0, 1], ], []) mesh.refine_all_elements() shapeset = H1Shapeset() pss = PrecalcShapeset(shapeset) space = H1Space(mesh, shapeset) set_bc(space) space.set_uniform_order(1) wf = WeakForm(1) set_forms(wf) sln = Solution() rsln = Solution() solver = DummySolver() selector = H1ProjBasedSelector(CandList.HP_ANISO, 1.0, -1, shapeset) view = ScalarView("Solution") iter = 0 graph = [] while 1: space.assign_dofs() sys = LinSystem(wf, solver) sys.set_spaces(space) sys.set_pss(pss) sys.assemble() sys.solve_system(sln) dofs = sys.get_matrix().shape[0] if interactive_plotting: view.show(sln, lib=lib, notebook=True, filename="a%02d.png" % iter) rsys = RefSystem(sys) rsys.assemble() rsys.solve_system(rsln) hp = H1Adapt([space]) hp.set_solutions([sln], [rsln]) err_est = hp.calc_error() * 100 err_est = hp.calc_error(sln, rsln) * 100 print "iter=%02d, err_est=%5.2f%%, DOFS=%d" % (iter, err_est, dofs) graph.append([dofs, err_est]) if err_est < error_tol: break hp.adapt(selector, threshold, strategy) iter += 1 if not interactive_plotting: view.show(sln, lib=lib, notebook=True) if show_mesh: mview = MeshView("Mesh") mview.show(mesh, lib="mpl", notebook=True, filename="b.png") if show_graph: from numpy import array graph = array(graph) import pylab pylab.clf() pylab.plot(graph[:, 0], graph[:, 1], "ko", label="error estimate") pylab.plot(graph[:, 0], graph[:, 1], "k-") pylab.title("Error Convergence for the Inner Layer Problem") pylab.legend() pylab.xlabel("Degrees of Freedom") pylab.ylabel("Error [%]") pylab.yscale("log") pylab.grid() pylab.savefig("graph.png")
def schroedinger_solver(n_eigs=4, iter=2, verbose_level=1, plot=False, potential="hydrogen", report=False, report_filename="report.h5", force=False, sim_name="sim", potential2=None): """ One particle Schroedinger equation solver. n_eigs ... the number of the lowest eigenvectors to calculate iter ... the number of adaptive iterations to do verbose_level ... 0 ... quiet 1 ... only moderate output (default) 2 ... lot's of output plot ........ plot the progress (solutions, refined solutions, errors) potential ... the V(x) for which to solve, one of: well, oscillator, hydrogen potential2 .. other terms that should be added to potential report ...... it will save raw data to a file, useful for creating graphs etc. Returns the eigenvalues and eigenvectors. """ set_verbose(verbose_level == 2) set_warn_integration(False) pot = {"well": 0, "oscillator": 1, "hydrogen": 2, "three-points": 3} pot_type = pot[potential] if report: from timeit import default_timer as clock from tables import IsDescription, UInt32Col, Float32Col, openFile, \ Float64Col, Float64Atom, Col, ObjectAtom class Iteration(IsDescription): n = UInt32Col() DOF = UInt32Col() DOF_reference = UInt32Col() cpu_solve = Float32Col() cpu_solve_reference = Float32Col() eig_errors = Float64Col(shape=(n_eigs,)) eigenvalues = Float64Col(shape=(n_eigs,)) eigenvalues_reference = Float64Col(shape=(n_eigs,)) h5file = openFile(report_filename, mode = "a", title = "Simulation data") if hasattr(h5file.root, sim_name): if force: h5file.removeNode(getattr(h5file.root, sim_name), recursive=True) else: print "The group '%s' already exists. Use -f to overwrite it." \ % sim_name return group = h5file.createGroup("/", sim_name, 'Simulation run') table = h5file.createTable(group, "iterations", Iteration, "Iterations info") h5eigs = h5file.createVLArray(group, 'eigenvectors', ObjectAtom()) h5eigs_ref = h5file.createVLArray(group, 'eigenvectors_reference', ObjectAtom()) iteration = table.row mesh = Mesh() mesh.load("square.mesh") if potential == "well": # Read the width of the mesh automatically. This assumes there is just # one square element: a = sqrt(mesh.get_element(0).get_area()) # set N high enough, so that we get enough analytical eigenvalues: N = 10 levels = [] for n1 in range(1, N): for n2 in range(1, N): levels.append(n1**2 + n2**2) levels.sort() E_exact = [pi**2/(2.*a**2) * m for m in levels] elif potential == "oscillator": E_exact = [1] + [2]*2 + [3]*3 + [4]*4 + [5]*5 + [6]*6 elif potential == "hydrogen": Z = 1 # atom number E_exact = [-float(Z)**2/2/(n-0.5)**2/4 for n in [1]+[2]*3+[3]*5 +\ [4]*8 + [5]*15] else: E_exact = [1.]*50 if len(E_exact) < n_eigs: print n_eigs print E_exact raise Exception("We don't have enough analytical eigenvalues.") #mesh.refine_element(0) mesh.refine_all_elements() #mesh.refine_all_elements() #mesh.refine_all_elements() #mesh.refine_all_elements() #mview = MeshView() #mview.show(mesh) shapeset = H1Shapeset() space = H1Space(mesh, shapeset) space.set_uniform_order(2) space.assign_dofs() pss = PrecalcShapeset(shapeset) #bview = BaseView() #bview.show(space) wf1 = WeakForm(1) # this is induced by set_verbose(): #dp1.set_quiet(not verbose) set_forms8(wf1, pot_type, potential2) wf2 = WeakForm(1) # this is induced by set_verbose(): #dp2.set_quiet(not verbose) set_forms7(wf2) solver = DummySolver() w = 320 h = 320 views = [ScalarView("", i*w, 0, w, h) for i in range(4)] viewsm = [ScalarView("", i*w, h, w, h) for i in range(4)] viewse = [ScalarView("", i*w, 2*h, w, h) for i in range(4)] #for v in viewse: # v.set_min_max_range(0, 10**-4) ord = OrderView("Polynomial Orders", 0, 2*h, w, h) rs = None precision = 30.0 if verbose_level >= 1: print "Problem initialized. Starting calculation." for it in range(iter): if verbose_level >= 1: print "-"*80 print "Starting iteration %d." % it if report: iteration["n"] = it #mesh.save("refined2.mesh") sys1 = LinSystem(wf1, solver) sys1.set_spaces(space) sys1.set_pss(pss) sys2 = LinSystem(wf2, solver) sys2.set_spaces(space) sys2.set_pss(pss) if verbose_level >= 1: print "Assembling the matrices A, B." sys1.assemble() sys2.assemble() if verbose_level == 2: print "converting matrices A, B" A = sys1.get_matrix() B = sys2.get_matrix() if verbose_level >= 1: n = A.shape[0] print "Solving the problem Ax=EBx (%d x %d)." % (n, n) if report: n = A.shape[0] iteration["DOF"] = n if report: t = clock() eigs, sols = solve(A, B, n_eigs, verbose_level == 2) if report: t = clock() - t iteration["cpu_solve"] = t iteration["eigenvalues"] = array(eigs) #h5eigs.append(sols) if verbose_level >= 1: print " \-Done." print_eigs(eigs, E_exact) s = [] n = sols.shape[1] for i in range(n): sln = Solution() vec = sols[:, i] sln.set_fe_solution(space, pss, vec) s.append(sln) if verbose_level >= 1: print "Matching solutions." if rs is not None: def minus2(sols, i): sln = Solution() vec = sols[:, i] sln.set_fe_solution(space, pss, -vec) return sln pairs, flips = make_pairs(rs, s, d1, d2) #print "_"*40 #print pairs, flips #print len(rs), len(s) #from time import sleep #sleep(3) #stop s2 = [] for j, flip in zip(pairs, flips): if flip: s2.append(minus2(sols,j)) else: s2.append(s[j]) s = s2 if plot: if verbose_level >= 1: print "plotting: solution" ord.show(space) for i in range(min(len(s), 4)): views[i].show(s[i]) views[i].set_title("Iter: %d, eig: %d" % (it, i)) #mat1.show(dp1) if verbose_level >= 1: print "reference: initializing mesh." rsys1 = RefSystem(sys1) rsys2 = RefSystem(sys2) if verbose_level >= 1: print "reference: assembling the matrices A, B." rsys1.assemble() rsys2.assemble() if verbose_level == 2: print "converting matrices A, B" A = rsys1.get_matrix() B = rsys2.get_matrix() if verbose_level >= 1: n = A.shape[0] print "reference: solving the problem Ax=EBx (%d x %d)." % (n, n) if report: n = A.shape[0] iteration["DOF_reference"] = n if report: t = clock() eigs, sols = solve(A, B, n_eigs, verbose_level == 2) if report: t = clock() - t iteration["cpu_solve_reference"] = t iteration["eigenvalues_reference"] = array(eigs) #h5eigs_ref.append(sols) if verbose_level >= 1: print " \-Done." print_eigs(eigs, E_exact) rs = [] rspace = rsys1.get_ref_space(0) n = sols.shape[1] for i in range(n): sln = Solution() vec = sols[:, i] sln.set_fe_solution(rspace, pss, vec) rs.append(sln) if verbose_level >= 1: print "reference: matching solutions." def minus(sols, i): sln = Solution() vec = sols[:, i] sln.set_fe_solution(rspace, pss, -vec) return sln # segfaults #mat2.show(rp1) def d1(x, y): return (x-y).l2_norm() def d2(x, y): return (x+y).l2_norm() from pairs import make_pairs pairs, flips = make_pairs(s, rs, d1, d2) rs2 = [] for j, flip in zip(pairs, flips): if flip: rs2.append(minus(sols,j)) else: rs2.append(rs[j]) rs = rs2 if plot: if verbose_level >= 1: print "plotting: solution, reference solution, errors" for i in range(min(len(s), len(rs), 4)): #views[i].show(s[i]) #views[i].set_title("Iter: %d, eig: %d" % (it, i)) viewsm[i].show(rs[i]) viewsm[i].set_title("Ref. Iter: %d, eig: %d" % (it, i)) viewse[i].show((s[i]-rs[i])**2) viewse[i].set_title("Error plot Iter: %d, eig: %d" % (it, i)) if verbose_level >= 1: print "Calculating errors." hp = H1OrthoHP(space) if verbose_level == 2: print "-"*60 print "calc error (iter=%d):" % it eig_converging = 0 errors = [] for i in range(min(len(s), len(rs))): error = hp.calc_error(s[i], rs[i]) * 100 errors.append(error) prec = precision if verbose_level >= 1: print "eig %d: %g%% precision goal: %g%%" % (i, error, prec) if report: iteration["eig_errors"] = array(errors) if errors[0] > precision: eig_converging = 0 elif errors[3] > precision: eig_converging = 3 elif errors[1] > precision: eig_converging = 1 elif errors[2] > precision: eig_converging = 2 else: precision /= 2 # uncomment the following line to only converge to some eigenvalue: #eig_converging = 3 if verbose_level >= 1: print "picked: %d" % eig_converging error = hp.calc_error(s[eig_converging], rs[eig_converging]) * 100 if verbose_level >= 1: print "Adapting the mesh." hp.adapt(0.3) space.assign_dofs() if report: iteration.append() table.flush() if report: h5file.close() return s
done = False cpu = 0.0 sln_coarse = Solution() sln_fine = Solution() while(not done): print("\n---- Adaptivity step %d ---------------------------------------------\n" % it) it += 1 # Solve the coarse mesh problem ls = LinSystem(wf, solver) ls.set_spaces(space) ls.set_pss(pss) ls.assemble() ls.solve_system(sln_coarse) # View the solution sview.show(sln_coarse, lib='mayavi') # View the mesh mview = MeshView("Example 7", 100, 100, 500, 500) mview.show(mesh, lib="mpl", method="orders", notebook=False) # Solve the fine mesh problem rs = RefSystem(ls) rs.assemble() rs.solve_system(sln_fine)
def calc( threshold=0.3, strategy=0, h_only=False, error_tol=1, interactive_plotting=False, show_mesh=False, show_graph=True, ): mesh = Mesh() mesh.create( [[0, 0], [1, 0], [1, 1], [0, 1]], [[2, 3, 0, 1, 0]], [[0, 1, 1], [1, 2, 1], [2, 3, 1], [3, 0, 1]], [] ) mesh.refine_all_elements() shapeset = H1Shapeset() pss = PrecalcShapeset(shapeset) space = H1Space(mesh, shapeset) set_bc(space) space.set_uniform_order(1) wf = WeakForm(1) set_forms(wf) sln = Solution() rsln = Solution() solver = DummySolver() selector = H1ProjBasedSelector(CandList.HP_ANISO, 1.0, -1, shapeset) view = ScalarView("Solution") iter = 0 graph = [] while 1: space.assign_dofs() sys = LinSystem(wf, solver) sys.set_spaces(space) sys.set_pss(pss) sys.assemble() sys.solve_system(sln) dofs = sys.get_matrix().shape[0] if interactive_plotting: view.show(sln, lib=lib, notebook=True, filename="a%02d.png" % iter) rsys = RefSystem(sys) rsys.assemble() rsys.solve_system(rsln) hp = H1Adapt([space]) hp.set_solutions([sln], [rsln]) err_est = hp.calc_error() * 100 err_est = hp.calc_error(sln, rsln) * 100 print "iter=%02d, err_est=%5.2f%%, DOFS=%d" % (iter, err_est, dofs) graph.append([dofs, err_est]) if err_est < error_tol: break hp.adapt(selector, threshold, strategy) iter += 1 if not interactive_plotting: view.show(sln, lib=lib, notebook=True) if show_mesh: mview = MeshView("Mesh") mview.show(mesh, lib="mpl", notebook=True, filename="b.png") if show_graph: from numpy import array graph = array(graph) import pylab pylab.clf() pylab.plot(graph[:, 0], graph[:, 1], "ko", label="error estimate") pylab.plot(graph[:, 0], graph[:, 1], "k-") pylab.title("Error Convergence for the Inner Layer Problem") pylab.legend() pylab.xlabel("Degrees of Freedom") pylab.ylabel("Error [%]") pylab.yscale("log") pylab.grid() pylab.savefig("graph.png")