def test_complex_prec_solve_2D(arpack_eigs, interface, x, num_evs, tol, atol, interactive=False): from fvm import JadaHYMLSInterface from jadapy import ComplexEpetraInterface from jadapy import jdqz numpy.random.seed(1234) jac_op = ComplexEpetraInterface.CrsMatrix(interface.jacobian(x)) mass_op = ComplexEpetraInterface.CrsMatrix(interface.mass_matrix()) jada_interface = JadaHYMLSInterface.ComplexJadaHYMLSInterface(interface.map, interface, preconditioned_solve=True) alpha, beta = jdqz.jdqz(jac_op, mass_op, num_evs, tol=tol, subspace_dimensions=[20, 40], interface=jada_interface) jdqz_eigs = numpy.array(sorted(alpha / beta, key=lambda x: abs(x))) assert_allclose(jdqz_eigs.real, arpack_eigs.real, rtol=0, atol=atol) assert_allclose(abs(jdqz_eigs.imag), abs(arpack_eigs.imag), rtol=0, atol=atol) if not interactive: return x fig, ax = plt.subplots() ax.scatter(jdqz_eigs.real, jdqz_eigs.imag, marker='+') plt.show()
def solve(self, op, rhs, tol, maxit): solver_parameters = self.parameters.sublist('Solver') iterative_solver_parameters = solver_parameters.sublist( 'Iterative Solver') iterative_solver_parameters.set('Convergence Tolerance', tol if maxit > 1 else 1e-3) # iterative_solver_parameters.set('Maximum Iterations', maxit) solver_parameters.set('Complex', True) x = EpetraInterface.Vector(rhs.real.Map(), 2) y = EpetraInterface.Vector(rhs.real.Map(), 2) x[:, 0] = rhs.real x[:, 1] = rhs.imag epetra_op = ComplexEpetraInterface.Operator(op) if self.preconditioned_solve: epetra_precop = ComplexJadaHYMLSPrecOp( op, self.interface.preconditioner) solver = HYMLS.Solver(epetra_op, epetra_precop, self.parameters) else: solver = HYMLS.Solver(epetra_op, epetra_op, self.parameters) solver.ApplyInverse(x, y) out = ComplexEpetraInterface.ComplexVector(y[:, 0], y[:, 1]) return out
def test_Complex_Epetra(): try: from PyTrilinos import Epetra from jadapy import ComplexEpetraInterface except ImportError: pytest.skip("Trilinos not found") dtype = numpy.float64 numpy.random.seed(1234) tol = numpy.finfo(dtype).eps * 1e3 atol = tol * 10 n = 20 k = 5 comm = Epetra.PyComm() map = Epetra.Map(n, 0, comm) a1, a2 = generate_Complex_Epetra_test_matrix(map, [n, n], dtype) b1, b2 = generate_Complex_Epetra_test_matrix(map, [n, n], dtype) interface = ComplexEpetraInterface.ComplexEpetraInterface(map) alpha, beta = jdqz.jdqz(a2, b2, k, tol=tol, interface=interface) jdqz_eigs = numpy.array(sorted(alpha / beta, key=lambda x: abs(x))) eigs = scipy.linalg.eigvals(a1, b1) eigs = numpy.array(sorted(eigs, key=lambda x: abs(x))) eigs = eigs[:k] assert_allclose(jdqz_eigs.real, eigs.real, rtol=0, atol=atol) assert_allclose(abs(jdqz_eigs.imag), abs(eigs.imag), rtol=0, atol=atol)
def prec(self, x, *args): y = EpetraInterface.Vector(x.real.Map(), 2) z = EpetraInterface.Vector(x.real.Map(), 2) y[:, 0] = x.real y[:, 1] = x.imag self.interface.preconditioner.ApplyInverse(y, z) out = ComplexEpetraInterface.ComplexVector(z[:, 0], z[:, 1]) return out
def ApplyInverse(self, x, y): self.prec.ApplyInverse(x, y) assert x.NumVectors() == 2 # Create a view here because this is an Epetra.MultiVector. y = EpetraInterface.Vector(Epetra.View, y, 0, y.NumVectors()) y = ComplexEpetraInterface.ComplexVector(y[:, 0], y[:, 1]) z = self.op.proj(y) y *= 0.0 y += z return 0
def solve(self, op, rhs, tol, maxit): solver_parameters = self.parameters.sublist('Solver') iterative_solver_parameters = solver_parameters.sublist( 'Iterative Solver') iterative_solver_parameters.set('Convergence Tolerance', tol if maxit > 1 else 1e-3) # iterative_solver_parameters.set('Maximum Iterations', maxit) solver_parameters.set('Complex', True) solver_parameters.set('Use Bordering', True) x = EpetraInterface.Vector(rhs.real.Map(), 2) y = EpetraInterface.Vector(rhs.real.Map(), 2) x[:, 0] = rhs.real x[:, 1] = rhs.imag m = op.Q.real.NumVectors() Q = EpetraInterface.Vector(rhs.real.Map(), m * 2) Q[:, 0:m] = op.Q.real Q[:, m:2 * m] = op.Q.imag Z = EpetraInterface.Vector(rhs.real.Map(), m * 2) Z[:, 0:m] = op.Z.real Z[:, m:2 * m] = op.Z.imag epetra_op = ComplexEpetraInterface.Operator(ShiftedOperator(op)) if self.preconditioned_solve: solver = HYMLS.Solver(epetra_op, self.interface.preconditioner, self.parameters) solver.SetBorder(Z, Q) self.interface.preconditioner.Compute() solver.ApplyInverse(x, y) solver.UnsetBorder() else: raise Exception('Not implemented') out = ComplexEpetraInterface.ComplexVector(y[:, 0], y[:, 1]) return out
def generate_Complex_Epetra_test_matrix(map, shape, dtype): try: from PyTrilinos import Epetra from jadapy import ComplexEpetraInterface except ImportError: pytest.skip("Trilinos not found") a1 = generate_test_matrix(shape, dtype) a2 = ComplexEpetraInterface.CrsMatrix(Epetra.Copy, map, shape[1]) for i in range(shape[0]): for j in range(shape[1]): a2[i, j] = a1[i, j] a2.FillComplete() return a1, a2