def __init__(self, c_ptr): check_ptr(c_ptr) self.c_ptr = c_ptr def finalize(c_ptr: CPointer, release_borrowed: Callable[[], None]) -> None: if c_ptr == ffi.NULL: logger.warn("Trying to free Solver, but it is NULL.") else: logger.debug("Freeing Solver") lib.SUNNonlinSolFree(c_ptr) release_borrowed() weakref.finalize(self, finalize, self.c_ptr, self.release_borrowed_func())
def __init__(self, problem: Problem, *, solver: str = 'BDF', jac_kind: str = "dense"): super().__init__() self.mark_changed() self.problem = problem self.user_data = problem.make_user_data() self._state_buffer = sunode.empty_vector(self.n_states) self._state_buffer.data[:] = 0. self.borrow(self._state_buffer) if jac_kind == 'dense': self._jac = matrix.empty_matrix((self.n_states, self.n_states)) elif jac_kind == 'sparse': self._jac = problem.make_rhs_sparse_jac_template() else: raise ValueError(f'Unknown jac_kind {jac_kind}.') self.borrow(self._jac) if solver == 'BDF': self.c_ptr = check_ptr(lib.CVodeCreate(lib.CV_BDF)) elif solver == 'ADAMS': self.c_ptr = check_ptr(lib.CVodeCreate(lib.CV_ADAMS)) else: raise ValueError(f'Unknown solver {solver}.') self._rhs = self.problem.make_sundials_rhs() def finalize(c_ptr: CPointer, release_borrowed: Callable[[], None]) -> None: if c_ptr == ffi.NULL: logger.warn("Trying to free Solver, but it is NULL.") else: logger.debug("Freeing Solver") lib.CVodeFree(c_ptr) release_borrowed() weakref.finalize(self, finalize, self.c_ptr, self.release_borrowed_func())
def __init__(self, vector: Vector, matrix: Sparse): c_ptr = check_ptr(lib.SunLinSol_KLU(vector.c_ptr, matrix.c_ptr)) self._last_nnz = matrix.nnz super().__init__(c_ptr)
def __init__(self, vector: Vector, matrix: Dense): c_ptr = check_ptr(lib.SunLinSol_LapackDense(vector.c_ptr, matrix.c_ptr)) super().__init__(c_ptr)
def __init__(self, vector: Vector, matrix: Band): c_ptr = check_ptr(lib.SUNLinSol_Band(vector.c_ptr, matrix.c_ptr)) super().__init__(c_ptr)