SWMM代码移植到64位平台

时间:2024-01-08 14:35:20

在32位平台上运行SWMM模型,当节点数量到达60万以上的时候,模型运行占用内存接近1.85G的时候就会因为内存不够而无法计算。这种情况还是单独运行SWMM.exe的时候出现,如果采用SWMM.DLL的方式来计算的话,加载DLL的主程序还需要占用一定的内存,那么留给模型的内存就更少了。出现这个问题的根本原因还是由于32位系统单个进程4G内存的限制导致的。想解决大量节点的计算问题就需要考虑将模型移植到64位平台。 目前EPA发布的最新的SWMM代码是5.0.022版本。移植就采用该版本。 在VS2010编译器中按照win32的设置来配置X64的编译选项。配置编译选项问题不大,主要注意几个选项,优化开关,浮点运算等。 完成配置后,就可以编译成为64位版本的计算引擎。

对比64位和32位模型的计算结果,发现在Steady Flow 的计算条件下,2中模型的计算结果一致,但是在Kinematic Wave 和 Dynamic Wave的计算条件下,模型的计算结果偏差较大,特别是对于Dynamic Wave,某些节点的计算结果,比如水深,水头等的偏差达到20%,甚至是50%,并且该结果不是在零值附近。通过调试和跟踪代码,发现对浮点数的处理是导致该问题出现的原因之一,在模型中有不少从double 转换为 float的操作,该操作导致变量的截断误差。因为在32位平台和64位平台下,从double 转换为 float的操作可能会导致同一个变量的结果不一致。通过修改这些强制转换的操作可以有效的减少截断误差所造成的影响。