1 #include <../../nrnconf.h>
13 #define nt_t nrn_threads->_t
14 #define nt_dt nrn_threads->_dt
64 (*f)(m, diffunc,
v, ai, sindex, dindex, nt);
69 extern "C" void nrn_tree_solve(
double* a,
double* d,
double* b,
double*
rhs,
int* pindex,
int n) {
84 for (
i =
n - 1;
i > 0; --
i) {
94 for (
i = 0;
i <
n; ++
i) {
153 int i,
n, mi, mpi,
j,
index, pindex, vnodecount;
155 double rall, dxp, dxc;
161 vnodecount = _nt->
end;
164 for (
i = 0;
i <
n; ++
i) {
176 mpi = pld->
mindex[pindex];
185 pld->
af[
i] = 2 * rall / dxp / (dxc + dxp);
186 pld->
bf[
i] = 2 / dxc / (dxc + dxp);
194 int i,
n, mi, mpi,
j,
index, pindex, vnodecount;
199 vnodecount = _nt->
end;
207 pld->
a = (
double*)
ecalloc(
n,
sizeof(
double));
208 pld->
b = (
double*)
ecalloc(
n,
sizeof(
double));
209 pld->
d = (
double*)
ecalloc(
n,
sizeof(
double));
211 pld->
af = (
double*)
ecalloc(
n,
sizeof(
double));
212 pld->
bf = (
double*)
ecalloc(
n,
sizeof(
double));
214 pld->
dc = (
double*)
ecalloc(
n,
sizeof(
double));
217 map = (
int*)
ecalloc(vnodecount,
sizeof(
int));
218 omap = (
int*)
ecalloc(
n,
sizeof(
int));
219 for (
i = 0;
i < vnodecount; ++
i) {
222 for (
i = 0;
i <
n; ++
i) {
226 for (
i=0;
i < vnodecount; ++
i) {
235 for (
i = 0,
j = 0;
i < vnodecount; ++
i) {
270 for (
i=0;
i <
n; ++
i) {
271 printf(
"i=%d pin=%d mi=%d :%s node %d state[(%i)]=%g\n",
i, pld->
pindex[
i],
274 , sindex, pld->
state[
i][0]);
316 if (tml->
index == m) {
317 ldtd->
ml[
i] = tml->
ml;
327 return (*ppldtd)->ldifus[tid];
332 return (*ppldtd)->ml[tid];
339 double dc, vol, dfdi, dx;
359 for (
i = 0;
i <
n; ++
i) {
362 pld->
dc[
i] = (*diffunc)(ai,
data[mi],
pdata[mi], pld->
vol +
i, &dfdi, thread, _nt);
371 dc = (pld->
dc[
i] + pld->
dc[pin]) / 2.;
378 for (
i = 0;
i <
n; ++
i) {
384 pld->
d[
i] -= pld->
b[
i];
385 pld->
d[pin] -= pld->
a[
i];
389 for (
i=0;
i <
n; ++
i) {
double a,b;
394 printf(
"i=%d a=%g b=%g d=%g rhs=%g state=%g\n",
403 for (
i = 0;
i <
n; ++
i) {
412 double dc, vol, dfdi;
432 for (
i = 0;
i <
n; ++
i) {
435 pld->
dc[
i] = (*diffunc)(ai,
data[mi],
pdata[mi], pld->
vol +
i, &dfdi, thread, _nt);
438 dc = (pld->
dc[
i] + pld->
dc[pin]) / 2.;
445 for (
i = 0;
i <
n; ++
i) {
454 data[mi][di] += dif * pld->
b[
i];
459 for (
i=0;
i <
n; ++
i) {
461 printf(
"%d olddstate=%g new=%g\n",
i, pld->
d[
i],
data[mi][di]);
471 double dc, vol, dfdi;
490 for (
i = 0;
i <
n; ++
i) {
493 pld->
dc[
i] = (*diffunc)(ai,
data[mi],
pdata[mi], pld->
vol +
i, &dfdi, thread, _nt);
503 dc = (pld->
dc[
i] + pld->
dc[pin]) / 2.;
510 for (
i = 0;
i <
n; ++
i) {
516 pld->
d[
i] -= pld->
b[
i];
517 pld->
d[pin] -= pld->
a[
i];
521 for (
i=0;
i <
n; ++
i) {
double a,b;
527 printf(
"i=%d a=%g b=%g d=%g rhs=%g dstate=%g\n",
532 for (
i =
n - 1;
i > 0; --
i) {
536 p = pld->
a[
i] / pld->
d[
i];
537 pld->
d[pin] -=
p * pld->
b[
i];
542 for (
i = 0;
i <
n; ++
i) {
545 pld->
rhs[
i] -= pld->
b[
i] * pld->
rhs[pin];
550 for (
i = 0;
i <
n; ++
i) {
const char * secname(Section *sec)
double section_length(Section *sec)
void * erealloc(void *ptr, size_t n)
void * ecalloc(size_t n, size_t size)
struct LongDifusThreadData LongDifusThreadData
static void longdifusalloc(LongDifus **ppld, int m, int sindex, Memb_list *ml, NrnThread *_nt)
static ldifusfunc2_t stagger
void long_difus_solve(int method, NrnThread *nt)
void nrn_tree_solve(double *a, double *d, double *b, double *rhs, int *pindex, int n)
static Memb_list * v2ml(void **v, int tid)
static void longdifusfree(LongDifus **ppld)
static void longdifus_diamchange(LongDifus *pld, int m, int sindex, Memb_list *ml, NrnThread *_nt)
static ldifusfunc2_t matsol
static ldifusfunc2_t overall_setup
void hoc_register_ldifus1(ldifusfunc_t f)
static ldifusfunc_t * ldifusfunc
struct LongDifus LongDifus
static LongDifus * v2ld(void **v, int tid)
static double map(void *v)
char * emalloc(unsigned n)
int const size_t const size_t n
double(* ldifusfunc3_t)(int, double *, Datum *, double *, double *, Datum *, NrnThread *)
void ldifusfunc2_t(int, ldifusfunc3_t, void **, int, int, int, NrnThread *)
void(* ldifusfunc_t)(ldifusfunc2_t, NrnThread *)
Represent main neuron object computed by single thread.
struct NrnThreadMembList * next
struct Section * parentsec