1 #include <../../nrnconf.h>
38 static HocParmLimits limits[] = {
"xraxial", 1
e-9, 1e15,
"xg", 0., 1e15,
"xc", 0., 1e15, 0, 0., 0.};
58 static void printnode(
const char* s);
86 #define xg (pd + (nlayer))
87 #define xc (pd + 2 * (nlayer))
88 #define e_extracellular pd[3 * (nlayer)]
90 #define i_membrane pd[1 + 3 * (nlayer)]
91 #define sav_g pd[2 + 3 * (nlayer)]
92 #define sav_rhs pd[3 + 3 * (nlayer)]
111 cfac = .001 * nt->
cj;
115 for (
i = 0;
i <
cnt; ++
i) {
118 for (il = 0; il <
nlayer; ++il) {
119 nde->
v[il] += *nde->
_rhs[il];
125 for (
i = 0;
i <
cnt; ++
i) {
201 hoc_execerror(
"Extracellular mechanism only works with fixed step methods and daspk", 0);
203 for (
i = 0;
i < ndcount; ++
i) {
234 if (
sec->pnode[0]->extnode) {
260 if (s->
type == RANGEVAR) {
263 if (a && a->
nsub == 1) {
320 nde->
param = (
double*) 0;
321 for (
p = nd->
prop;
p;
p =
p->next) {
322 if (
p->type == EXTRACELL) {
339 for (
i = 0;
i <
cnt; ++
i) {
340 Node* nd = ndlist[
i];
354 for (
i =
sec->nnode - 1;
i >= 0;
i--) {
358 if (!
sec->parentsec &&
sec->parentnode) {
378 for (
i = 0;
i <
cnt; ++
i) {
389 for (
i = 0;
i <
cnt; ++
i) {
399 double dv = pnde->
v[
j] - nde->
v[
j];
416 double dv = -nde->
v[0];
425 for (--
j;
j >= 0; --
j) {
426 double x =
xg[
j] * (nde->
v[
j] - nde->
v[
j + 1]);
428 *nde->
_rhs[
j + 1] += x;
433 for (
i = 0;
i <
cnt; ++
i) {
447 double d, cfac, mfac;
456 cfac = .001 * _nt->
cj;
461 for (
i = 0;
i <
cnt; ++
i) {
466 d = (*nde->
_d[0] +=
NODED(nd));
477 for (
i = 0;
i <
cnt; ++
i) {
486 mfac = (
xg[
j] +
xc[
j] * cfac);
493 *nde->
_x12[
j] -= mfac;
494 *nde->
_x21[
j] -= mfac;
500 *nde->
_d[
j] -= nde->
_b[
j];
501 *pnde->
_d[
j] -= nde->
_a[
j];
527 if (
sec->pnode[0]->extnode) {
529 for (
j = 0;
j <
sec->nnode - 1;
j++) {
530 nde =
sec->pnode[
j]->extnode;
537 nde =
sec->pnode[
j]->extnode;
545 if (!
sec->parentsec) {
546 nde =
sec->parentnode->extnode;
567 if (
sec->pnode[0]->extnode) {
572 nde =
sec->pnode[0]->extnode;
576 for (
j = 1;
j <
sec->nnode;
j++) {
577 nde =
sec->pnode[
j]->extnode;
579 nde->
_b[
k] = *nde->
_rhs[
k] + *(
sec->pnode[
j - 1]->extnode->_rhs[
k]);
587 if (
sec->pnode[0]->extnode) {
601 nde->
_a[
k] = -1.e2 *
sec->prop->dparam[4].val / (nde->
_b[
k] *
area);
603 for (
j = 1;
j <
sec->nnode;
j++) {
616 if (
sec->pnode[0]->extnode) {
617 for (
j = 0;
j <
sec->nnode;
j++) {
631 static void printnode(
const char* s) {
654 static int cntndsave;
657 void save2mat(
void) {
658 int i,
j,
k, im, ipm;
662 if (cntndsave < v_node_count) {
666 cntndsave = v_node_count;
669 for (
i=0;
i < v_node_count; ++
i) {
674 ndesave[
i].
v[
j] = nde->
v[
j];
675 ndesave[
i].rhs[
j] = nde->
_rhs[
j];
677 ndesave[
i].m[
j][
k] = nde->_m[
j][
k];
680 ndesave[
i].m[
j][0] = 0.;
688 ndesave[
i].
v[0] = nd->v;
691 ndesave[
i].m[0][0] =
NODEB(nd);
703 void check2mat(
void) {
710 for (
i=0;
i < v_node_count; ++
i) {
724 for (
i=0;
i < v_node_count; ++
i) {
737 for (
i=0;
i < v_node_count; ++
i) {
738 DBG(
"work on node %d\n",
i);
740 ip = v_parent[
i]->v_node_index;
742 DBG(
" effect of parent %d on node %d\n", ip,
i);
744 DBG(
" work on layer %d\n",
j);
746 DBG(
" nde[%d].rhs[%d] -= nde[%d].v[%d]*nde[%d].m[%d][%d]\n",
i,
j,ip,
k,
i,
j,
k-
j);
747 DBG(
" %g * %g\n",ndesave[ip].
v[
k],ndesave[
i].m[
j][
k-
j]);
748 ndesave[
i].rhs[
j] -= ndesave[ip].
v[
k]*ndesave[
i].m[
j][
k-
j];
752 DBG(
" effect of node %d on parent %d\n",
i, ip);
754 DBG(
" work on layer %d\n",
j);
755 for (
k=0;
k <=
j; ++
k) {
756 DBG(
" nde[%d].rhs[%d] -= nde[%d].v[%d]*nde[%d].m[%d][%d]\n", ip,
j,
i,
k,
i,
j,2*(
nlayer)-
j+
k);
757 DBG(
" %g * %g\n",ndesave[
i].
v[
k],ndesave[
i].m[
j][2*(
nlayer)-
j+
k]);
758 ndesave[ip].rhs[
j] -= ndesave[
i].
v[
k]*ndesave[
i].m[
j][2*(
nlayer)-
j+
k];
763 DBG(
" effect of node %d on node %d\n",
i,
i);
765 DBG(
" work on layer %d\n",
j);
767 DBG(
" nde[%d].rhs[%d] -= nde[%d].v[%d]*nde[%d].m[%d][%d]\n",
i,
j,
i,
k,
i,
j,(
nlayer)+
k-
j);
768 DBG(
" %g * %g\n",ndesave[
i].
v[
k],ndesave[
i].m[
j][(
nlayer)+
k-
j]);
774 for (
i=0;
i < v_node_count; ++
i) {
777 printf(
"bad soln of eq %d,%d rhs-M*V=%g\n",
const char * secname(Section *sec)
double section_length(Section *sec)
int nrn_get_mechtype(const char *mechname)
Symbol * hoc_table_lookup(const char *, Symlist *)
double * nrn_prop_data_alloc(int type, int count, Prop *p)
double chkarg(int, double low, double high)
void register_mech(const char **, Pvmp, Pvmi, Pvmi, Pvmi, Pvmi, int, int)
static int _ode_count(int type)
static HocParmUnits units[]
void nrn_update_2d(NrnThread *nt)
static HocParmLimits limits[]
static void extcell_init(NrnThread *nt, Memb_list *ml, int type)
int nrn_nlayer_extracellular
void extracell_reg_(void)
void nlayer_extracellular()
void nrn_extcell_update_param(void)
static void extnode_alloc_elements(Extnode *nde)
static void extcell_alloc(Prop *)
static void check_if_extracellular_in_use()
void nrn_rhs_ext(NrnThread *_nt)
void extcell_2d_alloc(Section *sec)
static void update_extracellular_reg(int old_nlayer)
void nrn_delete_prop_pool(int type)
void extcell_node_create(Node *nd)
static const char * mechanism[]
static void update_existing_extnode(int old_nlayer)
void nrn_setup_ext(NrnThread *_nt)
void extnode_free_elements(Extnode *nde)
void hoc_execerror(const char *, const char *)
void hoc_retpushx(double x)
void * ecalloc(size_t n, size_t size)
Symlist * hoc_built_in_symlist
void(* Pvmi)(struct NrnThread *, Memb_list *, int)
#define ITERATE(itm, lst)
void hoc_register_limits(int type, HocParmLimits *limits)
void hoc_register_units(int type, HocParmUnits *units)
void hoc_register_cvode(int i, nrn_ode_count_t cnt, nrn_ode_map_t map, Pvmi spec, Pvmi matsol)
static philox4x32_key_t k
Represent main neuron object computed by single thread.
Memb_list * _ecell_memb_list
HocStruct Symbol ** ppsym
struct Symbol::@37::@38 rng