Path: blob/devel/elmergrid/src/metis-5.1.0/programs/gpmetis.c
3206 views
/*1* Copyright 1994-2011, Regents of the University of Minnesota2*3* gpmetis.c4*5* Drivers for the partitioning routines6*7* Started 8/28/948* George9*10* $Id: gpmetis.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 i;24char *curptr, *newptr;25idx_t options[METIS_NOPTIONS];26graph_t *graph;27idx_t *part;28idx_t objval;29params_t *params;30int status=0;3132params = parse_cmdline(argc, argv);3334gk_startcputimer(params->iotimer);35graph = ReadGraph(params);3637ReadTPwgts(params, graph->ncon);38gk_stopcputimer(params->iotimer);3940/* Check if the graph is contiguous */41if (params->contig && !IsConnected(graph, 0)) {42printf("***The input graph is not contiguous.\n"43"***The specified -contig option will be ignored.\n");44params->contig = 0;45}4647/* Get ubvec if supplied */48if (params->ubvecstr) {49params->ubvec = rmalloc(graph->ncon, "main");50curptr = params->ubvecstr;51for (i=0; i<graph->ncon; i++) {52params->ubvec[i] = strtoreal(curptr, &newptr);53if (curptr == newptr)54errexit("Error parsing entry #%"PRIDX" of ubvec [%s] (possibly missing).\n",55i, params->ubvecstr);56curptr = newptr;57}58}5960/* Setup iptype */61if (params->iptype == -1) {62if (params->ptype == METIS_PTYPE_RB) {63if (graph->ncon == 1)64params->iptype = METIS_IPTYPE_GROW;65else66params->iptype = METIS_IPTYPE_RANDOM;67}68}6970GPPrintInfo(params, graph);7172part = imalloc(graph->nvtxs, "main: part");7374METIS_SetDefaultOptions(options);75options[METIS_OPTION_OBJTYPE] = params->objtype;76options[METIS_OPTION_CTYPE] = params->ctype;77options[METIS_OPTION_IPTYPE] = params->iptype;78options[METIS_OPTION_RTYPE] = params->rtype;79options[METIS_OPTION_NO2HOP] = params->no2hop;80options[METIS_OPTION_MINCONN] = params->minconn;81options[METIS_OPTION_CONTIG] = params->contig;82options[METIS_OPTION_SEED] = params->seed;83options[METIS_OPTION_NITER] = params->niter;84options[METIS_OPTION_NCUTS] = params->ncuts;85options[METIS_OPTION_UFACTOR] = params->ufactor;86options[METIS_OPTION_DBGLVL] = params->dbglvl;8788gk_malloc_init();89gk_startcputimer(params->parttimer);9091switch (params->ptype) {92case METIS_PTYPE_RB:93status = METIS_PartGraphRecursive(&graph->nvtxs, &graph->ncon, graph->xadj,94graph->adjncy, graph->vwgt, graph->vsize, graph->adjwgt,95¶ms->nparts, params->tpwgts, params->ubvec, options,96&objval, part);97break;9899case METIS_PTYPE_KWAY:100status = METIS_PartGraphKway(&graph->nvtxs, &graph->ncon, graph->xadj,101graph->adjncy, graph->vwgt, graph->vsize, graph->adjwgt,102¶ms->nparts, params->tpwgts, params->ubvec, options,103&objval, part);104break;105106}107108gk_stopcputimer(params->parttimer);109110if (gk_GetCurMemoryUsed() != 0)111printf("***It seems that Metis did not free all of its memory! Report this.\n");112params->maxmemory = gk_GetMaxMemoryUsed();113gk_malloc_cleanup(0);114115116if (status != METIS_OK) {117printf("\n***Metis returned with an error.\n");118}119else {120if (!params->nooutput) {121/* Write the solution */122gk_startcputimer(params->iotimer);123WritePartition(params->filename, part, graph->nvtxs, params->nparts);124gk_stopcputimer(params->iotimer);125}126127GPReportResults(params, graph, part, objval);128}129130FreeGraph(&graph);131gk_free((void **)&part, LTERM);132gk_free((void **)¶ms->filename, ¶ms->tpwgtsfile, ¶ms->tpwgts,133¶ms->ubvecstr, ¶ms->ubvec, ¶ms, LTERM);134135}136137138/*************************************************************************/139/*! This function prints run parameters */140/*************************************************************************/141void GPPrintInfo(params_t *params, graph_t *graph)142{143idx_t i;144145if (params->ufactor == -1) {146if (params->ptype == METIS_PTYPE_KWAY)147params->ufactor = KMETIS_DEFAULT_UFACTOR;148else if (graph->ncon == 1)149params->ufactor = PMETIS_DEFAULT_UFACTOR;150else151params->ufactor = MCPMETIS_DEFAULT_UFACTOR;152}153154printf("******************************************************************************\n");155printf("%s", METISTITLE);156printf(" (HEAD: %s, Built on: %s, %s)\n", SVNINFO, __DATE__, __TIME__);157printf(" size of idx_t: %zubits, real_t: %zubits, idx_t *: %zubits\n",1588*sizeof(idx_t), 8*sizeof(real_t), 8*sizeof(idx_t *));159printf("\n");160printf("Graph Information -----------------------------------------------------------\n");161printf(" Name: %s, #Vertices: %"PRIDX", #Edges: %"PRIDX", #Parts: %"PRIDX"\n",162params->filename, graph->nvtxs, graph->nedges/2, params->nparts);163if (graph->ncon > 1)164printf(" Balancing constraints: %"PRIDX"\n", graph->ncon);165166printf("\n");167printf("Options ---------------------------------------------------------------------\n");168printf(" ptype=%s, objtype=%s, ctype=%s, rtype=%s, iptype=%s\n",169ptypenames[params->ptype], objtypenames[params->objtype], ctypenames[params->ctype],170rtypenames[params->rtype], iptypenames[params->iptype]);171172printf(" dbglvl=%"PRIDX", ufactor=%.3f, no2hop=%s, minconn=%s, contig=%s, nooutput=%s\n",173params->dbglvl,174I2RUBFACTOR(params->ufactor),175(params->no2hop ? "YES" : "NO"),176(params->minconn ? "YES" : "NO"),177(params->contig ? "YES" : "NO"),178(params->nooutput ? "YES" : "NO")179);180181printf(" seed=%"PRIDX", niter=%"PRIDX", ncuts=%"PRIDX"\n",182params->seed, params->niter, params->ncuts);183184if (params->ubvec) {185printf(" ubvec=(");186for (i=0; i<graph->ncon; i++)187printf("%s%.2e", (i==0?"":" "), (double)params->ubvec[i]);188printf(")\n");189}190191printf("\n");192switch (params->ptype) {193case METIS_PTYPE_RB:194printf("Recursive Partitioning ------------------------------------------------------\n");195break;196case METIS_PTYPE_KWAY:197printf("Direct k-way Partitioning ---------------------------------------------------\n");198break;199}200}201202203/*************************************************************************/204/*! This function does any post-partitioning reporting */205/*************************************************************************/206void GPReportResults(params_t *params, graph_t *graph, idx_t *part, idx_t objval)207{208gk_startcputimer(params->reporttimer);209ComputePartitionInfo(params, graph, part);210211gk_stopcputimer(params->reporttimer);212213printf("\nTiming Information ----------------------------------------------------------\n");214printf(" I/O: \t\t %7.3"PRREAL" sec\n", gk_getcputimer(params->iotimer));215printf(" Partitioning: \t\t %7.3"PRREAL" sec (METIS time)\n", gk_getcputimer(params->parttimer));216printf(" Reporting: \t\t %7.3"PRREAL" sec\n", gk_getcputimer(params->reporttimer));217printf("\nMemory Information ----------------------------------------------------------\n");218printf(" Max memory used:\t\t %7.3"PRREAL" MB\n", (real_t)(params->maxmemory/(1024.0*1024.0)));219printf("******************************************************************************\n");220221}222223224