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

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

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

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

 int  getdata()
/*
**----------------------------------------------------------------
** Input: none ;输入:无
** Output: returns error code ;输出:错误编号(大于100表示严重错误)
** Purpose: reads in network data from disk file;作用:从磁盘文件(*.inp)中读入管网模型数据
**----------------------------------------------------------------
*/
{
int errcode = ;
setdefaults(); /* Assign default data values ;给vars.h中的部分全局变量赋值*/
initreport(); /* Initialize reporting options ;初始化报表选项*/
rewind(InFile); /* Rewind input file ;将INPUT文件的指针指向文件的开始*/
ERRCODE(readdata()); /* Read in network data ;读取整个管网数据,该部分的具体实现是依赖INPUT2.C与INPUT3.C*/
if (!errcode) adjustdata(); /* Adjust data for default values ;调整数据的默认值,当INPUT文件对部分关键参数缺少描述时,这里将重新赋值*/
if (!errcode) initunits(); /* Initialize units on input data ;确定单位转换因子,EPANET中的单位体系就2种,一种是英美制US,一种是米制,根据确定的单位体系,来设置各节点、管段等的字段的转换参数*/
ERRCODE(inittanks()); /* Initialize tank volumes ;初始化水库的容积*/
if (!errcode) convertunits(); /* Convert units on input data ;在进行水力解算前对管段、节点、水泵、阀门的相关字段的单位数据进行转换*/
return(errcode);
} /* End of getdata */

最新文章

  1. Xdebug文档(四)函数跟踪
  2. Tomcat6.0 管理器配置
  3. HDU1058 DP
  4. int.class 与 Integer.class
  5. Windows 环境搭建cocos2dx 3.x Eclipse的环境
  6. Page 16 Exercises 1.2.3 -------Introduction to Software Testing (Paul Ammann and Jeff Offutt)
  7. H5入门-xhtml+css2-第01节
  8. 考虑virtual函数以外的其它选择
  9. WordPress Ultimate Auction插件跨站请求伪造漏洞
  10. IIS的ISAPI接口简介
  11. 【转】揭秘JavaScript中谜一样的this
  12. 云计算---OpenStack Neutron详解
  13. vue+axios访问本地json数据踩坑点
  14. Python终极coding
  15. 金融量化分析【day113】:布林带策略
  16. 字符编码笔记:ASCII,Unicode和UTF-8(转载)
  17. (转) MVC身份验证及权限管理-1
  18. C# 对象引擎,以路径形式访问对象属性(data.Product[1].Name)
  19. mysql 批量更新常用操作
  20. The Backpropagation Algorithm

热门文章

  1. memset与malloc性能测试
  2. GTD中定位篇
  3. Jmeter调试工具---HTTP Mirror Server
  4. Java多线程(3) Volatile的实现原理
  5. 关于ios中得路径详细讲解
  6. Android 第三方开源库收集整理(转)
  7. Android 6.0 源代码编译实践
  8. 【译】Python Lex Yacc手册
  9. iOS 日期处理 (Swift3.0 NSDate)
  10. ha456.jar打开dump文件报Unsupported major.minor version 51.0异常