1 /*!
2 \file cmdline_m2gmetis.c
3
4 \brief Command-line argument parsing for m2gmetis
5
6 \date 12/24/2008
7 \author George
8 \version\verbatim $Id: cmdline_m2gmetis.c 10046 2011-06-01 14:13:40Z karypis $\endverbatim
9 */
10
11 #include "metisbin.h"
12
13
14 /*-------------------------------------------------------------------
15 * Command-line options
16 *-------------------------------------------------------------------*/
17 static struct gk_option long_options[] = {
18 {"gtype", 1, 0, METIS_OPTION_GTYPE},
19 {"ncommon", 1, 0, METIS_OPTION_NCOMMON},
20
21 {"dbglvl", 1, 0, METIS_OPTION_DBGLVL},
22
23 {"help", 0, 0, METIS_OPTION_HELP},
24 {0, 0, 0, 0}
25 };
26
27
28
29 /*-------------------------------------------------------------------
30 * Mappings for the various parameter values
31 *-------------------------------------------------------------------*/
32 static gk_StringMap_t gtype_options[] = {
33 {"dual", METIS_GTYPE_DUAL},
34 {"nodal", METIS_GTYPE_NODAL},
35 {NULL, 0}
36 };
37
38
39 /*-------------------------------------------------------------------
40 * Mini help
41 *-------------------------------------------------------------------*/
42 static char helpstr[][100] =
43 {
44 " ",
45 "Usage: m2gmetis [options] <meshfile> <graphfile>",
46 " ",
47 " Required parameters",
48 " meshfile Stores the input mesh.",
49 " graphfile The filename of the output graph.",
50 " ",
51 " Optional parameters",
52 " -gtype=string",
53 " Specifies the graph that will be generated.",
54 " The possible values are:",
55 " dual - Generate dual graph of the mesh [default]",
56 " nodal - Generate the nodal graph of the mesh",
57 " ",
58 " -ncommon=int [applies when gtype=dual]",
59 " Specifies the common number of nodes that two elements must have",
60 " in order to put an edge between them in the dual graph. Default is 1.",
61 " ",
62 " -dbglvl=int ",
63 " Selects the dbglvl.",
64 " ",
65 " -help",
66 " Prints this message.",
67 ""
68 };
69
70 static char shorthelpstr[][100] = {
71 " ",
72 " Usage: m2gmetis [options] <meshfile> <graphfile>",
73 " use 'm2gmetis -help' for a summary of the options.",
74 ""
75 };
76
77
78
79 /*************************************************************************
80 * This is the entry point of the command-line argument parser
81 **************************************************************************/
parse_cmdline(int argc,char * argv[])82 params_t *parse_cmdline(int argc, char *argv[])
83 {
84 int i, j, k;
85 int c, option_index;
86 params_t *params;
87
88 params = (params_t *)gk_malloc(sizeof(params_t), "parse_cmdline");
89 memset((void *)params, 0, sizeof(params_t));
90
91 /* initialize the params data structure */
92 params->gtype = METIS_GTYPE_DUAL;
93 params->ncommon = 1;
94 params->dbglvl = 0;
95 params->filename = NULL;
96 params->outfile = NULL;
97
98
99 gk_clearcputimer(params->iotimer);
100 gk_clearcputimer(params->parttimer);
101 gk_clearcputimer(params->reporttimer);
102
103
104 /* Parse the command line arguments */
105 while ((c = gk_getopt_long_only(argc, argv, "", long_options, &option_index)) != -1) {
106 switch (c) {
107 case METIS_OPTION_GTYPE:
108 if (gk_optarg)
109 if ((params->gtype = gk_GetStringID(gtype_options, gk_optarg)) == -1)
110 errexit("Invalid option -%s=%s\n", long_options[option_index].name, gk_optarg);
111 break;
112
113 case METIS_OPTION_NCOMMON:
114 if (gk_optarg) params->ncommon = (idx_t)atoi(gk_optarg);
115 if (params->ncommon < 1)
116 errexit("The -ncommon option should specify a number >= 1.\n");
117 break;
118
119 case METIS_OPTION_DBGLVL:
120 if (gk_optarg) params->dbglvl = (idx_t)atoi(gk_optarg);
121 break;
122
123 case METIS_OPTION_HELP:
124 for (i=0; strlen(helpstr[i]) > 0; i++)
125 printf("%s\n", helpstr[i]);
126 exit(0);
127 break;
128 case '?':
129 default:
130 errexit("Illegal command-line option(s)\n"
131 "Use %s -help for a summary of the options.\n", argv[0]);
132 }
133 }
134
135 if (argc-gk_optind != 2) {
136 printf("Missing parameters.");
137 for (i=0; strlen(shorthelpstr[i]) > 0; i++)
138 printf("%s\n", shorthelpstr[i]);
139 exit(0);
140 }
141
142 params->filename = gk_strdup(argv[gk_optind++]);
143 params->outfile = gk_strdup(argv[gk_optind++]);
144
145 return params;
146 }
147
148
149