1 #include <../../nrnconf.h> 33 extern double chkarg(
int,
double low,
double high);
35 #if !defined(NRNMPI) || NRNMPI == 0 59 #define UPDATE_VEC_AREA(nd) if (nd->_nt && nd->_nt->_actual_area) { nd->_nt->_actual_area[(nd)->v_node_index] = NODEAREA(nd);} 362 i2 = i1 + _nt->
ncell;
374 for (i=1; i <=
neqn; ++
i) {
380 for (i = i1; i < i3; ++
i) {
386 for (i = i1; i < i3; ++
i) {
392 for (i = i1; i < i3; ++
i) {
407 (*s)(_nt, tml->
ml, tml->
index);
412 hoc_warning(
"errno set during calculation of currents", (
char*)0);
424 for (i = i1; i < i3; ++
i) {
428 for (i = i1; i < i3; ++
i) {
456 for (i = i2; i < i3; ++
i) {
465 for (i = i2; i < i3; ++
i) {
489 i2 = i1 + _nt->
ncell;
503 for (i = i1; i < i3; ++
i) {
509 for (i = i1; i < i3; ++
i) {
516 for (i = i1; i < i3; ++
i) {
527 (*s)(_nt, tml->
ml, tml->
index);
531 hoc_warning(
"errno set during calculation of jacobian", (
char*)0);
553 for (i = i1; i < i3; ++
i) {
558 for (i = i1; i < i3; ++
i) {
562 for (i = i1; i < i3; ++
i) {
586 for (i = i2; i < i3; ++
i) {
592 for (i=i2; i < i3; ++
i) {
598 for (i=i2; i < i3; ++
i) {
605 for (i=i2; i < i3; ++
i) {
643 fprintf(stderr,
"You can not locate a point process at\n\ 644 position 0 or 1 if it needs an ion\n");
649 for (m = *current_prop_list; m; mprev = m, m = m->
next) {
650 if (m->type == type) {
661 *current_prop_list = m;
662 }
else if (nrn_pnt_sec_for_need_) {
674 nrn_pnt_sec_for_need_ = (
Section*)0;
676 current_prop_list = cpl;
696 nrn_alloc_node_ =
nd;
701 current_prop_list = pp;
710 p->
param = (
double *) 0;
741 if (pnt_map[p->
type]) {
768 #define PI 3.14159265358979323846 775 double ra, dx, diam, rright, rleft;
787 for (j = 0; j < sec->
nnode-1; j++) {
789 for (p = nd->
prop; p; p = p->
next) {
796 if (sec->
npt3d > 1) {
816 rleft = 1
e-2*ra*(dx/2)/(
PI*diam*diam/4.);
837 double dx, diam,
area, ra;
842 extern int nrn_ra_set;
856 hoc_warning(
"Don't forget to set Ra in every section",
857 "eg. forall Ra=35.4");
876 if (!
sec->parentsec) {
956 if (x == 0. || x == 1.) {
1031 if ((
int)
chkarg(1, 0., 1.) == 1) {
1054 req =
chkarg(1, 0., 30000.);
1084 if (sec->
pt3d[i0].
d < 0.) {
1092 for (i = i0; i <
n; ++
i) {
1107 free((
char *)(sec->
pt3d));
1125 for (i = n-1; i >= i0; --
i) {
1132 sec->
pt3d[i0].
x = x;
1133 sec->
pt3d[i0].
y = y;
1134 sec->
pt3d[i0].
z = z;
1135 sec->
pt3d[i0].
d = d;
1180 for (i=i0+1; i <
n; ++
i) {
1210 for (i=0; i < sec->
npt3d; ++
i) {
1212 if (x > 1.0) {x = 1.0;}
1227 x0 = sec->
pt3d[0].
x;
1228 y0 = sec->
pt3d[0].
y;
1229 z0 = sec->
pt3d[0].
z;
1233 for (i=0; i < sec->
npt3d; ++
i) {
1259 for (i=0; i <
n; i++) {
1295 i =
chkarg(1, 0., (
double)n);
1304 i =
chkarg(1, 0., (
double)n);
1313 i =
chkarg(1, 0., (
double)n);
1322 i =
chkarg(1, 0., (
double)n);
1332 i =
chkarg(1, 0., (
double)n);
1333 d = (double)sec->
pt3d[i].
d;
1343 i =
chkarg(1, 0., (
double)n);
1344 d = (double)sec->
pt3d[i].
d;
1399 dx = x - sec->
pt3d[0].
x;
1400 dy = y - sec->
pt3d[0].
y;
1401 dz = z - sec->
pt3d[0].
z;
1404 for (i=0; i < sec->
npt3d; ++
i) {
1412 static int changed_;
1415 float x, y, z, dz, x1, y1;
1416 float nch, ich=0.0, angle;
1455 Printf(
"nrn_define_shape: %s first and last 3-d point at same (x,y)\n",
secname(psec));
1458 angle =
atan2(y1, x1);
1460 if (arc > 0. && arc < 1.) {
1461 angle += 3.14159265358979323846/2.;
1473 angle += ich/(nch - 1.) * .8 - .4;
1476 x1 = x + len*
cos(angle);
1477 y1 = y + len*
sin(angle);
1479 for (j = 0; j < sec->
nnode-1; ++
j) {
1480 double frac = ((double)j+.5)/(double)(sec->
nnode-1);
1515 static double x1, y1, ds;
1518 double diam, delta, temp,
ri,
area, ra, rleft=0.0;
1528 si = (double)inode*ds;
1534 for (ihalf = 0; ihalf < 2; ihalf++) {
1539 double x2, y2, xj, xjp;
1543 if (sec->
pt3d[j].
d < 0 && xj >= si && xj < sip) {
1548 if (xjp > sip || jp == npt - 1) {
1550 if (
fabs(xjp - xj) < 1
e-10) {
1553 frac = (sip - xj)/(xjp - xj);
1566 diam += (y2 + y1)*delta;
1567 if (delta < 1
e-15) {
1570 if ((temp = y2*y1/delta) == 0) {
1575 temp = .5*(y2 - y1);
1576 temp =
sqrt(delta*delta + temp*temp);
1581 area += (y2 + y1)*temp;
1592 rleft = ri*ra/
PI*(4.*.01);
1594 ri = ri*ra/
PI*(4.*.01);
1602 if (
fabs(diam - p->
param[0]) > 1
e-9 || diam < 1
e-5) {
1609 if (inode == sec->
nnode-2 && sec->
pt3d[npt-1].
d < 0.) {
1715 for (inode=0; inode < _nt->
end; inode++) {
1788 #define P fprintf(fnd, 1790 #define Pd(arg) P "%d\n", arg) 1791 #define Pg(arg) P "%g\n", arg) 1793 void node_data_scaffolding(
void) {
1802 void node_data_structure(
void) {
1809 for (i=0; i < v_node_count; ++
i) {
1810 Pd(v_parent[i]->v_node_index);
1822 void node_data_values(
void) {
1825 for (i=0; i < v_node_count; ++
i) {
1826 Pg(
NODEV(v_node[i]));
1827 Pg(
NODEA(v_node[i]));
1828 Pg(
NODEB(v_node[i]));
1843 for (k = 0; k <
cnt; ++
k) {
1864 node_data_scaffolding();
1865 node_data_structure();
1886 for (j = 0; j <
sec->nnode; ++
j) {
1888 for (p = nd->
prop; p; p = p->
next) {
1889 if (p->
param == pp) {
1898 fprintf(stderr,
"Don't know the location of params at %p\n", pp);
2038 int in, err, extn,
neqn,
j;
2052 for (in=0, i=1; in < nt->
end; ++in, ++
i) {
2058 for (in = 0; in < nt->
end; ++in) {
2069 for (ie = 0; ie <
nlayer; ++ie) {
2082 int kp = j + ie + 1;
2099 for (i = 0; i < nt->
end; ++
i) {
2148 for (i=0; i <
n; ++
i) {
2156 static double* (*recalc_ptr_)(
double*);
2162 int k = (
int)(*old);
2172 Printf(
"More than 20 recalc_ptr_callback functions\n");
2218 *nd->
_v = (double)ii;
2228 for (p = nd->
prop; p; p = p->
next) {
void nrn_pt3dinsert(Section *sec, int i0, double x, double y, double z, double d)
void activclamp_rhs(void)
#define nrn_nonvint_block_conductance(size, d, tid)
void * ecalloc(size_t n, size_t size)
hoc_List * hoc_l_newlist()
Prop * need_memb(Symbol *sym)
spREAL * spGetElement(char *, int, int)
void long_difus_solve(int, NrnThread *)
void nrn_prop_data_free(int type, double *pd)
void clear_point_process_struct(Prop *p)
static void stor_pt3d_vec(Section *sec, IvocVect *xv, IvocVect *yv, IvocVect *zv, IvocVect *dv)
Prop * prop_alloc_disallow(Prop **pp, short type, Node *nd)
void nrn_pt3dclear(Section *sec, int req)
void nrn_ba(NrnThread *, int)
void nrn_old_thread_save(void)
static double ** old_actual_area_
struct NrnThreadMembList * next
void nrn_recalc_ptrs(double *(*r)(double *))
struct Section * parentsec
double * nrn_classicalNodeA(Node *nd)
static int n_recalc_ptr_callback
#define ITERATE(itm, lst)
short * nrn_is_artificial_
double nrn_arc_position(Section *sec, Node *node)
int nrndae_list_is_empty()
Represent main neuron object computed by single thread.
void notify_freed_val_array(double *p, size_t size)
void nrn_thread_error(const char *)
struct Node * _classical_parent
void activclamp_lhs(void)
Section * nrn_pnt_sec_for_need_
void nrn_register_recalc_ptr_callback(Pfrv f)
static void nrn_thread_memblist_setup()
void hoc_free_val_array(double *, size_t)
static philox4x32_key_t k
#define UPDATE_VEC_AREA(nd)
int arc0at0(Section *sec)
void nrn_cap_jacob(NrnThread *_nt, Memb_list *ml)
static void nrn_recalc_node_ptrs()
_nrn_Fast_Imem * _nrn_fast_imem
struct Pt3d * logical_connection
void nrn_pt3dchange1(Section *sec, int i, double d)
double * hoc_pgetarg(int narg)
void nrn_shape_update(void)
int nrn_method_consistent(void)
double * nrn_recalc_ptr(double *old)
void stor_pt3d(Section *sec, double x, double y, double z, double d)
void nrn_pt3dchange2(Section *sec, int i, double x, double y, double z, double diam)
void nrn_complain(double *pp)
int hoc_is_pdouble_arg(int narg)
void nrn_pt3dstyle0(Section *sec)
Symlist * hoc_built_in_symlist
int const size_t const size_t n
Memb_list * _ecell_memb_list
static double diam_from_list(Section *sec, int inode, Prop *p, double rparent)
cTemplate ** nrn_pnt_template_
void hoc_obj_unref(Object *obj)
void nrn_partrans_update_ptrs()
static double ** old_actual_v_
double nrn_connection_position(Section *sec)
void(* Pvmi)(struct NrnThread *, Memb_list *, int)
void nrn_prop_datum_free(int type, Datum *ppd)
void nrn_rhs(NrnThread *_nt)
const char * secname(Section *sec)
static double ** recalc_ptr_old_vp_
void hoc_warning(const char *, const char *)
void single_prop_free(Prop *p)
static double ** recalc_ptr_new_vp_
double * nrn_classicalNodeB(Node *nd)
void hoc_execerror(const char *, const char *)
int nrn_isdouble(double *, double, double)
void activsynapse_rhs(void)
void prop_free(Prop **pp)
int nrn_node_ptr_change_cnt_
static void nrn_matrix_node_alloc(void)
void nrn_recalc_ptrvector()
fprintf(stderr, "Don't know the location of params at %p\, pp)
void nrn_matrix_node_free(void)
void(* nrn_multisplit_setup_)()
Prop * nrn_mechanism(int type, Node *nd)
char * emalloc(unsigned n)
int * nrn_dparam_ptr_start_
int can_change_morph(Section *sec)
void nrn_lhs(NrnThread *_nt)
double section_length(Section *sec)
int * nrn_dparam_ptr_end_
for(j=1;j< sec->nnode;j++)
ForAllSections(sec) if(!sec -> parentsec)
static int * old_actual_v_size_
void synapse_prepare(void)
static int disallow_needmemb
void * hoc_Erealloc(void *buf, size_t size)
int vector_capacity(Vect *v)
static void phase_end(const char *name)
void nrn_cache_prop_realloc()
static void phase_begin(const char *name)
void nrn_length_change(Section *sec, double d)
#define nrn_nonvint_block_setup()
void connection_coef(void)
static void nrn_pt3dmodified(Section *sec, int i0)
double * vector_vec(Vect *v)
void * setup_tree_matrix(NrnThread *_nt)
static void nrn_pt3dbufchk(Section *sec, int n)
double nrn_diameter(Node *nd)
void nrn_pt3dstyle1(Section *sec, double x, double y, double z)
static void(* recalc_ptr_callback[20])()
void activsynapse_lhs(void)
#define nrn_nonvint_block_ode_count(offset, tid)
Prop * prop_alloc(Prop **, int, Node *)
int hoc_is_object_arg(int narg)
static double *(* recalc_ptr_)(double *)
Node * node_ptr(Section *sec, double x, double *parea)
void nrn_diam_change(Section *sec)
void nrn_area_ri(Section *sec)
void nrn_setup_ext(NrnThread *_nt)
Section * chk_access(void)
#define BEFORE_BREAKPOINT
void nrn_rhs_ext(NrnThread *_nt)
static Prop ** current_prop_list
Node * nrn_parent_node(Node *nd)
void nrn_shape_update_always(void)
hoc_Item * hoc_l_lappendsec(hoc_List *, struct Section *)
void v_setup_vectors(void)
double chkarg(int, double low, double high)
static void nrn_translate_shape(Section *sec, float x, float y, float z)
void nrn_pt3dremove(Section *sec, int i0)
static void reorder_secorder()
#define nrn_nonvint_block_current(size, rhs, tid)
int * nrn_prop_dparam_size_
int nrndae_extra_eqn_count()