35 Int nchild, child, sn, cp ;
43 Child = LUsymbolic->
Child ;
44 Childp = LUsymbolic->
Childp ;
46 ASSERT (nchild == Childp [c+1] - Childp [c]) ;
48 for (cp = 0 ; cp < nchild ; cp++)
51 child = Child [Childp [c] + cp] ;
52 sn = LU->
LUnode [child]->PK_SN ;
55 LU->
LUnode [child]->PK_SSIZE,
sizeof (double),
94 LUnode->PK_STATUS = status ;
97 if (parent_id !=
EMPTY && parent_id != Common->
myid)
100 PR1 ((Common->
file,
"proc "ID" sends header parent proc "ID"\n",
101 Common->
myid, parent_id)) ;
103 parent_id,
TAG0, MPI_COMM_WORLD)) ;
106 PR1 ((Common->
file,
"proc "ID
" wait for parent "ID
"\n",
107 Common->
myid, parent_id)) ;
108 MPI (MPI_Recv (&ok, 1, MPI_INT, parent_id,
TAG0, MPI_COMM_WORLD, &ms)) ;
118 parent_id,
TAG0, MPI_COMM_WORLD)) ;
120 parent_id,
TAG0, MPI_COMM_WORLD)) ;
121 MPI (MPI_Rsend (LUnode->
sx, LUnode->PK_SSIZE, MPI_DOUBLE,
122 parent_id,
TAG0, MPI_COMM_WORLD)) ;
124 parent_id,
TAG0, MPI_COMM_WORLD)) ;
126 parent_id,
TAG0, MPI_COMM_WORLD)) ;
130 if (!ok || parent_id ==
EMPTY || parent_id != Common->
myid)
135 LUnode->
sx =
CHOLMOD (free) (LUnode->PK_SSIZE,
136 sizeof (double), LUnode->
sx, cm) ;
137 LUnode->
sp =
CHOLMOD (free) (LUnode->PK_SN,
138 sizeof (
Int), LUnode->
sp, cm) ;
140 sizeof (
Int), LUnode->
slen, cm) ;
166 double *Cx, *W, *Sx, *Ax, *S ;
167 Int *Child, *Childp, *Lost, *Lostp, *Plost_in, *Qlost_in, *Cp, *Ci, *Flag,
168 *Sp, *Si, *Slen, *Ap, *Ai, *Cn, *Plocal, *Qlocal, *Pglobal, *Qglobal,
170 Int cp, cnz, clnz, nchild, k1, k2, child, cn, npiv, k, j, p, i, nfound,
171 mark, cj, ci, nlost_in, len, sn, myid, ssize, parent, nmessages,
176 MPI (MPI_Status ms) ;
177 MPI (MPI_Request req [5]) ;
184 PR0 ((Common->
file,
"\n\n######################## FACTORIZE NODE "ID"\n", c));
190 cnz = LUsymbolic->
Cnz [c] ;
191 Childp = LUsymbolic->
Childp ;
192 Child = LUsymbolic->
Child ;
193 clnz = LUsymbolic->
Clnz [c] ;
194 nchild = Childp [c+1] - Childp [c] ;
195 k1 = LUsymbolic->
Cstart [c] ;
196 k2 = LUsymbolic->
Cstart [c+1] ;
197 Cn = LUsymbolic->
Cn ;
198 Sched = LUsymbolic->
Sched ;
199 parent = LUsymbolic->
Cparent [c] ;
200 myid = Common->
myid ;
201 parent_id = (parent ==
EMPTY) ?
EMPTY : Sched [parent] ;
203 PR0 ((Common->
file,
"proc "ID" at node "ID", clnz: "ID"\n", myid, c, clnz)) ;
217 PR1 ((Common->
file,
"proc "ID
" node "ID
" nchild "ID
"\n", myid, c, nchild)) ;
223 "proc "ID
": node "ID
" sched "ID
" cparent "ID
" childp ["ID
":"ID
"]\n",
224 myid, cc, Sched [cc], LUsymbolic->
Cparent [cc], Childp [cc],
226 for (cp = 0 ; cp < Childp [cc+1] - Childp [cc] ; cp++)
228 PR2 ((Common->
file,
"node "ID
": child node "ID
"\n",
229 cc, Child [Childp[c] + cp])) ;
239 PR1 ((Common->
file,
"proc "ID
" posting recv at node "ID
", nchild "ID
" status "ID
"\n",
240 myid, c, nchild, cm->
status)) ;
242 for (cp = 0 ; cp < nchild ; cp++)
244 child = Child [Childp [c] + cp] ;
245 PR2 ((Common->
file,
"proc "ID
" child "ID
" owned by "ID
"\n",
246 myid, child, Sched [child])) ;
247 if (Sched [child] != myid)
249 PR2 ((Common->
file,
"parent proc "ID
" awaits header from "ID
"\n",
250 myid, Sched [child])) ;
252 Sched [child],
TAG0, MPI_COMM_WORLD, &(LUnode->Req [cp]))) ;
257 MPI (LUnode->Req [cp] = MPI_REQUEST_NULL) ;
271 for (k = 0 ; k < nmessages ; k++)
279 MPI (MPI_Waitany (nchild, LUnode->Req, &cp, &ms)) ;
281 child = Child [Childp [c] + cp] ;
282 ASSERT (Sched [child] != myid) ;
284 status = LU->
LUnode [child]->PK_STATUS ;
285 sn = LU->
LUnode [child]->PK_SN ;
286 nfound = LU->
LUnode [child]->PK_NFOUND ;
287 npiv = LU->
LUnode [child]->PK_NPIV ;
288 ssize = LU->
LUnode [child]->PK_SSIZE ;
289 cn = LU->
LUnode [child]->PK_NN ;
291 ok = ok && (status ==
PK_OK) ;
309 sizeof (double), cm) ;
313 sizeof (double), cm) ;
334 Sched [child],
TAG0, MPI_COMM_WORLD, &(req [0]))) ;
336 Sched [child],
TAG0, MPI_COMM_WORLD, &(req [1]))) ;
337 MPI (MPI_Irecv (LU->
LUnode [child]->
sx, ssize, MPI_DOUBLE,
338 Sched [child],
TAG0, MPI_COMM_WORLD, &(req [2]))) ;
340 Sched [child],
TAG0, MPI_COMM_WORLD, &(req [3]))) ;
342 Sched [child],
TAG0, MPI_COMM_WORLD, &(req [4]))) ;
349 PR1 ((Common->
file,
"parent proc "ID
" replies to proc "ID
"\n",
350 myid, Sched [child])) ;
351 MPI (MPI_Send (&ok, 1, MPI_INT, Sched [child],
TAG0, MPI_COMM_WORLD)) ;
359 MPI (MPI_Waitall (5, req, MPI_STATUSES_IGNORE)) ;
363 PR1 ((Common->
file,
"proc "ID
" node "ID
" arrowhead again\n", myid, c)) ;
372 PR0 ((Common->
file,
"proc "ID
", node "ID
", report failure to parent: "ID
"\n",
373 myid, c, parent_id)) ;
378 LU, LUsymbolic, Common) ;
390 Lost = LUnode->
Lost ;
391 Lostp = LUnode->
Lostp ;
395 for (cp = 0 ; cp < nchild ; cp++)
399 child = Child [Childp [c] + cp] ;
400 Lostp [cp] = nlost_in ;
401 Lost [cp] = LU->
LUnode [child]->PK_NLOST ;
402 PR1 ((Common->
file,
"child "ID
" lost "ID
" \n", child, Lost [cp])) ;
403 nlost_in += Lost [cp] ;
412 Lostp [nchild] = nlost_in ;
417 cn = nlost_in + Cn [c] ;
418 npiv = nlost_in + (k2 - k1) ;
421 LUnode->W2 =
CHOLMOD (malloc) (nlost_in, 2*
sizeof (
Int), cm) ;
422 Plost_in = LUnode->W2 ;
423 Qlost_in = LUnode->W2 + nlost_in ;
445 LU, LUsymbolic, Common) ;
459 for (cp = 0 ; cp < nchild ; cp++)
462 child = Child [Childp [c] + cp] ;
463 sn = LU->
LUnode [child]->PK_SN ;
465 PR1 ((Common->
file,
"\nconcatenate lost child "ID
", Lost [cp] "ID
"\n",
470 nfound = LU->
LUnode [child]->PK_NFOUND ;
472 PR1 ((Common->
file,
"Cn [c] is "ID
"\n", Cn [c])) ;
473 PR1 ((Common->
file,
"child is "ID
"\n", child)) ;
474 PR1 ((Common->
file,
"Lost[cp] is "ID
"\n", Lost [cp])) ;
475 PR1 ((Common->
file,
"sn "ID
" Lost[cp]+Cn[cn] "ID
"\n",
476 sn, Lost [cp] + Cn [c]));
478 ASSERT (sn == Lost [cp] + Cn [c]) ;
480 for (j = 0 ; j < Lost [cp] ; j++)
484 PR2 ((Common->
file,
"lost child col "ID
" becomes col "ID
" of C\n",
488 for (p = 0 ; p < len ; p++)
491 ci = i + ((i < Lost [cp]) ? Lostp [cp] : (nlost_in - Lost[cp]));
495 " Lost child col: row "ID
" newrow "ID
" value %g\n",
518 DEBUG (
for (cj = 0 ; cj < cn ; cj++)
ASSERT (W [cj] == 0)) ;
520 for (j = 0 ; j < Cn [c] ; j++)
529 PR2 ((Common->
file,
"\nAdd column "ID
" of Schur\n", cj)) ;
538 for (p = Ap [j] ; p < Ap [j+1] ; p++)
542 PR3 ((Common->
file,
"scatter original ("ID
","ID
") %g to ("ID
","ID
")\n",
543 i, j, Ax [p], ci, cj)) ;
550 for (cp = 0 ; cp < nchild ; cp++)
553 child = Child [Childp [c] + cp] ;
557 GET_COLUMN (Sp, Slen, S, j + Lost [cp], Si, Sx, len) ;
558 for (p = 0 ; p < len ; p++)
561 ci = i + ((i < Lost [cp]) ? Lostp [cp] : (nlost_in - Lost[cp]));
562 if (Flag [ci] < mark)
572 PR2 ((Common->
file,
"gather "ID
" to "ID
"-1\n", Cp [cj], cnz)) ;
573 for (p = Cp [cj] ; p < cnz ; p++)
578 PR3 ((Common->
file,
""ID
": %g\n", ci, Cx [p])) ;
580 DEBUG (
for (cj = 0 ; cj < cn ; cj++)
ASSERT (W [cj] == 0)) ;
613 LUnode->PK_NPIV = npiv ;
616 LUnode->
lp =
CHOLMOD (malloc) (npiv,
sizeof (
Int), cm) ;
631 PR1 ((Common->
file,
"allocated LUnode->ix: size "ID
"\n", LUnode->
lusize)) ;
638 LU, LUsymbolic, Common) ;
654 LU, LUsymbolic, Common) ;
658 PR0 ((Common->
file,
"============= NODE "ID
" NPIV "ID
" FOUND "ID
" LOST "ID
"\n", c,
659 LUnode->PK_NPIV, LUnode->PK_NFOUND,
660 LUnode->PK_NPIV - LUnode->PK_NFOUND)) ;
668 Pinv = LUnode->
Pinv ;
669 for (k = 0 ; k < npiv ; k++)
672 ASSERT (i >= 0 && i < npiv) ;
689 nfound = LUnode->PK_NFOUND ;
691 for (k = 0 ; k < npiv ; k++)
697 Pglobal [k] = Plost_in [i] ;
704 Pglobal [k] = i - nlost_in + k1 ;
707 for (k = 0 ; k < npiv ; k++)
713 Qglobal [k] = Qlost_in [j] ;
720 Qglobal [k] = j - nlost_in + k1 ;
724 LUnode->PK_NLOST = npiv - nfound ;
735 LU->
LUnode [c]->
B =
CHOLMOD (malloc) (k2-k1,
sizeof (double), cm) ;
742 LU, LUsymbolic, Common) ;
750 PR0 ((Common->
file,
"proc "ID
" done at node "ID
"\n", myid, c)) ;
754 PR0 ((Common->
file,
"proc "ID
" done send to parent at node "ID
"\n", myid, c)) ;
size_t CHOLMOD() add_size_t(size_t a, size_t b, int *ok)
int CHOLMOD() reallocate_sparse(size_t nznew, cholmod_sparse *A, cholmod_common *Common)
size_t CHOLMOD() mult_size_t(size_t a, size_t k, int *ok)
#define PARAKLETE_ERROR(status, message)
int CHOLMOD() print_sparse(cholmod_sparse *A, char *name, cholmod_common *Common)
static void paraklete_send_to_parent(Int c, Int status, Int parent_id, paraklete_numeric *LU, paraklete_symbolic *LUsymbolic, paraklete_common *Common)
static void paraklete_free_children(Int c, paraklete_numeric *LU, paraklete_symbolic *LUsymbolic, paraklete_common *Common)
int CHOLMOD() free_sparse(cholmod_sparse **AHandle, cholmod_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)
Int amesos_paraklete_kernel(cholmod_sparse *A, paraklete_node *LUnode, paraklete_common *Common)
cholmod_sparse *CHOLMOD() allocate_sparse(size_t nrow, size_t ncol, size_t nzmax, int sorted, int packed, int stype, int xtype, cholmod_common *Common)
int CHOLMOD() allocate_work(size_t nrow, size_t iworksize, size_t xworksize, cholmod_common *Common)
Int amesos_paraklete_factorize_node(Int c, paraklete_numeric *LU, paraklete_symbolic *LUsymbolic, paraklete_common *Common)
#define CHOLMOD_CLEAR_FLAG(Common)