1 #include <../../nrnconf.h>
16 #include <unordered_map>
57 #define RHS(i) vec_rhs[i]
58 #define S1A(i) sid1A[i]
59 #define S1B(i) sid1B[i]
240 void reorder(
int j,
int nt,
int* mark,
int* all_bb_relation,
int* allsid);
242 void fillrmap(
int sid1,
int sid2,
double* pd);
243 void fillsmap(
int sid,
double* prhs,
double* pdiag);
244 void pr_map(
int,
double*);
356 if (sid > 1000) {
pexch();
return; }
357 if (sid >= 1000) {
pmat(sid>1000);
return; }
369 if (backbone_style != 2) {
392 if (backbone_style == 2) {
393 if (
ms->backbone_style != 2) {
394 hoc_execerror(
"earlier call for this cell did not have a backbone style = 2", 0);
396 }
else if (backbone_style == 1) {
397 ms->backbone_style = 1;
401 if (
ms->sid[1] ==
ms->sid[0]) {
403 Sprintf(
s,
"two sid = %d at same point on tree rooted at", sid);
408 ms->backbone_style = backbone_style;
417 ms->rmap_index_ = -1;
418 ms->smap_index_ = -1;
419 (*classical_root_to_multisplit_)[
root] =
ms;
522 delete mspair.second;
571 if (
ms->backbone_style == 2) {
576 }
else if (
ms->backbone_style == 1) {
578 ms->backbone_style = 0;
610 int* bb_relation = 0;
614 bb_relation =
new int[
n];
615 threadid =
new int[
n];
621 inode[
i] =
ms->nd[0]->v_node_index;
622 threadid[
i] =
ms->ithread;
623 bb_relation[
i] =
ms->backbone_style;
628 inode[
i] =
ms->nd[1]->v_node_index;
629 threadid[
i] =
ms->ithread;
630 bb_relation[
i] =
ms->backbone_style;
631 if (
ms->backbone_style == 2) {
632 bb_relation[
i - 1] += 1 + sid[
i];
633 bb_relation[
i] += 1 + sid[
i - 1];
647 displ[
i + 1] = displ[
i] + nn[
i];
650 int* allsid =
new int[nt];
651 int* all_bb_relation =
new int[nt];
656 for (
i = 0;
i <
n; ++
i) {
658 all_bb_relation[
i] = bb_relation[
i];
663 delete[] all_bb_relation;
704 int* mark =
new int[nt];
705 int* connects2short =
new int[
n];
706 for (
i = 0;
i <
n; ++
i) {
707 connects2short[
i] = 0;
709 for (
i = 0;
i < nt; ++
i) {
711 for (
j = 0;
j <
n; ++
j) {
712 if (allsid[
i] == sid[
j]) {
719 if ((bb_relation[
j] >= 2) != (all_bb_relation[
i] >= 2)) {
720 hoc_execerror(
"backbone_style==2 inconsistent between hosts for same sid", 0);
723 if (all_bb_relation[
i] < 2) {
725 if (all_bb_relation[
i] == 1) {
726 connects2short[
j] = 1;
743 for (
i = 0;
i < nt; ++
i) {
744 if (mark[
i] >= 0 && connects2short[mark[
i]] && all_bb_relation[
i] == 0 &&
745 bb_relation[mark[
i]] == 0) {
750 for (
i = 0;
i < nt; ++
i) {
752 if (bb_relation[mark[
i]] == 1 && all_bb_relation[
i] == 1) {
753 hoc_execerror(
"a short to short backbone interprocessor connection exists", 0);
765 for (
j = 0;
j <
n; ++
j) {
766 if (bb_relation[
j] >= 2) {
775 for (
i=0;
i < nt; ++
i) {
printf(
"%d %d allsid=%d all_bb_relation=%d mark=%d\n",
785 int* mcnt =
new int[
n];
786 for (
j = 0;
j <
n; ++
j) {
790 if (all_bb_relation[
i] >= 2 && mark[
i] >= 0) {
792 if (all_bb_relation[
i] > 2) {
797 for (
j = 0;
j <
n; ++
j) {
812 int* rthost =
new int[
n];
814 for (
j = 0;
j <
n; ++
j) {
820 if (
ms->backbone_style == 2) {
821 for (
j = 0;
j <
n; ++
j) {
822 if (sid[
j] ==
ms->sid[0]) {
829 for (
i = displ[ih];
i < displ[ih + 1]; ++
i) {
831 if (all_bb_relation[
i] > 2) {
835 if (all_bb_relation[
i] == 2) {
842 if (
ms->rthost != -1) {
846 if (
ms->rthost == -1) {
850 rthost[
j] =
ms->rthost;
859 for (
j=0;
j <
n; ++
j) {
861 bb_relation[
j], rthost[
j]);
875 int nj = displ[
i + 1];
876 for (
j = displ[
i];
j < nj; ++
j) {
877 if (all_bb_relation[
j] >= 2 && mark[
j] >= 0 && rthost[mark[
j]] ==
nrnmpi_myid) {
880 if (all_bb_relation[
j] > 2) {
889 for (
j = 0;
j <
n; ++
j) {
897 for (
j = 0;
j <
n; ++
j) {
904 for (
k = 0;
k < nt; ++
k) {
905 if (mark[
k] ==
j && all_bb_relation[
k] >= 2) {
906 const auto&
result = s2rt->insert({allsid[
k], rank});
910 if (all_bb_relation[
k] == 2) {
934 if (
ms->backbone_style == 2) {
936 ms->rthost = rthost[jj];
937 rthost[
j] =
ms->rthost;
948 if (
ms->backbone_style == 2) {
952 for (
j=0;
j <
n; ++
j) {
954 bb_relation[
j], rthost[
j]);
959 for (
i = 0;
i <
n; ++
i) {
962 for (
j = 0;
j < 2; ++
j) {
972 if (bb_relation[
i] == 2) {
991 for (
i = 0;
i <
n; ++
i) {
994 for (
j = 0;
j < 2; ++
j) {
1007 if (bb_relation[
i] > 2) {
1012 art.
pd[2] =
t.sid1A +
t.backAindex_[
k];
1014 art.
pd[2] =
t.sid1B +
t.backBindex_[
k];
1025 if (bb_relation[
i] > 2) {
1031 if (bb_relation[
i] == 2) {
1049 for (
i=0;
i <
n; ++
i) {
1050 printf(
"%d %d sid=%d bbrelation=%d rthost=%d rt=%p\n",
nrnmpi_myid,
i, sid[
i], bb_relation[
i], rthost[
i], rt[
i]);
1055 for (
i=0;
i < nt; ++
i) {
1056 printf(
"%d %d allsid=%d mark=%d all_bb_relation=%d\n",
nrnmpi_myid,
i, allsid[
i], mark[
i], all_bb_relation[
i]);
1079 for (
j = displ[
i];
j < displ[
i + 1]; ++
j) {
1082 if (bb_relation[mark[
j]] == 1) {
1083 assert(all_bb_relation[
j] == 0);
1087 }
else if (all_bb_relation[
j] == 1) {
1091 }
else if (all_bb_relation[
j] < 2) {
1095 }
else if (all_bb_relation[
j] >= 2) {
1096 int rth = rthost[mark[
j]];
1106 if (all_bb_relation[
j] > 2) {
1116 for (
int jj = displ[
i]; jj <
j; ++jj) {
1117 if (rth == rthost[mark[jj]]) {
1124 if (all_bb_relation[
j] > 2) {
1171 for (
j = displ[
i];
j < displ[
i + 1]; ++
j) {
1172 if (mark[
j] >= 0 && bb_relation[mark[
j]] == 0 && all_bb_relation[
j] == 1) {
1196 int* tmphost =
new int[
n];
1199 for (
j = displ[
i];
j < displ[
i + 1]; ++
j) {
1201 if (j1 >= 0 && bb_relation[j1] >= 2 && rthost[j1] !=
i) {
1202 tmphost[ntmphost++] = rthost[j1];
1203 for (
int itmp = 1; itmp < ntmphost; ++itmp) {
1204 if (tmphost[itmp - 1] == rthost[j1]) {
1213 for (
int itmp = 0; itmp < ntmphost; ++itmp) {
1220 for (
j = displ[
i];
j < displ[
i + 1]; ++
j) {
1221 int jj =
j - displ[
i];
1226 if (j1 >= 0 && bb_relation[j1] >= 2 && rthost[j1] == tmphost[itmp]) {
1236 if (bb_relation[jj] > 2) {
1297 ix[1] = inode[jj + 1];
1298 ixth[0] = vec2ms[jj]->ithread;
1299 ixth[1] = vec2ms[jj]->ithread;
1300 od[0] =
t.sid1A +
t.backAindex_[
i];
1301 od[1] =
t.sid1B +
t.backBindex_[
i];
1302 iod[0] =
t.backAindex_[
i];
1303 iod[1] =
t.backBindex_[
i];
1305 printf(
"%d offdiag nbrt=%d iii=%d i=%d j1=%d jj=%d sid=%d ix = %d %d back = %d %d\n",
1306 nrnmpi_myid, nbackrt_, iii,
i, j1, jj, sid[j1], ix[0], ix[1],
t.backAindex_[
i],
t.backBindex_[
i]);
1323 mdisp += 2 * b + br;
1336 for (
j = displ[
i];
j < displ[
i + 1]; ++
j) {
1337 if (mark[
j] >= 0 && bb_relation[mark[
j]] == 0 && all_bb_relation[
j] == 0) {
1363 for (
j = displ[
i];
j < displ[
i + 1]; ++
j) {
1365 if (j1 >= 0 && all_bb_relation[
j] >= 2 && rthost[j1] ==
nrnmpi_myid &&
1373 int ib = mdisp + 2 * b;
1379 if (all_bb_relation[
j] > 2) {
1390 for (
j = displ[
i];
j < displ[
i + 1]; ++
j) {
1392 if (j1 >= 0 && all_bb_relation[
j] >= 2 && rthost[j1] ==
nrnmpi_myid &&
1394 if (all_bb_relation[
j] > 2) {
1395 int ib = mdisp + 2 * b + br;
1408 mdisp += 2 * b + br;
1425 for (
j = displ[
i];
j < displ[
i + 1]; ++
j) {
1426 if (mark[
j] >= 0 && bb_relation[mark[
j]] == 1 && all_bb_relation[
j] == 0) {
1455 for (
i=0;
i <
k; ++
i) {
1474 int j =
ms->nd[0]->v_node_index;
1484 ib =
ms->back_index;
1489 j =
ms->nd[1]->v_node_index;
1529 if (
i == tmp_index) {
1558 if (msti.
tag_ == 3) {
1584 for (ioff = 0; ioff < msti.
nnode_rt_; ++ioff) {
1613 delete[] bb_relation;
1614 delete[] all_bb_relation;
1615 delete[] connects2short;
1635 double** r =
ms->rt_->rmap +
ms->rmap_index_;
1636 double**
s =
ms->rt_->smap +
ms->smap_index_;
1637 for (
int j = 0;
j < 2; ++
j)
1644 *r++ =
t.sid1A +
t.backAindex_[
ms->back_index];
1645 *r++ =
t.sid1B +
t.backBindex_[
ms->back_index];
1659 if (art.
inode ==
ms.nd[0]->v_node_index) {
1660 art.
pd[2] =
t.sid1A +
t.backAindex_[
ms.back_index];
1661 }
else if (art.
inode ==
ms.nd[1]->v_node_index) {
1662 art.
pd[2] =
t.sid1B +
t.backBindex_[
ms.back_index];
1678 Printf(
"%d %d host=%d nnode=%d displ=%d\n",
id,
i,
ms.host_,
ms.nnode_,
ms.displ_);
1679 for (
j = 0;
j <
ms.nnode_; ++
j) {
1680 k =
ms.nodeindex_[
j];
1681 Printf(
"%d %d %d %d %s %d\n",
1697 int* all_bb_relation) {
1699 for (
i = 0;
i < nt; ++
i) {
1700 if (mark[
i] == -1 && allsid[
i] == sid) {
1702 if (all_bb_relation[
i] > 2) {
1703 int sid2 = all_bb_relation[
i] - 3;
1704 reduced_mark(m, sid2, nt, mark, allsid, all_bb_relation);
1812 Printf(
" %2d bbs=%d bi=%-2d rthost=%-4d %-4d %s{%d}",
1819 ms->nd[0]->sec_node_index_);
1824 ms->nd[1]->sec_node_index_);
1831 Printf(
" backbone_begin=%d backbone_long_begin=%d backbone_interior_begin=%d\n",
1833 t.backbone_long_begin,
1834 t.backbone_interior_begin);
1835 Printf(
" backbone_sid1_begin=%d backbone_long_sid1_begin=%d backbone_end=%d\n",
1836 t.backbone_sid1_begin,
1837 t.backbone_long_sid1_begin,
1839 Printf(
" nbackrt_=%d i, backsid_[i], backAindex_[i], backBindex_[i]\n",
1842 for (
int i = 0;
i <
t.nbackrt_; ++
i) {
1843 Printf(
" %2d %2d %5d %5d",
1850 nd = _nt->
_v_node[
t.backbone_begin +
t.backBindex_[
i]];
1865 Printf(
" %d host=%d rthost=%d nnode=%d nnode_rt=%d size=%d tag=%d\n",
1874 Printf(
" nodeindex=%p nodeindex_buffer = %p\n",
1879 Printf(
" ndbsize=%d i nodeindex_buffer_=%p nodeindex_rthost_=%p\n",
1888 Printf(
" tbsize=%d trecvbuf_=%p tsendbuf_=%p\n",
1930 t.triang_subtree2backbone(nt);
1931 t.triang_backbone(nt);
1938 t.bksub_backbone(nt);
1939 t.bksub_subtrees(nt);
2039 double afac = 100. / vec_area[
j];
2048 double afac = 100. / vec_area[
j];
2105 #define EXCHANGE_ON 1
2118 printf(
"%d post receive %d displ=%d size=%d host=%d tag=%d\n",
2131 for (jj = 0; jj < mt.
nnode_; ++jj) {
2143 printf(
"%d send to %d nnode=%d nnode_rt=%d size=%d tag=%d\n",
2150 printf(
"%d send to %d tbuf[%d] = %g tbuf[%d] = %g from node %d\n",
2155 printf(
"%d send to %d offdiag tbuf[%d] = %g\n",
2168 for (
j = 0;
j < ab.
n; ++
j) {
2169 tbuf[ab.
ibuf[
j]] *= afac;
2171 printf(
"%d area2buf * afac=%g i=%d j=%d node=%d ibuf=%d buf=%g\n",
nrnmpi_myid, afac,
2183 printf(
"%d post send %d displ=%d size=%d host=%d tag=%d\n",
2205 printf(
"%d receive from %d nnode=%d nnode_rt=%d size=%d tag=%d displ=%d\n",
2224 for (
j = 0;
j < ar.
n; ++
j) {
2267 printf(
"%d receive from %d nnode=%d nnode_rt=%d size=%d tag=%d\n",
2284 for (jj = 0; jj < mt.
nnode_; ++jj) {
2293 printf(
"%d received from %d tbuf[%d] = %g tbuf[%d] = %g added to node %d\n",
2316 #define EXCHANGE_ON 1
2329 printf(
"%d post receive %d displ=%d size=%d host=%d tag=%d\n",
2340 for (jj = 0; jj < mt.
nnode_; ++jj) {
2352 printf(
"%d send to %d nnode=%d nnode_rt=%d size=%d tag=%d\n",
2359 printf(
"%d send to %d tbuf[%d] = %g tbuf[%d] = %g from node %d\n",
2364 printf(
"%d send to %d offdiag tbuf[%d] = %g\n",
2377 printf(
"%d post send %d displ=%d size=%d host=%d tag=%d\n",
2399 printf(
"%d receive from %d nnode=%d nnode_rt=%d size=%d tag=%d displ=%d\n",
2426 for (jj = 0; jj < mt.
nnode_; ++jj) {
2434 printf(
"%d received from %d tbuf[%d] = %g tbuf[%d] = %g added to node %d\n",
2471 printf(
"%d receive from %d nnode=%d nnode_rt=%d size=%d tag=%d\n",
2483 for (jj = 0; jj < mt.
nnode_; ++jj) {
2492 printf(
"%d received from %d tbuf[%d] = %g tbuf[%d] = %g added to node %d\n",
2514 rhs =
new double[4 *
n];
2560 for (
i = 0;
i <
n; ++
i) {
2567 for (
i = 0;
i <
nmap;
i += 2) {
2569 if (*
rmap[
i + 1] == 1e50) {
2578 for (
i=0;
i <
n; ++
i) {
2579 printf(
"%d ReducedTree %2d %12.5g %12.5g %d %12.5g\n",
2603 for (
i=0;
i <
n; ++
i) {
2604 printf(
"%d ReducedTree %2d %12.5g %12.5g %2d %12.5g %12.5g\n",
2609 for (
i =
n - 1;
i > 0; --
i) {
2616 for (
i = 1;
i <
n; ++
i) {
2621 for (
i=0;
i <
n; ++
i) {
2630 for (
i = 0;
i <
n4; ++
i) {
2657 *
smap[
i + 1] = 1e30;
2660 for (
i=0;
i <
nsmap;
i += 2)
if (
i > 10){
2674 int nb =
t.backbone_end -
t.backbone_begin;
2675 if (
rmap[
i] >= trbuf &&
rmap[
i] < (trbuf + tsize)) {
2680 Printf(
" %2d rhs[%2d] rhs[%d] += rhs[%ld] \t%s{%d}\n",
2689 Printf(
" %2d rhs[%2d] d[%d] += d[%ld]\n",
2696 Printf(
" %2d rhs[%2d] a[%d] += sid1A[%ld]",
2701 int j = (
rmap[
i] -
t.sid1A) +
t.backbone_begin;
2703 Printf(
" \tA(%d) %s{%d}",
j,
secname(nd->sec), nd->sec_node_index_);
2707 Printf(
" %2d rhs[%2d] b[%d] += sid1B[%ld]",
2712 int j = (
rmap[
i] -
t.sid1B) +
t.backbone_begin;
2714 Printf(
"\tB(%d) %s{%d}",
j,
secname(nd->sec), nd->sec_node_index_);
2728 int* e1 =
new int[
n - 1];
2729 int* e2 =
new int[
n - 1];
2731 int* sid =
new int[
n];
2734 for (
i = 0;
i <
n; ++
i) {
2740 for (
i = 0;
i < nt; ++
i) {
2741 if (mark[
i] ==
j && allbbr[
i] == 2) {
2742 singlesid = allsid[
i];
2744 if (mark[
i] ==
j && allbbr[
i] > 2 && allsid[
i] < allbbr[
i] - 3) {
2748 const auto& e1ieiter =
s2rt->find(allsid[
i]);
2750 e1[ie] = e1ieiter->second;
2751 sid[e1[ie]] = allsid[
i];
2752 const auto& e2ieiter =
s2rt->find(allbbr[
i] - 3);
2754 e2[ie] = e2ieiter->second;
2755 sid[e2[ie]] = allbbr[
i] - 3;
2769 while (ordered <
n) {
2771 for (
i = 0;
i < ne; ++
i) {
2776 order[e2[
i]] = ordered++;
2779 }
else if (
order[e2[
i]] >= 0) {
2782 order[e1[
i]] = ordered++;
2792 for (
i = 0;
i <
n; ++
i) {
2798 for (
i=0;
i <
n; ++
i) {
2801 for (
i=0;
i <
n; ++
i) {
2813 const auto& sid1_iter =
s2rt->find(sid1);
2815 const int i = sid1_iter->second;
2821 }
else if (sid2 == sid1) {
2824 const auto& sid2_iter =
s2rt->find(sid2);
2826 j = sid2_iter->second;
2829 }
else if (
ip[
j] ==
i) {
2847 const auto& sid_iter =
s2rt->find(sid);
2849 const int i = sid_iter->second;
2875 printf(
"end of triang_subtree2backbone\n");
2901 p = vec_a[
i] /
D(
i);
2957 double a, b,
p, vsid1;
3011 printf(
"%d part1 i=%d j=%d\n",
3013 printf(
"%d part1 d=%12.5g a=%12.5g rhs=%12.5g\n",
3015 printf(
"%d part1 b=%12.5g d=%12.5g rhs=%12.5g\n",
3025 printf(
"%d part1 result %12.5g %12.5g\n",
3111 "ParallelContext.nthread() was changed after ParallelContext.multisplit()", 0);
3133 int nnode =
i3 -
i1;
3142 int i,
j, i0,
ii, in, ip, nback, ib, ibl, ibs;
3143 int is0, is1, k0, k1, iss0, iss1, isl0, isl1;
3146 printf(
"multisplit_v_setup %d\n", nnode);
3153 printf(
"multisplit_v_setup %d\n", nnode);
3154 printf(
"\nclassical order\n");
3177 if (classical_root_to_multisplit_) {
3180 if (
ms->nd[1]->_nt != nt) {
3184 if (
ms->backbone_style != 1) {
3187 if (
ms->backbone_style == 2) {
3203 if (classical_root_to_multisplit_) {
3204 const auto& msiter = classical_root_to_multisplit_->find(oldroot);
3205 if (msiter != classical_root_to_multisplit_->end()) {
3206 nd = msiter->second->nd[0];
3207 if (nd == oldroot) {
3232 printf(
"\nsid0 is a root\n");
3250 if (classical_root_to_multisplit_ &&
3251 classical_root_to_multisplit_->find(nd) != classical_root_to_multisplit_->end()) {
3252 MultiSplit*
ms = classical_root_to_multisplit_->operator[](nd);
3254 ib =
ms->backbone_style >= 1 ? ibs : ibl;
3256 parent[ib -
i1] = 0;
3257 if (
ms->backbone_style >= 1) {
3267 i0 =
ms->nd[0]->v_node_index;
3268 int iii =
ms->nd[1]->v_node_index;
3275 parent[
ii -
i1] = 0;
3280 parent[
ii -
i1] = 0;
3295 sid0i =
new int[nback];
3296 sid1A =
new double[nback];
3297 sid1B =
new double[nback];
3298 for (
i = 0;
i < nback; ++
i) {
3315 if (classical_root_to_multisplit_) {
3317 const auto& msiter = classical_root_to_multisplit_->find(nd);
3318 if (msiter != classical_root_to_multisplit_->end()) {
3319 ms = msiter->second;
3320 ms->ithread = nt->
id;
3322 if (
ms->backbone_style >= 1) {
3329 i0 =
ms->nd[0]->v_node_index;
3330 ii =
ms->nd[1]->v_node_index;
3342 if (
ms->backbone_style == 2) {
3344 ms->back_index = ibrt;
3370 parent[
i]?parent[
i]->sec_node_index_:-1);
3414 printf(
"\nmultisplit reordering\n");
3415 printf(
"backbone begin=%d long=%d interior=%d sid1=%d long=%d end=%d\n",
3456 for (
i = 0;
i < _nt->
end; ++
i) {
3468 Printf(
" root\t\t %10.5g %10.5g", 0., 0.);
3473 if (
t.sid0i &&
i >=
t.backbone_begin &&
i <
t.backbone_end) {
3475 t.S1B(
i -
t.backbone_begin),
3476 t.S1A(
i -
t.backbone_begin));
3490 f = fopen(fname,
"w");
3494 fprintf(f,
"%d %d\n", it, _nt->
end);
3495 for (
i = 0;
i < _nt->
end; ++
i) {
3508 fprintf(f,
" root\t\t %10.5g %10.5g", 0., 0.);
3513 if (
t.sid0i &&
i >=
t.backbone_begin &&
i <
t.backbone_end) {
3516 t.S1B(
i -
t.backbone_begin),
3517 t.S1A(
i -
t.backbone_begin));
3528 double a, b, d,
rhs;
3537 int i =
ms->nd[0]->v_node_index;
3538 if (i < i1 || i >= i3) {
3545 a =
mth_[it].S1A(0);
3547 Printf(
"%2d %s sid=%d %12.5g %12.5g %12.5g %12.5g\n",
3556 d =
D(
ms->nd[1]->v_node_index);
3557 rhs =
RHS(
ms->nd[1]->v_node_index);
3559 b =
t.S1B(
t.backbone_sid1_begin -
t.backbone_begin);
3560 Printf(
"%2d %s sid=%d %12.5g %12.5g %12.5g %12.5g\n",
3579 }
else if (
pnd == 0) {
3595 }
else if (
pnd == 0) {
const char * secname(Section *sec)
name of section (for use in error messages)
void setup_topology(void)
Node * node_exact(Section *sec, double x)
like node_index but give proper node when x is 0 or 1 as well as in between
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)
void move(Item *q1, Item *q2, Item *q3)
void(* nrn_multisplit_setup_)()
std::vector< MultiSplit * > MultiSplitList
static void nrnmpi_postrecv_doubles(double *, int, int, int, void **)
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_nocap_v_part1(NrnThread *nt)
void(* nrn_multisplit_solve_)()
void nrn_multisplit_ptr_update()
static MultiSplitControl * msc_
void nrn_multisplit_nocap_v_part3(NrnThread *nt)
void nrn_multisplit_nocap_v()
static void multisplit_v_setup()
void nrnmpi_multisplit_clear()
void nrn_multisplit_adjust_rhs(NrnThread *nt)
static void nrnmpi_wait(void **)
void nrn_multisplit_nocap_v_part2(NrnThread *nt)
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()
static void nrnmpi_barrier()
std::unordered_map< int, int > Int2IntTable
void hoc_execerror(const char *s1, const char *s2)
int Sprintf(char(&buf)[N], const char *fmt, Args &&... args)
Redirect sprintf to snprintf if the buffer size can be deduced.
#define nrn_assert(x)
assert()-like macro, independent of NDEBUG status
static Node * node(Object *)
void nrn_matrix_node_free()
int const size_t const size_t n
struct Node * _classical_parent
Represent main neuron object computed by single thread.
double & actual_d(std::size_t row)
double * node_a_storage()
double & actual_rhs(std::size_t row)
double * node_rhs_storage()
double * node_area_storage()
double * node_d_storage()
double * node_voltage_storage()
double * node_b_storage()
int Printf(const char *fmt, Args... args)