zoukankan      html  css  js  c++  java
  • EPANET中读取INPUT文件的函数文件——INPUT1.C/INPUT2.C/INPUT3.C

         首先介绍下这3个文件的关系:可以说INPUT1.C的函数粒度最大,它的函数getdata()就完成了整个INPUT文件数据的读入,该函数又调用了INPUT2.C中的部分函数,INPUT2.C文件中的函数分为两类,一类是解析INPUT文件的函数;另一类是工具函数,包括将节点、管段数据存入哈希表中,构建哈希索引、字符串的匹配,从哈希表中查找数据等,该文件的粒度中等。而INPUT3.C的粒度是最细的,他是用于解析单行INPUT文件的对象内容并保存到内存中。INPUT3.C的组织结构也很简单,各个函数具有较大的相似性,分别是对INPUT文件中的不同段落数据的处理。

         其中INPUT2.C文件中的unlinked()函数是检查孤立管点,这个数据检查的算法比较高效值得借鉴,该算法的巧妙之处可以参考代码中的注释:

     1 int  unlinked()
     2 /*
     3 **--------------------------------------------------------------
     4 ** Input:   none                                                ;输入:无
     5 ** Output:  returns error code if any unlinked junctions found  ;输出:如果存在孤立点则返回错误代码
     6 ** Purpose: checks for unlinked junctions in network            ;目的:检查管网中的孤立点
     7 **                                                              
     8 ** NOTE: unlinked tanks have no effect on computations.         ;注意:没有连接的蓄水池对计算无效
     9 **--------------------------------------------------------------
    10 */
    11 {
    12    char  *marked;
    13    int   i,err, errcode;
    14    errcode = 0;
    15    err = 0;
    16    marked   = (char *) calloc(Nnodes+1,sizeof(char));  //开辟连续的所有节点内存空间
    17    ERRCODE(MEMCHECK(marked));
    18    if (!errcode)
    19    {
    20       memset(marked,0,(Nnodes+1)*sizeof(char));//给这块内存空间置0
    21       for (i=1; i<=Nlinks; i++)            /* Mark end nodes of each link */
    22       {
    23          marked[Link[i].N1]++;//以marked的内存的逻辑地址从1、2、3...开始去一一对应管段节点在Node中的索引值,从而标记出所有被管段引用作为始末节点的索引值,而所有未标记成功的就是孤立的点。
    24          marked[Link[i].N2]++;
    25       }
    26       for (i=1; i<=Njuncs; i++)            /* Check each junction  */
    27       {
    28          if (marked[i] == 0)               /* If not marked then error */
    29          {
    30             err++;
    31             sprintf(Msg,ERR233,Node[i].ID);
    32             writeline(Msg);
    33          }
    34          if (err >= MAXERRS) break;
    35       }
    36       if (err > 0) errcode = 200;
    37    }
    38    free(marked);
    39    return(errcode);
    40 }                        /* End of unlinked */

         在INPUT1.C这个文件中,我们重点看下getdata(),就知道了它的功能:

     1 int  getdata()
     2 /*
     3 **----------------------------------------------------------------
     4 **  Input:   none                                ;输入:无
     5 **  Output:  returns error code                  ;输出:错误编号(大于100表示严重错误)
     6 **  Purpose: reads in network data from disk file;作用:从磁盘文件(*.inp)中读入管网模型数据
     7 **----------------------------------------------------------------
     8 */
     9 {
    10    int errcode = 0;
    11    setdefaults();                /* Assign default data values     ;给vars.h中的部分全局变量赋值*/
    12    initreport();                 /* Initialize reporting options   ;初始化报表选项*/
    13    rewind(InFile);               /* Rewind input file              ;将INPUT文件的指针指向文件的开始*/
    14    ERRCODE(readdata());          /* Read in network data           ;读取整个管网数据,该部分的具体实现是依赖INPUT2.C与INPUT3.C*/
    15    if (!errcode) adjustdata();   /* Adjust data for default values ;调整数据的默认值,当INPUT文件对部分关键参数缺少描述时,这里将重新赋值*/
    16    if (!errcode) initunits();    /* Initialize units on input data ;确定单位转换因子,EPANET中的单位体系就2种,一种是英美制US,一种是米制,根据确定的单位体系,来设置各节点、管段等的字段的转换参数*/
    17    ERRCODE(inittanks());         /* Initialize tank volumes        ;初始化水库的容积*/
    18    if (!errcode) convertunits(); /* Convert units on input data    ;在进行水力解算前对管段、节点、水泵、阀门的相关字段的单位数据进行转换*/
    19    return(errcode);
    20 }                       /*  End of getdata  */
  • 相关阅读:
    动手动脑及作业
    技能——沟通
    大道至简第三章读后感
    编写一个程序,用户输入两个数,求其加减乘除,并用消息框显示计算结果。
    动手动脑及课后实验
    大道至简第六章
    继承与接口
    产生随机数并窗口显示他们的和
    大道至简——失败也是积累
    动手动脑
  • 原文地址:https://www.cnblogs.com/KingOfFreedom/p/3319798.html
Copyright © 2011-2022 走看看