⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 selectq.c

📁 一个用来实现偏微分方程中网格的计算库
💻 C
字号:
/* * Copyright 1997, Regents of the University of Minnesota * * selectq.c * * This file contains the driving routines for multilevel k-way refinement * * Started 7/28/97 * George * * $Id: selectq.c 2501 2007-11-20 02:33:29Z benkirk $ */#include <parmetislib.h>/**************************************************************************  This stuff is hardcoded for up to four constraints**************************************************************************/void Moc_DynamicSelectQueue(int nqueues, int ncon, int subdomain1, int subdomain2,     idxtype *currentq, float *flows, int *from, int *qnum, int minval, float avgvwgt,     float maxdiff){  int i, j;  int hash, index = -1, current;  int cand[MAXNCON], rank[MAXNCON], dont_cares[MAXNCON];  int nperms, perm[24][5];  float sign = 0.0;  KVType array[MAXNCON];int mype;MPI_Comm_rank(MPI_COMM_WORLD, &mype);  *qnum = -1;  if (*from == -1) {    for (i=0; i<ncon; i++) {      array[i].key = i;      array[i].val = (fabs)(flows[i]);    }    qsort(array, ncon, sizeof(KVType), myvalkeycompare);    ASSERTS(array[ncon-1].val - array[0].val <= maxdiff)    if (flows[array[ncon-1].key]>avgvwgt*MOC_GD_GRANULARITY_FACTOR) {      *from = subdomain1;      sign = 1.0;      index = 0;    }    if (flows[array[ncon-1].key]<-1.0*avgvwgt*MOC_GD_GRANULARITY_FACTOR) {      *from = subdomain2;      sign = -1.0;      index = nqueues;    }    if (*from == -1) {      return;    }  }  else {    ASSERTS(*from == subdomain1 || *from == subdomain2);    if (*from == subdomain1) {      sign = 1.0;      index = 0;    }    else {      sign = -1.0;      index = nqueues;    }  }  for (i=0; i<ncon; i++) {    array[i].key = i;    array[i].val = flows[i] * sign;  }  qsort(array, ncon, sizeof(KVType), myvalkeycompare);  iset(ncon, 1, dont_cares);  current = 0;  for (i=0; i<ncon-1; i++)     if (array[i+1].val - array[i].val < maxdiff * MC_FLOW_BALANCE_THRESHOLD && dont_cares[current] < ncon-1) {      dont_cares[current]++;      dont_cares[i+1] = 0;    }    else      current = i+1;  switch (ncon) {    /***********************/    case 2:      nperms = 1;      perm[0][0] = 0;   perm[0][1] = 1;      break;    /***********************/    case 3:      /* if the first and second flows are close */      if (dont_cares[0] == 2 && dont_cares[1] == 0 && dont_cares[2] == 1) {        nperms = 4;        perm[0][0] = 0;   perm[0][1] = 1;   perm[0][2] = 2;        perm[1][0] = 1;   perm[1][1] = 0;   perm[1][2] = 2;        perm[2][0] = 0;   perm[2][1] = 2;   perm[2][2] = 1;        perm[3][0] = 1;   perm[3][1] = 2;   perm[3][2] = 0;        break;      }      /* if the second and third flows are close */      if (dont_cares[0] == 1 && dont_cares[1] == 2 && dont_cares[2] == 0) {        nperms = 4;        perm[0][0] = 0;   perm[0][1] = 1;   perm[0][2] = 2;        perm[1][0] = 0;   perm[1][1] = 2;   perm[1][2] = 1;        perm[2][0] = 1;   perm[2][1] = 0;   perm[2][2] = 2;        perm[3][0] = 2;   perm[3][1] = 0;   perm[3][2] = 1;        break;      }      /* all or none of the flows are close */      nperms = 3;      perm[0][0] = 0;   perm[0][1] = 1;   perm[0][2] = 2;      perm[1][0] = 1;   perm[1][1] = 0;   perm[1][2] = 2;      perm[2][0] = 0;   perm[2][1] = 2;   perm[2][2] = 1;      break;    /***********************/    case 4:      if (dont_cares[0] == 2 && dont_cares[1] == 0 &&          dont_cares[2] == 1 && dont_cares[3] == 1) {        nperms = 14;        perm[0][0] =  0;   perm[0][1] =  1;   perm[0][2] =  2;   perm[0][3] =  3;        perm[1][0] =  1;   perm[1][1] =  0;   perm[1][2] =  2;   perm[1][3] =  3;        perm[2][0] =  0;   perm[2][1] =  2;   perm[2][2] =  1;   perm[2][3] =  3;        perm[3][0] =  1;   perm[3][1] =  2;   perm[3][2] =  0;   perm[3][3] =  3;        perm[4][0] =  0;   perm[4][1] =  1;   perm[4][2] =  3;   perm[4][3] =  2;        perm[5][0] =  1;   perm[5][1] =  0;   perm[5][2] =  3;   perm[5][3] =  2;                perm[6][0] =  0;   perm[6][1] =  3;   perm[6][2] =  1;   perm[6][3] =  2;        perm[7][0] =  1;   perm[7][1] =  3;   perm[7][2] =  0;   perm[7][3] =  2;        perm[8][0] =  0;   perm[8][1] =  2;   perm[8][2] =  3;   perm[8][3] =  1;        perm[9][0] =  1;   perm[9][1] =  2;   perm[9][2] =  3;   perm[9][3] =  0;        perm[10][0] = 2;   perm[10][1] = 0;   perm[10][2] = 1;   perm[10][3] = 3;        perm[11][0] = 2;   perm[11][1] = 1;   perm[11][2] = 0;   perm[11][3] = 3;                perm[12][0] = 0;   perm[12][1] = 3;   perm[12][2] = 2;   perm[12][3] = 1;        perm[13][0] = 1;   perm[13][1] = 3;   perm[13][2] = 2;   perm[13][3] = 0;        break;      }      if (dont_cares[0] == 1 && dont_cares[1] == 1 &&          dont_cares[2] == 2 && dont_cares[3] == 0) {        nperms = 14;        perm[0][0] =  0;   perm[0][1] =  1;   perm[0][2] =  2;   perm[0][3] =  3;        perm[1][0] =  0;   perm[1][1] =  1;   perm[1][2] =  3;   perm[1][3] =  2;        perm[2][0] =  0;   perm[2][1] =  2;   perm[2][2] =  1;   perm[2][3] =  3;        perm[3][0] =  0;   perm[3][1] =  3;   perm[3][2] =  1;   perm[3][3] =  2;        perm[4][0] =  1;   perm[4][1] =  0;   perm[4][2] =  2;   perm[4][3] =  3;        perm[5][0] =  1;   perm[5][1] =  0;   perm[5][2] =  3;   perm[5][3] =  2;        perm[6][0] =  1;   perm[6][1] =  2;   perm[6][2] =  0;   perm[6][3] =  3;        perm[7][0] =  1;   perm[7][1] =  3;   perm[7][2] =  0;   perm[7][3] =  2;        perm[8][0] =  2;   perm[8][1] =  0;   perm[8][2] =  1;   perm[8][3] =  3;        perm[9][0] =  3;   perm[9][1] =  0;   perm[9][2] =  1;   perm[9][3] =  2;        perm[10][0] = 0;   perm[10][1] = 2;   perm[10][2] = 3;   perm[10][3] = 1;        perm[11][0] = 0;   perm[11][1] = 3;   perm[11][2] = 2;   perm[11][3] = 1;        perm[12][0] = 2;   perm[12][1] = 1;   perm[12][2] = 0;   perm[12][3] = 3;        perm[13][0] = 3;   perm[13][1] = 1;   perm[13][2] = 0;   perm[13][3] = 2;        break;      }      if (dont_cares[0] == 2 && dont_cares[1] == 0 &&          dont_cares[2] == 2 && dont_cares[3] == 0) {        nperms = 14;        perm[0][0] =  0;   perm[0][1] =  1;   perm[0][2] =  2;   perm[0][3] =  3;        perm[1][0] =  1;   perm[1][1] =  0;   perm[1][2] =  2;   perm[1][3] =  3;        perm[2][0] =  0;   perm[2][1] =  1;   perm[2][2] =  3;   perm[2][3] =  2;        perm[3][0] =  1;   perm[3][1] =  0;   perm[3][2] =  3;   perm[3][3] =  2;        perm[4][0] =  0;   perm[4][1] =  2;   perm[4][2] =  1;   perm[4][3] =  3;        perm[5][0] =  1;   perm[5][1] =  2;   perm[5][2] =  0;   perm[5][3] =  3;        perm[6][0] =  0;   perm[6][1] =  3;   perm[6][2] =  1;   perm[6][3] =  2;        perm[7][0] =  1;   perm[7][1] =  3;   perm[7][2] =  0;   perm[7][3] =  2;        perm[8][0] = 2;    perm[8][1] = 0;    perm[8][2] = 1;    perm[8][3] = 3;        perm[9][0] = 0;    perm[9][1] = 2;    perm[9][2] = 3;    perm[9][3] = 1;        perm[10][0] = 2;   perm[10][1] = 1;   perm[10][2] = 0;   perm[10][3] = 3;        perm[11][0] = 0;   perm[11][1] = 3;   perm[11][2] = 2;   perm[11][3] = 1;        perm[12][0] = 3;   perm[12][1] = 0;   perm[12][2] = 1;   perm[12][3] = 2;        perm[13][0] = 1;   perm[13][1] = 2;   perm[13][2] = 3;   perm[13][3] = 0;        break;      }      if (dont_cares[0] == 3 && dont_cares[1] == 0 &&          dont_cares[2] == 0 && dont_cares[3] == 1) {        nperms = 14;        perm[0][0] =  0;   perm[0][1] =  1;   perm[0][2] =  2;   perm[0][3] =  3;        perm[1][0] =  0;   perm[1][1] =  2;   perm[1][2] =  1;   perm[1][3] =  3;        perm[2][0] =  1;   perm[2][1] =  0;   perm[2][2] =  2;   perm[2][3] =  3;        perm[3][0] =  2;   perm[3][1] =  0;   perm[3][2] =  1;   perm[3][3] =  3;        perm[4][0] =  1;   perm[4][1] =  2;   perm[4][2] =  0;   perm[4][3] =  3;        perm[5][0] =  2;   perm[5][1] =  1;   perm[5][2] =  0;   perm[5][3] =  3;        perm[6][0] =  0;   perm[6][1] =  1;   perm[6][2] =  3;   perm[6][3] =  2;        perm[7][0] =  1;   perm[7][1] =  0;   perm[7][2] =  3;   perm[7][3] =  2;        perm[8][0] =  0;   perm[8][1] =  2;   perm[8][2] =  3;   perm[8][3] =  1;        perm[9][0] =  2;   perm[9][1] =  0;   perm[9][2] =  3;   perm[9][3] =  1;        perm[10][0] = 1;   perm[10][1] = 2;   perm[10][2] = 3;   perm[10][3] = 0;        perm[11][0] = 2;   perm[11][1] = 1;   perm[11][2] = 3;   perm[11][3] = 0;        perm[12][0] = 0;   perm[12][1] = 3;   perm[12][2] = 1;   perm[12][3] = 2;        perm[13][0] = 0;   perm[13][1] = 3;   perm[13][2] = 2;   perm[13][3] = 1;        break;      }      if (dont_cares[0] == 1 && dont_cares[1] == 3 &&          dont_cares[2] == 0 && dont_cares[3] == 0) {        nperms = 14;        perm[0][0] =  0;   perm[0][1] =  1;   perm[0][2] =  2;   perm[0][3] =  3;        perm[1][0] =  0;   perm[1][1] =  2;   perm[1][2] =  1;   perm[1][3] =  3;        perm[2][0] =  0;   perm[2][1] =  1;   perm[2][2] =  3;   perm[2][3] =  2;        perm[3][0] =  0;   perm[3][1] =  2;   perm[3][2] =  3;   perm[3][3] =  1;        perm[4][0] =  0;   perm[4][1] =  3;   perm[4][2] =  1;   perm[4][3] =  2;        perm[5][0] =  0;   perm[5][1] =  3;   perm[5][2] =  2;   perm[5][3] =  1;        perm[6][0] =  1;   perm[6][1] =  0;   perm[6][2] =  2;   perm[6][3] =  3;        perm[7][0] =  1;   perm[7][1] =  0;   perm[7][2] =  3;   perm[7][3] =  2;        perm[8][0] =  2;   perm[8][1] =  0;   perm[8][2] =  1;   perm[8][3] =  3;        perm[9][0] =  2;   perm[9][1] =  0;   perm[9][2] =  3;   perm[9][3] =  1;        perm[10][0] = 3;   perm[10][1] = 0;   perm[10][2] = 1;   perm[10][3] = 2;        perm[11][0] = 3;   perm[11][1] = 0;   perm[11][2] = 2;   perm[11][3] = 1;        perm[12][0] = 1;   perm[12][1] = 2;   perm[12][2] = 0;   perm[12][3] = 3;        perm[13][0] = 2;   perm[13][1] = 1;   perm[13][2] = 0;   perm[13][3] = 3;        break;      }      nperms = 14;      perm[0][0] =  0;   perm[0][1] =  1;   perm[0][2] =  2;   perm[0][3] =  3;      perm[1][0] =  1;   perm[1][1] =  0;   perm[1][2] =  2;   perm[1][3] =  3;      perm[2][0] =  0;   perm[2][1] =  2;   perm[2][2] =  1;   perm[2][3] =  3;      perm[3][0] =  0;   perm[3][1] =  1;   perm[3][2] =  3;   perm[3][3] =  2;      perm[4][0] =  1;   perm[4][1] =  0;   perm[4][2] =  3;   perm[4][3] =  2;      perm[5][0] =  2;   perm[5][1] =  0;   perm[5][2] =  1;   perm[5][3] =  3;      perm[6][0] =  0;   perm[6][1] =  2;   perm[6][2] =  3;   perm[6][3] =  1;      perm[7][0] =  1;   perm[7][1] =  2;   perm[7][2] =  0;   perm[7][3] =  3;      perm[8][0] =  0;   perm[8][1] =  3;   perm[8][2] =  1;   perm[8][3] =  2;      perm[9][0] =  2;   perm[9][1] =  1;   perm[9][2] =  0;   perm[9][3] =  3;      perm[10][0] = 0;   perm[10][1] = 3;   perm[10][2] = 2;   perm[10][3] = 1;      perm[11][0] = 2;   perm[11][1] = 0;   perm[11][2] = 3;   perm[11][3] = 1;      perm[12][0] = 3;   perm[12][1] = 0;   perm[12][2] = 1;   perm[12][3] = 2;      perm[13][0] = 1;   perm[13][1] = 2;   perm[13][2] = 3;   perm[13][3] = 0;      break;    /***********************/    default:      return;  }  for (i=0; i<nperms; i++) {    for (j=0; j<ncon; j++)      cand[j] = array[perm[i][j]].key;    for (j=0; j<ncon; j++)      rank[cand[j]] = j;    hash = Moc_HashVRank(ncon, rank) - minval;    if (currentq[hash+index] > 0) {      *qnum = hash;      return;    }  }  return;}/**************************************************************************  This function sorts the nvwgts of a vertex and returns a hashed value**************************************************************************/int Moc_HashVwgts(int ncon, float *nvwgt){  int i;  int multiplier, retval;  int rank[MAXNCON];  KVType array[MAXNCON];  for (i=0; i<ncon; i++) {    array[i].key = i;    array[i].val = nvwgt[i];  }  qsort(array, ncon, sizeof(KVType), myvalkeycompare);  for (i=0; i<ncon; i++)    rank[array[i].key] = i;  multiplier = 1;  retval = 0;  for (i=0; i<ncon; i++) {    multiplier *= (i+1);    retval += rank[ncon-i-1] * multiplier;  }  return retval;}/**************************************************************************  This function sorts the vwgts of a vertex and returns a hashed value**************************************************************************/int Moc_HashVRank(int ncon, int *vwgt){  int i, multiplier, retval;  multiplier = 1;  retval = 0;  for (i=0; i<ncon; i++) {    multiplier *= (i+1);    retval += vwgt[ncon-1-i] * multiplier;  }  return retval;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -