1 #include <../../nrnconf.h> 28 void nrnmpi_split_clear();
29 extern void (*nrnmpi_splitcell_compute_)();
31 extern void nrnmpi_recv_doubles(
double*,
int cnt,
int src,
int tag);
36 static int change_cnt_;
37 static void transfer();
38 static void set_structure();
39 static void splitcell_compute();
49 static SplitCellList* splitcell_list_;
53 static bool splitcell_connected_[2];
54 static double* transfer_p_[4];
61 if (!splitcell_list_) { splitcell_list_ =
new SplitCellList(); }
64 hoc_execerror(
"cells may be split only on adjacent hosts", 0);
74 nrnmpi_splitcell_compute_ = splitcell_compute;
75 for (i=0; i < 2; ++
i)
if (that_host ==
nrnmpi_myid + i*2-1) {
76 if (splitcell_connected_[i]) {
79 hoc_execerror(
"splitcell connection already exists between hosts", buf);
81 splitcell_connected_[
i] =
true;
83 SplitCell* sc =
new SplitCell();
84 splitcell_list_->append(sc);
85 sc->rootsec_ = rootsec;
86 sc->that_host_ = that_host;
90 "NEURON not configured with --with-paranrn");
97 void nrnmpi_split_clear() {
98 if (nrnmpi_splitcell_compute_ == splitcell_compute) {
105 void splitcell_compute() {
113 for (i = 0; i < split_cnt_; ++
i) {
114 SplitInfo& si = split_info_[
i];
116 SplitInfo& sj = split_info_[si.that_index];
117 sj.d_that = *(si.d_this);
118 sj.rhs_that = *(si.rhs_this);
121 for (i = 0; i < split_cnt_; ++
i) {
122 SplitInfo& si = split_info_[
i];
123 *(si.d_this) += si.d_that;
124 *(si.rhs_this) += si.rhs_that;
130 double trans[2], trans_sav[2];
132 if (transfer_p_[ip]) {
133 trans[0] = *transfer_p_[ip + 0];
134 trans[1] = *transfer_p_[ip + 1];
137 if (transfer_p_[im]) {
138 nrnmpi_recv_doubles(trans_sav, 2,
nrnmpi_myid-1, 1);
141 trans[0] = *transfer_p_[im + 0];
142 trans[1] = *transfer_p_[im + 1];
143 *transfer_p_[im + 0] += trans_sav[0];
144 *transfer_p_[im + 1] += trans_sav[1];
147 if (transfer_p_[ip]) {
149 *transfer_p_[ip + 0] += trans[0];
150 *transfer_p_[ip + 1] += trans[1];
156 void set_structure() {
158 if (!splitcell_list_) {
return; }
159 cnt = splitcell_list_->count();
160 for (i = 0; i <
cnt; ++
i) {
161 SplitCell& sc = *splitcell_list_->item(i);
163 transfer_p_[ip + 0] = &
NODED(sc.rootsec_->parentnode);
164 transfer_p_[ip + 1] = &
NODERHS(sc.rootsec_->parentnode);
167 transfer_p_[im + 0] = &
NODED(sc.rootsec_->parentnode);
168 transfer_p_[im + 1] = &
NODERHS(sc.rootsec_->parentnode);
#define declarePtrList(PtrList, T)
static double nrnmpi_splitcell_wait_
struct Section * parentsec
sprintf(buf," if (secondorder) {\ " int _i;\" " for(_i=0;_i< %d;++_i) {\" " _p[_slist%d[_i]]+=dt *_p[_dlist%d[_i]];\" " }}\", numeqn, listnum, listnum)
#define implementPtrList(PtrList, T)
const char * secname(Section *sec)
void hoc_execerror(const char *, const char *)
void nrnmpi_splitcell_connect(int that_host)
static void nrnmpi_send_doubles(double *, int, int, int)
static double nrnmpi_wtime()
Section * chk_access(void)