Esempio n. 1
0
    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())
Esempio n. 2
0
    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())
Esempio n. 3
0
 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)
Esempio n. 4
0
 def __init__(self, vector: Vector, matrix: Dense):
     c_ptr = check_ptr(lib.SunLinSol_LapackDense(vector.c_ptr,
                                                 matrix.c_ptr))
     super().__init__(c_ptr)
Esempio n. 5
0
 def __init__(self, vector: Vector, matrix: Band):
     c_ptr = check_ptr(lib.SUNLinSol_Band(vector.c_ptr, matrix.c_ptr))
     super().__init__(c_ptr)