Beispiel #1
0
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()
Beispiel #2
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)

        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
Beispiel #3
0
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)
Beispiel #4
0
    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
Beispiel #5
0
    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
Beispiel #6
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
Beispiel #7
0
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