1 #include <../../nrnconf.h>
101 #if METHOD3 && VECTORIZE
113 int spatial_method() {
117 new_method = (int)
chkarg(1, 0., 3.);
118 if (_method3 == 0 && new_method) {
120 }
else if (_method3 && new_method == 0) {
123 if (_method3 != new_method) {
124 _method3 = new_method;
128 _method3 = new_method;
138 extern int v_node_count;
139 extern Node** v_node;
140 extern Node** v_parent;
145 method3_setup_tree_matrix()
154 for (
i = 0;
i < v_node_count; ++
i) {
155 Node* nd = v_node[
i];
158 nd->thisnode.GC = 0.;
159 nd->thisnode.EC = 0.;
174 for (
j = 0;
j < count; ++
j) {
179 for (
j = 0;
j < count; ++
j) {
181 nd->thisnode.EC -= (*s)(m->
data[
j], m->
pdata[
j], &nd->thisnode.GC, nd->v);
187 hoc_warning(
"errno set during calculation of currents", (
char*) 0);
194 for (
i = rootnodecount;
i < v_node_count; ++
i) {
196 Node* nd = v_node[
i];
198 double dg, de, dgp, dep, fac;
201 if (
i == rootnodecount) {
202 printf(
"v0 %g vn %g jstim %g jleft %g jright %g\n",
203 nd->v,
pnd->v, nd->fromparent.current, nd->toparent.current,
204 nd[1].fromparent.current);
209 if ((nd2 = nd->toparent.nd2) != (
Node*) 0) {
210 dgp = -(3 * (
pnd->thisnode.GC -
pnd->thisnode.Cdt) -
211 4 * (nd->thisnode.GC - nd->thisnode.Cdt) +
212 (nd2->thisnode.GC - nd2->thisnode.Cdt)) /
214 dep = -(3 * (
pnd->thisnode.EC -
pnd->thisnode.Cdt *
pnd->v) -
215 4 * (nd->thisnode.EC - nd->thisnode.Cdt * nd->v) +
216 (nd2->thisnode.EC - nd2->thisnode.Cdt * nd2->v)) /
223 if ((nd2 =
pnd->fromparent.nd2) != (
Node*) 0) {
224 dg = -(3 * (nd->thisnode.GC - nd->thisnode.Cdt) -
225 4 * (
pnd->thisnode.GC -
pnd->thisnode.Cdt) +
226 (nd2->thisnode.GC - nd2->thisnode.Cdt)) /
228 de = -(3 * (nd->thisnode.EC - nd->thisnode.Cdt * nd->v) -
229 4 * (
pnd->thisnode.EC -
pnd->thisnode.Cdt *
pnd->v) +
230 (nd2->thisnode.EC - nd2->thisnode.Cdt * nd2->v)) /
237 fac = 1. + nd->toparent.coefjdot * nd->thisnode.GC;
238 nd->toparent.djdv0 = (nd->toparent.coefj + nd->toparent.coef0 * nd->thisnode.GC +
239 nd->toparent.coefdg * dg) /
241 NODED(nd) += nd->toparent.djdv0;
242 nd->toparent.current = (-nd->toparent.coef0 * nd->thisnode.EC -
243 nd->toparent.coefn *
pnd->thisnode.EC +
244 nd->toparent.coefjdot * nd->thisnode.Cdt * nd->toparent.current -
245 nd->toparent.coefdg * de) /
247 NODERHS(nd) -= nd->toparent.current;
248 NODEB(nd) = (-nd->toparent.coefj + nd->toparent.coefn *
pnd->thisnode.GC) / fac;
251 fac = 1. + nd->fromparent.coefjdot *
pnd->thisnode.GC;
252 nd->fromparent.djdv0 = (nd->fromparent.coefj + nd->fromparent.coef0 *
pnd->thisnode.GC +
253 nd->fromparent.coefdg * dgp) /
255 pNODED(nd) += nd->fromparent.djdv0;
256 nd->fromparent.current =
257 (-nd->fromparent.coef0 *
pnd->thisnode.EC - nd->fromparent.coefn * nd->thisnode.EC +
258 nd->fromparent.coefjdot * nd->thisnode.Cdt * nd->fromparent.current -
259 nd->fromparent.coefdg * dep) /
261 pNODERHS(nd) -= nd->fromparent.current;
262 NODEA(nd) = (-nd->fromparent.coefj + nd->fromparent.coefn * nd->thisnode.GC) / fac;
269 method3_axial_current() {
274 for (
i = rootnodecount;
i < v_node_count; ++
i) {
275 Node* nd = v_node[
i];
277 nd->toparent.current += nd->toparent.djdv0 * nd->v +
NODEB(nd) *
pnd->v;
279 nd->fromparent.current += nd->fromparent.djdv0 *
pnd->v +
NODEA(nd) * nd->v;
282 printf(
"cur0 %g curleft %g curright %g\n",
283 v_node[rootnodecount]->fromparent.current,
284 v_node[rootnodecount]->toparent.current,
285 v_node[rootnodecount+1]->fromparent.current
296 #define PI 3.14159265358979323846
298 method3_connection_coef()
301 double dx, diam, ra, coef;
338 for (
j = 0;
j <
sec->nnode; ++
j) {
346 coef =
PI * 1
e-2 * diam;
349 sec->parentnode->area = 100.;
351 nd->toparent.coef0 = coef * r * dx / 12.;
352 nd->fromparent.coef0 = coef * r * dx / 12.;
353 nd->toparent.coefn = coef * s * dx / 12.;
354 nd->fromparent.coefn = coef * s * dx / 12.;
355 nd->toparent.coefjdot =
t * ra * coef * dx * dx / 12.;
356 nd->fromparent.coefjdot =
t * ra * coef * dx * dx / 12.;
357 nd->toparent.coefdg =
t * coef * dx / 12.;
358 nd->fromparent.coefdg =
t * coef * dx / 12.;
359 nd->toparent.coefj = 1. / (ra * dx);
360 nd->fromparent.coefj = 1. / (ra * dx);
361 nd->toparent.nd2 = 0;
362 nd->fromparent.nd2 = 0;
364 if (
sec->nnode > 1) {
365 sec->pnode[0]->toparent.nd2 =
sec->pnode[1];
366 if (
sec->nnode > 2) {
367 sec->pnode[
sec->nnode - 2]->fromparent.nd2 =
sec->pnode[
sec->nnode - 3];
369 sec->pnode[
sec->nnode - 2]->fromparent.nd2 =
370 sec->parentsec->pnode[
sec->parentsec->nnode - 1];
Prop * nrn_mechanism(int type, Node *nd)
double nrn_ra(Section *sec)
double section_length(Section *sec)
double chkarg(int, double low, double high)
void hoc_execerror(const char *, const char *)
void hoc_warning(const char *, const char *)
void hoc_retpushx(double x)
#define ITERATE(itm, lst)