Example #1
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
Example #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)
        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