1 #include <../../nrnconf.h>
16 #include "ida/ida_impl.h"
39 extern booleantype
IDAEwtSet(IDAMem IDA_mem, N_Vector ycur);
43 #define nt_dt nrn_threads->_dt
44 #define nt_t nrn_threads->_t
50 static int res_gvardt(realtype
t, N_Vector y, N_Vector yp, N_Vector delta,
void* rdata);
52 static int minit(IDAMem);
54 static int msetup(IDAMem mem,
62 static int msolve(IDAMem mem, N_Vector b, N_Vector ycur, N_Vector ypcur, N_Vector deltacur);
64 static int mfree(IDAMem);
68 #define thread_t nrn_thread_t
91 static int res_gvardt(realtype
t, N_Vector y, N_Vector yp, N_Vector delta,
void* rdata) {
109 static int msetup(IDAMem mem, N_Vector y, N_Vector yp, N_Vector, N_Vector, N_Vector, N_Vector) {
126 static int msolve(IDAMem mem, N_Vector b, N_Vector w, N_Vector ycur, N_Vector, N_Vector) {
156 IDAFree((IDAMem)
mem_);
169 IDAMem mem = (IDAMem) IDACreate();
173 IDASetRdata(mem,
cv_);
176 mem->ida_linit =
minit;
179 mem->ida_lfree =
mfree;
180 mem->ida_setupNonNull =
false;
195 auto*
const nt = &ntr;
199 cv->
do_ode(sorted_token, ntr);
210 double norm = N_VWrmsNorm(ida->
delta_, ((IDAMem) (ida->
mem_))->ida_ewt);
214 printf(
" %3d %22.15g %22.15g %22.15g\n",
i,
215 N_VGetArrayPointer(ida->
cv_->
y_)[
i],
216 N_VGetArrayPointer(ida->
yp_)[
i],
217 N_VGetArrayPointer(ida->
delta_)[
i]);
227 printf(
"Daspk_init t_=%20.12g t-t_=%g t0_-t_=%g\n",
238 double dtinv = 1. /
dteps_;
269 N_VScale(dtinv,
yp_,
yp_);
291 Printf(
"IDA initialization failure, weighted norm of residual=%g\n",
norm);
295 Printf(
"IDA initialization warning, weighted norm of residual=%g\n",
norm);
298 Printf(
"IDA initialization warning, weighted norm of residual=%g\n",
norm);
301 Printf(
" subtracting (for next 1e-6 ms): f(y', y, %g)*exp(-1e7*(t-%g))\n",
nt_t,
nt_t);
326 IDASetStopTime(
mem_, tstop);
333 if (ier > 0 && t < cv_->t_) {
354 Printf(
"DASPK interpolate error\n");
369 printf(
"rwork size = %d\n", iwork_[18-1]);
370 printf(
"iwork size = %d\n", iwork_[17-1]);
371 printf(
"Number of time steps = %d\n", iwork_[11-1]);
372 printf(
"Number of residual evaluations = %d\n", iwork_[12-1]);
373 printf(
"Number of Jac evaluations = %d\n", iwork_[13-1]);
374 printf(
"Number of preconditioner solves = %d\n", iwork_[21-1]);
375 printf(
"Number of nonlinear iterations = %d\n", iwork_[19-1]);
376 printf(
"Number of linear iterations = %d\n", iwork_[20-1]);
377 double avlin = double(iwork_[20-1])/double(iwork_[19-1]);
378 printf(
"Average Krylov subspace dimension = %g\n", avlin);
379 printf(
"nonlinear conv. failures = %d\n", iwork_[15-1]);
380 printf(
"linear conv. failures = %d\n", iwork_[16-1]);
410 for (
i = 0;
i <
n; ++
i) {
433 for (
i = 0;
i <
n; ++
i) {
456 printf(
"Cvode::res enter tt=%g\n", tt);
458 printf(
" %d %g %g %g\n",
i, y[
i], yprime[
i], delta[
i]);
467 do_ode(sorted_token, *nt);
485 printf(
"Cvode::res after ode and gather_ydot into delta\n");
487 printf(
" %d %g %g %g\n",
i, y[
i], yprime[
i], delta[
i]);
501 for (
int i = 0;
i <
n; ++
i) {
507 cdvm = 1e-3 * ml->
data(
i, 0) * (yprime[
j] - yprime[
j + 1]);
509 delta[
j + 1] += cdvm;
511 ml->
data(
i, 1) = cdvm;
518 cdvm = 1e-3 * ml->
data(
i, 0) * yprime[
j];
520 ml->
data(
i, 1) = cdvm;
524 vec_sav_rhs[
j] += cdvm;
534 for (
int i = 0;
i <
n; ++
i) {
560 (yprime[jj] - yprime[jj + 1]);
573 delta[
i] -= yprime[
i];
583 delta[
i] -= tps[
i] * fac;
588 printf(
"Cvode::res exit res_=%d tt=%20.12g\n", res_, tt);
590 printf(
" %d %g %g %g\n",
i, y[
i], yprime[
i], delta[
i]);
597 e += delta[
i]*delta[
i];
599 printf(
"Cvode::res %d e=%g t=%.15g\n", res_, e, tt);
634 printf(
"before nrn_solve matrix cj=%g\n", cj);
636 printf(
"before nrn_solve actual_rhs=\n");
638 printf(
"%d %g\n",
i+1, actual_rhs[
i+1]);
645 printf(
"after nrn_solve actual_rhs=\n");
646 for (
i=0;
i < neq_v_; ++
i) {
647 printf(
"%d %g\n",
i+1, actual_rhs[
i+1]);
670 return ((IDAMem)
mem_)->ida_ewt;
674 return ((IDAMem)
mem_)->ida_delta;
void solvemem(neuron::model_sorted_token const &, NrnThread *)
void play_continuous_thread(double t, NrnThread *)
int psol(double, double *, double *, double, NrnThread *)
void daspk_scatter_y(N_Vector)
void play_continuous(double t)
void before_after(neuron::model_sorted_token const &, BAMechList *, NrnThread *)
int res(double, double *, double *, double *, NrnThread *)
double * n_vector_data(N_Vector, int)
void do_ode(neuron::model_sorted_token const &, NrnThread &)
void daspk_gather_y(N_Vector)
void scatter_y(neuron::model_sorted_token const &, double *, int)
void scatter_ydot(double *, int)
void gather_ydot(N_Vector)
BAMechList * after_solve_
std::vector< double * > pvdot_
static int init_try_again_
int interpolate(double tout)
static int first_try_init_failures_
int advance_tn(double tstop)
static int init_failure_style_
static bool eq(T x, T y, T e)
static double eps(double x)
int nrn_nlayer_extracellular
double norm(const Point3D &p1)
static void nrn_lhs(NrnThread *_nt)
void hoc_execerror(const char *s1, const char *s2)
static void nrn_rhs(NrnThread *_nt)
void nrn_multithread_job(F &&job, Args &&... args)
static void check(VecTNode &)
neuron::model_sorted_token nrn_ensure_model_data_are_sorted()
Ensure neuron::container::* data are sorted.
void nrndae_dkpsol(double)
static void do_ode_thread(neuron::model_sorted_token const &sorted_token, NrnThread &ntr)
void nrndae_dkres(double *, double *, double *)
static int res_gvardt(realtype t, N_Vector y, N_Vector yp, N_Vector delta, void *rdata)
static void daspk_nrn_solve(NrnThread *nt)
void nrn_daspk_init_step(double, double, int)
static N_Vector nvec_delta
static void * msolve_thread(NrnThread *nt)
void nrn_solve(NrnThread *)
static int msolve(IDAMem mem, N_Vector b, N_Vector ycur, N_Vector ypcur, N_Vector deltacur)
booleantype IDAEwtSet(IDAMem IDA_mem, N_Vector ycur)
static void * daspk_gather_thread(NrnThread *nt)
static void * daspk_scatter_thread(NrnThread *nt)
static void * res_thread(NrnThread *nt)
static int msetup(IDAMem mem, N_Vector y, N_Vector ydot, N_Vector delta, N_Vector tempv1, N_Vector tempv2, N_Vector tempv3)
int const size_t const size_t n
void spPrint(char *, int, int, int)
std::vector< Memb_list > ml
std::vector< neuron::container::data_handle< double > > param
A view into a set of mechanism instances.
std::vector< double * > data()
Get a vector of double* representing the model data.
Represent main neuron object computed by single thread.
double * node_sav_rhs_storage()
int Printf(const char *fmt, Args... args)