def test(i, solver, choice, problem): xtol = 1E-12 N = 2**i mesh = UnitSquareMesh(N, N, 'crossed') n_cells = mesh.num_cells() n_obtuse_cells = len(obtuse_cells(mesh)) if problem == "point": A = array([1.0, 0.0]) point_distance = Problem(MyPoint(A)) elif problem == "line": A = array([0., 0.]) B = array([1., 0.]) point_distance = Problem(Segment(A, B)) if solver == "Q1": # set up the linear problem V = FunctionSpace(mesh, "CG", 1) u = Function(V) u_exact = Function(V) fixed_dofs = [] point_distance.init(u, fixed_dofs) point_distance.exact_solution(u_exact) solver1 = Geometric(V) start = clock() n_sweeps = solver1.solve(u, fixed_dofs, xtol=xtol) stop = clock() - start l1 = assemble(abs(u - u_exact)*dx) l2 = assemble((u - u_exact)**2*dx) # set up the quadratic problem W = FunctionSpace(mesh, "CG", 2) v = interpolate(u, W) v_exact = Function(W) fixed_dofs = [] point_distance.init(v, fixed_dofs) point_distance.exact_solution(v_exact) solver2 = Quadratic(W, choice) start = clock() n_sweeps = solver2.solve(v, fixed_dofs, xtol=xtol, order_vector=v.vector()) stop = clock() - start if solver == "Q2": # set up the linear problem V = FunctionSpace(mesh, "CG", 1) u = Function(V) u_exact = Function(V) fixed_dofs = [] point_distance.init(u, fixed_dofs) point_distance.exact_solution(u_exact) solver1 = Geometric(V) n_sweeps = solver1.solve(u, fixed_dofs, xtol=xtol) # set up the quadratic problem W = FunctionSpace(mesh, "CG", 2) v = interpolate(u, W) xxx = Function(W) xxx.vector()[:] = v.vector().array() v_exact = Function(W) Fixed_dofs = [] point_distance.init(v, Fixed_dofs) point_distance.exact_solution(v_exact) #print fixed_dofs #for i in range(W.dim()): # print i, xxx.vector()[i], v.vector()[i], # if i in fixed_dofs: # print "<--" # else: # print solver2 = Quad(W, choice) start = clock() n_sweeps = solver2.solve(v, Fixed_dofs, xtol=xtol) stop = clock() - start if solver == "Q3": # set up the quadratic problem W = FunctionSpace(mesh, "CG", 2) v = Function(W) v_exact = Function(W) fixed_dofs = [] point_distance.init(v, fixed_dofs) point_distance.exact_solution(v_exact) solver2 = QuadraticRatic(W, choice) start = clock() n_sweeps = solver2.solve(v, fixed_dofs, xtol=xtol) stop = clock() - start if solver == "Q4": # set up the linear problem V = FunctionSpace(mesh, "CG", 1) u = Function(V) u_exact = Function(V) fixed_dofs = [] point_distance.init(u, fixed_dofs) point_distance.exact_solution(u_exact) solver1 = Geometric(V) start = clock() n_sweeps = solver1.solve(u, fixed_dofs, xtol=xtol) stop = clock() - start l1 = assemble(abs(u - u_exact)*dx) l2 = assemble((u - u_exact)**2*dx) # set up the quadratic problem W = FunctionSpace(mesh, "CG", 2) v = Function(W) v_exact = Function(W) fixed_dofs = [] point_distance.init(v, fixed_dofs) point_distance.exact_solution(v_exact) order = interpolate(u, W) solver2 = Q4(W, choice) start = clock() n_sweeps = solver2.solve(v, fixed_dofs, xtol=xtol, order_u=order) stop = clock() - start l1 = assemble(abs(v - v_exact)*dx) l2 = assemble((v - v_exact)**2*dx) diff = v.vector() - v_exact.vector() diff.abs() ci = diff.max() plot(v, interactive=True, title='numeric') plot(v_exact, interactive=True, title='exact') v_exact.vector()[:] -= v.vector().array() v_exact.vector().abs() plot(v_exact, interactive=True, title='error') if choice == 0: local = "sample" else: local = "quad" print "%g %.8E %.8E %.8E %d/%d %d %g" %\ (mesh.hmin(), l1, l2, ci, n_obtuse_cells, n_cells, n_sweeps, stop) out_name = "./test_results/"+solver+"_"+local+"_"+problem+".dat" with open(out_name, "a") as out: out.write("%g %.8E %.8E %.8E %d %d %d %g\n" %\ (mesh.hmin(), l1, l2, ci, n_obtuse_cells, n_cells, n_sweeps, stop) )