Path: blob/devel/elmergrid/src/metis-5.1.0/libmetis/wspace.c
3206 views
/*!1\file2\brief Functions dealing with memory allocation and workspace management34\date Started 2/24/965\author George6\author Copyright 1997-2009, Regents of the University of Minnesota7\version $Id: wspace.c 10492 2011-07-06 09:28:42Z karypis $8*/910#include "metislib.h"111213/*************************************************************************/14/*! This function allocates memory for the workspace */15/*************************************************************************/16void AllocateWorkSpace(ctrl_t *ctrl, graph_t *graph)17{18size_t coresize;1920switch (ctrl->optype) {21case METIS_OP_PMETIS:22coresize = 3*(graph->nvtxs+1)*sizeof(idx_t) +235*(ctrl->nparts+1)*graph->ncon*sizeof(idx_t) +245*(ctrl->nparts+1)*graph->ncon*sizeof(real_t);25break;26default:27coresize = 4*(graph->nvtxs+1)*sizeof(idx_t) +285*(ctrl->nparts+1)*graph->ncon*sizeof(idx_t) +295*(ctrl->nparts+1)*graph->ncon*sizeof(real_t);30}31/*coresize = 0;*/32ctrl->mcore = gk_mcoreCreate(coresize);3334ctrl->nbrpoolsize = 0;35ctrl->nbrpoolcpos = 0;36}373839/*************************************************************************/40/*! This function allocates refinement-specific memory for the workspace */41/*************************************************************************/42void AllocateRefinementWorkSpace(ctrl_t *ctrl, idx_t nbrpoolsize)43{44ctrl->nbrpoolsize = nbrpoolsize;45ctrl->nbrpoolcpos = 0;46ctrl->nbrpoolreallocs = 0;4748switch (ctrl->objtype) {49case METIS_OBJTYPE_CUT:50ctrl->cnbrpool = (cnbr_t *)gk_malloc(ctrl->nbrpoolsize*sizeof(cnbr_t),51"AllocateRefinementWorkSpace: cnbrpool");52break;5354case METIS_OBJTYPE_VOL:55ctrl->vnbrpool = (vnbr_t *)gk_malloc(ctrl->nbrpoolsize*sizeof(vnbr_t),56"AllocateRefinementWorkSpace: vnbrpool");57break;5859default:60gk_errexit(SIGERR, "Unknown objtype of %d\n", ctrl->objtype);61}626364/* Allocate the memory for the sparse subdomain graph */65if (ctrl->minconn) {66ctrl->pvec1 = imalloc(ctrl->nparts+1, "AllocateRefinementWorkSpace: pvec1");67ctrl->pvec2 = imalloc(ctrl->nparts+1, "AllocateRefinementWorkSpace: pvec2");68ctrl->maxnads = ismalloc(ctrl->nparts, INIT_MAXNAD, "AllocateRefinementWorkSpace: maxnads");69ctrl->nads = imalloc(ctrl->nparts, "AllocateRefinementWorkSpace: nads");70ctrl->adids = iAllocMatrix(ctrl->nparts, INIT_MAXNAD, 0, "AllocateRefinementWorkSpace: adids");71ctrl->adwgts = iAllocMatrix(ctrl->nparts, INIT_MAXNAD, 0, "AllocateRefinementWorkSpace: adwgts");72}73}747576/*************************************************************************/77/*! This function frees the workspace */78/*************************************************************************/79void FreeWorkSpace(ctrl_t *ctrl)80{81gk_mcoreDestroy(&ctrl->mcore, ctrl->dbglvl&METIS_DBG_INFO);8283IFSET(ctrl->dbglvl, METIS_DBG_INFO,84printf(" nbrpool statistics\n"85" nbrpoolsize: %12zu nbrpoolcpos: %12zu\n"86" nbrpoolreallocs: %12zu\n\n",87ctrl->nbrpoolsize, ctrl->nbrpoolcpos,88ctrl->nbrpoolreallocs));8990gk_free((void **)&ctrl->cnbrpool, &ctrl->vnbrpool, LTERM);91ctrl->nbrpoolsize = 0;92ctrl->nbrpoolcpos = 0;9394if (ctrl->minconn) {95iFreeMatrix(&(ctrl->adids), ctrl->nparts, INIT_MAXNAD);96iFreeMatrix(&(ctrl->adwgts), ctrl->nparts, INIT_MAXNAD);9798gk_free((void **)&ctrl->pvec1, &ctrl->pvec2,99&ctrl->maxnads, &ctrl->nads, LTERM);100}101}102103104/*************************************************************************/105/*! This function allocate space from the workspace/heap */106/*************************************************************************/107void *wspacemalloc(ctrl_t *ctrl, size_t nbytes)108{109return gk_mcoreMalloc(ctrl->mcore, nbytes);110}111112113/*************************************************************************/114/*! This function sets a marker in the stack of malloc ops to be used115subsequently for freeing purposes */116/*************************************************************************/117void wspacepush(ctrl_t *ctrl)118{119gk_mcorePush(ctrl->mcore);120}121122123/*************************************************************************/124/*! This function frees all mops since the last push */125/*************************************************************************/126void wspacepop(ctrl_t *ctrl)127{128gk_mcorePop(ctrl->mcore);129}130131132/*************************************************************************/133/*! This function allocate space from the core */134/*************************************************************************/135idx_t *iwspacemalloc(ctrl_t *ctrl, idx_t n)136{137return (idx_t *)wspacemalloc(ctrl, n*sizeof(idx_t));138}139140141/*************************************************************************/142/*! This function allocate space from the core */143/*************************************************************************/144real_t *rwspacemalloc(ctrl_t *ctrl, idx_t n)145{146return (real_t *)wspacemalloc(ctrl, n*sizeof(real_t));147}148149150/*************************************************************************/151/*! This function allocate space from the core */152/*************************************************************************/153ikv_t *ikvwspacemalloc(ctrl_t *ctrl, idx_t n)154{155return (ikv_t *)wspacemalloc(ctrl, n*sizeof(ikv_t));156}157158159/*************************************************************************/160/*! This function resets the cnbrpool */161/*************************************************************************/162void cnbrpoolReset(ctrl_t *ctrl)163{164ctrl->nbrpoolcpos = 0;165}166167168/*************************************************************************/169/*! This function gets the next free index from cnbrpool */170/*************************************************************************/171idx_t cnbrpoolGetNext(ctrl_t *ctrl, idx_t nnbrs)172{173ctrl->nbrpoolcpos += nnbrs;174175if (ctrl->nbrpoolcpos > ctrl->nbrpoolsize) {176ctrl->nbrpoolsize += gk_max(10*nnbrs, ctrl->nbrpoolsize/2);177178ctrl->cnbrpool = (cnbr_t *)gk_realloc(ctrl->cnbrpool,179ctrl->nbrpoolsize*sizeof(cnbr_t), "cnbrpoolGet: cnbrpool");180ctrl->nbrpoolreallocs++;181}182183return ctrl->nbrpoolcpos - nnbrs;184}185186187/*************************************************************************/188/*! This function resets the vnbrpool */189/*************************************************************************/190void vnbrpoolReset(ctrl_t *ctrl)191{192ctrl->nbrpoolcpos = 0;193}194195196/*************************************************************************/197/*! This function gets the next free index from vnbrpool */198/*************************************************************************/199idx_t vnbrpoolGetNext(ctrl_t *ctrl, idx_t nnbrs)200{201ctrl->nbrpoolcpos += nnbrs;202203if (ctrl->nbrpoolcpos > ctrl->nbrpoolsize) {204ctrl->nbrpoolsize += gk_max(10*nnbrs, ctrl->nbrpoolsize/2);205206ctrl->vnbrpool = (vnbr_t *)gk_realloc(ctrl->vnbrpool,207ctrl->nbrpoolsize*sizeof(vnbr_t), "vnbrpoolGet: vnbrpool");208ctrl->nbrpoolreallocs++;209}210211return ctrl->nbrpoolcpos - nnbrs;212}213214215216