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

📄 checkgraph.c

📁 一个用来实现偏微分方程中网格的计算库
💻 C
字号:
/* * Copyright 1997, Regents of the University of Minnesota * * checkgraph.c * * This file contains routines related to I/O * * Started 8/28/94 * George * * $Id: checkgraph.c 2501 2007-11-20 02:33:29Z benkirk $ * */#include <metis.h>/************************************************************************** This function checks if a graph is valid**************************************************************************/int CheckGraph(GraphType *graph){  int i, j, k, l;  int nvtxs, ncon, err=0;  int minedge, maxedge, minewgt, maxewgt;  float minvwgt[MAXNCON], maxvwgt[MAXNCON];  idxtype *xadj, *adjncy, *adjwgt, *htable;  float *nvwgt, ntvwgts[MAXNCON];  nvtxs = graph->nvtxs;  ncon = graph->ncon;  xadj = graph->xadj;  nvwgt = graph->nvwgt;  adjncy = graph->adjncy;  adjwgt = graph->adjwgt;  htable = idxsmalloc(nvtxs, 0, "htable");  if (ncon > 1) {    for (j=0; j<ncon; j++) {       minvwgt[j] = maxvwgt[j] = nvwgt[j];      ntvwgts[j] = 0.0;    }  }  minedge = maxedge = adjncy[0];  minewgt = maxewgt = adjwgt[0];  for (i=0; i<nvtxs; i++) {    if (ncon > 1) {      for (j=0; j<ncon; j++) {        ntvwgts[j] += nvwgt[i*ncon+j];        minvwgt[j] = (nvwgt[i*ncon+j] < minvwgt[j]) ? nvwgt[i*ncon+j] : minvwgt[j];        maxvwgt[j] = (nvwgt[i*ncon+j] > maxvwgt[j]) ? nvwgt[i*ncon+j] : maxvwgt[j];      }    }    for (j=xadj[i]; j<xadj[i+1]; j++) {      k = adjncy[j];      minedge = (k < minedge) ? k : minedge;      maxedge = (k > maxedge) ? k : maxedge;      minewgt = (adjwgt[j] < minewgt) ? adjwgt[j] : minewgt;      maxewgt = (adjwgt[j] > maxewgt) ? adjwgt[j] : maxewgt;      if (i == k) {        printf("Vertex %d contains a self-loop (i.e., diagonal entry in the matrix)!\n", i);        err++;      }      else {        for (l=xadj[k]; l<xadj[k+1]; l++) {          if (adjncy[l] == i) {            if (adjwgt != NULL && adjwgt[l] != adjwgt[j]) {              printf("Edges (%d %d) and (%d %d) do not have the same weight! %d %d\n", i,k,k,i, adjwgt[l], adjwgt[j]);              err++;            }            break;          }        }        if (l == xadj[k+1]) {          printf("Missing edge: (%d %d)!\n", k, i);          err++;        }      }      if (htable[k] == 0) {        htable[k]++;      }      else {        printf("Edge %d from vertex %d is repeated %d times\n", k, i, htable[k]++);        err++;      }    }    for (j=xadj[i]; j<xadj[i+1]; j++) {      htable[adjncy[j]] = 0;    }  }  if (ncon > 1) {    for (j=0; j<ncon; j++) {      if (fabs(ntvwgts[j] - 1.0) > 0.0001) {        printf("Normalized vwgts don't sum to one.  Weight %d = %.8f.\n", j, ntvwgts[j]);        err++;      }    }  }/*  printf("errs: %d, adjncy: [%d %d], adjwgt: [%d %d]\n",  err, minedge, maxedge, minewgt, maxewgt);  if (ncon > 1) {    for (j=0; j<ncon; j++)      printf("[%.5f %.5f] ", minvwgt[j], maxvwgt[j]);    printf("\n");  }*/   if (err > 0) {     printf("A total of %d errors exist in the input file. Correct them, and run again!\n", err);  }  GKfree(&htable, LTERM);  return (err == 0 ? 1 : 0);}

⌨️ 快捷键说明

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