26 Int n, nblocks, header [4] ;
38 if (Common->
myid == 0)
40 LU_btf_symbolic = *LU_btf_symbolic_handle ;
41 if (LU_btf_symbolic !=
NULL)
43 n = LU_btf_symbolic->
n ;
44 nblocks = LU_btf_symbolic->
nblocks ;
50 *LU_btf_symbolic_handle =
NULL ;
55 header [1] = nblocks ;
58 nblocks = header [1] ;
64 if (Common->
myid != 0)
68 *LU_btf_symbolic_handle = LU_btf_symbolic ;
76 MPI (MPI_Allreduce (&ok, &all_ok, 1, MPI_INT, MPI_LAND, MPI_COMM_WORLD)) ;
80 PR0 ((Common->
file,
"proc "ID" all fail in analyze\n", Common->
myid)) ;
82 *LU_btf_symbolic_handle =
NULL ;
128 LU_btf_symbolic->
n = n ;
129 LU_btf_symbolic->
nblocks = nblocks ;
130 LU_btf_symbolic->
cnz = 0 ;
131 LU_btf_symbolic->
fnz = 0 ;
133 LU_btf_symbolic->
Qbtf = p ;
134 LU_btf_symbolic->
Pbinv = p + n ;
135 LU_btf_symbolic->
Rbtf = p + 2*n ;
144 return (LU_btf_symbolic) ;
166 Int nblocks, n = 0, nmatch, block, k, k1, k2, inew, jold, anz = 0, fnz,
176 if (Common->
myid == 0)
184 if (LU_btf_symbolic ==
NULL)
190 Qbtf = LU_btf_symbolic->
Qbtf ;
191 Rbtf = LU_btf_symbolic->
Rbtf ;
192 Pbinv = LU_btf_symbolic->
Pbinv ;
199 Work =
CHOLMOD (malloc) (n, 6*
sizeof (
Int), cm) ;
207 nblocks =
BTF_order (n, Ap, Ai, 0, &work, Pbtf, Qbtf, Rbtf, &nmatch,
211 for (k = 0 ; k < n ; k++)
213 Pbinv [Pbtf [k]] = k ;
216 CHOLMOD (free) (n, 6*
sizeof (
Int), Work, cm) ;
217 LU_btf_symbolic->
nblocks = nblocks ;
226 Rbtf = LU_btf_symbolic->
Rbtf ;
228 nblocks = LU_btf_symbolic->
nblocks ;
234 if (Common->
myid == 0)
247 LU_btf_symbolic->
cnz = 0 ;
250 for (block = 0 ; block < nblocks ; block++)
253 k2 = Rbtf [block+1] ;
256 if (Common->
myid == 0)
259 for (k = k1 ; k < k2 ; k++)
263 for (p = Ap [jold] ; p < Ap [jold+1] ; p++)
265 inew = Pbinv [Ai [p]] ;
274 Ci [cnz++] = inew - k1 ;
278 LU_btf_symbolic->
cnz =
MAX (LU_btf_symbolic->
cnz, cnz) ;
287 LUsymbolic [block] =
NULL ;
291 if (Common->
myid == 0)
294 LUsymbolic [block] = (
void *)
KLU_analyze (nk, Cp, Ci, km) ;
304 LUsymbolic [block] =
NULL ;
312 if (LUsymbolic [block] ==
NULL)
324 if (Common->
myid == 0)
327 LU_btf_symbolic->
fnz = fnz ;
337 return (LU_btf_symbolic) ;
358 Int fnz = 0, cnz = 0, nblocks, n, k, k1, k2, block, jold, inew, p, nk ;
359 int ok =
TRUE, all_ok ;
360 void **LUsymbolic =
NULL;
362 void **LUnumeric =
NULL ;
378 if (Common->
myid == 0)
380 fnz = LU_btf_symbolic->
fnz ;
381 cnz = LU_btf_symbolic->
cnz ;
395 n = LU_btf_symbolic->
n ;
396 nblocks = LU_btf_symbolic->
nblocks ;
397 Rbtf = LU_btf_symbolic->
Rbtf ;
398 Qbtf = LU_btf_symbolic->
Qbtf ;
399 Pbinv = LU_btf_symbolic->
Pbinv ;
402 if (Common->
myid == 0)
414 Singleton =
CHOLMOD (calloc) (nblocks,
sizeof (double), cm) ;
426 CHOLMOD (calloc) (nblocks,
sizeof (
void *), cm) ;
427 LU_btf_numeric->
F = F ;
428 LU_btf_numeric->
nblocks = nblocks ;
441 for (block = 0 ; block < nblocks ; block++)
444 k2 = Rbtf [block+1] ;
447 if (Common->
myid == 0)
450 for (k = k1 ; k < k2 ; k++)
455 for (p = Ap [jold] ; p < Ap [jold+1] ; p++)
457 inew = Pbinv [Ai [p]] ;
468 Ci [cnz] = inew - k1 ;
482 if (Common->
myid == 0)
484 Singleton [block] = Cx [0] ;
486 LUnumeric [block] =
NULL ;
490 if (Common->
myid == 0)
493 LUnumeric [block] = (
void *)
KLU_factor (Cp, Ci, Cx,
505 LUnumeric [block] =
NULL ;
513 if (LUnumeric [block] ==
NULL)
521 if (Common->
myid == 0)
532 MPI (MPI_Allreduce (&ok, &all_ok, 1, MPI_INT, MPI_LAND, MPI_COMM_WORLD)) ;
538 return (LU_btf_numeric) ;
560 double *Fx =
NULL, *W =
NULL, *Singleton ;
562 Int iold, n, jnew, k, k1, k2, nk, p, nblocks, block ;
571 nblocks = LU_btf_symbolic->nblocks ;
572 n = LU_btf_symbolic->n ;
573 Rbtf = LU_btf_symbolic->Rbtf ;
574 Qbtf = LU_btf_symbolic->Qbtf ;
575 Pbinv = LU_btf_symbolic->Pbinv ;
576 LUsymbolic = LU_btf_symbolic->LUsymbolic ;
579 F = LU_btf_numeric->
F ;
580 if (Common->
myid == 0)
592 if (Common->
myid == 0)
595 W =
CHOLMOD (malloc) (n,
sizeof (double), cm) ;
601 for (iold = 0 ; iold < n ; iold++)
603 W [Pbinv [iold]] = B [iold] ;
611 for (block = nblocks-1 ; block >= 0 ; block--)
614 k2 = Rbtf [block+1] ;
619 if (Common->
myid == 0)
621 W [k1] /= Singleton [block] ;
626 if (Common->
myid == 0)
631 (
KLU_numeric *) LUnumeric [block], nk, 1, W+k1, km) ;
643 LUnumeric [block] =
NULL ;
655 if (Common->
myid == 0)
657 for (k = k1 ; k < k2 ; k++)
660 for (p = Fp [k] ; p < Fp [k+1] ; p++)
662 W [Fi [p]] -= Fx [p] * wk ;
672 if (Common->
myid == 0)
674 for (jnew = 0 ; jnew < n ; jnew++)
676 B [Qbtf [jnew]] = W [jnew] ;
678 CHOLMOD (free) (n,
sizeof (double), W, cm) ;
697 Int n, block, nblocks, k1, k2, nk, *Rbtf ;
701 if (LU_btf_symbolic_handle ==
NULL)
705 LU_btf_symbolic = *LU_btf_symbolic_handle ;
706 if (LU_btf_symbolic ==
NULL)
708 *LU_btf_symbolic_handle =
NULL ;
715 Rbtf = LU_btf_symbolic->
Rbtf ;
716 n = LU_btf_symbolic->
n ;
717 nblocks = LU_btf_symbolic->
nblocks ;
718 for (block = 0 ; block < nblocks ; block++)
720 k2 = Rbtf [block+1] ;
735 LUsymbolic [block] =
NULL ;
740 LU_btf_symbolic, cm) ;
759 if (LU_btf_numeric_handle ==
NULL)
763 LU_btf_numeric = *LU_btf_numeric_handle ;
764 if (LU_btf_numeric ==
NULL)
766 *LU_btf_numeric_handle =
NULL ;
772 nblocks = LU_btf_numeric->
nblocks ;
774 for (block = 0 ; block < nblocks ; block++)
793 LUnumeric [block] =
NULL ;
797 CHOLMOD (free) (nblocks,
sizeof (
void *), LUnumeric, cm) ;
801 LU_btf_numeric, cm) ;
struct paraklete_btf_numeric_struct paraklete_btf_numeric
paraklete_btf_symbolic * amesos_paraklete_btf_analyze(cholmod_sparse *A, paraklete_common *Common)
size_t CHOLMOD() add_size_t(size_t a, size_t b, int *ok)
size_t CHOLMOD() mult_size_t(size_t a, size_t k, int *ok)
#define PARAKLETE_ERROR(status, message)
paraklete_btf_numeric * amesos_paraklete_btf_factorize(cholmod_sparse *A, paraklete_btf_symbolic *LU_btf_symbolic, paraklete_common *Common)
void amesos_paraklete_free_numeric(paraklete_numeric **LUHandle, paraklete_common *Common)
paraklete_btf_symbolic * amesos_paraklete_btf_alloc_symbolic(Int n, Int nblocks, paraklete_common *Common)
int CHOLMOD() free_sparse(cholmod_sparse **AHandle, cholmod_common *Common)
struct paraklete_btf_symbolic_struct paraklete_btf_symbolic
Int amesos_paraklete_solve(paraklete_numeric *LU, paraklete_symbolic *LUsymbolic, double *B, paraklete_common *Common)
Int amesos_paraklete_btf_solve(paraklete_btf_numeric *LU_btf_numeric, paraklete_btf_symbolic *LU_btf_symbolic, double *B, paraklete_common *Common)
#define KLU_free_symbolic
void amesos_paraklete_free_symbolic(paraklete_symbolic **LUsymbolicHandle, paraklete_common *Common)
void amesos_paraklete_btf_free_symbolic(paraklete_btf_symbolic **LU_btf_symbolic_handle, 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)
void amesos_paraklete_btf_free_numeric(paraklete_btf_numeric **LU_btf_numeric_handle, paraklete_common *Common)
paraklete_symbolic * amesos_paraklete_analyze(cholmod_sparse *A, paraklete_common *Common)
static Int paraklete_btf_bcast_symbolic(paraklete_btf_symbolic **LU_btf_symbolic_handle, paraklete_common *Common)
paraklete_numeric * amesos_paraklete_factorize(cholmod_sparse *A, paraklete_symbolic *LUsymbolic, paraklete_common *Common)