1 #include <../../nrnconf.h>
22 #include "utils/profile/profiler_interface.h"
33 #include <fmt/format.h>
40 extern double chkarg(
int,
double low,
double high);
41 #if !defined(NRNMPI) || NRNMPI == 0
337 for (
int i = 0;
i < nt->
end;
i++) {
346 for (
int i = 0;
i < nt->
end;
i++) {
355 for (
int i = 0;
i < nt->
end; ++
i) {
364 for (
int i = 0;
i < nt->
end; ++
i) {
376 auto*
const _nt = &nt;
383 i2 = i1 + _nt->ncell;
399 _nt->_sp13_rhs[
i] = 0.;
401 for (
i = i1;
i < i3; ++
i) {
405 for (
i = i1;
i < i3; ++
i) {
409 auto const vec_sav_rhs = _nt->node_sav_rhs_storage();
411 for (
i = i1;
i < i3; ++
i) {
418 for (tml = _nt->tml; tml; tml = tml->
next)
433 hoc_warning(
"errno set during calculation of currents", (
char*) 0);
443 for (
i = i1;
i < i3; ++
i) {
471 for (
i = i2;
i < i3; ++
i) {
472 auto const pi = parent_i[
i];
473 auto const dv = vec_v[
pi] - vec_v[
i];
489 auto*
const _nt = &nt;
494 i2 = i1 + _nt->ncell;
507 auto*
const vec_d = _nt->node_d_storage();
508 for (
int i = i1;
i < i3; ++
i) {
512 auto const vec_sav_d = _nt->node_sav_d_storage();
514 for (
i = i1;
i < i3; ++
i) {
520 for (tml = _nt->tml; tml; tml = tml->
next)
525 jacob(sorted_token, _nt, tml->
ml, tml->
index);
529 hoc_warning(
"errno set during calculation of jacobian", (
char*) 0);
548 for (
i = i1;
i < i3; ++
i) {
549 vec_sav_d[
i] =
vec_d[
i] - vec_sav_d[
i];
572 for (
i = i2;
i < i3; ++
i) {
573 Node* nd = _nt->_v_node[
i];
574 auto const parent_i = _nt->_v_parent_index[
i];
575 auto*
const parent_nd = _nt->_v_node[parent_i];
576 auto const nd_a =
NODEA(nd);
577 auto const nd_b =
NODEB(nd);
583 *parent_nd->_d_matelm -= nd_a;
586 vec_d[parent_i] -= nd_a;
589 auto*
const vec_a = _nt->node_a_storage();
590 auto*
const vec_b = _nt->node_b_storage();
591 for (
i = i2;
i < i3; ++
i) {
593 vec_d[_nt->_v_parent_index[
i]] -= vec_a[
i];
627 "You can not locate a point process at\n\
628 position 0 or 1 if it needs an ion\n");
679 auto*
p =
new Prop{nd,
static_cast<short>(
type)};
747 #define PI 3.14159265358979323846
754 double ra, dx, rright, rleft;
762 sec->prop->dparam[2] =
sec->pt3d[
sec->npt3d - 1].arc;
768 for (
j = 0;
j <
sec->nnode - 1;
j++) {
770 for (
p = nd->
prop;
p;
p =
p->next) {
777 if (
sec->npt3d > 1) {
790 auto& diam =
p->param(0);
795 nd->
area() =
PI * diam * dx;
796 rleft = 1e-2 * ra * (dx / 2) / (
PI * diam * diam / 4.);
797 NODERINV(nd) = 1. / (rleft + rright);
803 sec->pnode[
j]->area() = 1.e2;
805 sec->recalc_area_ = 0;
819 extern int nrn_ra_set;
833 hoc_warning(
"Don't forget to set Ra in every section",
"eg. forall Ra=35.4");
855 std::fill_n(nt.node_a_storage(), nt.end, 0.0);
856 std::fill_n(nt.node_b_storage(), nt.end, 0.0);
860 if (!
sec->parentsec) {
880 for (
j = 1;
j <
sec->nnode;
j++) {
888 for (
j = 0;
j <
sec->nnode;
j++) {
939 if (x == 0. || x == 1.) {
943 if (
sec->recalc_area_) {
977 if (
sec->logical_connection) {
978 free(
sec->logical_connection);
979 sec->logical_connection = (
Pt3d*) 0;
1014 if ((
int)
chkarg(1, 0., 1.) == 1) {
1040 req =
chkarg(1, 0., 30000.);
1049 if (
n >
sec->pt3d_bsize) {
1050 sec->pt3d_bsize =
n;
1053 sec->pt3d_bsize = 0;
1064 sec->recalc_area_ = 1;
1068 if (
sec->pt3d[i0].d < 0.) {
1073 sec->pt3d[0].arc = 0.;
1076 for (
i = i0;
i <
n; ++
i) {
1079 t1 =
sec->pt3d[
i].x -
p->x;
1080 t2 =
sec->pt3d[
i].y -
p->y;
1081 t3 =
sec->pt3d[
i].z -
p->z;
1082 sec->pt3d[
i].arc =
p->arc +
sqrt(t1 * t1 + t2 * t2 + t3 * t3);
1084 sec->prop->dparam[2] =
sec->pt3d[
n - 1].arc;
1089 if (req !=
sec->pt3d_bsize) {
1091 free((
char*) (
sec->pt3d));
1093 sec->pt3d_bsize = 0;
1097 sec->pt3d_bsize = req;
1109 for (
i =
n - 1;
i >= i0; --
i) {
1111 p->x =
sec->pt3d[
i].x;
1112 p->y =
sec->pt3d[
i].y;
1113 p->z =
sec->pt3d[
i].z;
1114 p->d =
sec->pt3d[
i].d;
1116 sec->pt3d[i0].x = x;
1117 sec->pt3d[i0].y = y;
1118 sec->pt3d[i0].z = z;
1119 sec->pt3d[i0].d = d;
1128 i0 = (int)
chkarg(1, 0., (
double) (
n));
1137 sec->recalc_area_ = 1;
1144 sec->pt3d[
i].d = diam;
1152 i = (int)
chkarg(1, 0., (
double) (
n - 1));
1164 for (
i = i0 + 1;
i <
n; ++
i) {
1166 p->x =
sec->pt3d[
i].x;
1167 p->y =
sec->pt3d[
i].y;
1168 p->z =
sec->pt3d[
i].z;
1169 p->d =
sec->pt3d[
i].d;
1179 i0 = (int)
chkarg(1, 0., (
double) (
n - 1));
1190 if (
fabs(L -
sec->pt3d[
sec->npt3d - 1].arc) > .001) {
1193 for (
i = 0;
i <
sec->npt3d; ++
i) {
1194 x =
sec->pt3d[
i].arc / L;
1211 x0 =
sec->pt3d[0].x;
1212 y0 =
sec->pt3d[0].y;
1213 z0 =
sec->pt3d[0].z;
1214 l =
sec->pt3d[
sec->npt3d - 1].arc;
1217 for (
i = 0;
i <
sec->npt3d; ++
i) {
1218 sec->pt3d[
i].arc =
sec->pt3d[
i].arc * fac;
1219 sec->pt3d[
i].x = x0 + (
sec->pt3d[
i].x - x0) * fac;
1220 sec->pt3d[
i].y = y0 + (
sec->pt3d[
i].y - y0) * fac;
1221 sec->pt3d[
i].z = z0 + (
sec->pt3d[
i].z - z0) * fac;
1241 for (
i = 0;
i <
n;
i++) {
1242 sec->pt3d[
i].x = x[
i];
1243 sec->pt3d[
i].y = y[
i];
1244 sec->pt3d[
i].z = z[
i];
1245 sec->pt3d[
i].d = d[
i];
1313 d = (double)
sec->pt3d[
i].d;
1324 d = (double)
sec->pt3d[
i].d;
1368 if (
sec->logical_connection) {
1377 dx = x -
sec->pt3d[0].x;
1378 dy = y -
sec->pt3d[0].y;
1379 dz = z -
sec->pt3d[0].z;
1382 for (
i = 0;
i <
sec->npt3d; ++
i) {
1383 sec->pt3d[
i].x += dx;
1384 sec->pt3d[
i].y += dy;
1385 sec->pt3d[
i].z += dz;
1390 static int changed_;
1393 float x, y, z, dz, x1, y1;
1394 float nch, ich = 0.0, angle;
1404 if ((psec =
sec->parentsec) == (
Section*) 0) {
1422 x = psec->
pt3d[psec->
npt3d - 1].
x * arc1 + psec->
pt3d[0].
x * (1 - arc1);
1423 y = psec->
pt3d[psec->
npt3d - 1].
y * arc1 + psec->
pt3d[0].
y * (1 - arc1);
1424 z = psec->
pt3d[psec->
npt3d - 1].
z * arc1 + psec->
pt3d[0].
z * (1 - arc1);
1432 if (
fabs(y1) < 1e-6 &&
fabs(x1) < 1e-6) {
1433 Printf(
"nrn_define_shape: %s first and last 3-d point at same (x,y)\n",
secname(psec));
1436 angle =
atan2(y1, x1);
1438 if (arc > 0. && arc < 1.) {
1439 angle += 3.14159265358979323846 / 2.;
1452 angle += ich / (nch - 1.) * .8 - .4;
1455 x1 = x + len *
cos(angle);
1456 y1 = y + len *
sin(angle);
1458 for (
j = 0;
j <
sec->nnode - 1; ++
j) {
1459 double frac = ((double)
j + .5) / (double) (
sec->nnode - 1);
1461 x * (1 - frac) + x1 * frac,
1462 y * (1 - frac) + y1 * frac,
1468 sec->pt3d[
sec->npt3d - 1].arc = len;
1469 sec->prop->dparam[2] = len;
1493 static double x1, y1, ds;
1496 double diam, delta, temp,
ri,
area, ra, rleft = 0.0;
1502 x1 =
sec->pt3d[
j].arc;
1504 ds =
sec->pt3d[
sec->npt3d - 1].arc / ((double) (
sec->nnode - 1));
1506 si = (double) inode * ds;
1512 for (ihalf = 0; ihalf < 2; ihalf++) {
1517 double x2, y2, xj, xjp;
1519 xj =
sec->pt3d[
j].arc;
1521 if (
sec->pt3d[
j].d < 0 && xj >= si && xj < sip) {
1525 xjp =
sec->pt3d[jp].arc;
1526 if (xjp > sip || jp == npt - 1) {
1528 if (
fabs(xjp - xj) < 1e-10) {
1531 frac = (sip - xj) / (xjp - xj);
1534 y2 = (1. - frac) *
fabs(
sec->pt3d[
j].d) + frac *
fabs(
sec->pt3d[jp].d);
1544 diam += (y2 + y1) * delta;
1545 if (delta < 1e-15) {
1548 if ((temp = y2 * y1 / delta) == 0) {
1553 temp = .5 * (y2 - y1);
1554 temp =
sqrt(delta * delta + temp * temp);
1559 area += (y2 + y1) * temp;
1570 rleft =
ri * ra /
PI * (4. * .01);
1572 ri =
ri * ra /
PI * (4. * .01);
1578 NODERINV(
sec->pnode[inode]) = 1. / (rparent + rleft);
1580 if (
fabs(diam -
p->param(0)) > 1e-9 || diam < 1e-5) {
1583 sec->pnode[inode]->area() =
area * .5 *
PI;
1586 if (inode ==
sec->nnode - 2 &&
sec->pt3d[npt - 1].d < 0.) {
1589 sec->pnode[inode]->area() =
sec->pnode[inode]->area() + nspine *
spinearea;
1628 memb_list[
i].nodes_alloc(node_count, alloc_pdata);
1661 for (inode = 0; inode < _nt->end; inode++) {
1662 if (_nt->_v_parent[inode] !=
NULL) {
1663 _nt->_v_parent_index[inode] = _nt->_v_parent[inode]->v_node_index;
1678 std::vector<std::size_t> thread_counts(
nrn_nthread);
1697 auto const tid =
static_cast<NrnThread*
>(pnt->_vnt)->
id;
1698 ++thread_counts[tid];
1718 std::vector<std::size_t> thread_offsets(
nrn_nthread);
1720 thread_offsets[
j] = std::exchange(thread_counts[
j - 1], 0) + thread_offsets[
j - 1];
1725 auto const tid =
static_cast<NrnThread*
>(pnt->_vnt)->
id;
1726 memb_list[
i].pdata[thread_offsets[tid] + thread_counts[tid]++] = pnt->prop->dparam;
1754 printf(
"nrnthread %d node info\n", tid);
1756 for (
int i = 0;
i < nt.end; ++
i) {
1758 " _v_node[%2d]->v_node_index=%2d"
1759 " _v_parent[%2d]->v_node_index=%2d v=%g\n",
1761 nt._v_node[
i]->v_node_index,
1763 nt._v_parent[
i] ? nt._v_parent[
i]->v_node_index : -1,
1764 (*nt._v_node[
i]).v());
1773 if (nt->_sp13_rhs) {
1774 free(std::exchange(nt->_sp13_rhs,
nullptr));
1778 nt->_sp13mat = (
char*) 0;
1797 if (nt->_ecell_memb_list) {
1872 int in, err, extn,
neqn,
j;
1886 for (in = 0,
i = 1; in < nt->
end; ++in, ++
i) {
1892 for (in = 0; in < nt->
end; ++in) {
1903 for (ie = 0; ie <
nlayer; ++ie) {
1916 for (ie = 0; ie <
nlayer; ++ie) {
1917 int kp =
j + ie + 1;
1951 auto const type = mech_data.
type();
1955 std::size_t
const mech_data_size{mech_data.
size()};
1956 std::vector<short> pdata_fields_to_cache{};
1959 &pdata_fields_to_cache,
1962 if (field >= pdata_hack.size()) {
1964 pdata_hack.resize(field + 1);
1966 pdata_hack.at(
field).reserve(mech_data_size);
1967 pdata_fields_to_cache.push_back(
field);
1969 std::size_t global_i{}, trivial_counter{};
1970 std::vector<std::size_t> mech_data_permutation(mech_data_size,
1971 std::numeric_limits<std::size_t>::max());
1975 auto*
const ml = nt->_ml_list[
type];
1978 ml->set_storage_offset(global_i);
1982 cache.
thread.at(nt->id).mechanism_offset.at(
type) = global_i;
1984 auto nt_mech_count = 0;
1986 for (
auto i = 0;
i < nt->end; ++
i) {
1987 auto*
const nd = nt->_v_node[
i];
1989 for (
Prop*
p = nd->prop;
p;
p =
p->next) {
1990 if (
p->_type !=
type) {
2000 auto const current_global_row =
p->id().current_row();
2001 trivial_counter += (current_global_row == global_i);
2002 mech_data_permutation.at(current_global_row) = global_i++;
2003 for (
auto const field: pdata_fields_to_cache) {
2007 assert(ml->nodelist[nt_mech_count] == nd);
2008 assert(ml->nodeindices[nt_mech_count] == nd->v_node_index);
2012 assert(!ml || ml->nodecount == nt_mech_count);
2021 if (nt == pnt->_vnt) {
2022 auto const current_global_row = pnt->prop->id().current_row();
2023 trivial_counter += (current_global_row == global_i);
2024 mech_data_permutation.at(current_global_row) = global_i++;
2025 for (
auto const field: pdata_fields_to_cache) {
2027 pnt->prop->dparam +
field);
2033 if (global_i != mech_data_size) {
2041 auto missing_elements = mech_data_size - global_i;
2045 for (
auto global_row = 0ul; global_row < mech_data_size; ++global_row) {
2046 if (mech_data_permutation[global_row] == std::numeric_limits<std::size_t>::max()) {
2047 trivial_counter += (global_row == global_i);
2048 mech_data_permutation[global_row] = global_i++;
2050 if (missing_elements == 0) {
2055 if (global_i != mech_data_size) {
2056 std::ostringstream oss;
2057 oss <<
"(global_i = " << global_i <<
") != (mech_data_size = " << mech_data_size
2058 <<
") for " << mech_data.
name();
2059 throw std::runtime_error(oss.str());
2062 assert(trivial_counter <= mech_data_size);
2063 if (trivial_counter < mech_data_size) {
2071 mech_data.mark_as_sorted(sorted_token);
2086 auto const type = mech_data.
type();
2093 mech_cache.pdata_hack.end(),
2094 std::back_inserter(mech_cache.pdata),
2095 [](std::vector<Datum*>& pdata_hack) {
2096 std::vector<double*> tmp{};
2099 std::back_inserter(tmp),
2100 [](
Datum* datum) { return datum->get<double*>(); });
2102 pdata_hack.shrink_to_fit();
2105 mech_cache.pdata_hack.clear();
2108 mech_cache.pdata.end(),
2109 std::back_inserter(mech_cache.pdata_ptr_cache),
2110 [](
auto const&
pdata) { return pdata.empty() ? nullptr : pdata.data(); });
2129 std::size_t
const node_data_size{node_data.
size()};
2130 std::size_t global_i{};
2131 std::vector<std::size_t> node_data_permutation(node_data_size,
2132 std::numeric_limits<std::size_t>::max());
2138 nt->_node_data_offset = global_i;
2140 for (
int i = 0;
i < nt->end; ++
i, ++global_i) {
2141 Node* nd = nt->_v_node[
i];
2143 assert(current_node_row < node_data_size);
2144 assert(global_i < node_data_size);
2145 node_data_permutation.at(current_node_row) = global_i;
2148 if (global_i != node_data_size) {
2152 auto missing_elements = node_data_size - global_i;
2153 Printf(fmt::format(
"permuting {} 'lost' Nodes to the end\n", missing_elements).c_str());
2156 for (
auto global_row = 0ul; global_row < node_data_size; ++global_row) {
2157 if (node_data_permutation[global_row] == std::numeric_limits<std::size_t>::max()) {
2158 node_data_permutation[global_row] = global_i++;
2160 if (missing_elements == 0) {
2165 if (global_i != node_data_size) {
2166 std::ostringstream oss;
2167 oss <<
"(global_i = " << global_i <<
") != (node_data_size = " << node_data_size <<
')';
2168 throw std::runtime_error(oss.str());
2173 node_data.apply_reverse_permutation(
std::move(node_data_permutation), sorted_token);
2191 static std::mutex s_mut{};
2192 std::unique_lock _{s_mut};
2203 auto& node_data =
model.node_data();
2205 auto node_token = node_data.issue_frozen_token();
2206 auto already_sorted = node_data.is_sorted();
2208 auto const mech_storage_size =
model.mechanism_storage_size();
2209 std::vector<neuron::container::Mechanism::storage::frozen_token_type> mech_tokens{};
2210 mech_tokens.reserve(mech_storage_size);
2211 model.apply_to_mechanisms([&already_sorted, &mech_tokens](
auto& mech_data) {
2212 mech_tokens.push_back(mech_data.issue_frozen_token());
2213 already_sorted = already_sorted && mech_data.is_sorted();
2218 if (already_sorted) {
2233 for (
auto& thread_cache: cache.thread) {
2234 thread_cache.mechanism_offset.resize(mech_storage_size);
2236 cache.mechanism.resize(mech_storage_size);
2247 assert(node_data.is_sorted());
2250 model.apply_to_mechanisms([&cache, &
n, &mech_tokens](
auto& mech_data) {
2253 assert(mech_data.is_sorted());
2257 model.apply_to_mechanisms(
2264 ret.mech_data_tokens =
std::move(mech_tokens);
const char * secname(Section *sec)
name of section (for use in error messages)
Node * node_ptr(Section *sec, double x, double *parea)
void setup_topology(void)
double nrn_ra(Section *sec)
double section_length(Section *sec)
int node_index(Section *sec, double x)
returns nearest index to x
double nrn_connection_position(Section *sec)
int arc0at0(Section *sec)
double nrn_diameter(Node *nd)
void mech_insert1(Section *sec, int type)
void activclamp_lhs(void)
void activclamp_rhs(void)
void nrn_prop_datum_free(int type, Datum *ppd)
void nrn_rhs_ext(NrnThread *_nt)
void nrn_setup_ext(NrnThread *_nt)
int nrn_errno_check(int i)
int hoc_is_object_arg(int narg)
void hoc_retpushx(double x)
IvocVect * vector_arg(int i)
double * hoc_pgetarg(int narg)
int hoc_is_pdouble_arg(int narg)
void hoc_obj_unref(Object *obj)
hoc_List * hoc_l_newlist()
hoc_Item * hoc_l_lappendsec(hoc_List *, struct Section *)
constexpr auto range_sec(hoc_List *iterable)
void notify_freed_val_array(double *p, size_t size)
void long_difus_solve(neuron::model_sorted_token const &sorted_token, int method, NrnThread &nt)
#define BEFORE_BREAKPOINT
#define ITERATE(itm, lst)
void move(Item *q1, Item *q2, Item *q3)
auto for_threads(NrnThread *threads, int num_threads)
double * nrn_classicalNodeA(Node *nd)
double * nrn_classicalNodeB(Node *nd)
static void phase_end(const char *name)
static void phase_begin(const char *name)
phase
Reading phase number.
double * vector_vec(IvocVect *v)
void hoc_execerror(const char *s1, const char *s2)
void * ecalloc(size_t n, size_t size)
int vector_capacity(IvocVect *v)
void hoc_warning(const char *s1, const char *s2)
void nrn_ba(NrnThread *nt, int bat)
void indices_to_cache(short type, Callable callable)
Call the given method with each dparam index that should be cached for a mechanism.
std::optional< Model > model
void nrn_permute_node_order()
Compute and carry out the permutation for interleave_permute_type.
Model & model()
Access the global Model instance.
data_handle< T > transform(data_handle< T > handle, Transform type)
int nrndae_extra_eqn_count()
#define nrn_nonvint_block_ode_count(offset, tid)
#define nrn_nonvint_block_current(size, rhs, tid)
#define nrn_nonvint_block_setup()
#define nrn_nonvint_block_conductance(size, d, tid)
void activsynapse_rhs(void)
void synapse_prepare(void)
void clear_point_process_struct(Prop *p)
void activsynapse_lhs(void)
static Node * node(Object *)
void nrn_use_daspk(int b)
void nrndae_rhs(NrnThread *_nt)
int nrndae_list_is_empty()
int const size_t const size_t n
std::vector< Memb_func > memb_func
void nrn_cap_jacob(neuron::model_sorted_token const &sorted_token, NrnThread *_nt, Memb_list *ml)
std::vector< Memb_list > memb_list
std::unordered_map< int, void(*)(Prop *)> nrn_mech_inst_destruct
void nrn_thread_memblist_setup()
void nrn_thread_error(const char *s)
void * hoc_Erealloc(void *ptr, std::size_t size)
int spGetSize(char *eMatrix, BOOLEAN External)
char * spCreate(int Size, BOOLEAN Complex, int *pError)
void spClear(char *eMatrix)
struct Node * _classical_parent
neuron::container::Node::owning_handle _node_handle
Represent main neuron object computed by single thread.
double & actual_d(std::size_t row)
double * node_a_storage()
double & actual_rhs(std::size_t row)
double * node_rhs_storage()
double * node_d_storage()
Memb_list * _ecell_memb_list
double * node_voltage_storage()
double * node_b_storage()
struct NrnThreadMembList * next
A point process is computed just like regular mechanisms.
container::Node::storage & node_data()
Access the structure containing the data of all Nodes.
std::vector< Mechanism > mechanism
std::vector< Thread > thread
Underlying storage for all instances of a particular Mechanism.
std::string_view name() const
The name of this mechanism.
short type() const
The type of this mechanism.
Non-template stable handle to a generic value.
std::size_t current_row() const
Return current offset in the underlying storage where this object lives.
std::size_t size() const
Get the size of the container.
void mark_as_unsorted()
Tell the container it is no longer sorted.
frozen_token_type apply_reverse_permutation(Arg &&permutation)
Permute the SoA-format data using an arbitrary range of integers.
Token whose lifetime manages the frozen state of a container.
void stor_pt3d(Section *sec, double x, double y, double z, double d)
void nrn_pt3dremove(Section *sec, int i0)
Section * nrn_pnt_sec_for_need_
short * nrn_is_artificial_
void(* nrn_multisplit_setup_)()
void update_actual_d_based_on_sp13_mat(NrnThread *nt)
void nrn_pt3dinsert(Section *sec, int i0, double x, double y, double z, double d)
void update_actual_rhs_based_on_sp13_rhs(NrnThread *nt)
double chkarg(int, double low, double high)
int nrn_method_consistent(void)
Prop * prop_alloc_disallow(Prop **pp, short type, Node *nd)
Node * nrn_parent_node(Node *nd)
void nrn_fill_mech_data_caches(neuron::cache::Model &cache, neuron::container::Mechanism::storage &mech_data)
void setup_tree_matrix(neuron::model_sorted_token const &cache_token, NrnThread &nt)
static Prop ** current_prop_list
static void nrn_translate_shape(Section *sec, float x, float y, float z)
int can_change_morph(Section *sec)
void nrn_area_ri(Section *sec)
static void stor_pt3d_vec(Section *sec, IvocVect *xv, IvocVect *yv, IvocVect *zv, IvocVect *dv)
static int disallow_needmemb
static void nrn_sort_mech_data(neuron::container::Mechanism::storage::frozen_token_type &sorted_token, neuron::cache::Model &cache, neuron::container::Mechanism::storage &mech_data)
Sort the underlying storage for a particular mechanism.
Prop * need_memb(Symbol *sym)
cTemplate ** nrn_pnt_template_
static double diam_from_list(Section *sec, int inode, Prop *p, double rparent)
static void nrn_pt3dmodified(Section *sec, int i0)
void nrn_pt3dchange2(Section *sec, int i, double x, double y, double z, double diam)
Prop * prop_alloc(Prop **, int, Node *)
void connection_coef(void)
void update_sp13_rhs_based_on_actual_rhs(NrnThread *nt)
void nrn_shape_update(void)
void nrn_pt3dstyle1(Section *sec, double x, double y, double z)
void nrn_pt3dchange1(Section *sec, int i, double d)
void nrn_rhs(neuron::model_sorted_token const &cache_token, NrnThread &nt)
static void nrn_sort_node_data(neuron::container::Node::storage::frozen_token_type &sorted_token, neuron::cache::Model &cache)
Sort the underlying storage for Nodes.
static void nrn_matrix_node_alloc(void)
int * nrn_dparam_ptr_start_
void nrn_shape_update_always(void)
void prop_update_ion_variables(Prop *prop, Node *node)
void nrn_pt3dclear(Section *sec, int req)
int * nrn_prop_dparam_size_
void nrn_diam_change(Section *sec)
void nrn_length_change(Section *sec, double d)
spREAL * spGetElement(char *, int, int)
void update_sp13_mat_based_on_actual_d(NrnThread *nt)
void nrn_lhs(neuron::model_sorted_token const &sorted_token, NrnThread &nt)
int * nrn_dparam_ptr_end_
void nrn_pt3dstyle0(Section *sec)
void single_prop_free(Prop *p)
Symlist * hoc_built_in_symlist
void nrn_matrix_node_free()
void prop_free(Prop **pp)
void v_setup_vectors(void)
static void nrn_pt3dbufchk(Section *sec, int n)
neuron::model_sorted_token nrn_ensure_model_data_are_sorted()
Ensure neuron::container::* data are sorted.
int Printf(const char *fmt, Args... args)