183 const char* message, SUNErrCode errCode,
void* pData, SUNContext sunContext)
199 std::vector<double>& rInitialY,
204 assert(maxStep > 0.0);
207#if CHASTE_SUNDIALS_VERSION >= 60000
208 N_Vector initial_values = N_VMake_Serial(rInitialY.size(), &(rInitialY[0]), CvodeContextManager::Instance()->GetSundialsContext());
210 N_Vector initial_values = N_VMake_Serial(rInitialY.size(), &(rInitialY[0]));
212 assert(NV_DATA_S(initial_values) == &(rInitialY[0]));
213 assert(!NV_OWN_DATA_S(initial_values));
223 for (
unsigned i = 0; i < size; i++)
236#if CHASTE_SUNDIALS_VERSION >= 60000
237 mpCvodeMem = CVodeCreate(CV_BDF, CvodeContextManager::Instance()->GetSundialsContext());
238#elif CHASTE_SUNDIALS_VERSION >= 40000
249#if CHASTE_SUNDIALS_VERSION >= 70000
250 SUNContext_PushErrHandler(CvodeContextManager::Instance()->GetSundialsContext(), CvodeErrorHandler,
nullptr);
252 CVodeSetErrHandlerFn(
mpCvodeMem, CvodeErrorHandler,
nullptr);
257#if CHASTE_SUNDIALS_VERSION >= 20400
264#if CHASTE_SUNDIALS_VERSION >= 20400
265 CVodeInit(
mpCvodeMem, CvodeRhsAdaptor, startTime, initial_values);
268 CVodeMalloc(
mpCvodeMem, CvodeRhsAdaptor, startTime, initial_values,
275#if CHASTE_SUNDIALS_VERSION >= 20400
276 CVodeRootInit(
mpCvodeMem, 1, CvodeRootAdaptor);
283#if CHASTE_SUNDIALS_VERSION >= 60000
284 mpSundialsDenseMatrix = SUNDenseMatrix(rInitialY.size(), rInitialY.size(), CvodeContextManager::Instance()->GetSundialsContext());
285#elif CHASTE_SUNDIALS_VERSION >= 30000
286 mpSundialsDenseMatrix = SUNDenseMatrix(rInitialY.size(), rInitialY.size());
289#if CHASTE_SUNDIALS_VERSION >= 60000
291 mpSundialsLinearSolver = SUNLinSol_Dense(initial_values, mpSundialsDenseMatrix, CvodeContextManager::Instance()->GetSundialsContext());
294 CVodeSetLinearSolver(
mpCvodeMem, mpSundialsLinearSolver, mpSundialsDenseMatrix);
295#elif CHASTE_SUNDIALS_VERSION >= 40000
297 mpSundialsLinearSolver = SUNLinSol_Dense(initial_values, mpSundialsDenseMatrix);
300 CVodeSetLinearSolver(
mpCvodeMem, mpSundialsLinearSolver, mpSundialsDenseMatrix);
301#elif CHASTE_SUNDIALS_VERSION >= 30000
303 mpSundialsLinearSolver = SUNDenseLinearSolver(initial_values, mpSundialsDenseMatrix);
306 CVDlsSetLinearSolver(
mpCvodeMem, mpSundialsLinearSolver, mpSundialsDenseMatrix);
318#if CHASTE_SUNDIALS_VERSION >= 20400
324#if CHASTE_SUNDIALS_VERSION >= 20400
325 CVodeReInit(
mpCvodeMem, startTime, initial_values);
328 CVodeReInit(
mpCvodeMem, CvodeRhsAdaptor, startTime, initial_values,
332#if CHASTE_SUNDIALS_VERSION >= 30000
333 if (mpSundialsLinearSolver)
336 SUNLinSolFree(mpSundialsLinearSolver);
338 if (mpSundialsDenseMatrix)
341 SUNMatDestroy(mpSundialsDenseMatrix);
345#if CHASTE_SUNDIALS_VERSION >= 60000
346 mpSundialsDenseMatrix = SUNDenseMatrix(rInitialY.size(), rInitialY.size(), CvodeContextManager::Instance()->GetSundialsContext());
348 mpSundialsDenseMatrix = SUNDenseMatrix(rInitialY.size(), rInitialY.size());
351#if CHASTE_SUNDIALS_VERSION >= 60000
353 mpSundialsLinearSolver = SUNLinSol_Dense(initial_values, mpSundialsDenseMatrix, CvodeContextManager::Instance()->GetSundialsContext());
356 CVodeSetLinearSolver(
mpCvodeMem, mpSundialsLinearSolver, mpSundialsDenseMatrix);
357#elif CHASTE_SUNDIALS_VERSION >= 40000
359 mpSundialsLinearSolver = SUNLinSol_Dense(initial_values, mpSundialsDenseMatrix);
362 CVodeSetLinearSolver(
mpCvodeMem, mpSundialsLinearSolver, mpSundialsDenseMatrix);
365 mpSundialsLinearSolver = SUNDenseLinearSolver(initial_values, mpSundialsDenseMatrix);
368 CVDlsSetLinearSolver(
mpCvodeMem, mpSundialsLinearSolver, mpSundialsDenseMatrix);
448 std::vector<double>& rYValues,
454 assert(endTime > startTime);
455 assert(timeSampling > 0.0);
460 EXCEPTION(
"(Solve with sampling) Stopping event is true for initial condition");
463 SetupCvode(pOdeSystem, rYValues, startTime, maxStep);
465 TimeStepper stepper(startTime, endTime, timeSampling);
466#if CHASTE_SUNDIALS_VERSION >= 60000
467 N_Vector yout = N_VMake_Serial(rYValues.size(), &(rYValues[0]), CvodeContextManager::Instance()->GetSundialsContext());
469 N_Vector yout = N_VMake_Serial(rYValues.size(), &(rYValues[0]));
476 solutions.
rGetTimes().push_back(startTime);
484 assert(ierr == CV_SUCCESS);
493 CvodeError(ierr,
"CVODE failed to solve system");
498 if (ierr == CV_ROOT_RETURN)
512 assert(ierr == CV_SUCCESS);
521 std::vector<double>& rYValues,
526 assert(endTime > startTime);
531 EXCEPTION(
"(Solve) Stopping event is true for initial condition");
534 SetupCvode(pOdeSystem, rYValues, startTime, maxStep);
536#if CHASTE_SUNDIALS_VERSION >= 60000
537 N_Vector yout = N_VMake_Serial(rYValues.size(), &(rYValues[0]), CvodeContextManager::Instance()->GetSundialsContext());
539 N_Vector yout = N_VMake_Serial(rYValues.size(), &(rYValues[0]));
543 int ierr = CVodeSetStopTime(
mpCvodeMem, endTime);
544 assert(ierr == CV_SUCCESS);
548 ierr = CVode(
mpCvodeMem, endTime, yout, &tend, CV_NORMAL);
553 CvodeError(ierr,
"CVODE failed to solve system");
555 if (ierr == CV_ROOT_RETURN)
561 assert(NV_DATA_S(yout) == &(rYValues[0]));
562 assert(!NV_OWN_DATA_S(yout));
569 assert(ierr == CV_SUCCESS);
580 mLastInternalStepSize(-0.0),
582 mCheckForRoots(false),
583 mLastSolutionState(nullptr),
584 mLastSolutionTime(0.0),
585#if CHASTE_SUNDIALS_VERSION >= 20400
590 mForceMinimalReset(false)
591#if CHASTE_SUNDIALS_VERSION >= 30000
593 mpSundialsDenseMatrix(nullptr),
594 mpSundialsLinearSolver(nullptr)