def _solve_(self, L, x, b): diag = L.takeDiagonal() maxdiag = max(numerix.absolute(diag)) L = L * (1 / maxdiag) b = b * (1 / maxdiag) LU = superlu.factorize(L.matrix.to_csr()) if DEBUG: import sys print(L.matrix, file=sys.stderr) error0 = numerix.sqrt(numerix.sum((L * x - b)**2)) for iteration in range(self.iterations): errorVector = L * x - b if (numerix.sqrt(numerix.sum(errorVector**2)) / error0) <= self.tolerance: break xError = numerix.zeros(len(b), 'd') LU.solve(errorVector, xError) x[:] = x - xError if 'FIPY_VERBOSE_SOLVER' in os.environ: from fipy.tools.debug import PRINT PRINT('iterations: %d / %d' % (iteration+1, self.iterations)) PRINT('residual:', numerix.sqrt(numerix.sum(errorVector**2)))
def _solve_(self, L, x, b): diag = L.takeDiagonal() maxdiag = max(numerix.absolute(diag)) L = L * (1 / maxdiag) b = b * (1 / maxdiag) LU = splu(L.matrix.asformat("csc"), diag_pivot_thresh=1., relax=1, panel_size=10, permc_spec=3) error0 = numerix.sqrt(numerix.sum((L * x - b)**2)) for iteration in range(min(self.iterations, 10)): errorVector = L * x - b if (numerix.sqrt(numerix.sum(errorVector**2)) / error0) <= self.tolerance: break xError = LU.solve(errorVector) x[:] = x - xError if 'FIPY_VERBOSE_SOLVER' in os.environ: from fipy.tools.debug import PRINT PRINT('iterations: %d / %d' % (iteration+1, self.iterations)) PRINT('residual:', numerix.sqrt(numerix.sum(errorVector**2))) return x
def _solve_(self, L, x, b): diag = L.takeDiagonal() maxdiag = max(numerix.absolute(diag)) L = L * (1 / maxdiag) b = b * (1 / maxdiag) LU = splu(L.matrix.asformat("csc"), diag_pivot_thresh=1., drop_tol=0., relax=1, panel_size=10, permc_spec=3) error0 = numerix.sqrt(numerix.sum((L * x - b)**2)) for iteration in range(min(self.iterations, 10)): errorVector = L * x - b if (numerix.sqrt(numerix.sum(errorVector**2)) / error0) <= self.tolerance: break xError = LU.solve(errorVector) x[:] = x - xError if 'FIPY_VERBOSE_SOLVER' in os.environ: from fipy.tools.debug import PRINT PRINT('iterations: %d / %d' % (iteration + 1, self.iterations)) PRINT('residual:', numerix.sqrt(numerix.sum(errorVector**2))) return x
def _solve_(self, L, x, b): diag = L.takeDiagonal() maxdiag = max(numerix.absolute(diag)) L = L * (1 / maxdiag) b = b * (1 / maxdiag) LU = superlu.factorize(L.matrix.to_csr()) if DEBUG: import sys print >> sys.stderr, L.matrix error0 = numerix.sqrt(numerix.sum((L * x - b)**2)) for iteration in range(self.iterations): errorVector = L * x - b if (numerix.sqrt(numerix.sum(errorVector**2)) / error0) <= self.tolerance: break xError = numerix.zeros(len(b),'d') LU.solve(errorVector, xError) x[:] = x - xError if 'FIPY_VERBOSE_SOLVER' in os.environ: from fipy.tools.debug import PRINT PRINT('iterations: %d / %d' % (iteration+1, self.iterations)) PRINT('residual:', numerix.sqrt(numerix.sum(errorVector**2)))
def _solve_(self, L, x, b): diag = L.takeDiagonal() maxdiag = max(numerix.absolute(diag)) L = L * (1 / maxdiag) b = b * (1 / maxdiag) LU = superlu.factorize(L._getMatrix().to_csr()) error0 = numerix.sqrt(numerix.sum((L * x - b)**2)) for iteration in range(self.iterations): errorVector = L * x - b if (numerix.sqrt(numerix.sum(errorVector**2)) / error0) <= self.tolerance: break xError = numerix.zeros(len(b),'d') LU.solve(errorVector, xError) x[:] = x - xError
def _solve_(self, L, x, b): for iteration in range(self.iterations): # errorVector = L*x - b errorVector = Epetra.Vector(L.RowMap()) L.Multiply(False, x, errorVector) errorVector = errorVector - b tol = max(numerix.absolute(_trilinosToNumpyVector(errorVector))) if iteration == 0: tol0 = tol if (tol / tol0) <= self.tolerance: break xError = _numpyToTrilinosVector(numerix.zeros(errorVector.GlobalLength(), 'd'), L.RowMap()) Problem = Epetra.LinearProblem(L, xError, errorVector) Solver = self.Factory.Create("Klu", Problem) Solver.Solve() x[:] = x - xError