Amesos Package Browser (Single Doxygen Collection)  Development
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
amesos_paraklete_decl.h
Go to the documentation of this file.
1 /* ========================================================================== */
2 /* === Paraklete/paraklete.h ================================================ */
3 /* ========================================================================== */
4 
5 /* Include file for Paraklete library API.
6  *
7  * PARAKLETE version 0.3: parallel sparse LU factorization. Nov 13, 2007
8  * Copyright (C) 2007, Univ. of Florida. Author: Timothy A. Davis
9  * See License.txt for the Version 2.1 of the GNU Lesser General Public License
10  * http://www.cise.ufl.edu/research/sparse
11  */
12 
13 /* use the UF_long version of CHOLMOD and KLU, where Int is UF_long ("long"
14  * on all platforms except Windows, where it is int64 but where Paraklete has
15  * not been ported) */
16 
17 /* Include file for user programs that call paraklete_* routines */
18 
19 #ifndef AMESOS_PARAKLETE_DECL_H
20 #define AMESOS_PARAKLETE_DECL_H
21 
22 #ifndef DLONG
23 #define DLONG
24 #endif
25 
26 #include "amesos_cholmod.h"
28 #include "amesos_btf_decl.h"
29 #include "amesos_klu_decl.h"
30 
31 #ifndef NMPI
32 #include "mpi.h"
33 #define MPI(statement) statement
34 #else
35 #define MPI(statement)
36 #endif
37 
38 /* all integers are UF_long, or "long" on all but Windows */
39 #define MPI_Int MPI_LONG
40 
41 /* use the long version of KLU and BTF */
42 #define KLU_analyze amesos_klu_l_analyze
43 #define KLU_factor amesos_klu_l_factor
44 #define KLU_solve amesos_klu_l_solve
45 #define KLU_symbolic klu_l_symbolic
46 #define KLU_numeric klu_l_numeric
47 #define KLU_common klu_l_common
48 #define KLU_free_symbolic amesos_klu_l_free_symbolic
49 #define KLU_free_numeric amesos_klu_l_free_numeric
50 #define KLU_defaults amesos_klu_l_defaults
51 
52 #define BTF_order amesos_btf_l_order
53 
54 #define TAG0 0
55 
56 /* turn off debugging */
57 #ifndef NDEBUG
58 #define NDEBUG
59 #endif
60 
61 /* To enable debugging, uncomment this line */
62 /*
63 #undef NDEBUG
64 */
65 
66 /* ========================================================================== */
67 /* === paraklete_common ===================================================== */
68 /* ========================================================================== */
69 
70 /* Workspace (for each node) and global parameters */
71 
73 {
74  double tol_diag ; /* diagonal pivot tolerance (0 to 1)
75  * default 0.01 */
76  double tol_offdiag ; /* off-diagonal pivot tolerance (0 to 1),
77  * default 1.0 */
78  double growth ; /* memory reallocation factor, default 2.0 */
79 
80  Int status ; /* PK_OK, PK_SINGULAR, etc, ... (see below) */
81 
82 /* the first two error codes match with CHOLMOD error codes: */
83 #define PK_OK CHOLMOD_OK /* status is OK */
84 #define PK_OUT_OF_MEMORY CHOLMOD_OUT_OF_MEMORY /* out of memory */
85 #define PK_TOO_LARGE CHOLMOD_TOO_LARGE /* Int overflow occurred */
86 #define PK_SINGULAR (-5) /* singular */
87 #define PK_UNKNOWN (-6) /* not computed or not known */
88 
89  Int nproc ; /* number of processors */
90  Int myid ; /* who am I? (in range 0 to nproc-1) */
91 
92  Int nleaves ; /* number of leaves in separator tree. Should
93  * be >= nprocs for parallelism. Larger value is
94  * OK (can affect ordering quality, up or down).
95  * Default: nprocs */
96 
97  Int dump ; /* debug print level, for debugging only */
98  FILE *file ; /* per-process output file, for debugging only */
99 
100  cholmod_common cm ; /* CHOLMOD workspace for each node */
101 
102  KLU_common km ; /* KLU common */
103 }
105 
106 
107 /* ========================================================================== */
108 /* === paraklete_symbolic =================================================== */
109 /* ========================================================================== */
110 
111 /* The LUsymbolic object consists of 3 malloc'd blocks: the LUsymbolic struct
112  * itself, Mem_n of size 3*n, and Mem_c of size 7*ncomponents+2 */
113 
115 {
116  Int n ; /* dimension of the matrix to factorize */
117 
118  Int ncomponents ; /* final number of components in the separator tree. */
119  Int ncomp0 ; /* initial (from cholmod_nested_dissection) */
120  Int ncomp1 ; /* after collapsing (from cholmod_collapse_septree) */
121 
122  /* ---------------------------------------------------------------------- */
123  /* size-3n memory space, in Mem_n: */
124  /* ---------------------------------------------------------------------- */
125 
126  Int *Mem_n ; /* size 3*n (malloc'd block for Cperm, RpermInv,
127  * Cparent */
128 
129  Int *Cperm ; /* size n. Symmetric nested-dissection fill-reducing
130  * ordering of the original matrix. Cperm [k] = i if
131  * row/column i of the original matrix becomes row/
132  * column k of the permuted matrix. Does not take into
133  * account numerical pivoting (as returned by
134  * paraklete_analyze).
135  * -----------------------------------------------------
136  * paraklete_reanalyze combines the fill-reducing
137  * ordering with column permutations arising from column
138  * pivoting in paraklete_factorize, and stores this
139  * as Cperm (a copy of LU->Q, from the numeric object).
140  */
141 
142  Int *RpermInv ; /* size n. The inverse of Rperm, or Cperm if Rperm is
143  * NULL. RpermInv [i] = k if Rperm [k] = i. */
144 
145  Int *Cparent ; /* size n, but only entries 0 to ncomponents-1 used.
146  * Cparent [c] is the parent of node c in the separator
147  * tree, or EMPTY if c is a root. */
148 
149  /* ---------------------------------------------------------------------- */
150  /* size-(7*ncomponents+2) memory space, in Mem_c: */
151  /* ---------------------------------------------------------------------- */
152 
153  Int *Mem_c ; /* size 7*ncomponents+2 (malloc'd block for Cstart,
154  * Child, Childp, Clnz, Cn, Cnz, and Sched) */
155 
156  Int *Cstart ; /* size ncomponents+1. Cstart[c] is the first candidate
157  * pivot row/column in node c, in the matrix permuted
158  * with Cperm. Cstart [c+1]-1 is the last candidate
159  * pivot row/column in node c. */
160 
161  Int *Child ; /* size ncomponents. */
162 
163  Int *Childp ; /* size ncomponents+1.
164  * Child [Childp [c] ... Childp [c+1]-1] are the
165  * children of node c.
166  */
167 
168  Int *Cn ; /* size ncomponents. Cn [c] is the total dimension of
169  * node c, including the pivots (Cstart [c] to
170  * Cstart [c+1]-1), and the sum of the number of pivots
171  * of all ancestors of node c in the separator tree. If
172  * no pivots are lost during numerical factorization,
173  * Cn [c] is the dimension of the LU factors of node c.
174  */
175 
176  Int *Clnz ; /* size ncomponents. Clnz [c] is an estimate of the
177  * number of nonzeros in the LU factors of node c,
178  * assuming no numerical pivoting and assuming A+A' is
179  * factorized. */
180 
181  Int *Cnz ; /* size ncomponents. Cnz [c] is the number of entries
182  * in the original matrix A that start in node c. */
183 
184  Int *Sched ; /* size ncomponents. Sched [c] is the id of the process
185  * that factorizes node c */
186 
187  /* ---------------------------------------------------------------------- */
188  /* size-n memory space, allocated by itself */
189  /* ---------------------------------------------------------------------- */
190 
191  Int *Rperm ; /* size n if not NULL. NULL for output of
192  * paraklete_analyze (in which case Rperm and the
193  * initial Cperm are identical).
194  * -----------------------------------------------------
195  * For paraklete_reanalyze, this is a copy of LU->P from
196  * the LU numeric object from paraklete_factorize. */
197 }
199 
200 
201 /* ========================================================================== */
202 /* === paraklete_node ======================================================= */
203 /* ========================================================================== */
204 
205 /* LU factorization and Schur complement for one node of the separator tree */
206 
207 /* Return pointers to the integer and real parts of column j of a matrix A
208  * stored with merged row indices and numerical values.
209  * Assumes sizeof(double) = 2*sizeof(Int).
210  */
211 
212 #define GET_COLUMN(Ap,Anz,Aix,j,Ai,Ax,len) \
213 { \
214  Int getp = Ap [j] ; \
215  len = Anz [j] ; \
216  Ai = (Int *) (Aix + getp) ; \
217  Ax = (double *) (Aix + getp + ((len + 1) / 2)) ; \
218 }
219 
220 typedef struct paraklete_node_struct
221 {
222 
223  /* ---------------------------------------------------------------------- */
224  /* header information */
225  /* ---------------------------------------------------------------------- */
226 
227  /* The header is sent in a single message, from child to parent */
228 
229 #define PK_HEADER 8 /* size of header */
230 
231  Int header [PK_HEADER] ; /* contents defined below: */
232 
233 #define PK_STATUS header[0] /* status (see Common->status above) */
234 
235 #define PK_SN header[1] /* dimension of the Schur complement */
236 
237 #define PK_SNZ header[2] /* number of nonzeros in S */
238 
239 #define PK_NFOUND header[3] /* number of pivots found for this node. */
240 
241 #define PK_NLOST header[4] /* # pivots lost, equal to npiv - nfound */
242 
243 #define PK_NN header[5] /* dimension of the LU factors of this node. */
244  /* Equal to Cn [c] c if no pivots fail.
245  * Failed pivot candidates of the children are
246  * added to Cn [c] to obtain nn. */
247 
248 #define PK_NPIV header[6] /* number of candidate pivots for this node. */
249  /* Equal to Cstart [c+1] - Cstart [c] if no
250  * pivots fail. Failed pivots from the
251  * children are added to obtain npiv. */
252 
253 #define PK_SSIZE header[7] /* size of the sx array */
254 
255  /* ---------------------------------------------------------------------- */
256  /* local copy of the matrix to factorize for just this node */
257  /* ---------------------------------------------------------------------- */
258 
259  cholmod_sparse *A ; /* dimension Cn [c] */
260  cholmod_sparse *C ; /* dimension nn, = A + Schur complements of children */
261 
262  /* ---------------------------------------------------------------------- */
263  /* LU factors */
264  /* ---------------------------------------------------------------------- */
265 
266  Int lnz ; /* number of nonzeros in L */
267 
268  Int unz ; /* number of nonzeros in U */
269 
270  Int nlost_in ; /* sum of # of pivots lost in children */
271 
272  Int *llen ; /* size npiv. llen [j] is the number of entries in
273  * column j of L. */
274 
275  Int *ulen ; /* size npiv. ulen [j] is the number of entries in
276  * column j of U */
277 
278  Int *lp ; /* size nn. lp [j] is the start of column j of L in the
279  * ix array. */
280 
281  Int *up ; /* size nn. up [j] is the start of column j of U in the
282  * ix array */
283 
284  Int *Plocal ; /* size npiv. Plocal [k] = i if local row i is the kth
285  * row of the LU factors for this node. Both k and i
286  * are in the range 0 to npiv-1 */
287 
288  Int *Qlocal ; /* size npiv.
289  * Qlocal [k] = j if local col j is the kth col of the
290  * LU factors for this node. */
291 
292  Int *Pglobal ; /* size npiv. Pglobal [k] = i if local row i is the kth
293  * row of the LU factors of A(Cperm,Cperm).
294  * k is in the range 0 to npiv-1,
295  * i is in the range 0 to (LU->n)-1 */
296 
297  Int *Qglobal ; /* size npiv. Qglobal [k] = j if local col j is the kth
298  * col of the LU factors of A(Cperm,Cperm).
299  * k is in the range 0 to npiv-1,
300  * j is in the range 0 to (LU->n)-1 */
301 
302  Int *Pinv ; /* size npiv. The inverse of Plocal.
303  * Pinv [i] = k if local row i is the kth row of the
304  * LU factors for this node. */
305 
306  Int *Qinv ; /* size npiv. The inverse of Qlocal.
307  * Qinv [j] = k if local col j is the kth col of the
308  * LU factors for this node. */
309 
310  Int lusize ; /* size of ix array */
311 
312  double *ix ; /* indices and numerical values of the LU factors */
313 
314  Int *Lost ; /* size nchild */
315  Int *Lostp ; /* size nchild+1 */
317 
318  /* To traverse column j of L:
319  *
320  * GET_COLUMN (LUnode->lp, LUnode->llen, LUnode->ix, Li, Lx, len) ;
321  * for (p = 0 ; p < len ; p++)
322  * {
323  * i = Li [p] ;
324  * lij = Lx [p] ;
325  * }
326  *
327  * To traverse column j of U:
328  *
329  * GET_COLUMN (LUnode->up, LUnode->ulen, LUnode->ix, Ui, Ux, len) ;
330  * for (p = 0 ; p < len ; p++)
331  * {
332  * i = Ui [p] ;
333  * uij = Ux [p] ;
334  * }
335  */
336 
339  double umin ;
340  double umax ;
341 
342  /* ---------------------------------------------------------------------- */
343  /* Schur complement */
344  /* ---------------------------------------------------------------------- */
345 
346  /* The Schur complement has dimension sn = nn-nfound */
347 
348  double *sx ; /* indices and numerical values of Schur complmement */
349  Int *sp ; /* size sn. sp [j] is the start of column j in sx */
350  Int *slen ; /* size sn. sp [j] is the start of column j in sx */
351 
352  /* ---------------------------------------------------------------------- */
353  /* solution to Ly=Pb and Ux=y */
354  /* ---------------------------------------------------------------------- */
355 
356  Int nk ; /* Cstart [c+1] - Cstart [c], nominal pivots at node */
357  double *B ; /* size nk = Cstart [c+1] - Cstart [c] */
358  double *X ; /* size nn */
359 
360  /* ---------------------------------------------------------------------- */
361  /* MPI message handling */
362  /* ---------------------------------------------------------------------- */
363 
364  MPI (MPI_Request req ; )
365  MPI (MPI_Request *Req ; ) /* size nchild */
366 
367  /* workspace at this node */
368  Int *W2 ; /* size 2*nlost_in */
369 
370 } paraklete_node ;
371 
372 
373 /* ========================================================================== */
374 /* === paraklete_numeric ==================================================== */
375 /* ========================================================================== */
376 
377 /* All nodes share this data structure. LUnode [0..ncomponents] is an array
378  * of the LU factorization of each node, and status information about that node.
379  * If a process owns node c, it uses LUnode [c] to hold permanent parts of the
380  * global LU factors. If it does not own node c, it uses LUnode [c] to hold
381  * information about a child or parent in the separator tree (such as the
382  * Schur complement from a child node owned by another process.
383  *
384  * Some information is shared globally: n, ncomponents, and the global
385  * permutation (P, Q, Pinv, Qinv). This structure also contains workspace
386  * held by process 0 only (W, Ep2, and E).
387  */
388 
389 #define PARAKLETE_MAGIC (-42)
390 
392 {
393  Int magic ; /* always equal to PARAKLETE_MAGIC, and less than zero */
394  Int n ;
396 
397  Int *P ; /* size n. row permutation */
398  Int *Q ; /* size n. column permutation. Both P and Q include
399  * LUsymbolic->Cperm, so that L*U=P*A*Q is the final
400  * factorization. */
401 
404 
405  paraklete_node **LUnode ; /* size ncomponents. LUnode [c] is a
406  * pointer to the LU factorization of
407  * node c. */
408 
409  /* workspace for process 0 only */
410  double *W ; /* size n */
411  Int *Ep2 ; /* size n+1 */
412  cholmod_sparse *E ; /* n-by-n, E = A (Cperm, Cperm) */
413 
415 
416 /* ========================================================================== */
417 /* === paraklete_btf_symbolic =============================================== */
418 /* ========================================================================== */
419 
421 {
422  Int n ; /* dimension of A */
423  Int nblocks ; /* number of diagonal blocks in BTF form */
424  Int cnz ; /* # of entries in diagonal blocks of A(p,q) */
425  Int fnz ; /* # of entries in off-diagonal blocks of A(p,q) */
426  Int *Mem_n ; /* contains Qbtf, Pbinv, and Rbtf */
427  /* Int *Pbtf ; */ /* BTF row permutation, size n */
428  Int *Qbtf ; /* BTF column permutation, size n */
429  Int *Pbinv ; /* inverse of Pbtf, size n */
430  Int *Rbtf ; /* BTF block boundaries, size n+1 (0..nblocks used) */
431 
432  /* symbolic analysis of each diagaonal block (NULL for singletons) */
433  void **LUsymbolic ; /* array of pointers, size n */
434  /* only first nblocks entries used */
435 }
437 
438 /* ========================================================================== */
439 /* === paraklete_btf_numeric ================================================ */
440 /* ========================================================================== */
441 
443 {
444  Int nblocks ; /* number of diagonal blocks in BTF form */
445  double *Singleton ; /* singleton values, size nblocks */
446 
447  cholmod_sparse *F ; /* off-diagonal entries, size n-by-n */
448 
449  /* symbolic analysis of each diagaonal block (NULL for singletons) */
450  void **LUnumeric ; /* array of pointers, size nblocks */
451 }
453 
454 /* ========================================================================== */
455 
457 (
458  cholmod_sparse *A,
459  paraklete_common *Common
460 ) ;
461 
463 (
464  cholmod_sparse *A,
465  paraklete_btf_symbolic *LU_btf_symbolic,
466  paraklete_common *Common
467 ) ;
468 
470 (
471  paraklete_btf_numeric *LU_btf_numeric,
472  paraklete_btf_symbolic *LU_btf_symbolic,
473  double *B,
474  paraklete_common *Common
475 ) ;
476 
478 (
479  paraklete_btf_symbolic **LU_btf_symbolic_handle,
480  paraklete_common *Common
481 ) ;
482 
484 (
485  paraklete_btf_numeric **LU_btf_numeric_handle,
486  paraklete_common *Common
487 ) ;
488 
490 (
491  Int n,
492  Int nblocks,
493  paraklete_common *Common
494 ) ;
495 
496 /* ========================================================================== */
497 
499 (
500  cholmod_sparse *A,
501  paraklete_common *Common
502 ) ;
503 
505 (
506  cholmod_sparse *A,
507  paraklete_symbolic *LUsymbolic,
508  paraklete_common *Common
509 ) ;
510 
512 (
513  cholmod_sparse *A,
514  paraklete_node *LUnode,
515  paraklete_common *Common
516 ) ;
517 
519 (
520  Int c,
521  paraklete_numeric *LU,
522  paraklete_symbolic *LUsymbolic,
523  paraklete_common *Common
524 ) ;
525 
527 (
528  paraklete_numeric *LU,
529  paraklete_symbolic *LUsymbolic,
530  double *B,
531  paraklete_common *Common
532 ) ;
533 
535 (
536  Int c,
537  paraklete_numeric *LU,
538  paraklete_symbolic *LUsymbolic,
539  paraklete_common *Common
540 ) ;
541 
543 (
544  Int c,
545  paraklete_numeric *LU,
546  paraklete_symbolic *LUsymbolic,
547  paraklete_common *Common
548 ) ;
549 
551 (
552  Int n,
553  Int ncomponents,
554  Int do_Rperm,
555  paraklete_common *Common
556 ) ;
557 
559 (
560  paraklete_symbolic **LUsymbolicHandle,
561  paraklete_common *Common
562 ) ;
563 
565 (
566  paraklete_numeric **LUHandle,
567  paraklete_common *Common
568 ) ;
569 
571 (
572  cholmod_sparse *A,
573  paraklete_numeric *LU,
574  paraklete_symbolic *LUsymbolic,
575  paraklete_common *Common
576 ) ;
577 
578 void amesos_paraklete_start (Int nproc, Int myid, paraklete_common *Common) ;
580 
581 #define PARAKLETE_ERROR(status,message) \
582  amesos_paraklete_error (status, __FILE__, __LINE__, message, Common) ;
583 
584 void amesos_paraklete_error (Int status, char *filename, Int line, char *message,
585  paraklete_common *Common) ;
586 
587 /* ========================================================================== */
588 /* === Paraklete version ==================================================== */
589 /* ========================================================================== */
590 
591 #define PARAKLETE_DATE "Nov 27, 2007"
592 #define PARAKLETE_VERSION_CODE(main,sub) ((main) * 1000 + (sub))
593 #define PARAKLETE_MAIN_VERSION 0
594 #define PARAKLETE_SUB_VERSION 3
595 #define PARAKLETE_VERSION \
596  PARAKLETE_VERSION_CODE(PARAKLETE_MAIN_VERSION,PARAKLETE_SUB_VERSION)
597 
598 /* ========================================================================== */
599 /* === debugging definitions ================================================ */
600 /* ========================================================================== */
601 
602 #undef DEBUG
603 #undef ASSERT
604 #undef PR0
605 #undef PR1
606 #undef PR2
607 #undef PR3
608 
609 extern Int my_tries ;
610 
611 #ifndef NDEBUG
612 
613 #include <assert.h>
614 #define PR0(params) { (void) fprintf params ; fflush (Common->file) ; }
615 #define PR1(params) { if (Common->dump >= 1) (void) fprintf params ; fflush (Common->file) ; }
616 #define PR2(params) { if (Common->dump >= 2) (void) fprintf params ; fflush (Common->file) ; }
617 #define PR3(params) { if (Common->dump >= 3) (void) fprintf params ; fflush (Common->file) ; }
618 #define DEBUG(statement) statement
619 #define ASSERT(expression) (assert (expression))
620 
621 #else
622 
623 #define PR0(params)
624 #define PR1(params)
625 #define PR2(params)
626 #define PR3(params)
627 #define DEBUG(statement)
628 #define ASSERT(expression)
629 
630 #endif
631 
632 #endif /* AMESOS_PARAKLETE_DECL_H */
struct paraklete_btf_numeric_struct paraklete_btf_numeric
#define Int
paraklete_btf_numeric * amesos_paraklete_btf_factorize(cholmod_sparse *A, paraklete_btf_symbolic *LU_btf_symbolic, 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 PK_HEADER
struct paraklete_numeric_struct paraklete_numeric
Int amesos_paraklete_lsolve_node(Int c, paraklete_numeric *LU, paraklete_symbolic *LUsymbolic, paraklete_common *Common)
MPI(MPI_Request *Req;) Int *W2
Int amesos_paraklete_factorize_node(Int c, paraklete_numeric *LU, paraklete_symbolic *LUsymbolic, paraklete_common *Common)
void amesos_paraklete_free_numeric(paraklete_numeric **LUHandle, paraklete_common *Common)
paraklete_symbolic * amesos_paraklete_reanalyze(cholmod_sparse *A, paraklete_numeric *LU, paraklete_symbolic *LUsymbolic, paraklete_common *Common)
void amesos_paraklete_btf_free_symbolic(paraklete_btf_symbolic **LU_btf_symbolic_handle, paraklete_common *Common)
void amesos_paraklete_start(Int nproc, Int myid, paraklete_common *Common)
Int amesos_paraklete_usolve_node(Int c, paraklete_numeric *LU, paraklete_symbolic *LUsymbolic, paraklete_common *Common)
void amesos_paraklete_btf_free_numeric(paraklete_btf_numeric **LU_btf_numeric_handle, paraklete_common *Common)
struct paraklete_btf_symbolic_struct paraklete_btf_symbolic
paraklete_btf_symbolic * amesos_paraklete_btf_alloc_symbolic(Int n, Int nblocks, paraklete_common *Common)
paraklete_symbolic * amesos_paraklete_alloc_symbolic(Int n, Int ncomponents, Int do_Rperm, paraklete_common *Common)
Int amesos_paraklete_solve(paraklete_numeric *LU, paraklete_symbolic *LUsymbolic, double *B, paraklete_common *Common)
void amesos_paraklete_free_symbolic(paraklete_symbolic **LUsymbolicHandle, paraklete_common *Common)
Int amesos_paraklete_kernel(cholmod_sparse *A, paraklete_node *LUnode, paraklete_common *Common)
#define KLU_common
void amesos_paraklete_finish(paraklete_common *Common)
struct paraklete_node_struct paraklete_node
Int my_tries
void amesos_paraklete_error(Int status, char *filename, Int line, char *message, paraklete_common *Common)
paraklete_symbolic * amesos_paraklete_analyze(cholmod_sparse *A, paraklete_common *Common)
struct paraklete_symbolic_struct paraklete_symbolic
struct paraklete_common_struct paraklete_common
paraklete_btf_symbolic * amesos_paraklete_btf_analyze(cholmod_sparse *A, paraklete_common *Common)
paraklete_numeric * amesos_paraklete_factorize(cholmod_sparse *A, paraklete_symbolic *LUsymbolic, paraklete_common *Common)