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) if rhs.shape[1] == 2: solver_parameters.set('Complex', True) else: solver_parameters.set('Complex', False) out = EpetraInterface.Vector(rhs) epetra_op = EpetraInterface.Operator(op) if self.preconditioned_solve: epetra_precop = JadaHYMLSPrecOp(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(rhs, out) return out
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) if rhs.shape[1] == 2: solver_parameters.set('Complex', True) else: solver_parameters.set('Complex', False) solver_parameters.set('Use Bordering', True) out = EpetraInterface.Vector(rhs) epetra_op = EpetraInterface.Operator(ShiftedOperator(op)) if self.preconditioned_solve: solver = HYMLS.Solver(epetra_op, self.interface.preconditioner, self.parameters) solver.SetBorder(op.Z, op.Q) self.interface.preconditioner.Compute() solver.ApplyInverse(rhs, out) solver.UnsetBorder() else: raise Exception('Not implemented') return out