[水力建模]EPANET代码解读1

EPANET代码解读1   

EPANET是美国环境保护局(环保署)公布的水力分析引擎,其源代码是开放的,但由于是用C写的,并且代码清晰度并不够,因此有必要解读一下。

    EPANET当前最新版本是2.0,可以编译为动态链接库(DLL),也可以编译为独立的可执行程序(EXE)。编译DLL的最好方法是在VC++新建一个空的DLL项目,然后把*.c、*.h以及epanet.def文件加入到项目中,即可顺利完成编译。要编译EXE,可以新建一个空的EXE项目,同样加入文件后,定义CLE并进行编译。

    DLL包含了一组导出函数,详细的用法在用户手册中有介绍,此处不作解释。EXE需要3个文件参数,分别是输入文件、报告文件和输出文件,下面从main函数开始根据正常执行流程进行说明。

    main函数定义在epanet.c文件的起始位置。除了参数检查之外,最重要的是调用ENepanet函数(也是DLL中的导出函数,定义在epanet.c文件中)进行完整的模拟。ENepanet函数只包含几行代码,依次是调用ENopen、ENsolveH、ENsolveQ、ENreport和ENclose,这几个函数也都是从外部可调用的导出函数,也都定义在epanet.c文件中,分别解读如下。

    ENopen需要的也是和main同样的3个文件参数。首先,函数初始化一些系统标志,包括Openflag OpenHflag OpenQflag SaveHflag SaveQflag Warnflag Messageflag Rptflag等,调用epanet.c中定义的initpointers函数初始化一系列指针(设置为NULL)。这些指针保存了管网的各种信息,其定义都在一个单独的文件var.h中。虽然指针的名字看起来有点乱,但因为非常重要,根据初始化的顺序详细列举如下:

    D——各节点实际用水需求,为double*类型;

    C——各节点实际水质,为double*类型;

    H——各节点的水头(head ),为double*类型;

    Q——各管段的流量,为double*类型;

    R——各管段的反应率,为double*类型;

    S——各管段的状态,为char*类型,值为CLOSED OPEN ACTIVE 等枚举状态(定义在types.h中);

    K——各管段的设置,如水泵速度、阀的设置等,为double*类型;

    OldStat——各管段(水池)的原来状态;

    Node——节点数据,为Snode*类型,Snode为一个结构,其定义在types.h中,包括一个字符串类型的ID、一个Sdemand*类型的需求指针、一个Ssource*类型的源指针、double类型的标高、初始水质、扩散器系数和一个char类型的报告标志;

    Link——管段数据,为Slink*类型,Slink为一个结构,其定义在types.h中,

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EPANET是一种用于水力和水质行为的软件,而EPANET的API(应用程序编程接口)可以使程序员使用各种编程语言来编写与EPANET相关的应用程序。在Java中,可以使用JNA(Java Native Access)库来调用EPANET的API,从而实现水力水质分析的功能。下面是一个基于EPANET API的示例代码: ```java import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Pointer; public class EPANET { public interface EpanetLibrary extends Library { EpanetLibrary INSTANCE = (EpanetLibrary) Native.loadLibrary("epanet2", EpanetLibrary.class); int ENepanet(String inpFile, String rptFile, String outFile, Pointer p); int ENopen(String inpFile, String rptFile, String outFile); int ENclose(); int ENsolveH(); int ENsaveH(); int ENsolveQ(); int ENreport(); int ENgetcount(int type, Pointer count); int ENgetnodeindex(String id, Pointer index); int ENgetnodeid(int index, Pointer id); int ENgetlinkindex(String id, Pointer index); int ENgetlinkid(int index, Pointer id); int ENgetnodevalue(int index, int code, Pointer value); int ENsetnodevalue(int index, int code, double value); int ENgetlinkvalue(int index, int code, Pointer value); int ENsetlinkvalue(int index, int code, double value); int ENaddpattern(String id); int ENsetpattern(int index, double[] factors, int nfactors); int ENgetpatternid(int index, Pointer id); int ENgetpatternindex(String id, Pointer index); int ENgetpatternlen(int index, Pointer len); int ENgetpatternvalue(int index, int period, Pointer value); int ENsettimeparam(int code, long timevalue); } public static void main(String[] args) { EpanetLibrary lib = EpanetLibrary.INSTANCE; lib.ENopen("example.inp", "example.rpt", ""); lib.ENsolveH(); lib.ENreport(); lib.ENclose(); } } ``` 这个示例代码使用EPANET API打开了一个名为“example.inp”的输入文件,对其进行水力计算,输出报告到“example.rpt”文件中,并最终关闭了EPANET。在实际应用中,可以根据具体需求调用其他的EPANET API函数来实现各种水力水质分析的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值