1 /*
2  * Copyright 1994-2011, Regents of the University of Minnesota
3  *
4  * m2gmetis.c
5  *
6  * Drivers for the mesh-to-graph coversion routines
7  *
8  * Started 5/28/11
9  * George
10  *
11  * $Id: m2gmetis.c 10498 2011-07-06 16:41:38Z karypis $
12  *
13  */
14 
15 #include "metisbin.h"
16 
17 
18 
19 /*************************************************************************/
20 /*! Let the game begin! */
21 /*************************************************************************/
main(int argc,char * argv[])22 int main(int argc, char *argv[])
23 {
24   mesh_t *mesh;
25   graph_t *graph;
26   params_t *params;
27   int status=0;
28 
29   params = parse_cmdline(argc, argv);
30 
31   gk_startcputimer(params->iotimer);
32   mesh = ReadMesh(params);
33 
34   gk_stopcputimer(params->iotimer);
35 
36   if (mesh->ncon > 1) {
37     printf("*** Meshes with more than one balancing constraint are not supported yet.\n");
38     exit(0);
39   }
40 
41   M2GPrintInfo(params, mesh);
42 
43   graph = CreateGraph();
44 
45   gk_malloc_init();
46   gk_startcputimer(params->parttimer);
47 
48   switch (params->gtype) {
49     case METIS_GTYPE_DUAL:
50       status = METIS_MeshToDual(&mesh->ne, &mesh->nn, mesh->eptr, mesh->eind,
51                    &params->ncommon, &params->numflag, &graph->xadj, &graph->adjncy);
52 
53       if (status == METIS_OK) {
54         graph->nvtxs  = mesh->ne;
55         graph->nedges = graph->xadj[graph->nvtxs];
56         graph->ncon   = 1;
57       }
58       break;
59 
60     case METIS_GTYPE_NODAL:
61       status = METIS_MeshToNodal(&mesh->ne, &mesh->nn, mesh->eptr, mesh->eind,
62                    &params->numflag, &graph->xadj, &graph->adjncy);
63 
64       if (status == METIS_OK) {
65         graph->nvtxs  = mesh->nn;
66         graph->nedges = graph->xadj[graph->nvtxs];
67         graph->ncon   = 1;
68       }
69       break;
70   }
71 
72   gk_stopcputimer(params->parttimer);
73   if (gk_GetCurMemoryUsed() != 0)
74         printf("***It seems that Metis did not free all of its memory! Report this.\n");
75   params->maxmemory = gk_GetMaxMemoryUsed();
76   gk_malloc_cleanup(0);
77 
78   if (status != METIS_OK) {
79     printf("\n***Metis returned with an error.\n");
80   }
81   else {
82     /* Write the graph */
83     gk_startcputimer(params->iotimer);
84     WriteGraph(graph, params->outfile);
85     gk_stopcputimer(params->iotimer);
86 
87     M2GReportResults(params, mesh, graph);
88   }
89 
90   FreeGraph(&graph);
91   FreeMesh(&mesh);
92   gk_free((void **)&params->filename, &params->outfile, &params, LTERM);
93 }
94 
95 
96 /*************************************************************************/
97 /*! This function prints run parameters */
98 /*************************************************************************/
M2GPrintInfo(params_t * params,mesh_t * mesh)99 void M2GPrintInfo(params_t *params, mesh_t *mesh)
100 {
101   printf("******************************************************************************\n");
102   printf("%s", METISTITLE);
103   printf(" (HEAD: %s, Built on: %s, %s)\n", SVNINFO, __DATE__, __TIME__);
104   printf(" size of idx_t: %zubits, real_t: %zubits, idx_t *: %zubits\n",
105       8*sizeof(idx_t), 8*sizeof(real_t), 8*sizeof(idx_t *));
106   printf("\n");
107   printf("Mesh Information ------------------------------------------------------------\n");
108   printf(" Name: %s, #Elements: %"PRIDX", #Nodes: %"PRIDX"\n",
109       params->filename, mesh->ne, mesh->nn);
110 
111   printf("Options ---------------------------------------------------------------------\n");
112   printf(" gtype=%s, ncommon=%"PRIDX", outfile=%s\n",
113       gtypenames[params->gtype], params->ncommon, params->outfile);
114 
115   printf("\n");
116 }
117 
118 
119 /*************************************************************************/
120 /*! This function does any post-metis reporting */
121 /*************************************************************************/
M2GReportResults(params_t * params,mesh_t * mesh,graph_t * graph)122 void M2GReportResults(params_t *params, mesh_t *mesh, graph_t *graph)
123 {
124 
125   gk_startcputimer(params->reporttimer);
126 
127   printf(" - #nvtxs: %"PRIDX", #edges: %"PRIDX"\n", graph->nvtxs, graph->nedges);
128 
129   gk_stopcputimer(params->reporttimer);
130 
131 
132   printf("\nTiming Information ----------------------------------------------------------\n");
133   printf("  I/O:          \t\t %7.3"PRREAL" sec\n", gk_getcputimer(params->iotimer));
134   printf("  Partitioning: \t\t %7.3"PRREAL" sec   (METIS time)\n", gk_getcputimer(params->parttimer));
135   printf("  Reporting:    \t\t %7.3"PRREAL" sec\n", gk_getcputimer(params->reporttimer));
136   printf("\nMemory Information ----------------------------------------------------------\n");
137   printf("  Max memory used:\t\t %7.3"PRREAL" MB\n", (real_t)(params->maxmemory/(1024.0*1024.0)));
138   printf("******************************************************************************\n");
139 
140 }
141