1 #include <../../nrnconf.h> 13 #define nt_t nrn_threads->_t 14 #define nt_dt nrn_threads->_dt 58 (*f)(m, diffunc,
v, ai, sindex, dindex, nt);
78 for (i = n - 1; i > 0; --
i) {
84 rhs[pin] -= p * rhs[
i];
88 for (i = 0; i <
n; ++
i) {
91 rhs[
i] -= b[
i] * rhs[pin];
150 double rall, dxp, dxc;
154 vnodecount = _nt->
end;
157 for (i=0; i <
n; ++
i) {
180 pld->
af[
i] = 2*rall/dxp/(dxc + dxp);
181 pld->
bf[
i] = 2/dxc/(dxc + dxp);
195 vnodecount = _nt->
end;
203 pld->
a = (
double*)
ecalloc(n,
sizeof(
double));
204 pld->
b = (
double*)
ecalloc(n,
sizeof(
double));
205 pld->
d = (
double*)
ecalloc(n,
sizeof(
double));
206 pld->
rhs = (
double*)
ecalloc(n,
sizeof(
double));
207 pld->
af = (
double*)
ecalloc(n,
sizeof(
double));
208 pld->
bf = (
double*)
ecalloc(n,
sizeof(
double));
209 pld->
vol = (
double*)
ecalloc(n,
sizeof(
double));
210 pld->
dc = (
double*)
ecalloc(n,
sizeof(
double));
213 map = (
int*)
ecalloc(vnodecount,
sizeof(
int));
214 omap = (
int*)
ecalloc(n,
sizeof(
int));
215 for (i=0; i < vnodecount; ++
i) {
218 for (i=0; i <
n; ++
i) {
222 for (i=0; i < vnodecount; ++
i) {
223 printf(
"%d index=%d\n", i, map[i]);
231 for (i=0, j=0; i < vnodecount; ++
i) {
244 pnd = psec->
pnode[0];
251 pnd = psec->
pnode[0];
266 for (i=0; i <
n; ++
i) {
267 printf(
"i=%d pin=%d mi=%d :%s node %d state[(%i)]=%g\n", i, pld->
pindex[i],
270 , sindex, pld->
state[i][0]);
307 if (tml->
index == m) {
308 ldtd->
ml[
i] = tml->
ml;
318 return (*ppldtd)->
ldifus[tid];
323 return (*ppldtd)->
ml[tid];
330 double dc,
vol, dfdi, dx;
349 for (i=0; i <
n; ++
i) {
352 pld->
dc[
i] = (*diffunc)(ai, data[mi], pdata[mi], pld->
vol+
i, &dfdi, thread, _nt);
361 dc = (pld->
dc[
i] + pld->
dc[pin])/2.;
363 pld->
a[
i] = -pld->
af[
i] * dc / pld->
vol[pin];
364 pld->
b[
i] = -pld->
bf[
i] * dc / pld->
vol[
i];
368 for (i=0; i <
n; ++
i) {
374 pld->
d[
i] -= pld->
b[
i];
375 pld->
d[pin] -= pld->
a[
i];
379 for (i=0; i <
n; ++
i) {
double a,
b;
380 if (pld->
pindex[i] > -1) {
384 printf(
"i=%d a=%g b=%g d=%g rhs=%g state=%g\n",
385 i, a, b, pld->
d[i], pld->
rhs[i], pld->
state[i][ai]);
393 for (i=0; i <
n; ++
i) {
402 double dc,
vol, dfdi;
421 for (i=0; i <
n; ++
i) {
424 pld->
dc[
i] = (*diffunc)(ai, data[mi], pdata[mi], pld->
vol+
i, &dfdi, thread, _nt);
427 dc = (pld->
dc[
i] + pld->
dc[pin])/2.;
429 pld->
a[
i] = pld->
af[
i] * dc / pld->
vol[pin];
430 pld->
b[
i] = pld->
bf[
i] * dc / pld->
vol[
i];
434 for (i=0; i <
n; ++
i) {
439 pld->
d[
i] = data[mi][di];
443 data[mi][di] += dif*pld->
b[
i];
444 data[pld->
mindex[pin]][di] -= dif*pld->
a[
i];
448 for (i=0; i <
n; ++
i) {
450 printf(
"%d olddstate=%g new=%g\n", i, pld->
d[i], data[mi][di]);
460 double dc,
vol, dfdi;
478 for (i=0; i <
n; ++
i) {
481 pld->
dc[
i] = (*diffunc)(ai, data[mi], pdata[mi], pld->
vol+
i, &dfdi, thread, _nt);
486 printf(
"i=%d state=%g vol=%g dfdc=%g\n", i, pld->
state[i][ai],pld->
vol[i], pld->
d[i]);
491 dc = (pld->
dc[
i] + pld->
dc[pin])/2.;
493 pld->
a[
i] = -pld->
af[
i] * dc / pld->
vol[pin];
494 pld->
b[
i] = -pld->
bf[
i] * dc / pld->
vol[
i];
498 for (i=0; i <
n; ++
i) {
504 pld->
d[
i] -= pld->
b[
i];
505 pld->
d[pin] -= pld->
a[
i];
509 for (i=0; i <
n; ++
i) {
double a,
b;
511 if (pld->
pindex[i] > -1) {
515 printf(
"i=%d a=%g b=%g d=%g rhs=%g dstate=%g\n",
516 i, a, b, pld->
d[i], pld->
rhs[i], data[mi][di]);
520 for (i = n - 1; i > 0; --
i) {
524 p = pld->
a[
i] / pld->
d[
i];
525 pld->
d[pin] -= p * pld->
b[
i];
526 pld->
rhs[pin] -= p * pld->
rhs[
i];
530 for (i=0; i <
n; ++
i) {
533 pld->
rhs[
i] -= pld->
b[
i] * pld->
rhs[pin];
538 for (i=0; i <
n; ++
i) {
540 data[mi][di] = pld->
rhs[
i];
void * ecalloc(size_t n, size_t size)
void * erealloc(void *ptr, size_t n)
static LongDifus * v2ld(void **v, int tid)
struct NrnThreadMembList * next
struct Section * parentsec
void(* ldifusfunc_t)(ldifusfunc2_t, NrnThread *)
Represent main neuron object computed by single thread.
void long_difus_solve(int method, NrnThread *nt)
static ldifusfunc_t * ldifusfunc
void nrn_tree_solve(double *a, double *d, double *b, double *rhs, int *pindex, int n)
struct LongDifusThreadData LongDifusThreadData
void ldifusfunc2_t(int, ldifusfunc3_t, void **, int, int, int, NrnThread *)
static double map(void *v)
static ldifusfunc2_t overall_setup
int const size_t const size_t n
static void longdifus_diamchange(LongDifus *pld, int m, int sindex, Memb_list *ml, NrnThread *_nt)
const char * secname(Section *sec)
void hoc_register_ldifus1(ldifusfunc_t f)
char * emalloc(unsigned n)
static void longdifusalloc(LongDifus **ppld, int m, int sindex, Memb_list *ml, NrnThread *_nt)
double section_length(Section *sec)
struct LongDifus LongDifus
static void longdifusfree(LongDifus **ppld)
double(* ldifusfunc3_t)(int, double *, Datum *, double *, double *, Datum *, NrnThread *)
static ldifusfunc2_t stagger
static ldifusfunc2_t matsol
static Memb_list * v2ml(void **v, int tid)