1 #include <../../nrnconf.h>
11 #include <unordered_map>
66 #define RHS(i) VEC_RHS(i)
67 #define S1A(i) sid1A[i]
68 #define S1B(i) sid1B[i]
249 void reorder(
int j,
int nt,
int* mark,
int* all_bb_relation,
int* allsid);
251 void fillrmap(
int sid1,
int sid2,
double* pd);
252 void fillsmap(
int sid,
double* prhs,
double* pdiag);
253 void pr_map(
int,
double*);
365 if (sid > 1000) {
pexch();
return; }
366 if (sid >= 1000) {
pmat(sid>1000);
return; }
379 if (backbone_style != 2) {
402 if (backbone_style == 2) {
403 if (
ms->backbone_style != 2) {
404 hoc_execerror(
"earlier call for this cell did not have a backbone style = 2", 0);
406 }
else if (backbone_style == 1) {
407 ms->backbone_style = 1;
411 if (
ms->sid[1] ==
ms->sid[0]) {
413 sprintf(s,
"two sid = %d at same point on tree rooted at", sid);
418 ms->backbone_style = backbone_style;
427 ms->rmap_index_ = -1;
428 ms->smap_index_ = -1;
429 (*classical_root_to_multisplit_)[
root] =
ms;
532 delete mspair.second;
581 if (
ms->backbone_style == 2) {
586 }
else if (
ms->backbone_style == 1) {
588 ms->backbone_style = 0;
620 int* bb_relation = 0;
624 bb_relation =
new int[
n];
625 threadid =
new int[
n];
631 inode[
i] =
ms->nd[0]->v_node_index;
632 threadid[
i] =
ms->ithread;
633 bb_relation[
i] =
ms->backbone_style;
638 inode[
i] =
ms->nd[1]->v_node_index;
639 threadid[
i] =
ms->ithread;
640 bb_relation[
i] =
ms->backbone_style;
641 if (
ms->backbone_style == 2) {
642 bb_relation[
i - 1] += 1 + sid[
i];
643 bb_relation[
i] += 1 + sid[
i - 1];
657 displ[
i + 1] = displ[
i] + nn[
i];
660 int* allsid =
new int[nt];
661 int* all_bb_relation =
new int[nt];
666 for (
i = 0;
i <
n; ++
i) {
668 all_bb_relation[
i] = bb_relation[
i];
673 delete[] all_bb_relation;
714 int* mark =
new int[nt];
715 int* connects2short =
new int[
n];
716 for (
i = 0;
i <
n; ++
i) {
717 connects2short[
i] = 0;
719 for (
i = 0;
i < nt; ++
i) {
721 for (
j = 0;
j <
n; ++
j) {
722 if (allsid[
i] == sid[
j]) {
729 if ((bb_relation[
j] >= 2) != (all_bb_relation[
i] >= 2)) {
730 hoc_execerror(
"backbone_style==2 inconsistent between hosts for same sid", 0);
733 if (all_bb_relation[
i] < 2) {
735 if (all_bb_relation[
i] == 1) {
736 connects2short[
j] = 1;
753 for (
i = 0;
i < nt; ++
i) {
754 if (mark[
i] >= 0 && connects2short[mark[
i]] && all_bb_relation[
i] == 0 &&
755 bb_relation[mark[
i]] == 0) {
760 for (
i = 0;
i < nt; ++
i) {
762 if (bb_relation[mark[
i]] == 1 && all_bb_relation[
i] == 1) {
763 hoc_execerror(
"a short to short backbone interprocessor connection exists", 0);
775 for (
j = 0;
j <
n; ++
j) {
776 if (bb_relation[
j] >= 2) {
785 for (
i=0;
i < nt; ++
i) {
printf(
"%d %d allsid=%d all_bb_relation=%d mark=%d\n",
795 int* mcnt =
new int[
n];
796 for (
j = 0;
j <
n; ++
j) {
800 if (all_bb_relation[
i] >= 2 && mark[
i] >= 0) {
802 if (all_bb_relation[
i] > 2) {
807 for (
j = 0;
j <
n; ++
j) {
822 int* rthost =
new int[
n];
824 for (
j = 0;
j <
n; ++
j) {
830 if (
ms->backbone_style == 2) {
831 for (
j = 0;
j <
n; ++
j) {
832 if (sid[
j] ==
ms->sid[0]) {
839 for (
i = displ[ih];
i < displ[ih + 1]; ++
i) {
841 if (all_bb_relation[
i] > 2) {
845 if (all_bb_relation[
i] == 2) {
852 if (
ms->rthost != -1) {
856 if (
ms->rthost == -1) {
860 rthost[
j] =
ms->rthost;
869 for (
j=0;
j <
n; ++
j) {
871 bb_relation[
j], rthost[
j]);
885 int nj = displ[
i + 1];
886 for (
j = displ[
i];
j < nj; ++
j) {
887 if (all_bb_relation[
j] >= 2 && mark[
j] >= 0 && rthost[mark[
j]] ==
nrnmpi_myid) {
890 if (all_bb_relation[
j] > 2) {
899 for (
j = 0;
j <
n; ++
j) {
907 for (
j = 0;
j <
n; ++
j) {
914 for (
k = 0;
k < nt; ++
k) {
915 if (mark[
k] ==
j && all_bb_relation[
k] >= 2) {
916 const auto&
result = s2rt->insert({allsid[
k], rank});
920 if (all_bb_relation[
k] == 2) {
944 if (
ms->backbone_style == 2) {
946 ms->rthost = rthost[jj];
947 rthost[
j] =
ms->rthost;
958 if (
ms->backbone_style == 2) {
962 for (
j=0;
j <
n; ++
j) {
964 bb_relation[
j], rthost[
j]);
969 for (
i = 0;
i <
n; ++
i) {
972 for (
j = 0;
j < 2; ++
j) {
982 if (bb_relation[
i] == 2) {
1001 for (
i = 0;
i <
n; ++
i) {
1004 for (
j = 0;
j < 2; ++
j) {
1015 if (bb_relation[
i] > 2) {
1020 art.
pd[2] =
t.sid1A +
t.backAindex_[
k];
1022 art.
pd[2] =
t.sid1B +
t.backBindex_[
k];
1033 if (bb_relation[
i] > 2) {
1039 if (bb_relation[
i] == 2) {
1057 for (
i=0;
i <
n; ++
i) {
1058 printf(
"%d %d sid=%d bbrelation=%d rthost=%d rt=%p\n",
nrnmpi_myid,
i, sid[
i], bb_relation[
i], rthost[
i], rt[
i]);
1063 for (
i=0;
i < nt; ++
i) {
1064 printf(
"%d %d allsid=%d mark=%d all_bb_relation=%d\n",
nrnmpi_myid,
i, allsid[
i], mark[
i], all_bb_relation[
i]);
1087 for (
j = displ[
i];
j < displ[
i + 1]; ++
j) {
1090 if (bb_relation[mark[
j]] == 1) {
1091 assert(all_bb_relation[
j] == 0);
1095 }
else if (all_bb_relation[
j] == 1) {
1099 }
else if (all_bb_relation[
j] < 2) {
1103 }
else if (all_bb_relation[
j] >= 2) {
1104 int rth = rthost[mark[
j]];
1114 if (all_bb_relation[
j] > 2) {
1124 for (
int jj = displ[
i]; jj <
j; ++jj) {
1125 if (rth == rthost[mark[jj]]) {
1132 if (all_bb_relation[
j] > 2) {
1179 for (
j = displ[
i];
j < displ[
i + 1]; ++
j) {
1180 if (mark[
j] >= 0 && bb_relation[mark[
j]] == 0 && all_bb_relation[
j] == 1) {
1204 int* tmphost =
new int[
n];
1207 for (
j = displ[
i];
j < displ[
i + 1]; ++
j) {
1209 if (j1 >= 0 && bb_relation[j1] >= 2 && rthost[j1] !=
i) {
1210 tmphost[ntmphost++] = rthost[j1];
1211 for (
int itmp = 1; itmp < ntmphost; ++itmp) {
1212 if (tmphost[itmp - 1] == rthost[j1]) {
1221 for (
int itmp = 0; itmp < ntmphost; ++itmp) {
1228 for (
j = displ[
i];
j < displ[
i + 1]; ++
j) {
1229 int jj =
j - displ[
i];
1234 if (j1 >= 0 && bb_relation[j1] >= 2 && rthost[j1] == tmphost[itmp]) {
1244 if (bb_relation[jj] > 2) {
1305 ix[1] = inode[jj + 1];
1306 ixth[0] = vec2ms[jj]->ithread;
1307 ixth[1] = vec2ms[jj]->ithread;
1308 od[0] =
t.sid1A +
t.backAindex_[
i];
1309 od[1] =
t.sid1B +
t.backBindex_[
i];
1310 iod[0] =
t.backAindex_[
i];
1311 iod[1] =
t.backBindex_[
i];
1313 printf(
"%d offdiag nbrt=%d iii=%d i=%d j1=%d jj=%d sid=%d ix = %d %d back = %d %d\n",
1314 nrnmpi_myid, nbackrt_, iii,
i, j1, jj, sid[j1], ix[0], ix[1],
t.backAindex_[
i],
t.backBindex_[
i]);
1331 mdisp += 2 * b + br;
1344 for (
j = displ[
i];
j < displ[
i + 1]; ++
j) {
1345 if (mark[
j] >= 0 && bb_relation[mark[
j]] == 0 && all_bb_relation[
j] == 0) {
1371 for (
j = displ[
i];
j < displ[
i + 1]; ++
j) {
1373 if (j1 >= 0 && all_bb_relation[
j] >= 2 && rthost[j1] ==
nrnmpi_myid &&
1381 int ib = mdisp + 2 * b;
1387 if (all_bb_relation[
j] > 2) {
1398 for (
j = displ[
i];
j < displ[
i + 1]; ++
j) {
1400 if (j1 >= 0 && all_bb_relation[
j] >= 2 && rthost[j1] ==
nrnmpi_myid &&
1402 if (all_bb_relation[
j] > 2) {
1403 int ib = mdisp + 2 * b + br;
1416 mdisp += 2 * b + br;
1433 for (
j = displ[
i];
j < displ[
i + 1]; ++
j) {
1434 if (mark[
j] >= 0 && bb_relation[mark[
j]] == 1 && all_bb_relation[
j] == 0) {
1463 for (
i=0;
i <
k; ++
i) {
1480 int j =
ms->nd[0]->v_node_index;
1490 ib =
ms->back_index;
1495 j =
ms->nd[1]->v_node_index;
1535 if (
i == tmp_index) {
1564 if (msti.
tag_ == 3) {
1590 for (ioff = 0; ioff < msti.
nnode_rt_; ++ioff) {
1619 delete[] bb_relation;
1620 delete[] all_bb_relation;
1621 delete[] connects2short;
1641 double** r =
ms->rt_->rmap +
ms->rmap_index_;
1642 double** s =
ms->rt_->smap +
ms->smap_index_;
1643 for (
int j = 0;
j < 2; ++
j)
1650 *r++ =
t.sid1A +
t.backAindex_[
ms->back_index];
1651 *r++ =
t.sid1B +
t.backBindex_[
ms->back_index];
1665 if (art.
inode ==
ms.nd[0]->v_node_index) {
1666 art.
pd[2] =
t.sid1A +
t.backAindex_[
ms.back_index];
1667 }
else if (art.
inode ==
ms.nd[1]->v_node_index) {
1668 art.
pd[2] =
t.sid1B +
t.backBindex_[
ms.back_index];
1684 Printf(
"%d %d host=%d nnode=%d displ=%d\n",
id,
i,
ms.host_,
ms.nnode_,
ms.displ_);
1685 for (
j = 0;
j <
ms.nnode_; ++
j) {
1686 k =
ms.nodeindex_[
j];
1687 Printf(
"%d %d %d %d %s %d\n",
1703 int* all_bb_relation) {
1705 for (
i = 0;
i < nt; ++
i) {
1706 if (mark[
i] == -1 && allsid[
i] == sid) {
1708 if (all_bb_relation[
i] > 2) {
1709 int sid2 = all_bb_relation[
i] - 3;
1710 reduced_mark(m, sid2, nt, mark, allsid, all_bb_relation);
1818 Printf(
" %2d bbs=%d bi=%-2d rthost=%-4d %-4d %s{%d}",
1825 ms->nd[0]->sec_node_index_);
1830 ms->nd[1]->sec_node_index_);
1837 Printf(
" backbone_begin=%d backbone_long_begin=%d backbone_interior_begin=%d\n",
1839 t.backbone_long_begin,
1840 t.backbone_interior_begin);
1841 Printf(
" backbone_sid1_begin=%d backbone_long_sid1_begin=%d backbone_end=%d\n",
1842 t.backbone_sid1_begin,
1843 t.backbone_long_sid1_begin,
1845 Printf(
" nbackrt_=%d i, backsid_[i], backAindex_[i], backBindex_[i]\n",
1848 for (
int i = 0;
i <
t.nbackrt_; ++
i) {
1849 Printf(
" %2d %2d %5d %5d",
1856 nd = _nt->
_v_node[
t.backbone_begin +
t.backBindex_[
i]];
1871 Printf(
" %d host=%d rthost=%d nnode=%d nnode_rt=%d size=%d tag=%d\n",
1880 Printf(
" nodeindex=%p nodeindex_buffer = %p\n",
1885 Printf(
" ndbsize=%d i nodeindex_buffer_=%p nodeindex_rthost_=%p\n",
1933 t.triang_subtree2backbone(nt);
1934 t.triang_backbone(nt);
1941 t.bksub_backbone(nt);
1942 t.bksub_subtrees(nt);
2101 #define EXCHANGE_ON 1
2114 printf(
"%d post receive %d displ=%d size=%d host=%d tag=%d\n",
2127 for (jj = 0; jj < mt.
nnode_; ++jj) {
2139 printf(
"%d send to %d nnode=%d nnode_rt=%d size=%d tag=%d\n",
2146 printf(
"%d send to %d tbuf[%d] = %g tbuf[%d] = %g from node %d\n",
2151 printf(
"%d send to %d offdiag tbuf[%d] = %g\n",
2164 for (
j = 0;
j < ab.
n; ++
j) {
2165 tbuf[ab.
ibuf[
j]] *= afac;
2167 printf(
"%d area2buf * afac=%g i=%d j=%d node=%d ibuf=%d buf=%g\n",
nrnmpi_myid, afac,
2179 printf(
"%d post send %d displ=%d size=%d host=%d tag=%d\n",
2201 printf(
"%d receive from %d nnode=%d nnode_rt=%d size=%d tag=%d displ=%d\n",
2220 for (
j = 0;
j < ar.
n; ++
j) {
2263 printf(
"%d receive from %d nnode=%d nnode_rt=%d size=%d tag=%d\n",
2280 for (jj = 0; jj < mt.
nnode_; ++jj) {
2284 RHS(
k) += tbuf[
j++];
2289 printf(
"%d received from %d tbuf[%d] = %g tbuf[%d] = %g added to node %d\n",
2312 #define EXCHANGE_ON 1
2325 printf(
"%d post receive %d displ=%d size=%d host=%d tag=%d\n",
2336 for (jj = 0; jj < mt.
nnode_; ++jj) {
2348 printf(
"%d send to %d nnode=%d nnode_rt=%d size=%d tag=%d\n",
2355 printf(
"%d send to %d tbuf[%d] = %g tbuf[%d] = %g from node %d\n",
2360 printf(
"%d send to %d offdiag tbuf[%d] = %g\n",
2373 printf(
"%d post send %d displ=%d size=%d host=%d tag=%d\n",
2395 printf(
"%d receive from %d nnode=%d nnode_rt=%d size=%d tag=%d displ=%d\n",
2422 for (jj = 0; jj < mt.
nnode_; ++jj) {
2430 printf(
"%d received from %d tbuf[%d] = %g tbuf[%d] = %g added to node %d\n",
2467 printf(
"%d receive from %d nnode=%d nnode_rt=%d size=%d tag=%d\n",
2479 for (jj = 0; jj < mt.
nnode_; ++jj) {
2488 printf(
"%d received from %d tbuf[%d] = %g tbuf[%d] = %g added to node %d\n",
2510 rhs =
new double[4 *
n];
2556 for (
i = 0;
i <
n; ++
i) {
2563 for (
i = 0;
i <
nmap;
i += 2) {
2565 if (*
rmap[
i + 1] == 1e50) {
2574 for (
i=0;
i <
n; ++
i) {
2575 printf(
"%d ReducedTree %2d %12.5g %12.5g %d %12.5g\n",
2599 for (
i=0;
i <
n; ++
i) {
2600 printf(
"%d ReducedTree %2d %12.5g %12.5g %2d %12.5g %12.5g\n",
2605 for (
i =
n - 1;
i > 0; --
i) {
2612 for (
i = 1;
i <
n; ++
i) {
2617 for (
i=0;
i <
n; ++
i) {
2626 for (
i = 0;
i <
n4; ++
i) {
2653 *
smap[
i + 1] = 1e30;
2656 for (
i=0;
i <
nsmap;
i += 2)
if (
i > 10){
2670 int nb =
t.backbone_end -
t.backbone_begin;
2671 if (
rmap[
i] >= trbuf &&
rmap[
i] < (trbuf + tsize)) {
2676 Printf(
" %2d rhs[%2d] rhs[%d] += rhs[%ld] \t%s{%d}\n",
2685 Printf(
" %2d rhs[%2d] d[%d] += d[%ld]\n",
2692 Printf(
" %2d rhs[%2d] a[%d] += sid1A[%ld]",
2697 int j = (
rmap[
i] -
t.sid1A) +
t.backbone_begin;
2699 Printf(
" \tA(%d) %s{%d}",
j,
secname(nd->sec), nd->sec_node_index_);
2703 Printf(
" %2d rhs[%2d] b[%d] += sid1B[%ld]",
2708 int j = (
rmap[
i] -
t.sid1B) +
t.backbone_begin;
2710 Printf(
"\tB(%d) %s{%d}",
j,
secname(nd->sec), nd->sec_node_index_);
2724 int* e1 =
new int[
n - 1];
2725 int* e2 =
new int[
n - 1];
2727 int* sid =
new int[
n];
2730 for (
i = 0;
i <
n; ++
i) {
2736 for (
i = 0;
i < nt; ++
i) {
2737 if (mark[
i] ==
j && allbbr[
i] == 2) {
2738 singlesid = allsid[
i];
2740 if (mark[
i] ==
j && allbbr[
i] > 2 && allsid[
i] < allbbr[
i] - 3) {
2744 const auto& e1ieiter =
s2rt->find(allsid[
i]);
2746 e1[ie] = e1ieiter->second;
2747 sid[e1[ie]] = allsid[
i];
2748 const auto& e2ieiter =
s2rt->find(allbbr[
i] - 3);
2750 e2[ie] = e2ieiter->second;
2751 sid[e2[ie]] = allbbr[
i] - 3;
2765 while (ordered <
n) {
2767 for (
i = 0;
i <
ne; ++
i) {
2772 order[e2[
i]] = ordered++;
2775 }
else if (
order[e2[
i]] >= 0) {
2778 order[e1[
i]] = ordered++;
2788 for (
i = 0;
i <
n; ++
i) {
2794 for (
i=0;
i <
n; ++
i) {
2797 for (
i=0;
i <
n; ++
i) {
2809 const auto& sid1_iter =
s2rt->find(sid1);
2811 const int i = sid1_iter->second;
2817 }
else if (sid2 == sid1) {
2820 const auto& sid2_iter =
s2rt->find(sid2);
2822 j = sid2_iter->second;
2825 }
else if (
ip[
j] ==
i) {
2843 const auto& sid_iter =
s2rt->find(sid);
2845 const int i = sid_iter->second;
2867 printf(
"end of triang_subtree2backbone\n");
2943 double a, b,
p, vsid1;
2995 printf(
"%d part1 i=%d j=%d\n",
2997 printf(
"%d part1 d=%12.5g a=%12.5g rhs=%12.5g\n",
2999 printf(
"%d part1 b=%12.5g d=%12.5g rhs=%12.5g\n",
3009 printf(
"%d part1 result %12.5g %12.5g\n",
3094 "ParallelContext.nthread() was changed after ParallelContext.multisplit()", 0);
3116 int nnode =
i3 -
i1;
3125 int i,
j, i0, ii, in, ip, nback, ib, ibl, ibs;
3126 int is0, is1, k0, k1, iss0, iss1, isl0, isl1;
3129 printf(
"multisplit_v_setup %d\n", nnode);
3136 printf(
"multisplit_v_setup %d\n", nnode);
3137 printf(
"\nclassical order\n");
3160 if (classical_root_to_multisplit_) {
3163 if (
ms->nd[1]->_nt != nt) {
3167 if (
ms->backbone_style != 1) {
3170 if (
ms->backbone_style == 2) {
3186 if (classical_root_to_multisplit_) {
3187 const auto& msiter = classical_root_to_multisplit_->find(oldroot);
3188 if (msiter != classical_root_to_multisplit_->end()) {
3189 nd = msiter->second->nd[0];
3190 if (nd == oldroot) {
3215 printf(
"\nsid0 is a root\n");
3233 if (classical_root_to_multisplit_ &&
3234 classical_root_to_multisplit_->find(nd) != classical_root_to_multisplit_->end()) {
3235 MultiSplit*
ms = classical_root_to_multisplit_->operator[](nd);
3237 ib =
ms->backbone_style >= 1 ? ibs : ibl;
3240 if (
ms->backbone_style >= 1) {
3250 i0 =
ms->nd[0]->v_node_index;
3251 int iii =
ms->nd[1]->v_node_index;
3278 sid0i =
new int[nback];
3279 sid1A =
new double[nback];
3280 sid1B =
new double[nback];
3281 for (
i = 0;
i < nback; ++
i) {
3298 if (classical_root_to_multisplit_) {
3300 const auto& msiter = classical_root_to_multisplit_->find(nd);
3301 if (msiter != classical_root_to_multisplit_->end()) {
3302 ms = msiter->second;
3303 ms->ithread = nt->
id;
3305 if (
ms->backbone_style >= 1) {
3312 i0 =
ms->nd[0]->v_node_index;
3313 ii =
ms->nd[1]->v_node_index;
3325 if (
ms->backbone_style == 2) {
3327 ms->back_index = ibrt;
3397 printf(
"\nmultisplit reordering\n");
3398 printf(
"backbone begin=%d long=%d interior=%d sid1=%d long=%d end=%d\n",
3439 for (
i = 0;
i < _nt->
end; ++
i) {
3451 Printf(
" root\t\t %10.5g %10.5g", 0., 0.);
3456 if (
t.sid0i &&
i >=
t.backbone_begin &&
i <
t.backbone_end) {
3458 t.S1B(
i -
t.backbone_begin),
3459 t.S1A(
i -
t.backbone_begin));
3478 for (
i = 0;
i < _nt->
end; ++
i) {
3491 fprintf(f,
" root\t\t %10.5g %10.5g", 0., 0.);
3496 if (
t.sid0i &&
i >=
t.backbone_begin &&
i <
t.backbone_end) {
3499 t.S1B(
i -
t.backbone_begin),
3500 t.S1A(
i -
t.backbone_begin));
3511 double a, b, d,
rhs;
3518 int i =
ms->nd[0]->v_node_index;
3519 if (i < i1 || i >= i3) {
3526 a =
mth_[it].S1A(0);
3528 Printf(
"%2d %s sid=%d %12.5g %12.5g %12.5g %12.5g\n",
3537 d =
D(
ms->nd[1]->v_node_index);
3538 rhs =
RHS(
ms->nd[1]->v_node_index);
3540 b =
t.S1B(
t.backbone_sid1_begin -
t.backbone_begin);
3541 Printf(
"%2d %s sid=%d %12.5g %12.5g %12.5g %12.5g\n",
3560 }
else if (
pnd == 0) {
3576 }
else if (
pnd == 0) {
const char * secname(Section *sec)
Node * node_exact(Section *sec, double x)
MultiSplitList * multisplit_list_
int * nodeindex_buffer_th_
void multisplit(Section *, double, int, int)
void multisplit_nocap_v_part1(NrnThread *)
void multisplit_adjust_rhs(NrnThread *)
void pmatf(bool full=false)
void matrix_exchange_nocap()
virtual ~MultiSplitControl()
MultiSplitTransferInfo * msti_
std::unique_ptr< MultiSplitTable > classical_root_to_multisplit_
void multisplit_nocap_v_part3(NrnThread *)
void pmat(bool full=false)
void reduced_mark(int, int, int, int *, int *, int *)
void multisplit_nocap_v_part2(NrnThread *)
int backbone_long_sid1_begin
void triang_backbone(NrnThread *)
void bksub_short_backbone_part1(NrnThread *)
virtual ~MultiSplitThread()
void bksub_backbone(NrnThread *)
void v_setup(NrnThread *)
void bksub_subtrees(NrnThread *)
int backbone_interior_begin
void triang_subtree2backbone(NrnThread *)
void fillrmap(int sid1, int sid2, double *pd)
void fillsmap(int sid, double *prhs, double *pdiag)
void pr_map(int, double *)
ReducedTree(MultiSplitControl *, int rank, int mapsize)
std::unique_ptr< Int2IntTable > s2rt
void reorder(int j, int nt, int *mark, int *all_bb_relation, int *allsid)
static double order(void *v)
sprintf(buf, " if (secondorder) {\n" " int _i;\n" " for (_i = 0; _i < %d; ++_i) {\n" " _p[_slist%d[_i]] += dt*_p[_dlist%d[_i]];\n" " }}\n", numeqn, listnum, listnum)
void hoc_execerror(const char *, const char *)
void(* nrn_multisplit_setup_)()
std::vector< MultiSplit * > MultiSplitList
static void nrnmpi_postrecv_doubles(double *, int, int, int, void **)
void nrn_multisplit_nocap_v_part1(NrnThread *)
void * nrn_multisplit_reduce_solve(NrnThread *)
double * nrn_classicalNodeA(Node *nd)
static void nrnmpi_int_allgatherv(int *, int *, int *, int *)
int nrn_multisplit_active_
double * nrn_classicalNodeB(Node *nd)
static double nrnmpi_splitcell_wait_
std::unordered_map< Node *, MultiSplit * > MultiSplitTable
void nrn_multisplit_adjust_rhs(NrnThread *)
void(* nrn_multisplit_solve_)()
void nrn_multisplit_ptr_update()
static MultiSplitControl * msc_
void nrn_multisplit_nocap_v()
static void multisplit_v_setup()
void nrnmpi_multisplit_clear()
static void nrnmpi_wait(void **)
void nrn_multisplit_nocap_v_part2(NrnThread *)
static double nrnmpi_wtime()
void * nrn_multisplit_triang(NrnThread *)
double nrnmpi_rtcomp_time_
void * nrn_multisplit_bksub(NrnThread *)
static void nrnmpi_send_doubles(double *, int, int, int)
void nrnmpi_multisplit(Section *, double x, int sid, int backbone_style)
static void nrnmpi_int_allgather(int *, int *, int)
static void multisplit_solve()
void nrn_matrix_node_free()
static void nrnmpi_barrier()
std::unordered_map< int, int > Int2IntTable
void nrn_multisplit_nocap_v_part3(NrnThread *)
static Node * node(Object *)
int const size_t const size_t n
static philox4x32_key_t k
struct Node * _classical_parent
Represent main neuron object computed by single thread.
static const char * fname(const char *name)