Path: blob/devel/elmergrid/src/metis-5.1.0/programs/ndmetis.c
3206 views
/*1* Copyright 1994-2011, Regents of the University of Minnesota2*3* ndmetis.c4*5* Driver programs for nested disection ordering6*7* Started 8/28/948* George9*10* $Id: ndmetis.c 13900 2013-03-24 15:27:07Z karypis $11*12*/1314#include "metisbin.h"15161718/*************************************************************************/19/*! Let the game begin! */20/*************************************************************************/21int main(int argc, char *argv[])22{23idx_t options[METIS_NOPTIONS];24graph_t *graph;25idx_t *perm, *iperm;26params_t *params;27int status=0;2829params = parse_cmdline(argc, argv);3031gk_startcputimer(params->iotimer);32graph = ReadGraph(params);33gk_stopcputimer(params->iotimer);3435/* This is just for internal use to clean up some files36{37char fileout[8192];3839gk_free((void **)&graph->vwgt, &graph->adjwgt, &graph->vsize, LTERM);40sprintf(fileout, "ND/%s", params->filename);41if (graph->nvtxs > 25000)42WriteGraph(graph, fileout);43exit(0);44}45*/4647/* Check if the graph is contiguous */48if (graph->ncon != 1) {49printf("***The input graph contains %"PRIDX" constraints..\n"50"***Ordering requires a graph with one constraint.\n", graph->ncon);51exit(0);52}5354NDPrintInfo(params, graph);5556perm = imalloc(graph->nvtxs, "main: perm");57iperm = imalloc(graph->nvtxs, "main: iperm");5859METIS_SetDefaultOptions(options);60options[METIS_OPTION_CTYPE] = params->ctype;61options[METIS_OPTION_IPTYPE] = params->iptype;62options[METIS_OPTION_RTYPE] = params->rtype;63options[METIS_OPTION_DBGLVL] = params->dbglvl;64options[METIS_OPTION_UFACTOR] = params->ufactor;65options[METIS_OPTION_NO2HOP] = params->no2hop;66options[METIS_OPTION_COMPRESS] = params->compress;67options[METIS_OPTION_CCORDER] = params->ccorder;68options[METIS_OPTION_SEED] = params->seed;69options[METIS_OPTION_NITER] = params->niter;70options[METIS_OPTION_NSEPS] = params->nseps;71options[METIS_OPTION_PFACTOR] = params->pfactor;7273gk_malloc_init();74gk_startcputimer(params->parttimer);7576status = METIS_NodeND(&graph->nvtxs, graph->xadj, graph->adjncy, graph->vwgt,77options, perm, iperm);7879gk_stopcputimer(params->parttimer);80if (gk_GetCurMemoryUsed() != 0)81printf("***It seems that Metis did not free all of its memory! Report this.\n");82params->maxmemory = gk_GetMaxMemoryUsed();83gk_malloc_cleanup(0);848586if (status != METIS_OK) {87printf("\n***Metis returned with an error.\n");88}89else {90if (!params->nooutput) {91/* Write the solution */92gk_startcputimer(params->iotimer);93WritePermutation(params->filename, iperm, graph->nvtxs);94gk_stopcputimer(params->iotimer);95}9697NDReportResults(params, graph, perm, iperm);98}99100FreeGraph(&graph);101gk_free((void **)&perm, &iperm, LTERM);102gk_free((void **)¶ms->filename, ¶ms->tpwgtsfile, ¶ms->tpwgts,103¶ms->ubvec, ¶ms, LTERM);104105}106107108/*************************************************************************/109/*! This function prints run parameters */110/*************************************************************************/111void NDPrintInfo(params_t *params, graph_t *graph)112{113printf("******************************************************************************\n");114printf("%s", METISTITLE);115printf(" (HEAD: %s, Built on: %s, %s)\n", SVNINFO, __DATE__, __TIME__);116printf(" size of idx_t: %zubits, real_t: %zubits, idx_t *: %zubits\n",1178*sizeof(idx_t), 8*sizeof(real_t), 8*sizeof(idx_t *));118printf("\n");119printf("Graph Information -----------------------------------------------------------\n");120printf(" Name: %s, #Vertices: %"PRIDX", #Edges: %"PRIDX"\n",121params->filename, graph->nvtxs, graph->nedges/2);122123printf("\n");124printf("Options ---------------------------------------------------------------------\n");125printf(" ctype=%s, rtype=%s, iptype=%s, seed=%"PRIDX", dbglvl=%"PRIDX"\n",126ctypenames[params->ctype], rtypenames[params->rtype],127iptypenames[params->iptype], params->seed, params->dbglvl);128129printf(" ufactor=%.3f, pfactor=%.2f, no2hop=%s, ccorder=%s, compress=%s, , nooutput=%s\n",130I2RUBFACTOR(params->ufactor),1310.1*params->pfactor,132(params->no2hop ? "YES" : "NO"),133(params->ccorder ? "YES" : "NO"),134(params->compress ? "YES" : "NO"),135(params->nooutput ? "YES" : "NO")136);137138printf(" niter=%"PRIDX", nseps=%"PRIDX"\n", params->niter, params->nseps);139140printf("\n");141printf("Node-based Nested Dissection ------------------------------------------------\n");142}143144145/*************************************************************************/146/*! This function does any post-ordering reporting */147/*************************************************************************/148void NDReportResults(params_t *params, graph_t *graph, idx_t *perm,149idx_t *iperm)150{151size_t maxlnz, opc;152153gk_startcputimer(params->reporttimer);154ComputeFillIn(graph, perm, iperm, &maxlnz, &opc);155printf(" Nonzeros: %6.3le \tOperation Count: %6.3le\n", (double)maxlnz, (double)opc);156157gk_stopcputimer(params->reporttimer);158159160printf("\nTiming Information ----------------------------------------------------------\n");161printf(" I/O: \t\t %7.3"PRREAL" sec\n", gk_getcputimer(params->iotimer));162printf(" Ordering: \t\t %7.3"PRREAL" sec (METIS time)\n", gk_getcputimer(params->parttimer));163printf(" Reporting: \t\t %7.3"PRREAL" sec\n", gk_getcputimer(params->reporttimer));164printf("\nMemory Information ----------------------------------------------------------\n");165printf(" Max memory used:\t\t %7.3"PRREAL" MB\n", (real_t)(params->maxmemory/(1024.0*1024.0)));166printf("******************************************************************************\n");167168}169170171