用于与EPA SWMM5模型交互、编辑和可视化的工具

swmmio的Python项目详细描述


SWMMIO

V0.3.6

构建状态build status swmmio是一组python工具,旨在为epa雨水管理模型(swmm)的版本控制和结果可视化提供一种方法。还提供了命令行工具,用于通过python的多处理模块单独和并行地运行模型。这些工具是专门为洪水风险管理应用而开发的,尽管大多数功能通常适用于雨水管理建模。

先决条件

swmmio的主要功能是与swmm生成的.inp和.rpt(输入和报告)文件进行接口。运行模式模块中的功能依赖于一个SWMM5引擎,可以在这里下载该引擎

依赖关系

安装:

在安装之前,建议首先激活avirtualenv,以避免拥挤系统的包库。如果不使用上面列出的任何依赖项,则此步骤不太重要。swmmio可以通过命令行中的pip安装:

pip install swmmio

基本用法

swmmio.model()类提供了与swmm模型交互的基本端点。要开始,请将swmm5模型(.inp)及其报告文件(.rpt)保存在目录中。几个例子:

importswmmio#instantiate a swmmio model objectmymodel=swmmio.Model('/path/to/directory with swmm files')#Pandas dataframe with most useful data related to model nodes, conduits, and subcatchmentsnodes=mymodel.nodes()conduits=mymodel.conduits()subs=mymodel.subcatchments()#enjoy all the Pandas functionsnodes.head()
关于这一问题,我们在这一领域进行了深入的研究,我们在这一领域的研究>这一领域的研究>这一领域>这一领域>这一领域>这一领域>这一领域>这一类型>这一领域>这一领域>这一领域>这一领域>这一领域>这一领域>这一领域>这一领域>这一领域>这一领域>这一领域>这一领域>这一领域>这一领域>这一领域>这一领域>这一领域>这一领域>这一领域>这一领域>这一领域>这一领域>这一领域>这一领域的最大深度>这一领域>这一领域>这一领域>这一领域>这一领域>这一领域的最大深度>这一领域>这一领域>这一领域>这一领域>这一领域>这最大洪水lMaximumPondDepthXYcoordsNameS42A_10.N_413.5066736.3269775.0110.0JUNCTION0.696.3319.83012:010.010.200.011:520.0006.332689107.0227816.000[(2689107.0, 227816.0)]D70_ShunkStreet_Trunk_438.5084132.4936475.0744.0JUNCTION0.040.238.74012:14NaNNaNNaNNaNNaNNaN2691329.5223675.813[(2691329.5, 223675.813)]TD61_1_2_905.15000015.3980080.00.0交界处0.6815.4020.55011:550.0119.170.011:560.00015.402698463.5230905.720[(2698463.5, 230905.72)]D66_36.D.7.C.1_1919.3200003.3357605.06028.0JUNCTION0.5722.70012:000.496.450.011:510.0083.383.383.380.39>0/td>0.正文>
#write to a csvnodes.to_csv('/path/mynodes.csv')#calculate average and weighted average imperviousavg_imperviousness=subs.PercImperv.mean()weighted_avg_imp=(subs.Area*subs.PercImperv).sum()/len(subs)

生成图形

创建模型的图像(.png)可视化。默认情况下,如果模型包含输出数据(.inp应附带一个.rpt文件),则会显示管道应力和节点洪水持续时间。

fromswmmio.graphicsimportswmm_graphicsassgsg.draw_model(mymodel)

默认绘图输出

使用pandas计算一些有趣的统计数据,并生成一个突出显示的图像 对您的项目有兴趣或重要的内容:

#isolate nodes that have flooded for more than 30 minutesflooded_series=nodes.loc[nodes.HoursFlooded>0.5,'TotalFloodVol']flood_vol=sum(flooded_series)#total flood volume (million gallons)flooded_count=len(flooded_series)#count of flooded nodes#highlight these nodes in a graphicnodes['draw_color']='#787882'#grey, default node colornodes.loc[nodes.HoursFlooded>0.5,'draw_color']='#751167'#purple, flooded nodes#set the radius of flooded nodes as a function of HoursFloodednodes.loc[nodes.HoursFlooded>1,'draw_size']=nodes.loc[nodes.HoursFlooded>1,'HoursFlooded']*12#make the conduits grey, sized as function of their geometryconds['draw_color']='#787882'conds['draw_size']=conds.Geom1#add an informative annotation, and draw:annotation='Flooded Volume: {}MG\nFlooded Nodes:{}'.format(round(flood_vol),flooded_count)sg.draw_model(mymodel,annotation=annotation,file_path='flooded_anno_example.png')

flored highlight

建立模型的变体

从一个基本的swmm模型开始,可以通过将修改后的数据插入一个新的inp文件来创建其他模型。对于灵敏度分析或改变边界条件非常有用,可以使用一个相当简单的循环来创建模型,利用modify\u model包。

例如,可以通过创建一组具有不同排水口固定水位高程的模型来研究气候变化的影响:

importos,shutilimportswmmiofromswmmio.utils.modify_modelimportreplace_inp_sectionfromswmmioimportcreate_dataframeINP#initialize a baseline model objectbaseline=swmmio.Model(r'path\to\baseline.inp')rise=0.0#set the starting sea level rise condition#create models up to 5ft of sea level rise.whilerise<=5:#create a dataframe of the model's outfallsoutfalls=create_dataframeINP(baseline.inp.path,'[OUTFALLS]')#create the Pandas logic to access the StageOrTimeseries column of  FIXED outfallsslice_condition=outfalls.OutfallType=='FIXED','StageOrTimeseries'#add the current rise to the outfalls' stage elevationoutfalls.loc[slice_condition]=pd.to_numeric(outfalls.loc[slice_condition])+rise#copy the base model into a new directory    newdir=os.path.join(baseline.inp.dir,str(rise))os.mkdir(newdir)newfilepath=os.path.join(newdir,baseline.inp.name+"_"+str(rise)+'_SLR.inp')shutil.copyfile(baseline.inp.path,newfilepath)#Overwrite the OUTFALLS section of the new model with the adjusted datareplace_inp_section(newfilepath,'[OUTFALLS]',outfalls)#increase sea level rise for the next looprise+=0.25

接入模型网络

swmmio.model类通过network返回模型的networkx多向图表示

#access the model as a Networkx MutliDiGraphG=model.network#iterate through linksforu,v,key,datainmodel.network.edges(data=True,keys=True):print(key,data['Geom1'])# do stuff with the network

运行模式

使用命令行工具,可以通过调用shell中的swmmio模块来运行单独的swmm5模型:

$ python -m swmmio --run path/to/mymodel.inp

如果有许多模型要运行,并且希望利用计算机的核心,可以使用--start_pool(或-sp)命令启动一个模拟池。将-sp指向一个或多个目录后,swmmio将搜索swmm.inp文件并将所有文件添加到多处理池中。默认情况下,-sp会让您的机器的4个核心未使用。这可以通过-cores_left参数更改。

$ #run all models in models in directories Model_Dir1 Model_Dir2
$ python -m swmmio -sp Model_Dir1 Model_Dir2  

$ #leave 1 core unused
$ python -m swmmio -sp Model_Dir1 Model_Dir2  -cores_left=1
< div >

警告

将所有核心用于同时运行模型可以使计算机的CPU使用率在较长时间内保持在100%。这可能会给你的硬件带来压力。风险自负。

洪水模型选项生成

SWMMIO可以采取一套独立的风暴洪水救援(SFR)方案,并将它们结合到每一个潜在的基础设施变化组合中。这为确定最有效的实施顺序和投资水平奠定了基础。

考虑一个城市有兴趣通过在A街和/或B街沿线安装新的排水管来解决洪水问题的简化情景。此外,该城市想决定这些排水管是否应该有1或2个街区长。然后,工程师们决定为4种可能的泄压下水道方案建立雨水管理模型:

  • A1->;A街的一个排水沟
  • A2->;A街的两个排水沟街区
  • B1->;B街的一个排水沟
  • B2->;B街的两个排水沟街区

为了更全面,应为这些方案的组合建立实施方案的模型;例如,在A街和B街的一个街区组合建造泄压下水道,而不是单独在两个街区建造泄压下水道,可能更具成本效益。

swmmio在E版本控制模块。函数为分段洪水缓解模型的每个逻辑组合构建模型。在上面的示例中,将创建以下场景的模型:

  • A1带B1
  • A1带B2
  • A2带B1
  • A2带B2

要使create_combinations()函数工作,需要按如下方式设置模型目录:

pip install swmmio
0

新模型将被构建并保存在combinations目录中。create_combinations()需要知道这些目录在哪里,并且可以选择获取版本ID和注释数据:

pip install swmmio
1

新模型将保存在target\u目录的子目录中。新模型(及其包含目录)将基于其父模型名称的串联命名。建议保持父模型名称尽可能简洁,以便子模型名称是可管理的。运行create_combinations()后,项目目录将如下所示:

pip install swmmio
2

SWMM型号版本控制

要向模型空间添加更多段,请创建一个新的段目录,然后重新运行create_combinations()函数。可选地包括一条评论,总结模型空间的变化:

pip install swmmio
3

还可以使用create_combinations()函数以同样的方式将现有段(父)模型中的更改提交给所有子模型。每个模型的版本信息存储在每个模型目录中名为vc的子目录中。每次从create_combinations()函数修改模型时,都会生成一个新的"buildinstructions"文件来汇总更改。构建说明文件概述了如何根据基准模型重新创建模型。

待续……

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在JSP中添加自定义隐式对象   java MasterMindResource泄漏?   不同的c#java结果加密   java为什么安卓 studio显示“constraintlayout中缺少约束”错误?   java Make Logback将日志打印到文件中   java如何在Google应用程序引擎中设置日期时间?   jeditorpane如何阻止java HTMLEditorKit自动关闭我的标记   返回到Activity onCreate()时,不会调用java函数   java为什么我在这个对象上得到一个NullPointerException?   在java中,如何使用包含数组的参数调用图形方法?   java如何在Play framework 2应用程序中存储Akka参与者列表?   ssh使用java将文件从一个solaris 9复制到另一个solaris 9   网络Java服务器正在等待客户端响应   java Spring mvc从formBackingObject()重定向到页面   java Spark:JavaRDD<Tuple2>到javapairdd<>   java如何动态调用基类中由字符串值指定的子类方法?