33 double *Blocal, *X, *W, *X2 ;
34 Int *Cperm, *Rperm, *Cstart, *Q, *Sched, *Child, *Childp ;
35 Int i,
n, ncomponents, k, c, k1, k2, nfound, myid, cp, nchild, child ;
48 Cperm = LUsymbolic->
Cperm ;
49 Rperm = LUsymbolic->
Rperm ;
50 Rperm = (Rperm ==
NULL) ? Cperm : Rperm ;
51 Cstart = LUsymbolic->
Cstart ;
52 Sched = LUsymbolic->
Sched ;
60 for (k = 0 ; k < n ; k++)
62 W [k] = B [Rperm [k]] ;
70 for (c = 0 ; c < ncomponents ; c++)
78 MPI (LU->
LUnode [c]->req = MPI_REQUEST_NULL) ;
81 if (Sched [c] == myid)
83 for (i = 0 ; i < k2-k1 ; i++)
85 Blocal [i] = W [k1 + i] ;
90 MPI (MPI_Isend (W + k1, k2-k1, MPI_DOUBLE, Sched [c],
91 c, MPI_COMM_WORLD, &(LU->
LUnode [c]->req))) ;
96 if (Sched [c] == myid)
98 MPI (MPI_Irecv (Blocal, k2-k1, MPI_DOUBLE, 0,
99 c, MPI_COMM_WORLD, &(LU->
LUnode [c]->req))) ;
108 Childp = LUsymbolic->
Childp ;
109 Child = LUsymbolic->
Child ;
111 for (c = 0 ; c < ncomponents ; c++)
113 if (Sched [c] == myid)
115 nchild = Childp [c+1] - Childp [c] ;
116 for (cp = 0 ; cp < nchild ; cp++)
118 child = Child [Childp [c] + cp] ;
119 if (Sched [child] != myid)
122 LU->
LUnode [child]->PK_NN, MPI_DOUBLE, Sched [child],
123 TAG0, MPI_COMM_WORLD, &(LU->
LUnode [c]->Req [cp]))) ;
127 MPI (LU->
LUnode [c]->Req [cp] = MPI_REQUEST_NULL) ;
137 for (c = 0 ; c < ncomponents ; c++)
139 if (Sched [c] == myid)
145 MPI (MPI_Barrier (MPI_COMM_WORLD)) ;
151 for (c = ncomponents-1 ; c >= 0 ; c--)
153 if (Sched [c] == myid)
159 MPI (MPI_Barrier (MPI_COMM_WORLD)) ;
167 for (c = 0 ; c < ncomponents ; c++)
170 nfound = LU->
LUnode [c]->PK_NFOUND ;
173 PR1 ((Common->
file,
"get soln, node c="ID", nfound "ID"\n", c, nfound));
175 if (Sched [c] != myid)
177 PR1 ((Common->
file,
"recv node "ID
" from "ID
"\n", c, Sched [c])) ;
178 MPI (MPI_Recv (W, nfound, MPI_DOUBLE, Sched [c],
179 TAG0, MPI_COMM_WORLD, &ms)) ;
184 PR1 ((Common->
file,
"I own it already\n")) ;
187 PR1 ((Common->
file,
"got it from Sched [c] = "ID
"\n", Sched [c])) ;
188 for (i = 0 ; i < nfound ; i++)
191 PR2 ((Common->
file,
"X ["ID
"] is global B ["ID
"] %g\n",
198 if (Sched [c] == myid)
201 "send soln, node c = "ID", myid "ID" nfound "ID"\n",
203 MPI (MPI_Send (X, nfound, MPI_DOUBLE, 0,
TAG0, MPI_COMM_WORLD));
Int amesos_paraklete_lsolve_node(Int c, paraklete_numeric *LU, paraklete_symbolic *LUsymbolic, paraklete_common *Common)
Int amesos_paraklete_usolve_node(Int c, paraklete_numeric *LU, paraklete_symbolic *LUsymbolic, paraklete_common *Common)
Int amesos_paraklete_solve(paraklete_numeric *LU, paraklete_symbolic *LUsymbolic, double *B, paraklete_common *Common)