Path: blob/devel/elmergrid/src/metis-5.1.0/programs/mpmetis.c
3206 views
/*1* Copyright 1994-2011, Regents of the University of Minnesota2*3* mpmetis.c4*5* Drivers for the mesh partitioning routines6*7* Started 8/28/948* George9*10* $Id: mpmetis.c 10567 2011-07-13 16:17: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];24mesh_t *mesh;25idx_t *epart, *npart;26idx_t objval;27params_t *params;28int status=0;2930params = parse_cmdline(argc, argv);3132gk_startcputimer(params->iotimer);33mesh = ReadMesh(params);3435if (mesh->ncon > 1) {36printf("*** Meshes with more than one balancing constraint are not supported yet.\n");37exit(0);38}3940ReadTPwgts(params, mesh->ncon);41gk_stopcputimer(params->iotimer);4243MPPrintInfo(params, mesh);4445epart = imalloc(mesh->ne, "main: epart");46npart = imalloc(mesh->nn, "main: npart");4748METIS_SetDefaultOptions(options);49options[METIS_OPTION_PTYPE] = params->ptype;50options[METIS_OPTION_OBJTYPE] = params->objtype;51options[METIS_OPTION_CTYPE] = params->ctype;52options[METIS_OPTION_IPTYPE] = params->iptype;53options[METIS_OPTION_RTYPE] = params->rtype;54options[METIS_OPTION_DBGLVL] = params->dbglvl;55options[METIS_OPTION_UFACTOR] = params->ufactor;56options[METIS_OPTION_MINCONN] = params->minconn;57options[METIS_OPTION_CONTIG] = params->contig;58options[METIS_OPTION_SEED] = params->seed;59options[METIS_OPTION_NITER] = params->niter;60options[METIS_OPTION_NCUTS] = params->ncuts;616263gk_malloc_init();64gk_startcputimer(params->parttimer);6566switch (params->gtype) {67case METIS_GTYPE_DUAL:68status = METIS_PartMeshDual(&mesh->ne, &mesh->nn, mesh->eptr, mesh->eind,69mesh->ewgt, NULL, ¶ms->ncommon, ¶ms->nparts,70params->tpwgts, options, &objval, epart, npart);71break;7273case METIS_GTYPE_NODAL:74status = METIS_PartMeshNodal(&mesh->ne, &mesh->nn, mesh->eptr, mesh->eind,75NULL, NULL, ¶ms->nparts, params->tpwgts, options, &objval,76epart, npart);77break;78}7980gk_stopcputimer(params->parttimer);81if (gk_GetCurMemoryUsed() != 0)82printf("***It seems that Metis did not free all of its memory! Report this.\n");83params->maxmemory = gk_GetMaxMemoryUsed();84gk_malloc_cleanup(0);8586if (status != METIS_OK) {87printf("\n***Metis returned with an error.\n");88}89else {90if (!params->nooutput) {91/* Write the solution */92gk_startcputimer(params->iotimer);93WriteMeshPartition(params->filename, params->nparts, mesh->ne, epart, mesh->nn, npart);94gk_stopcputimer(params->iotimer);95}9697MPReportResults(params, mesh, epart, npart, objval);98}99100FreeMesh(&mesh);101gk_free((void **)&epart, &npart, LTERM);102gk_free((void **)¶ms->filename, ¶ms->tpwgtsfile, ¶ms->tpwgts,103¶ms->ubvecstr, ¶ms->ubvec, ¶ms, LTERM);104105}106107108/*************************************************************************/109/*! This function prints run parameters */110/*************************************************************************/111void MPPrintInfo(params_t *params, mesh_t *mesh)112{113if (params->ufactor == -1) {114if (params->ptype == METIS_PTYPE_KWAY)115params->ufactor = KMETIS_DEFAULT_UFACTOR;116else117params->ufactor = PMETIS_DEFAULT_UFACTOR;118}119120printf("******************************************************************************\n");121printf("%s", METISTITLE);122printf(" (HEAD: %s, Built on: %s, %s)\n", SVNINFO, __DATE__, __TIME__);123printf(" size of idx_t: %zubits, real_t: %zubits, idx_t *: %zubits\n",1248*sizeof(idx_t), 8*sizeof(real_t), 8*sizeof(idx_t *));125printf("\n");126printf("Mesh Information ------------------------------------------------------------\n");127printf(" Name: %s, #Elements: %"PRIDX", #Nodes: %"PRIDX", #Parts: %"PRIDX"\n",128params->filename, mesh->ne, mesh->nn, params->nparts);129if (mesh->ncon > 1)130printf(" Balancing Constraints: %"PRIDX"\n", mesh->ncon);131132printf("\n");133printf("Options ---------------------------------------------------------------------\n");134printf(" ptype=%s, objtype=%s, ctype=%s, rtype=%s, iptype=%s\n",135ptypenames[params->ptype], objtypenames[params->objtype], ctypenames[params->ctype],136rtypenames[params->rtype], iptypenames[params->iptype]);137138printf(" dbglvl=%"PRIDX", ufactor=%.3f, minconn=%s, contig=%s, nooutput=%s\n",139params->dbglvl,140I2RUBFACTOR(params->ufactor),141(params->minconn ? "YES" : "NO"),142(params->contig ? "YES" : "NO"),143(params->nooutput ? "YES" : "NO")144);145146printf(" seed=%"PRIDX", niter=%"PRIDX", ncuts=%"PRIDX"\n",147params->seed, params->niter, params->ncuts);148149printf(" gtype=%s, ncommon=%"PRIDX", niter=%"PRIDX", ncuts=%"PRIDX"\n",150gtypenames[params->gtype], params->ncommon, params->niter, params->ncuts);151152printf("\n");153switch (params->ptype) {154case METIS_PTYPE_RB:155printf("Recursive Partitioning ------------------------------------------------------\n");156break;157case METIS_PTYPE_KWAY:158printf("Direct k-way Partitioning ---------------------------------------------------\n");159break;160}161}162163164/*************************************************************************/165/*! This function does any post-partitioning reporting */166/*************************************************************************/167void MPReportResults(params_t *params, mesh_t *mesh, idx_t *epart, idx_t *npart,168idx_t objval)169{170171gk_startcputimer(params->reporttimer);172173/* ComputePartitionInfo(params, graph, part); */174175printf(" - %s: %"PRIDX".\n\n",176(params->objtype == METIS_OBJTYPE_CUT ? "Edgecut" : "Volume"), objval);177178gk_stopcputimer(params->reporttimer);179180181printf("\nTiming Information ----------------------------------------------------------\n");182printf(" I/O: \t\t %7.3"PRREAL" sec\n", gk_getcputimer(params->iotimer));183printf(" Partitioning: \t\t %7.3"PRREAL" sec (METIS time)\n", gk_getcputimer(params->parttimer));184printf(" Reporting: \t\t %7.3"PRREAL" sec\n", gk_getcputimer(params->reporttimer));185printf("\nMemory Information ----------------------------------------------------------\n");186printf(" Max memory used:\t\t %7.3"PRREAL" MB\n", (real_t)(params->maxmemory/(1024.0*1024.0)));187printf("******************************************************************************\n");188189}190191192