環境工程篇

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 https://linux.vbird.org/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 上囉! 大家也都可以協同工作了!加油!

參考資料

其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計