def setUp(self): mesh = dl.UnitSquareMesh(10, 10) self.mpi_rank = dl.MPI.rank(mesh.mpi_comm()) self.mpi_size = dl.MPI.size(mesh.mpi_comm()) Vh1 = dl.FunctionSpace(mesh, 'Lagrange', 1) uh, vh = dl.TrialFunction(Vh1), dl.TestFunction(Vh1) mh, test_mh = dl.TrialFunction(Vh1), dl.TestFunction(Vh1) ## Set up B ndim = 2 ntargets = 200 np.random.seed(seed=1) targets = np.random.uniform(0.1, 0.9, [ntargets, ndim]) B = assemblePointwiseObservation(Vh1, targets) ## Set up Asolver alpha = dl.Constant(1.0) varfA = ufl.inner(ufl.grad(uh), ufl.grad(vh))*ufl.dx +\ alpha*ufl.inner(uh,vh)*ufl.dx A = dl.assemble(varfA) Asolver = PETScKrylovSolver(A.mpi_comm(), "cg", amg_method()) Asolver.set_operator(A) Asolver.parameters["maximum_iterations"] = 100 Asolver.parameters["relative_tolerance"] = 1e-12 ## Set up C varfC = ufl.inner(mh, vh) * ufl.dx C = dl.assemble(varfC) self.Hop = Hop(B, Asolver, C) ## Set up RHS Matrix M. varfM = ufl.inner(mh, test_mh) * ufl.dx self.M = dl.assemble(varfM) self.Minv = PETScKrylovSolver(self.M.mpi_comm(), "cg", amg_method()) self.Minv.set_operator(self.M) self.Minv.parameters["maximum_iterations"] = 100 self.Minv.parameters["relative_tolerance"] = 1e-12 myRandom = Random(self.mpi_rank, self.mpi_size) x_vec = dl.Vector(mesh.mpi_comm()) self.Hop.init_vector(x_vec, 1) k_evec = 10 p_evec = 50 self.Omega = MultiVector(x_vec, k_evec + p_evec) self.k_evec = k_evec myRandom.normal(1., self.Omega)
class TestMultiVector(unittest.TestCase): def setUp(self): mesh = dl.UnitSquareMesh(10, 10) self.mpi_rank = dl.MPI.rank(mesh.mpi_comm()) self.mpi_size = dl.MPI.size(mesh.mpi_comm()) Vh = dl.FunctionSpace(mesh, 'Lagrange', 1) uh,vh = dl.TrialFunction(Vh),dl.TestFunction(Vh) varfM = ufl.inner(uh,vh)*ufl.dx self.M = dl.assemble(varfM) x = dl.Vector( mesh.mpi_comm() ) self.M.init_vector(x,0) k = 121 self.Q = MultiVector(x,k) def testOrthogonalization(self): myRandom = Random(self.mpi_rank, self.mpi_size) myRandom.normal(1.,self.Q) _ = self.Q.orthogonalize() QtQ = self.Q.dot_mv(self.Q) if self.mpi_rank == 0: assert np.linalg.norm(QtQ - np.eye(QtQ.shape[0])) < 1e-8 def testBOrthogonalization(self): myRandom = Random(self.mpi_rank, self.mpi_size) myRandom.normal(1.,self.Q) self.Q.Borthogonalize(self.M) MQ = MultiVector(self.Q) MQ.zero() MatMvMult(self.M, self.Q, MQ) QtMQ = self.Q.dot_mv(MQ) if self.mpi_rank == 0: assert np.linalg.norm(QtMQ - np.eye(QtMQ.shape[0])) < 1e-8
def testDoublePassG(self): d, U = doublePassG(self.Hop, self.M, self.Minv, self.Omega, self.k_evec, s=2) nvec = U.nvec() AU = MultiVector(U[0], nvec) BU = MultiVector(U[0], nvec) MatMvMult(self.Hop, U, AU) MatMvMult(self.M, U, BU) # Residual checks diff = MultiVector(AU) diff.axpy(-d, BU) res_norms = diff.norm("l2") # B-orthogonality UtBU = BU.dot_mv(U) err = UtBU - np.eye(nvec, dtype=UtBU.dtype) err_Bortho = np.linalg.norm(err, 'fro') # A-orthogonality V = MultiVector(U) scaling = np.power(np.abs(d), -0.5) V.scale(scaling) AU.scale(scaling) VtAV = AU.dot_mv(V) err = VtAV - np.diag(np.sign(d)) err_Aortho = np.linalg.norm(err, 'fro') assert err_Bortho < 1e-8 assert err_Aortho < 1e-4 assert np.all(res_norms < 1e-4)