1 武理排水管网模拟分析系统简介
武理排水管网模拟分析系统是基于SWMM深度二次开发的成果。其一维水力模型以SWMM为基础,利用C++对SWMM源代码进行了面向对象封装. 实现一个对象即是一个排水模型, 并且扩展了水动力计算模块使其支持一维、二维耦合水动力 计算,可以将其与SWEsolver模块配合实现城市排水管网水文水动力耦合模拟。在网络分析及结果分析方面也提供了更加丰富的功能。武理排水管网模拟分析系统本身是一个二次开发平台,可以利用该平台实现桌面程序的开发以及webapi的开发。
2 软件内容简介
软件托管在码云上,软件下载地址,以压缩文件下载后进行解压缩,其中有两个文件夹:software和Benchmarks。software是软件的主要内容,Benchmarks是用于检验模拟结果的案例。
2.1 software文件夹内容
2.1.1 bin文件夹
bin文件夹里面是编译后的成果以及运行辅助文件,
2.1.1.1 Debug及Release文件夹
保存了Debug及Release编译成果。
- SWMMCPP.dll为一维水力模拟模块;
- SweSolver.dll为二维水力模拟模块;
- SweSolver_cuda.dll为使用CUDA架构的二维水力模拟模块,可以在配备NVIDIA GPU的设备上提高二维计算的效率;
- Coupler.dll为一二模拟耦合器,负责一二维模型间数据交换;
- SwmmWrapper.dll及SweWarpper.dll,整个软件采用C++开发,因此采用C++使用该平台没有问题,如果想使用C#进行开发需要提供相应的适配函数,该两个模块提供了C#调用的适配函数;
- swmmTest.exe,SweCalling.exe,SweCalling_cuda.exe为通过命令调用计算模块的工具。
2.1.1.2 gdal-dev以及share文件夹
这两个文件夹包含了gdal模块运行时所需文件,与开发无关。需要将gdal-dev文件夹路径设置到环境变量path中,将share中的proj文件夹路径设置到环境变量的PROJ_LIB变量中。设置环境变量的工作可以通过双击envset.bat文件实现。也可以将该两个文件夹内容拷贝至开发成果所在运行目录中。
2.1.2 include文件夹
开发过程中需要用到的头文件
2.1.3 lib文件夹
库文件
2.1.4 doc文件夹
开发帮助文档
2.1.5 tutorial文件夹
开发教学实例
2.2 Benchmarks文件夹内容
该文件夹中保存了一些经典的二维浅水方程求解案例,可以通过案例结果展示计算模块的计算精度。
3 项目开发
按照上面内容下载软件,设置环境变量成功后,可以双击运行swmmTest.exe,如果出现如下结果则说明开发平台可用。

输入quit退出程序.接下来以Visual Studio2022为开发环境演示创建C++项目并使用武理排水管网模拟分析系统进行模拟计算.
3.1 新建项目
新建C++空项目

在项目中添加main.cpp文件

项目配置属性->常规->C++语言标准:选择"ISO C++17 标准 (/std:c++17)"或者更高版本
项目配置属性->高级->字符集:选择"使用 Unicode 字符集"
项目配置属性->C/C+±>常规->附加包含目录:添加software/include中的5个文件夹
项目配置属性->链接器->常规->附加库目录:添加software/lib文件夹
项目配置属性->链接器->输入->附加依赖项:
- 进行一维模拟,添加SWMMCPP.lib
- 进行耦合模拟,添加SWMMCPP.lib, SWEsolver.lib和gdal_i.lib
- 进行使用CUDA架构的耦合模拟,添加SWMMCPP.lib, SWEsolver_cuda.lib和gdal_i.lib
3.2 添加代码
在main.cpp中添加如下代码
cpp
#include "Iswmm_simu.h"
#include "swmm_cs.h"
int main()
{
ISwmmSimulation* pswmm = nullptr;
if (GetSwmmSimulation((void**)&pswmm) == 0)
printf("create swmm simulation interface successfully\n");
else
return 0;
//inp文件路径,替换为你的inp所在位置
std::string inpFilePath = "C:/Baiduyun/program/HTwater/software/tutorial/exp_swmmcpp_calling/swmm_network/network.inp";
std::string rptFilePath = inpFilePath;
rptFilePath.replace(rptFilePath.length() - 3, 3, "rpt");
std::string outFilePath = inpFilePath;
outFilePath.replace(outFilePath.length() - 3, 3, "out");
int err = pswmm->swmm_run(inpFilePath.data(), rptFilePath.data(), outFilePath.data());
if (err == 0)
printf("swmm_run successfully\n");
else
printf("swmm_run failed with error code is %d\n", err);
//释放资源
ReleaseSwmmSimulation((void*&)pswmm);
return 1;
}
3.3 编译运行
编译运行后得如下结果
