コード例 #1
0
ファイル: JadaHYMLSInterface.py プロジェクト: ipelupessy/fvm
    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
コード例 #2
0
ファイル: JadaHYMLSInterface.py プロジェクト: ipelupessy/fvm
    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