29
29
mesh = UnitSquareMesh(32, 32)
30
30
V = FunctionSpace(mesh, 'CG', 1)
31
31
bc = DirichletBC(V, Constant(0.0), lambda x, on_boundary: on_boundary)
32
u = TrialFunction(V); v = TestFunction(V);
48
49
"Test PETScKrylovSolver"
49
50
# Get solution vector
53
54
# Solve first using direct solver
56
direct_norm = x.norm("l2")
57
#direct_norm = x.norm("l2")
58
59
# Get solution vector
59
x_petsc = as_backend_type(x)
61
for prec, descr in krylov_solver_preconditioners():
62
if MPI.num_processes() > 1 and prec in ["ilu", "icc", "jacobi", "hypre_amg"]:
63
print "FIXME: Preconditioner '%s' does not work in parallel,"\
67
# With simple interface
68
solver = PETScKrylovSolver("gmres", prec)
69
solver.solve(A, x_petsc, as_backend_type(b))
70
self.assertAlmostEqual(x_petsc.norm("l2"), direct_norm, 5)
73
# With PETScPreconditioner interface
74
solver = PETScKrylovSolver("gmres", PETScPreconditioner(prec))
75
solver.solve(A, x_petsc, as_backend_type(b))
76
self.assertAlmostEqual(x_petsc.norm("l2"), direct_norm, 5)
60
#x_petsc = as_backend_type(x)
62
# With simple interface
63
#solver = PETScKrylovSolver("gmres", prec)
64
#solver.solve(A, x_petsc, as_backend_type(b))
65
#self.assertAlmostEqual(x_petsc.norm("l2"), direct_norm, 5)
67
# With PETScPreconditioner interface
68
#solver = PETScKrylovSolver("gmres", PETScPreconditioner(prec))
69
#solver.solve(A, x_petsc, as_backend_type(b))
70
#self.assertAlmostEqual(x_petsc.norm("l2"), direct_norm, 5)
78
72
if __name__ == "__main__":