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()函数是检查孤立管点,这个数据检查的算法比较高效值得借鉴,该算法的巧妙之处可以参考代码中的注释:
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 */
EPANET中读取INPUT文件的函数文件——INPUT1.C/INPUT2.C/INPUT3.C的更多相关文章
- EPANET中读取INPUT文件的函数文件——INPUT3.C
/* ********************************************************************** INPUT3.C -- Input data par ...
- C#项目实例中读取并修改App.config文件
C#项目是指一系列独特的.复杂的并相互关联的活动,这些活动有着一个明确的目标或目的,必须在特定的时间.预算.资源限定内,依据规范完成.项目参数包括项目范围.质量.成本.时间.资源. 1. 向C#项目实 ...
- 在.NET中读取嵌入和使用资源文件的方法
转http://www.jb51.net/article/84660.htm 本文分别介绍了使用GetManifestResourceStream读取嵌入资源,和使用. resx资源文件嵌入资源,希望 ...
- 总结文件操作函数-文件夹(三)-C语言
获取.改变当前文件夹: 原型为: #include <unistd.h> //头文件 char *getcwd(char *buf, size_t size); //获取当前文件夹.相 ...
- 第3章 Python基础-文件操作&函数 文件操作 练习题
一.利用b模式,编写一个cp工具,要求如下: 1. 既可以拷贝文本又可以拷贝视频,图片等文件 2. 用户一旦参数错误,打印命令的正确使用方法,如usage: cp source_file target ...
- matlab初学者_脚本文件调用函数文件
问题: matlab里面有两种文件,一种是脚本文件,一种是函数文件,为了模块化程序,我们需要把专门的功能写成一个函数封装到某个函数文件里面. 那么来看如何在脚本文件里调用函数文件中的函数. 注意点: ...
- java项目中读取src目录下的文件
private void getUser(String tmpfile){ Properties props = new Properties(); props.load(DbTask.class.g ...
- 通过纯Java代码从excle中读取数据(为.xlsx文件)
参考链接: 程序代码: package demo; import java.io.File; import java.io.IOException; import java.io.InputStrea ...
- [Java] 在 jar 文件中读取 resources 目录下的文件
注意两点: 1. 将资源目录添加到 build path,确保该目录下的文件被拷贝到 jar 文件中. 2. jar 内部的东西,可以当作 stream 来读取,但不应该当作 file 来读取. 例子 ...
随机推荐
- VAG DMA protocol
Func 0a - RAM Read 0A Func 0a - ROM Read 0A Func 0a - EEPROM Read FD Func 0C xx - EEPROM Write 0A Fu ...
- AngularJS中实现日志服务
本篇体验使用AngularJS自定义一个记录日志的服务. 在AngularJS中,服务的一些写法是这样的: var app = angular.module('app',[]); app.provid ...
- KVM 基础使用(一)
Host OS:CentOS release 6.3 (Final) x64 安装时选择Virtual Host 1.测试KVM有没有启动 运行 lsmod | grep kvm 和 stat /de ...
- Linux下查看mysql、apache是否安装,安装,卸载等操作
Linux下查看mysql.apache是否安装,并卸载. 指令 ps -ef|grep mysql 得出结果 root ? :: /bin/sh /usr/ ...
- 初学Linux
一直觉得Linux敲命令很蛋疼,今天开始学习一下吧,主要以练习(想到啥就查啥)命令和练习在Linux中编程(Python)为主吧. 不记得什么时候安装的Ubuntu 12.04.3 LTS虚拟机,连密 ...
- 如何通过Socket TCP发送并接收一个文件?
一.小结 1.大包发小包收,只发一次. 2.发时把文件扩展名,文件长度也随同一起发送,方便接收端接收时另存为正确的文件类型,并判断是否已经接收完毕. 如果不一起发送,分为文件扩展名,文件长度,文件内容 ...
- 利用 Python 只连接一次 MySQL
Github 地址 项目背景 最近做个项目,需要进行试驾分析,所谓"试驾",是指顾客在 4S 店指定人员的陪同下,沿着指定的路线驾驶车辆,从而了解这款汽车的行驶性能和操控性能.通常 ...
- [转]mongodb与mysql相比的优缺点
原文地址:http://blog.sina.com.cn/s/blog_966e430001019s8v.html 与关系型数据库相比,MongoDB的优点:①弱一致性(最终一致),更能保证用户的访问 ...
- leveldb - log格式
log文件在LevelDb中的主要作用是系统故障恢复时,能够保证不会丢失数据.因为在将记录写入内存的Memtable之前,会先写入Log文件,这样即使系统发生故障,Memtable中的数据没有来得及D ...
- Django 源码小剖: 初探中间件(middleware)
因为考虑到文章的长度, 所以 BaseHandler 的展开被推迟了. 在 BaseHandler 中隐藏着中间件的信息, 较常见的 SessionMiddleware 就已经默认安装. BaseH ...