27 double *X, *
B, *LUix, *Xchild, *Lx ;
28 Int *Child, *Childp, *Lost, *Lostp, *Cstart, *Lip, *Llen,
29 *Cn, *Pinv, *Li, *Cparent, *Sched ;
30 Int cp, nchild, child, cn, k, j, p, i, nfound, k1, k2, llen,
31 ci, nlost_in, cn_child, cn_nfound, parent, myid, pass ;
33 MPI (MPI_Request req) ;
40 PR0 ((Common->
file,
"\n\n########################## Lsolve NODE "ID"\n", c)) ;
47 Childp = LUsymbolic->
Childp ;
48 Child = LUsymbolic->
Child ;
49 nchild = Childp [c+1] - Childp [c] ;
51 Cstart = LUsymbolic->
Cstart ;
52 Sched = LUsymbolic->
Sched ;
64 nfound = LUnode->PK_NFOUND ;
68 Lostp = LUnode->
Lostp ;
72 cn = nlost_in + Cn [c] ;
80 Int npiv = LUnode->PK_NPIV ;
82 ASSERT (cn == LUnode->PK_NN) ;
83 ASSERT (npiv == nlost_in + (k2 - k1)) ;
84 for (k = 0 ; k < npiv ; k++)
87 ASSERT (i >= 0 && i < npiv) ;
100 PR1 ((Common->
file,
"Lsolve at Node "ID", cn "ID"\n", c, cn)) ;
101 for (i = 0 ; i < cn ; i++)
113 MPI (MPI_Wait (&(LU->
LUnode [c]->req), &ms)) ;
115 for (i = 0 ; i < k2-k1 ; i++)
119 PR2 ((Common->
file,
"orig B ["ID
"] = %g goes to X ["ID
"]\n", i, B [i], k)) ;
120 ASSERT (k >= 0 && k < cn) ;
125 for (pass = 1 ; pass <= 2 ; pass++)
127 for (cp = 0 ; cp < nchild ; cp++)
129 child = Child [Childp [c] + cp] ;
133 if (Sched [child] != myid) continue ;
138 if (Sched [child] == myid) continue ;
139 MPI (MPI_Wait (&(LUnode->Req [cp]), &ms)) ;
142 cn_child = LU->
LUnode [child]->PK_NN ;
143 cn_nfound = LU->
LUnode [child]->PK_NFOUND ;
144 Xchild = LU->
LUnode [child]->
X + cn_nfound ;
146 PR1 ((Common->
file,
"child "ID
" cn "ID
" nfound "ID
"\n",
147 child, cn_child, cn_nfound)) ;
150 for (i = 0 ; i < Lost [cp] ; i++)
152 ci = i + Lostp [cp] ;
154 PR2 ((Common->
file,
"Xchild ["ID
"] = %g goes to X ["ID
"] (lost)\n",
156 ASSERT (k >= 0 && k < cn) ;
157 X [k] += Xchild [i] ;
161 for ( ; i < Lost [cp] + (k2-k1) ; i++)
163 ci = i + (nlost_in - Lost [cp]) ;
165 PR2 ((Common->
file,
"Xchild ["ID
"] = %g goes to X ["ID
"] (cand)\n",
167 ASSERT (k >= 0 && k < cn) ;
168 X [k] += Xchild [i] ;
172 for ( ; i < cn_child - cn_nfound ; i++)
174 k = i + (nlost_in - Lost [cp]) ;
175 PR2 ((Common->
file,
"Xchild ["ID
"] = %g goes to X ["ID
"] (anc)\n",
177 ASSERT (k >= 0 && k < cn) ;
178 X [k] += Xchild [i] ;
187 for (j = 0 ; j < nfound ; j++)
190 GET_COLUMN (Lip, Llen, LUix, j, Li, Lx, llen) ;
191 for (p = 1 ; p < llen ; p++)
193 X [Li [p]] -= Lx [p] * xj ;
204 parent = Cparent [c] ;
205 if (parent !=
EMPTY && Sched [parent] != myid)
207 MPI (MPI_Isend (X, cn, MPI_DOUBLE, Sched [parent],
TAG0, MPI_COMM_WORLD,
212 MPI (MPI_Request_free (&req)) ;
Int amesos_paraklete_lsolve_node(Int c, paraklete_numeric *LU, paraklete_symbolic *LUsymbolic, paraklete_common *Common)
#define GET_COLUMN(Ap, Anz, Aix, j, Ai, Ax, len)
#define ASSERT(expression)
int CHOLMOD() print_perm(Int *Perm, size_t len, size_t n, char *name, cholmod_common *Common)