PaStiX Handbook 6.4.0
Loading...
Searching...
No Matches
pastix_subtask_order.c
Go to the documentation of this file.
1/**
2 *
3 * @file pastix_subtask_order.c
4 *
5 * PaStiX ordering task.
6 * Contains wrappers to build a good ordering for sparse direct solvers.
7 * Affected by the compilation time options:
8 * - PASTIX_ORDERING_SCOTCH: Enable Scotch graph partitioning library.
9 * - PASTIX_ORDERING_PTSCOTCH: Enable PT-Scotch graph partitioning library.
10 * - PASTIX_ORDERING_METIS: Enable Metis graph partitioning library.
11 *
12 * @copyright 2015-2024 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
13 * Univ. Bordeaux. All rights reserved.
14 *
15 * @version 6.4.0
16 * @author Xavier Lacoste
17 * @author Pierre Ramet
18 * @author Mathieu Faverge
19 * @author Gregoire Pichon
20 * @author Tony Delarue
21 * @date 2024-07-05
22 *
23 **/
24#include "common.h"
25#include <spm.h>
26#include "graph/graph.h"
27#include "blend/elimintree.h"
28#include "order_internal.h"
29
30/**
31 *******************************************************************************
32 *
33 * @ingroup pastix_analyze
34 *
35 * @brief Computes the ordering of the given graph in parameters.
36 *
37 * The graph given by the user is used to generate a graph that can be used by
38 * ordering tools and symbolic factorization. This graph is stored in the
39 * pastix_data->graph to be pass over to the symbolic factorization. If it exists
40 * before to call this routine, then the current structure is cleaned and a new
41 * one is created. From this structure, an ordering is computed by the ordering
42 * tool chosen by IPARM_ORDERING and stored in pastix_data->ordemesh. At the end
43 * the full ordering stucture: pemutation, inverse permutation, partition, and
44 * partion tree is generated such that it can be used by any symbolic
45 * factorization algorithm.
46 * The user can get back the permutation generated by providing allocated ordering
47 * structure where the results is stored after computation.
48 *
49 * This routine is affected by the following parameters:
50 * IPARM_VERBOSE, IPARM_ORDERING, IPARM_IO_STRATEGY
51 *
52 *******************************************************************************
53 *
54 * @param[inout] pastix_data
55 * The pastix_data structure that describes the solver instance.
56 * On exit, the field ordemesh is initialize with the result of the
57 * ordering.
58 * - IPARM_ORDERING will determine which ordering tool is used.
59 * - IPARM_IO_STRATEGY:
60 * - If set to PastixIOSave, the results will be written on files on
61 * exit.
62 * - If set to PastixIOLoad and IPARM_ORDERING is set to personal,
63 * then the ordering is loaded from files and no ordering is
64 * called.
65 * - If the function pastix_setSchurUnknownList() function has been
66 * previously called to set the list of vertices to isolate in the
67 * schur complement, those vertices are isolated at the end of the
68 * matrix in a dedicated supernode..
69 * - If the function pastix_setZerosUnknownList() function has been
70 * previously called to set the list of diagonal elements that may
71 * cause problem during the factorization, those vertices are isolated
72 * at the end of the matrix in a dedicated supernode..
73 *
74 * @param[in] spm
75 * The sparse matrix given by the user on which the ordering will be
76 * computed.
77 *
78 *
79 * @param[inout] myorder
80 * On entry, the permutation provide by the user if IPARM_ORDERING
81 * parameter set to PastixOrderPersonal. Not read otherwise.
82 * On exit, if the structure attributs != NULL and IPARM_ORDERING parameter
83 * is not set to PastixOrderPersonal, contains the permutation generated.
84 * Otherwise, it is not referenced.
85 *
86 *******************************************************************************
87 *
88 * @retval PASTIX_SUCCESS on successful exit,
89 * @retval PASTIX_ERR_BADPARAMETER if one parameter is incorrect,
90 * @retval PASTIX_ERR_OUTOFMEMORY if one allocation failed,
91 * @retval PASTIX_ERR_INTEGER_TYPE if Scotch integer type is not the
92 * same size as PaStiX ones,
93 * @retval PASTIX_ERR_INTERNAL if an error occurs internally to Scotch.
94 *
95 *******************************************************************************/
96int
98 const spmatrix_t *spm,
99 pastix_order_t *myorder )
100{
101 pastix_int_t schur_gN;
102 pastix_int_t *schur_perm = NULL;
103 pastix_int_t *zeros_perm = NULL;
104 pastix_int_t *iparm;
105 pastix_graph_t *subgraph;
106 pastix_graph_t schurgraph;
107 pastix_graph_t zerosgraph;
108 pastix_graph_t *graph;
109 pastix_order_t *ordemesh;
110 Clock timer;
111 int procnum;
112 int retval = PASTIX_SUCCESS;
113 int retval_rcv;
114 int do_schur = 1;
115 int do_zeros = 1;
116 int subgraph_is_a_copy = 0;
117 int spmbase;
118
119 /*
120 * Check parameters
121 */
122 if ( pastix_data == NULL ) {
123 pastix_print_error( "pastix_subtask_order: wrong pastix_data parameter" );
125 }
126 if ( spm == NULL ) {
127 pastix_print_error( "pastix_subtask_order: wrong spm parameter" );
129 }
130 if ( !(pastix_data->steps & STEP_INIT) ) {
131 pastix_print_error( "pastix_subtask_order: pastixInit() has to be called before calling this function" );
133 }
134
135 iparm = pastix_data->iparm;
136 /* Backup flttype from the spm into iparm[IPARM_FLOAT] for later use */
137 iparm[IPARM_FLOAT] = spm->flttype;
138
139 if ( pastix_data->schur_n > 0 )
140 {
141 /*
142 * If ordering is set to PastixOrderPersonal, we consider that the schur
143 * complement is already isolated at the end of the permutation array.
144 */
145 if ( iparm[IPARM_ORDERING] == PastixOrderPersonal ) {
146 do_schur = 0;
147 }
148 }
149 else {
150 do_schur = 0;
151 }
152
153 if ( pastix_data->zeros_n > 0 )
154 {
155 /*
156 * If ordering is set to PastixOrderPersonal, we consider that the zeros
157 * on diagonal are already isolated at the end of the permutation array.
158 */
159 if ( iparm[IPARM_ORDERING] == PastixOrderPersonal ) {
160 do_zeros = 0;
161 }
162 }
163 else {
164 do_zeros = 0;
165 }
166
167 /*
168 * Clean ordering if it exists
169 */
170 if ( pastix_data->ordemesh != NULL ) {
171 pastixOrderExit(pastix_data->ordemesh);
172 }
173 else {
174 MALLOC_INTERN( pastix_data->ordemesh, 1, pastix_order_t );
175 }
176
177 ordemesh = pastix_data->ordemesh;
178 procnum = pastix_data->procnum;
179 pastixOrderAlloc( ordemesh, 0, 0 );
180
181 if ( iparm[IPARM_VERBOSE] > PastixVerboseNot ) {
182 pastix_print( procnum, 0, "%s", OUT_STEP_ORDER );
183 }
184
185 /*
186 * Prepare a copy of user's SPM
187 * Copy the given spm in pastix_data structure and performs basic required
188 * operations as symmetrizing the graph and removing the diagonal
189 * coefficients
190 */
191 if ( pastix_data->graph != NULL ) {
192 graphExit( pastix_data->graph );
193 memFree_null( pastix_data->graph );
194 }
195 graphPrepare( pastix_data, spm, &(pastix_data->graph) );
196 graph = pastix_data->graph;
197 spmbase = spmFindBase( spm );
198
199 graphBase( graph, 0 );
200 subgraph = graph;
201
202 /*
203 * Isolate Shur elements
204 */
205 if ( do_schur )
206 {
207 assert( pastix_data->schur_list != NULL );
208
209 if ( spmbase != 0 ) {
210 /* We need to rebase the schur unknown list */
211 pastix_int_t i;
212
213 for( i=0; i<pastix_data->schur_n; i++ ) {
214 pastix_data->schur_list[i] -= spmbase;
215 }
216 }
217
218 graphIsolate( graph, &schurgraph,
219 pastix_data->schur_n,
220 pastix_data->schur_list,
221 &schur_perm,
222 NULL );
223
224 subgraph_is_a_copy = 1;
225 subgraph = &schurgraph;
226 }
227
228 /* Backup only the needed part */
229 schur_gN = subgraph->gN;
230
231 /*
232 * Isolate diagonal elements close to 0.
233 */
234 if ( do_zeros )
235 {
236 assert( pastix_data->zeros_list != NULL );
237
238 if ( spmbase != 0 ) {
239 /* We need to rebase the zeros unknown list */
240 pastix_int_t i;
241
242 for( i=0; i<pastix_data->zeros_n; i++ ) {
243 pastix_data->zeros_list[i] -= spmbase;
244 }
245 }
246
247 graphIsolate( subgraph, &zerosgraph,
248 pastix_data->zeros_n,
249 pastix_data->zeros_list,
250 &zeros_perm,
251 NULL );
252
253 if ( subgraph_is_a_copy ) {
254 /* We do not longer require arrays from the schur subgraph */
255 graphExit( subgraph );
256 }
257 subgraph_is_a_copy = 1;
258 subgraph = &zerosgraph;
259 }
260
261 if ( iparm[IPARM_VERBOSE] > PastixVerboseYes ) {
262 pastix_print( procnum, 0, "%s", OUT_ORDER_INIT );
263 }
264
265 clockStart(timer);
266
267 /* Select the ordering method chosen by the user */
268 switch ( iparm[IPARM_ORDERING] ) {
269 /*
270 * Scotch Ordering
271 */
273 if ( iparm[IPARM_VERBOSE] > PastixVerboseNot ) {
274 pastix_print( procnum, 0, OUT_ORDER_METHOD, "Scotch" );
275 }
276#if defined(PASTIX_ORDERING_SCOTCH)
277 graphGatherInPlace( subgraph );
278 retval = orderComputeScotch( pastix_data, subgraph );
279#else
280 pastix_print_error( "pastix_subtask_order: Ordering with Scotch requires to enable -DPASTIX_ORDERING_SCOTCH option" );
282#endif
283 break;
284
285 /*
286 * PT-Scotch Ordering
287 */
289 if (iparm[IPARM_VERBOSE] > PastixVerboseNot) {
290 pastix_print(procnum, 0, OUT_ORDER_METHOD, "PT-Scotch" );
291 }
292#if defined(PASTIX_ORDERING_PTSCOTCH)
293 graphScatterInPlace( subgraph, pastix_data->pastix_comm );
294 retval = orderComputePTScotch( pastix_data, subgraph );
295#else
296 pastix_print_error( "pastix_subtask_order: Ordering with PT-Scotch requires to enable -DPASTIX_ORDERING_PTSCOTCH option" );
298#endif
299 break;
300
301 /*
302 * METIS ordering
303 */
304 case PastixOrderMetis:
305 if (iparm[IPARM_VERBOSE] > PastixVerboseNot) {
306 pastix_print(procnum, 0, OUT_ORDER_METHOD, "Metis" );
307 }
308#if defined(PASTIX_ORDERING_METIS)
309 graphGatherInPlace( subgraph );
310 retval = orderComputeMetis( pastix_data, subgraph );
311 assert( ordemesh->rangtab == NULL );
312#else
313 pastix_print_error( "pastix_subtask_order: Ordering with Metis requires -DPASTIX_ORDERING_METIS flag at compile time" );
315#endif
316 break;
317
318 /*
319 * Personal Ordering
320 */
322 if ( iparm[IPARM_VERBOSE] > PastixVerboseNot ) {
323 pastix_print( procnum, 0, OUT_ORDER_METHOD, "Personal" );
324 }
325 retval = orderComputePersonal( pastix_data, subgraph, myorder );
326 break;
327
328 default:
329 pastix_print_error( "pastix_subtask_order: Ordering not available (iparm[IPARM_ORDERING]=%d)\n",
330 (int)iparm[IPARM_ORDERING] );
332 break;
333 }
334
335 /*
336 * Reduce the error code
337 */
338 MPI_Allreduce( &retval, &retval_rcv, 1, MPI_INT, MPI_MAX,
339 pastix_data->pastix_comm );
340 if (retval_rcv != PASTIX_SUCCESS) {
341
342 /* Cleanup memory */
343 if ( do_zeros ) {
344 graphExit( &zerosgraph );
345 memFree_null( zeros_perm );
346 }
347 if ( do_schur ) {
348 graphExit( &schurgraph );
349 memFree_null( schur_perm );
350 }
351
352 return retval_rcv;
353 }
354
355 /* Rebase the ordering to 0 (for orderFindSupernodes) */
356 pastixOrderBase( ordemesh, 0 );
357
358 /*
359 * If the rangtab or the treetab are not initialized, let's find it ourself
360 */
361 if (( ordemesh->rangtab == NULL ) ||
362 ( ordemesh->treetab == NULL ) )
363 {
364 /* The ordering step may be distributed, but supernodes routines are not */
365 graphGatherInPlace( subgraph );
366
367 /* TODO: if rangtab is provided, treetab could be easily calculated */
368 orderFindSupernodes( subgraph, ordemesh );
369
370#if !defined(NDEBUG) && defined(PASTIX_DEBUG_ORDERING)
371 assert( pastixOrderCheck( ordemesh ) == PASTIX_SUCCESS );
372#endif
373
375 iparm[IPARM_INCOMPLETE],
376 iparm[IPARM_LEVEL_OF_FILL],
379 subgraph,
380 ordemesh,
381 pastix_data->pastix_comm );
382 }
383
384#if !defined(NDEBUG) && defined(PASTIX_DEBUG_ORDERING)
385 assert( pastixOrderCheck( ordemesh ) == PASTIX_SUCCESS );
386#endif
387
388 /*
389 * The subgraph is no longer needed, let's free it if it was a copy
390 */
391 if ( subgraph_is_a_copy ) {
392 graphExit( subgraph );
393 }
394
395 /*
396 * Reorder supernodes by level to get a better order for runtime systems,
397 * and for the reordering algorithm
398 */
399 orderApplyLevelOrder( ordemesh,
400 iparm[IPARM_TASKS2D_LEVEL],
401 iparm[IPARM_TASKS2D_WIDTH] );
402
403#if !defined(NDEBUG) && defined(PASTIX_DEBUG_ORDERING)
404 assert( pastixOrderCheck( ordemesh ) == PASTIX_SUCCESS );
405#endif
406
407 /*
408 * Add the isolated elements to the ordering structure
409 */
410 if ( do_zeros )
411 {
412 orderAddIsolate( ordemesh, schur_gN, zeros_perm );
413
414 if ( zeros_perm != NULL ) { memFree_null( zeros_perm ); }
415 }
416
417 /*
418 * Add the isolated elements to the ordering structure
419 */
420 if ( do_schur )
421 {
422 orderAddIsolate( ordemesh, graph->gN, schur_perm );
423
424 if ( schur_perm != NULL ) { memFree_null( schur_perm ); }
425 }
426
427 /*
428 * Backup of the original supernodes
429 */
430 ordemesh->sndenbr = ordemesh->cblknbr;
431 ordemesh->sndetab = malloc( (ordemesh->sndenbr+1) * sizeof(pastix_int_t) );
432 memcpy( ordemesh->sndetab, ordemesh->rangtab, (ordemesh->sndenbr+1) * sizeof(pastix_int_t) );
433
434 /*
435 * Block Low-Rank clustering
436 */
437 if ( ( iparm[IPARM_COMPRESS_WHEN] != PastixCompressNever ) &&
439 {
440#if !defined(PASTIX_ORDERING_SCOTCH)
441 pastix_print_warning( "Clustering is not available yet when Scotch is disabled" );
442#else
443 EliminTree *etree;
444 pastix_int_t min_cblk = ordemesh->rangtab[ordemesh->cblknbr-1];
445 pastix_int_t ret;
446
447 graphBase( graph, 0 );
448
449 etree = orderBuildEtree( ordemesh );
450
451 ret = orderSupernodes( graph, ordemesh,
452 etree, iparm, do_schur );
453
454 eTreeExit( etree );
455
456 (void)ret;
457 (void)min_cblk;
458#endif /* !defined(PASTIX_ORDERING_SCOTCH) */
459 }
460
461#if defined(PASTIX_ORDER_DRAW_LASTSEP)
462 /*
463 * Draw last separator graph and xyz
464 */
465 orderDraw( pastix_data, NULL, ordemesh->sndenbr-1,
466 orderDrawGraph | orderDrawCoordinates );
467#endif
468
469 /* Reduce the error code */
470 MPI_Allreduce( &retval, &retval_rcv, 1, MPI_INT, MPI_MAX,
471 pastix_data->pastix_comm );
472 if ( retval_rcv != PASTIX_SUCCESS ) {
473 return retval_rcv;
474 }
475
476 clockStop(timer);
477 pastix_data->dparm[DPARM_ORDER_TIME] = clockVal(timer);
478 if ( iparm[IPARM_VERBOSE] > PastixVerboseNot ) {
479 pastix_print(procnum, 0, OUT_ORDER_TIME, clockVal(timer));
480 }
481
482 /*
483 * Save i/o strategy
484 */
485 if ( iparm[IPARM_IO_STRATEGY] & PastixIOSave ) {
486 if ( procnum == 0 ) {
487 retval = pastixOrderSave( pastix_data, ordemesh );
488 }
489
490 MPI_Allreduce( &retval, &retval_rcv, 1, MPI_INT, MPI_MAX,
491 pastix_data->pastix_comm );
492 if ( retval_rcv != PASTIX_SUCCESS ) {
493 return retval_rcv;
494 }
495 }
496
497 /*
498 * Return the ordering to user if structure is not NULL
499 * Remark: No need to copy back for personal
500 */
501 if ( ( iparm[IPARM_ORDERING] != PastixOrderPersonal ) &&
502 ( myorder != NULL ) )
503 {
504 if ( graph->loc2glob == NULL )
505 {
506 retval = pastixOrderCopy( myorder, ordemesh );
507 MPI_Allreduce( &retval, &retval_rcv, 1, MPI_INT, MPI_MAX,
508 pastix_data->pastix_comm );
509 if ( retval_rcv != PASTIX_SUCCESS ) {
510 return retval_rcv;
511 }
512 }
513 else
514 {
515 pastix_int_t *loc2glob;
516 pastix_int_t baseval = graph->baseval;
517 pastix_int_t i, n;
518
519 n = graph->n;
520 if ( myorder->permtab != NULL ) {
521 pastix_int_t *permtab = ordemesh->permtab - baseval;
522
523 loc2glob = graph->loc2glob;
524 for( i = 0; i < n; i++, loc2glob++ ) {
525 myorder->permtab[i] = permtab[*loc2glob];
526 }
527 }
528 if (myorder->peritab != NULL) {
529 pastix_int_t *peritab = ordemesh->peritab - baseval;
530 pastix_int_t i;
531
532 loc2glob = graph->loc2glob;
533 for( i = 0; i < n; i++, loc2glob++ ) {
534 myorder->peritab[i] = peritab[*loc2glob];
535 }
536 }
537 /* TODO: Copy also rangtab and treetab ? */
538 }
539 }
540
541 /*
542 * For now, what the rank 0 has will overwrite what the others have, even if
543 * they all computed something
544 */
545 pastixOrderBcast( pastix_data->ordemesh, 0, pastix_data->pastix_comm );
546
547#if !defined(NDEBUG)
548 assert( pastixOrderCheck( pastix_data->ordemesh ) == PASTIX_SUCCESS );
549#endif
550
551 /* Backup the spm pointer for further information */
552 pastix_data->csc = spm;
553
554 /* Invalidate following steps, and add order step to the ones performed */
555 pastix_data->steps &= ~( STEP_SYMBFACT |
556 STEP_ANALYSE |
557 STEP_CSC2BCSC |
558 STEP_BCSC2CTAB |
559 STEP_NUMFACT |
560 STEP_SOLVE |
561 STEP_REFINE );
562 pastix_data->steps |= STEP_ORDERING;
563
564 return PASTIX_SUCCESS;
565}
BEGIN_C_DECLS typedef int pastix_int_t
Definition datatypes.h:51
void eTreeExit(EliminTree *)
Free the elimination tree structure.
Definition elimintree.c:89
Elimination tree.
Definition elimintree.h:39
EliminTree * orderBuildEtree(const pastix_order_t *order)
This routine build the elimination tree associated to an ordering.
int pastix_subtask_order(pastix_data_t *pastix_data, const spmatrix_t *spm, pastix_order_t *myorder)
Computes the ordering of the given graph in parameters.
@ PastixIOSave
Definition api.h:231
@ DPARM_ORDER_TIME
Definition api.h:164
@ PastixCompressNever
Definition api.h:385
@ IPARM_COMPRESS_WHEN
Definition api.h:131
@ IPARM_TASKS2D_LEVEL
Definition api.h:90
@ IPARM_TASKS2D_WIDTH
Definition api.h:91
@ IPARM_AMALGAMATION_LVLBLAS
Definition api.h:74
@ IPARM_FLOAT
Definition api.h:149
@ IPARM_ORDERING
Definition api.h:50
@ IPARM_VERBOSE
Definition api.h:36
@ IPARM_AMALGAMATION_LVLCBLK
Definition api.h:75
@ IPARM_SPLITTING_STRATEGY
Definition api.h:80
@ IPARM_IO_STRATEGY
Definition api.h:37
@ IPARM_LEVEL_OF_FILL
Definition api.h:96
@ IPARM_INCOMPLETE
Definition api.h:95
@ PastixOrderPersonal
Definition api.h:347
@ PastixOrderScotch
Definition api.h:345
@ PastixOrderMetis
Definition api.h:346
@ PastixOrderPtScotch
Definition api.h:348
@ PastixVerboseYes
Definition api.h:222
@ PastixVerboseNot
Definition api.h:220
@ PASTIX_SUCCESS
Definition api.h:367
@ PASTIX_ERR_BADPARAMETER
Definition api.h:374
@ PastixSplitNot
Definition api.h:416
int graphIsolate(const pastix_graph_t *ingraph, pastix_graph_t *outgraph, pastix_int_t isolate_n, pastix_int_t *isolate_list, pastix_int_t **new_perm, pastix_int_t **new_invp)
Isolate a subset of vertices from a given graph.
void graphExit(pastix_graph_t *graph)
Free the content of the graph structure.
Definition graph.c:73
int graphScatterInPlace(pastix_graph_t *graph, PASTIX_Comm comm)
This routine scatter a graph from node root to the other nodes.
Definition graph.c:194
int graphPrepare(pastix_data_t *pastix_data, const spmatrix_t *spm, pastix_graph_t **graph)
This routine initializes the graph.
int graphGatherInPlace(pastix_graph_t *graph)
This routine gather a distributed graph on each node in place.
Definition graph.c:239
void graphBase(pastix_graph_t *graph, pastix_int_t baseval)
Rebase the graph to the given value.
Definition graph.c:102
pastix_int_t * treetab
Definition order.h:54
pastix_int_t * sndetab
Definition order.h:57
pastix_int_t * permtab
Definition order.h:51
pastix_int_t * peritab
Definition order.h:52
pastix_int_t cblknbr
Definition order.h:50
pastix_int_t sndenbr
Definition order.h:56
pastix_int_t * rangtab
Definition order.h:53
void orderDraw(pastix_data_t *pastix_data, const char *extname, pastix_int_t sndeidx, int dump)
Dump the last separator into an ivview file.
Definition order_draw.c:52
int pastixOrderAlloc(pastix_order_t *ordeptr, pastix_int_t vertnbr, pastix_int_t cblknbr)
Allocate the order structure.
Definition order.c:55
void orderFindSupernodes(const pastix_graph_t *graph, pastix_order_t *const ordeptr)
Computes the set of supernodes for a given permutation.
void pastixOrderBase(pastix_order_t *ordeptr, pastix_int_t baseval)
This routine sets the base of the given ordering structure to the given base value.
Definition order.c:322
int orderApplyLevelOrder(pastix_order_t *order, pastix_int_t level_tasks2d, pastix_int_t width_tasks2d)
This routine reorder the elimination tree nodes per level.
pastix_int_t orderSupernodes(const pastix_graph_t *graph, pastix_order_t *order, EliminTree *etree, pastix_int_t *iparm, int do_schur)
Order the supernodes with one of the clustering strategies.
int orderComputePersonal(pastix_data_t *pastix_data, pastix_graph_t *graph, pastix_order_t *myorder)
Computes the personal ordering of the PaStiX instance.
int pastixOrderSave(pastix_data_t *pastix_data, const pastix_order_t *ordeptr)
Save an ordering to a file.
Definition order_io.c:293
int orderComputeScotch(pastix_data_t *pastix_data, pastix_graph_t *graph)
Compute the ordering of the graph given as parameter with Scotch library.
int orderAmalgamate(int verbose, int ilu, int levelk, int rat_cblk, int rat_blas, pastix_graph_t *csc, pastix_order_t *orderptr, PASTIX_Comm pastix_comm)
Update the order structure with an amalgamation algorithm.
int orderComputePTScotch(pastix_data_t *pastix_data, pastix_graph_t *graph)
Compute the ordering of the graph given as parameter with PT-Scotch library.
int orderComputeMetis(pastix_data_t *pastix_data, pastix_graph_t *graph)
Compute the ordering of the graph given as parameter with Metis library.
int orderAddIsolate(pastix_order_t *ordemesh, pastix_int_t new_n, const pastix_int_t *perm)
This routine combines two permutation arrays when a subset of vertices has been isolated from the ori...
void pastixOrderBcast(pastix_order_t *ordemesh, int root, PASTIX_Comm pastix_comm)
This routine broadcast the ordemesh structure from node root to all the other nodes.
Definition order.c:679
int pastixOrderCheck(const pastix_order_t *ordeptr)
This routine checks the correctness of the ordering structure.
Definition order_check.c:39
int pastixOrderCopy(pastix_order_t *ordedst, const pastix_order_t *ordesrc)
This routine copy a given ordering in a new one.
Definition order.c:570
void pastixOrderExit(pastix_order_t *ordeptr)
Free the arrays initialized in the order structure.
Definition order.c:273
Order structure.
Definition order.h:47
PASTIX_Comm pastix_comm
Definition pastixdata.h:76
pastix_int_t zeros_n
Definition pastixdata.h:96
pastix_order_t * ordemesh
Definition pastixdata.h:98
pastix_int_t * iparm
Definition pastixdata.h:70
double * dparm
Definition pastixdata.h:71
const spmatrix_t * csc
Definition pastixdata.h:90
pastix_int_t schur_n
Definition pastixdata.h:94
pastix_graph_t * graph
Definition pastixdata.h:92
pastix_int_t * schur_list
Definition pastixdata.h:95
pastix_int_t * zeros_list
Definition pastixdata.h:97
pastix_int_t steps
Definition pastixdata.h:73
Main PaStiX data structure.
Definition pastixdata.h:68