1 #include <../../nrnconf.h>
86 if (
ctd_[0].cv_memb_list_ ==
nullptr) {
103 int i,
j, zneq, zneq_v, zneq_cap_v;
110 for (
int id = 0;
id <
nctd_; ++
id) {
135 zneq_cap_v += ml.nodecount;
144 for (
auto& ml: cml->
ml) {
145 zneq += ml.nodecount * count;
157 printf(
"%d Cvode::init_eqn id=%d neq_v_=%d #nonvint=%d #nonvint_extra=%d nvsize=%d\n",
167 global_neq_ = nrnmpi_int_sum_reduce(
neq_);
172 for (
int id = 0;
id <
nctd_; ++
id) {
190 zneq_cap_v += ml.nodecount;
196 for (
i = 0;
i < zneq; ++
i) {
206 if (x != 0 && x < vtol) {
210 for (
i = 0;
i < zneq_cap_v; ++
i) {
226 for (
int j = 0;
j < ml.nodecount; ++
j) {
227 auto*
const node = ml.nodelist[
j];
242 int nocap_child_index = 0;
274 std::vector<neuron::container::data_handle<double>> pv, pvdot;
275 for (
auto& ml: cml->
ml) {
285 for (
j = 0;
j < ml.nodecount; ++
j) {
286 mf.
ode_map(ml.prop[
j], ieq, pv.data(), pvdot.data(), atv + ieq, cml->
index);
287 for (
auto k = 0;
k <
n; ++
k) {
288 z.
pv_[
k + ieq] =
static_cast<double*
>(pv[
k]);
289 z.
pvdot_[
k + ieq] =
static_cast<double*
>(pvdot[
k]);
299 for (
int id = 0;
id <
nctd_; ++
id) {
323 for (
auto& ml: cml->ml) {
324 for (
auto i = 0;
i < ml.nodecount; ++
i) {
343 ncm->index = cml->index;
347 for (
auto& ml: cml->ml) {
348 for (
auto i = 0;
i < ml.nodecount; ++
i) {
350 auto& newml = ncm->ml.emplace_back(cml->index );
352 newml.nodelist =
new Node* [1] { ml.nodelist[
i] };
353 assert(newml.nodelist[0] == ml.nodelist[
i]);
354 newml.nodeindices =
new int[1]{ml.nodeindices[
i]};
355 newml.prop =
new Prop* [1] { ml.prop[
i] };
358 newml.set_storage_offset(ml.get_storage_offset() +
i);
359 newml.pdata =
new Datum* [1] { ml.pdata[
i] };
361 newml._thread = ml._thread;
365 assert(ncm->ml.size() == std::size_t(
n));
381 int i,
j, in, ie,
k, zneq;
395 zneq += std::accumulate(cml->
ml.begin(),
398 [](
int total,
auto& ml) { return total + ml.nodecount; }) *
422 if (x != 0 && x < vtol) {
430 for (in = 0; in < _nt->
end; ++in) {
439 for (ie = 0; ie <
nlayer; ++ie) {
441 z.
pv_[
k] =
static_cast<double*
>(
443 z.
pvdot_[
k] =
static_cast<double*
>(
467 auto const ode_map = mf.ode_map;
469 std::vector<neuron::container::data_handle<double>> pv(
n), pvdot(
n);
470 for (
auto& ml: cml->
ml) {
471 for (
j = 0;
j < ml.nodecount; ++
j) {
473 ode_map(ml.prop[
j], ieq, pv.data(), pvdot.data(), atv + ieq, cml->
index);
474 for (
auto k = 0;
k <
n; ++
k) {
475 z.
pv_[
k + ieq] =
static_cast<double*
>(pv[
k]);
476 z.
pvdot_[
k + ieq] =
static_cast<double*
>(pvdot[
k]);
490 N_Vector subvec = ((N_Vector*) N_VGetArrayPointer(
v))[tid];
491 return N_VGetArrayPointer(subvec);
493 return N_VGetArrayPointer(
v);
508 for (
auto& ml: cml->ml) {
605 nrn_digest_dbl_array(
"solvex enter b", nt->
id,
t_, b, z.
nvsize_);
606 nrn_digest_dbl_array(
"solvex enter y", nt->
id,
t_, y, z.
nvsize_);
609 lhs(sorted_token, nt);
623 (*nrn_multisplit_solve_)();
644 nrn_digest_dbl_array(
"solvex leave b", nt->
id,
t_, b, z.
nvsize_);
663 lhs(sorted_token, nt);
704 for (
auto& ml: cml->
ml) {
707 hoc_warning(
"errno set during ode jacobian solve",
nullptr);
723 nrn_digest_dbl_array(
"y", nt->
id, tt, y, z.
nvsize_);
731 if (nrn_digest_ && ydot) {
732 nrn_digest_dbl_array(
"ydot", nt->
id, tt, ydot, z.
nvsize_);
758 nrnmpi_assert_opstep(opmode_, nt->
_t);
773 (*nrnthread_v_transfer_)(nt);
777 rhs(sorted_token, nt);
783 do_ode(sorted_token, *nt);
793 vec_sav_rhs[
i] *= vec_area[
i] * 0.01;
796 vec_sav_rhs[
i] *= vec_area[
i] * 0.01;
818 nrnmpi_assert_opstep(opmode_, nt->
_t);
837 (*nrnthread_v_transfer_)(nt);
846 rhs(sorted_token, nt);
848 do_ode(sorted_token, *nt);
860 for (
auto* ba = baml; ba; ba = ba->
next) {
862 for (
auto*
const ml: ba->ml) {
863 for (
int i = 0;
i < ml->nodecount; ++
i) {
864 f(ml->nodelist[
i], ml->pdata[
i], ml->_thread, nt, ml,
i, sorted_token);
916 vec_rhs[parent_i] -= vec_a[
i] * vec_v[
i];
917 vec_d[parent_i] -= vec_a[
i];
962 vec_rhs[parent_i] -= vec_a[
i] * vec_v[
i];
963 vec_d[parent_i] -= vec_a[
i];
990 for (
auto& ml: cml->ml) {
991 ode_spec(sorted_token, &nt, &ml, cml->index);
993 hoc_warning(
"errno set during ode evaluation",
nullptr);
1023 for (
auto& ml: cml->
ml) {
1025 mf.
state(sorted_token, _nt, &ml, cml->
index);
1035 for (
id = 0;
id <
nctd_; ++
id) {
1046 for (
id = 0;
id <
nctd_; ++
id) {
1057 for (
id = 0;
id <
nctd_; ++
id) {
1068 for (
id = 0;
id <
nctd_; ++
id) {
1095 z.
record_ =
new std::vector<PlayRecord*>();
1113 for (
auto& item: *(z.
record_)) {
1114 item->continuous(
t_);
1127 for (
auto& item: *(z.
record_)) {
1128 item->continuous(
t_);
1136 z.
play_ =
new std::vector<PlayRecord*>();
1148 for (
auto& item: *(z.
play_)) {
1149 item->continuous(tt);
1158 for (
auto& item: *(z.
play_)) {
1159 item->continuous(tt);
void fun_thread_transfer_part2(neuron::model_sorted_token const &, double *ydot, NrnThread *nt)
void fun_thread_ms_part2(NrnThread *nt)
void solvemem(neuron::model_sorted_token const &, NrnThread *)
void do_nonode(neuron::model_sorted_token const &, NrnThread *nt=0)
void rhs(neuron::model_sorted_token const &, NrnThread *)
void rhs_memb(neuron::model_sorted_token const &, CvMembList *, NrnThread *)
int solvex_thread_part2(NrnThread *nt)
void fun_thread_transfer_part1(neuron::model_sorted_token const &, double t, double *y, NrnThread *nt)
void play_continuous_thread(double t, NrnThread *)
int solvex_thread(neuron::model_sorted_token const &, double *b, double *y, NrnThread *nt)
void record_add(PlayRecord *)
void play_add(PlayRecord *)
int setup(N_Vector ypred, N_Vector fpred)
void play_continuous(double t)
void fun_thread_ms_part4(double *ydot, NrnThread *nt)
void nocap_v_part2(NrnThread *)
void before_after(neuron::model_sorted_token const &, BAMechList *, NrnThread *)
void new_no_cap_memb(CvodeThreadData &, NrnThread *)
void fun_thread_ms_part34(double *ydot, NrnThread *nt)
void fun_thread_ms_part1(double t, double *y, NrnThread *nt)
void record_continuous_thread(NrnThread *)
int solvex_thread_part3(double *b, NrnThread *nt)
void fun_thread(neuron::model_sorted_token const &, double t, double *y, double *ydot, NrnThread *nt)
void nocap_v_part3(NrnThread *)
void fun_thread_ms_part3(NrnThread *nt)
double * n_vector_data(N_Vector, int)
void nocap_v_part1(NrnThread *)
void do_ode(neuron::model_sorted_token const &, NrnThread &)
void lhs_memb(neuron::model_sorted_token const &, CvMembList *, NrnThread *)
void lhs(neuron::model_sorted_token const &, NrnThread *)
void nocap_v(neuron::model_sorted_token const &, NrnThread *)
int solvex_thread_part1(double *b, NrnThread *nt)
void scatter_y(neuron::model_sorted_token const &, double *, int)
void scatter_ydot(double *, int)
void gather_ydot(N_Vector)
void error_weights(double *)
int nonvint_extra_offset_
std::vector< double * > pv_
CvMembList * cv_memb_list_
void delete_memb_list(CvMembList *)
std::vector< int > no_cap_indices_
CvMembList * no_cap_memb_
BAMechList * before_breakpoint_
BAMechList * after_solve_
int rootnode_begin_index_
std::vector< double * > pvdot_
std::vector< PlayRecord * > * record_
BAMechList * before_step_
std::vector< PlayRecord * > * play_
std::vector< int > no_cap_child_indices_
Symbol * hoc_table_lookup(const char *, Symlist *)
int nrn_errno_check(int i)
static void ode_spec(neuron::model_sorted_token const &token, NrnThread *, Memb_list *ml, int type)
static int ode_count(int type)
static void ode_matsol(neuron::model_sorted_token const &token, NrnThread *nt, Memb_list *ml, int type)
static void ode_map(Prop *prop, int ieq, neuron::container::data_handle< double > *pv, neuron::container::data_handle< double > *pvdot, double *atol, int type)
void long_difus_solve(neuron::model_sorted_token const &sorted_token, int method, NrnThread &nt)
void(*)(Node *, Datum *, Datum *, NrnThread *, Memb_list *, std::size_t, neuron::model_sorted_token const &) nrn_bamech_t
auto for_threads(NrnThread *threads, int num_threads)
void(* nrn_multisplit_solve_)()
void nrn_mul_capacity(NrnThread *, Memb_list *, int)
void nrn_div_capacity(NrnThread *, Memb_list *, int)
void nrn_multithread_job(F &&job, Args &&... args)
void hoc_warning(const char *s1, const char *s2)
constexpr do_not_search_t do_not_search
#define nrn_nonvint_block_ode_fun(size, y, ydot, tid)
#define nrn_nonvint_block_ode_count(offset, tid)
#define nrn_nonvint_block_jacobian(size, ypred, ydot, tid)
#define nrn_nonvint_block_ode_abstol(size, y, tid)
#define nrn_nonvint_block_ode_solve(size, b, y, tid)
neuron::model_sorted_token nrn_ensure_model_data_are_sorted()
Ensure neuron::container::* data are sorted.
#define nrn_assert(x)
assert()-like macro, independent of NDEBUG status
static Node * node(Object *)
void nrndae_dkmap(std::vector< double * > &pv, std::vector< double * > &pvdot)
int const size_t const size_t n
std::vector< Memb_func > memb_func
static void pr(N_Vector x)
void nrn_extra_scatter_gather(int, int)
void(* nrn_multisplit_setup_)()
void(* nrnthread_v_transfer_)(NrnThread *)
static void * gather_y_thread(NrnThread *nt)
void nrn_multisplit_nocap_v_part1(NrnThread *)
static N_Vector gather_vec
static void * gather_ydot_thread(NrnThread *nt)
void * nrn_multisplit_triang(NrnThread *)
void nrn_multisplit_adjust_rhs(NrnThread *)
void nrn_multisplit_nocap_v()
static void nonode_thread(neuron::model_sorted_token const &sorted_token, NrnThread &nt)
void * nrn_multisplit_bksub(NrnThread *)
void nrn_multisplit_nocap_v_part2(NrnThread *)
void * nrn_multisplit_reduce_solve(NrnThread *)
void(* nrnmpi_v_transfer_)()
void nrn_multisplit_nocap_v_part3(NrnThread *)
int spGetSize(char *eMatrix, BOOLEAN External)
Symlist * hoc_built_in_symlist
Wrapper for Memb_list in CVode related code.
std::vector< Memb_list > ml
nrn_ode_synonym_t ode_synonym
nrn_ode_count_t ode_count
nrn_ode_matsol_t ode_matsol
Represent main neuron object computed by single thread.
double * node_a_storage()
double * node_sav_rhs_storage()
double * node_rhs_storage()
double * node_area_storage()
double * node_d_storage()
double * node_voltage_storage()
double * node_b_storage()
Non-template stable handle to a generic value.