环境工程篇

ISCST3 扩散模式

在台湾,法规上面还是使用 1995 年就被取代的 ISCST3 模式,所以,这里还是稍微说明一下怎么用在 Linux 好了!

最近更新时间: 2021/12/13

美国环保署在 1995 年将 ISCST3 列为公告模式之后,同时间发现到 ISCST3 还有许多不足之处, 因此同时开发了 AERMOD 模式,并且在 2005 年声明 AERMOD 取代了 ISCST3 模式。不过,在台湾,ISCST3 目前还是环保署法规认可的高斯扩散模式之一,模式支持中心竟然还提供 2018 年以前的气象文件! 实在很奇特...不过,既然目前还在使用,所以...那就用吧。 只是,iscst3 目前看到的都是 windows 运行档,鸟哥就不喜欢!所以,找到美国环保署原本的代码, 修改一些输入参数的功能,改用 gfortran 去编译!也似乎能跑!提供大家来参考。

ISCST3 的编译

ISC3 是一个稳流态高斯扩散模式 (steady-state Gaussian plume model), 可以被用来仿真各种工业区排放所造成的空气污染物浓度,主要仿真的排放源,有点源、面源、线源跟体源。 点源一般指的是烟囱排放,面源指的是一个场区或一个工业区的排放,线源通常就是交通排放, 体源就是类似一间工厂有 3D 空间的排放这样。ISC3 有长程与短程版本,目前还有使用的,大概就是短程版本 (ISCST3)

  • ISCST3 被取代了

ISCST3 在美国环保署网站 (ps1) 当中的介绍,里面的 note 有特别强调,AERMOD 已经在 2005 年被美国环保署签核为正式公告的扩散模式版本, 任何 ISCST3 的模式仿真结果,都必须要在 1 年后,也就是 2006 年底时,以 AERMOD 所取代。 也就是说,在美国,2007 年以后,法规要求的扩散模式,只能使用 AERMOD 喔!

很怪的,台湾这个都以美国环保署所作的研究为指引的地方,竟然到了 2021 年的这个时候,还是使用 ISCST3 作为所谓的环保署『优选』模式...实在觉得有点想不透原因为何...台湾地区过去也做过非常多 AERMOD 与 ISCST3 的研究比较,当然仿真结果各有优劣,不过就以理论来说,似乎还是 AERMOD 略胜一筹,只是仿真结果的浓度可能稍低于 ISCST3。

是否由于上面的原因,导致 ISCST3 被戏称为『比较保守的模式』,也就是说,ISCTS3 仿真结果可能会比较高, 因此比起 AERMOD 较可能超过法规标准,所以环评就可能被打回票?然后实际上其实浓度不会超过这么多? 这样对于工厂是否也有不公平?总之,可能有很多的原因是我们这种小老百姓不懂的...总归一句话,ISCST3 在国外算是被淘汰了, 其代码自 2002 年就没有任何更动。而 AERMOD 到 2021 年 4 月都还推出新版,两者的代码差异已经有 20 年....

无论如何,在法规上面,目前台湾环保署还是使用 ISCST3,虽然在模式仿真规范里面,没有特别强调扩散必须要使用 ISCST3, 但是,规范里面竟然强调,气象参数必须要由环保署公告者较佳 (空气品质模式仿真规范第七条ps2), 而环保署旗下空气品质模式支持中心对于高斯类扩散模式的描述,竟然只有提到 ISCST3,而且还特别强调是美国公告的替代模式... (ps3)。 不知道是消息 10 年没有更新,还是某些特别的原因,这就很令人觉得伤脑筋了!

  • 还是来编译 ISCST3 好了

作为小老百姓的我们,既然法规要求我们要使用 ISCST3,大老板们也怕环评不会过,所以,可能也只能使用 ISCST3, 比较有良心的,可能还会使用 AERMOD 同步仿真一下...好吧!算了!那就来实际的编译好了!说再多也没人听...

因为 ISCST3 从 2002 年以后就没有更新过版本,目前在美国环保署网站能找到的就是这个 2002 年的版本。 这个版本当初是在早期的 windows 上面的 fortran 编译器架构出来的,这个编译器...鸟哥找不到了! 而且也想要转到 gfortran 来编译,这样大家使用上都会变得比较方便些。不过,gfortran 与原本的编译器, 在读取指令输入的方式不太一样,所以,鸟哥有针对代码做了很小幅度的更动,只有动到指令列读入参数的部份, 其他科学计算的部份通通没更动喔!

另外,毕竟使用 make 的方式来进行编译还是比较舒服的,所以鸟哥也提供一个简单的 Makefile 给大家, 这样编译、删除编译就便得很愉快!简单又方便!直接下载的网址如下:

鸟哥是在 RockyLinux 8.5 系统上面编译这个 iscst3 软件的,至少要有的软件,包括:

  • "Development Tools" 软件群组
  • gcc-gfortran 编译器
  • make 软件

使用 gfortran 编译时,会有一些警告消息,或许可以忽略。此外,鸟哥有加上一些针对本机系统硬件的加速, 所以编译出来的运行档,基本上不能够在其他主机上面运作喔!大概是这样。现在,假设你是一般帐号而已, 如何让 iscst3 在你的家目录内编译呢?

# 1. 假设用户名为 user,数据放在 mysoftware 目录下:
[user@localhost ~]$ mkdir mysoftware
[user@localhost ~]$ cd mysoftware
[user@localhost mysoftware]$ wget http://vbird.org.cn/enve/images/iscst3.tar.gz
[user@localhost mysoftware]$ tar -zxvf iscst3.tar.gz
[user@localhost mysoftware]$ cd iscst3

# 2. 通过 make 搭配本目录下的 Makefile 直接编译
[user@localhost iscst3]$ make
make iscfile
make[1]: Entering directory '/home/vbird/mysoftware/iscst3'
gfortran -c -m64 -fbounds-check -Wuninitialized -Ofast -march=native -ffast-math -funroll-loops modules.for
...
gfortran -o iscst3.exe -m64 -Ofast -march=native -ffast-math -funroll-loops modules.o ....
make[1]: Leaving directory '/home/user/mysoftware/iscst3'

[user@localhost iscst3]$ ll iscst*
-rwxrwxr-x. 1 user user 1403160 12月 12 21:16 iscst3.exe
-rw-rw-r--. 1 user user  125171  5月 25  2021 iscst3.for
-rw-rw-r--. 1 user user  305336 12月 12 21:16 iscst3.o

[user@localhost iscst3]$ ldd iscst3.exe
        linux-vdso.so.1 (0x00007fff46ece000)
        libgfortran.so.5 => /lib64/libgfortran.so.5 (0x00007f084e89d000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f084e51b000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f084e303000)
        libquadmath.so.0 => /lib64/libquadmath.so.0 (0x00007f084e0c2000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f084dcfd000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f084dae6000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f084ed1c000)

很快乐的,这样就编译好 iscst3.exe 这个主程序了!相当简单吧!

简单的一个范本

美国环保署的 iscst3 文档里面,有提供一个范本输入档,可以用来作为测试跑 iscst3 的案例。 鸟哥也将该案例抓下来,放置到刚刚的那个 iscst3 目录内了!里面有个 example 的子目录, 该目录内就是可以跑扩散模式的输入档。详细的范本说明,建议还是直接查找 iscst3 的手册 (ps4), 鸟哥只是提供一个可以直接运行的范本测试,让大家测试一下,我们刚刚编译的 iscst3.exe 能不能在 Linux 上面跑就是了。

测试的方法真的是简单到不行!你直接跑到 example 目录下,检查一下链接档是否正确的指向对的运行档, 然后直接运行 iscst3.exe 就可以了。不过需要注意的是,因为 2002 年的 iscst3 版本,不知道是否已经支持超过 8 个字符长度的文件名, 因此,建议设计文件名时,要注意文件名长度!文件名长度为 8 个字符,扩展名为 3 个字符,旧版 DOS 环境是如此的。 那就来测试看看啰!

[user@localhost iscst3]$ cd example
[user@localhost example]$ ll
-rw-rw-r--. 1 vbird vbird  7847 12月 10 08:33 EVENTEXP.INP
lrwxrwxrwx. 1 vbird vbird    13 12月 10 08:33 iscst3.exe -> ../iscst3.exe
-rw-rw-r--. 1 vbird vbird 24029  4月 19  1993 PREPIT.ASC    <==气象参数档
-rw-rw-r--. 1 vbird vbird  2542  4月 15  1999 TEST-ST.INP   <==主要输入档

[user@localhost example]$ ./iscst3.exe TEST-ST.INP output.txt
+Now Processing SETUP Information
+Now Processing Data For Day No.    1 of 1964
+Now Processing Data For Day No.    2 of 1964
+Now Processing Data For Day No.    3 of 1964
+Now Processing Data For Day No.    4 of 1964
+Now Processing Data For Day No.    5 of 1964
+Now Processing Data For Day No.    6 of 1964
+Now Processing Data For Day No.    7 of 1964
+Now Processing Data For Day No.    8 of 1964
+Now Processing Data For Day No.    9 of 1964
+Now Processing Data For Day No.   10 of 1964
+Now Processing Data For Day No.   11 of 1964
+Now Processing Data For Day No.   12 of 1964
+Now Processing Data For Day No.   13 of 1964
+Now Processing Data For Day No.   14 of 1964
+Now Processing Data For Day No.   15 of 1964
+Now Processing Data For Day No.   16 of 1964
+Now Processing Data For Day No.   17 of 1964
+Now Processing Data For Day No.   18 of 1964
+Now Processing Data For Day No.   19 of 1964
+Now Processing Data For Day No.   20 of 1964
+Now Processing Output Options
Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG IEEE_DIVIDE_BY_ZERO

恭喜您~你的 iscst3 可以在 Linux 的世界里面跑了~而且性能可以根据你的 CPU 调校到较佳的效果! 现在,请慢慢将你的数据移到 server 上面吧!这样你的信息就不用保留在 windows 上啰! 大家也都可以协同工作了!加油!

参考数据

其他链接
环境工程模式篇
鸟园讨论区
鸟哥旧站

今日 人数统计
昨日 人数统计
本月 人数统计
上月 人数统计