EPANET中读取INPUT文件的函数文件——INPUT1.C/INPUT2.C/INPUT3.C

摘要:
首先,我们将介绍三个文件之间的关系。可以说,INPUT1。C具有最大的函数粒度。其函数getdata()完成整个INPUT文件中数据的读取。该函数还调用INPUT2中的一些函数。C、 INPUT2中的函数。C文件分为两种类型,一种是解析INPUT文件的函数;另一个是工具功能,包括将节点和管道段数据存储到哈希表中、构建哈希索引、字符串匹配以及从哈希表中查找数据。文件具有中等粒度。INPUT3的组织结构。C也很简单。每个函数都有很大的相似性,这就是INPUT文件中不同段落数据的处理。

     首先介绍下这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  */

免责声明:文章转载自《EPANET中读取INPUT文件的函数文件——INPUT1.C/INPUT2.C/INPUT3.C》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Verilog HDL的程序结构及其描述基于时间干涉电场的非侵入式深部脑刺激法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

input中blur失去焦点事件与点击事件冲突时如何解决

方法一 使用setTimeout $(function(){ $(".cy-name-input input").on({ focus:function() { $(".cy-close").css('display','block'); }, blur:function() { setTimeout(f...

卸载阿里云、腾讯云的监控

腾讯云: 第一步:在默认安装系统的时候不要勾选安全云镜和安全监控软件第二步:如果安装了监控软件后如何卸载,操作如下: /usr/local/qcloud/stargate/admin/uninstall.sh /usr/local/qcloud/YunJing/uninst.sh /usr/local/qcloud/monitor/barad/admin/...

python程序练习题集

1.#输入a,b,c,d4个整数,计算a+b-c*d的结果 a=input("please input a nimber:") b=input("please input a number:") c=input("please input a number:") d=input("please input a number:") print a+b-c*d...

python+selenium:解决上传文件&amp;lt;input type='file'&amp;gt;标签属性被css的visibility隐藏导致无法定位元素的问题

要想上传文件,需要找到在HTML中<inputtype="file" />这个标签,有它就可以利用send_keys上传文件,不过这里的<input>元素被隐藏了,导致一直定位不到input html代码如下,注意visibility:hidden,表示这个input元素被隐藏了,要想定位它必须先把隐藏属性去掉 一般控制元素显示或...

Js/如何修改easyui修饰的input的val值

1.关于js对input值的修改介绍:一般js改变input的val值,我一直使用的方法是: $('#id').val('test');这样的方式来进行修改。但是我使 用了class="easyui-textbox"来对input进行修饰。使用上面的方法就不起作用。 这里改为:$('#id').textbox('setValue', '');...

sql server中调用c#写的dll里的方法

最近有一项目:  一超市管理系统单机版,运行在WIN2003+SQL2005上,每天超市关门都都会关电脑,现客户要新加功能,每天关门下班后回家可以上网查看超市管理系统的数据库里的相关数据,然后再做一些原系统没有的统计分析等,老系统不能做大改动,像升级到WIN2012+SQL2012等这些操作,改动越小越好。 现在的想法是:阿里云买台服务器,装上SQL,然...