PaStiX Handbook  6.3.2
order_compute_metis.c
Go to the documentation of this file.
1 /**
2  *
3  * @file order_compute_metis.c
4  *
5  * PaStiX order driver to perform ordering with Metis library
6  *
7  * @copyright 2004-2023 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
8  * Univ. Bordeaux. All rights reserved.
9  *
10  * @version 6.3.2
11  * @author Xavier Lacoste
12  * @author Pierre Ramet
13  * @author Mathieu Faverge
14  * @author Tony Delarue
15  * @date 2023-07-21
16  *
17  **/
18 #include "common.h"
19 #include "graph/graph.h"
20 #include "order/order_internal.h"
21 #include <metis.h>
22 
23 /**
24  *******************************************************************************
25  *
26  * @ingroup pastix_order
27  *
28  * @brief Compute the ordering of the graph given as parameter
29  * with Metis library.
30  *
31  * This routine is affected by the following parameters:
32  * IPARM_VERBOSE, IPARM_ORDERING_DEFAULT, IPARM_METIS_CTYPE,
33  * IPARM_METIS_RTYPE, IPARM_METIS_NO2HOP, IPARM_METIS_NSEPS,
34  * IPARM_METIS_NITER, IPARM_METIS_UFACTOR, IPARM_METIS_COMPRESS,
35  * IPARM_METIS_CCORDER, IPARM_METIS_PFACTOR, IPARM_METIS_SEED,
36  * IPARM_METIS_DBGLVL.
37  *
38  *******************************************************************************
39  *
40  * @param[inout] pastix_data
41  * The pastix_data structure that describes the solver instance.
42  * On exit, the field oerdemesh is initialize with the result of the
43  * ordering realized by Scotch.
44  *
45  * @param[inout] graph
46  * The graph prepared by graphPrepare function on which we want to
47  * perform the ordering. On exit, the graph might be rebased.
48  *
49  *******************************************************************************
50  *
51  * @retval PASTIX_SUCCESS on successful exit,
52  * @retval PASTIX_ERR_BADPARAMETER if one parameter is incorrect,
53  * @retval PASTIX_ERR_OUTOFMEMORY if one allocation failed,
54  * @retval PASTIX_ERR_INTEGER_TYPE if Metis integer type is not the
55  * same size as PaStiX ones,
56  * @retval PASTIX_ERR_INTERNAL if an error occurs internally to Metis.
57  *
58  *******************************************************************************/
59 int
61  pastix_graph_t *graph )
62 {
63  pastix_int_t *iparm = pastix_data->iparm;
64  pastix_order_t *ordemesh = pastix_data->ordemesh;
65  pastix_int_t n;
66  pastix_int_t baseval = graph->colptr[0];
67  idx_t opt[METIS_NOPTIONS];
68  int rc;
69 
70  if ( sizeof(pastix_int_t) != sizeof(idx_t)) {
71  pastix_print_error( "Inconsistent integer type between PaStiX and Metis\n" );
73  }
74 
75  /* Set of valid options for METIS_NodeND */
76  METIS_SetDefaultOptions(opt);
77  if (iparm[IPARM_ORDERING_DEFAULT] != 1) {
78  opt[METIS_OPTION_CTYPE ] = iparm[IPARM_METIS_CTYPE ];
79  opt[METIS_OPTION_RTYPE ] = iparm[IPARM_METIS_RTYPE ];
80  opt[METIS_OPTION_NO2HOP ] = iparm[IPARM_METIS_NO2HOP ];
81  opt[METIS_OPTION_NSEPS ] = iparm[IPARM_METIS_NSEPS ];
82  opt[METIS_OPTION_NITER ] = iparm[IPARM_METIS_NITER ];
83  opt[METIS_OPTION_UFACTOR ] = iparm[IPARM_METIS_UFACTOR ];
84  opt[METIS_OPTION_COMPRESS] = iparm[IPARM_METIS_COMPRESS];
85  opt[METIS_OPTION_CCORDER ] = iparm[IPARM_METIS_CCORDER ];
86  opt[METIS_OPTION_PFACTOR ] = iparm[IPARM_METIS_PFACTOR ];
87  }
88  opt[METIS_OPTION_SEED ] = iparm[IPARM_METIS_SEED];
89  opt[METIS_OPTION_NUMBERING] = baseval;
90  opt[METIS_OPTION_DBGLVL ] = iparm[IPARM_METIS_DBGLVL];
91 
92  n = graph->n;
93  rc = pastixOrderAlloc( ordemesh, graph->n, 0 );
94  if (rc != PASTIX_SUCCESS )
95  {
96  pastix_print_error( "orderComputeMetis: Error during odering initialization\n" );
97  return rc;
98  }
99  ordemesh->baseval = baseval;
100  rc = METIS_NodeND( &n, graph->colptr, graph->rowptr, NULL,
101  opt, ordemesh->peritab, ordemesh->permtab);
102 
103  assert( n == graph->n );
104  if (rc != METIS_OK )
105  {
106  pastix_print_error( "orderComputeMetis: Invalid code returned by METIS_NodeND (%d)\n", rc );
107  return PASTIX_ERR_INTERNAL;
108  }
109 
110 #if defined(PASTIX_DEBUG_ORDERING)
111  {
112  pastix_int_t i;
113  for(i=0; i<n; i++) {
114  assert( ordemesh->permtab[i] >= baseval );
115  assert( ordemesh->permtab[i] < (n+baseval) );
116  assert( ordemesh->peritab[i] >= baseval );
117  assert( ordemesh->peritab[i] < (n+baseval) );
118  }
119  }
120 #endif
121  return PASTIX_SUCCESS;
122 }
BEGIN_C_DECLS typedef int pastix_int_t
Definition: datatypes.h:51
@ IPARM_METIS_SEED
Definition: api.h:70
@ IPARM_METIS_NO2HOP
Definition: api.h:63
@ IPARM_METIS_NITER
Definition: api.h:65
@ IPARM_ORDERING_DEFAULT
Definition: api.h:51
@ IPARM_METIS_COMPRESS
Definition: api.h:67
@ IPARM_METIS_DBGLVL
Definition: api.h:71
@ IPARM_METIS_RTYPE
Definition: api.h:62
@ IPARM_METIS_PFACTOR
Definition: api.h:69
@ IPARM_METIS_NSEPS
Definition: api.h:64
@ IPARM_METIS_UFACTOR
Definition: api.h:66
@ IPARM_METIS_CCORDER
Definition: api.h:68
@ IPARM_METIS_CTYPE
Definition: api.h:61
@ PASTIX_ERR_INTERNAL
Definition: api.h:373
@ PASTIX_ERR_INTEGER_TYPE
Definition: api.h:376
@ PASTIX_SUCCESS
Definition: api.h:367
pastix_int_t baseval
Definition: order.h:48
pastix_int_t * permtab
Definition: order.h:51
pastix_int_t * peritab
Definition: order.h:52
int pastixOrderAlloc(pastix_order_t *ordeptr, pastix_int_t vertnbr, pastix_int_t cblknbr)
Allocate the order structure.
Definition: order.c:55
int orderComputeMetis(pastix_data_t *pastix_data, pastix_graph_t *graph)
Compute the ordering of the graph given as parameter with Metis library.
Order structure.
Definition: order.h:47
pastix_order_t * ordemesh
Definition: pastixdata.h:97
pastix_int_t * iparm
Definition: pastixdata.h:69
Main PaStiX data structure.
Definition: pastixdata.h:67