环境工程篇

AERMOD - AERMET 气象处理模块

AERMET 是 AERMOD 里面很重要的一环!因为气象参数的影响对于空品模式是相当重要的!

最近更新时间: 2019/07/28

影响扩散模式最重要的一环,当然就是气象场数据。AERMOD 的气象场数据,主要是通过相关附属模块,也就是 AERMET 的协助来处理。 如前所述,AERMOD 运作时,需要一组地面风场数据,以及一组探空数据。然后将这两个数据丢进 AERMET 整理成为 AERMOD 可以读取的数据, 才能够开始进行模式的运作。就让我们来理解一下如何操作 AERMET 吧!

AERMET 的处理流程概述 (ps1)

AERMET 对于 AERMOD 来说,是很重要的!因为气象条件不准确的话,后续的所有仿真与分析都是垃圾!

  • 前言

AERMET 模式是 AERMOD 的附属模块之一,主要的目的在提供 AERMOD 运作时,所需要的 (1)地面风场数据与 (2)探空数据等。 但是 AERMET 一开始是针对美国的气象场设计而来的,因此,读取的数据格式主要是美国国家气象服务 (National Weather Service, NWS) 所观测的气象数据格式。 NWS 主要提供两种数据,一个是每天两次的探空数据 (soundings),一个是地面的观测站数据。在取得上述的数据后,AERMET 可以进行如下的动作:

  • 首先,将 NWS 提供的气象数据读入,并进行气象数据的品质确认 (QA/QC) 任务,确认数据的可靠度
  • 再将上述的数据以小时逐时记载的方式,保存到单一文件中
  • 由上述的文件中,读入所需要的气象场数据,开始集成所需要的地面风场数据,以及计算出仿真区域的 PBL 数据,当然, 这些探空数据是多层次的。

最终 AERMET 在完成上述的动作之后,会产生两个文件:

  • 地面小时风场数据与 PBL 的特征参数;
  • 多层次的风速、风向数据
  • AERMET 概观

US EPA 指定了 AERMOD 作为法规标准的扩散模式,而 AERMOD 扩散模式主要在仿真近场的污染浓度扩散仿真,所谓的近场大致上范围就是 50 公里内。 为了要仿真扩散行为,AERMET 就被开发用来作为扩散仿真的气象场准备数据。AERMET 可以评估计算大气边界层 (ABL) 或者是所谓的行星边界层 (PBL) 的特征参数, 据以提供给 AERMOD 进行仿真。

AERMET 主要运作三种数据格式:

  1. 由 NWS 或 FAA (Federal Aviation Administration) 所提供的地面测站的逐时观测数据;
  2. 由 NWS 每天两次施放监测到的探空气球的探空数据 (主要计算 PBL)
  3. 由类似 WRF 的气象数据,并经过 MMIF 模块转换之后,取得的大气模式输出的数据 (并不是观测数据喔!)

基本上的运作主要分为两种,一种是完全由观测值取得的地面与高空数据,就是上面的 1, 2 项数据。如果你手边有大气模式的输出档,例如 WRF 的全年输出数据, 那就可以通过 AERMET 的插件,亦即是 MMIF 这个模块,直接从已经网格化的气象场当中取出所需要的数据即可!因此,上述的第 3 项数据,其实就已经包含了全部所需要的地面与探空数据了。 而且数据可能比观测值还要更可靠!

因为 WRF 所输出的气象场数据非常庞大,除了原本就有在玩气象模式的朋友之外,大部分的朋友大概很难取这些数据。所以,US EPA 所提供的使用手册, 也只是针对上述的 1, 2 项数据来进行说明。整体的 AERMET 流程如下图所示:

AERMET 的整体处理流程
AERMET 的整体处理流程

因为 NWS 提供的数据数据相当庞大,因此地面观测数据与探空数据,就得要针对不同地点来截取 (extracted) 出来!你可以看到上图中, 从左而右的最上方两条线路,第一条就是取出地面风场数据 (surface observations),第二条就是探空数据 (soundings)。第一条跟第二条中间的一个小区块, 名称为『 1-min ASOS 』是比较新的数据,是一分钟一笔的数据数据,并不是小时数据!因为台湾似乎没有这方面的数据,所以,这一条 (1-min ASOS) 就可以先忽略。 至于最后一条『 Raw site-specific data 』则是针对测站的相关设置,则可以直接指定到设置档当中,也不用事先读出。

对于台湾这种非 NWS 数据格式的系统来说,比较讨厌的,就是得要事先将我们自己的观测数据格式转成 AERMET 可以处理的格式!也就是说, 要先将格式转为 NWS 的格式之后,后续就能直接使用 AERMET 的相关模式功能。否则,连开始都无法开始啊!

如上图所示,基本上, AERMET 共需要进行三个阶段 (stage),第一阶段就是在进行地面测站及探空数据的截取,一直到 QA 之后,都是属于第一阶段的工作范围。 第二阶段则是在整理 24 小时的数据,将数据汇整成为单一输出档,如上图中右侧数来的第二个字段:『 Merged Data: 24-h blocks 』就是这个阶段的数据。 第三阶段就是将刚刚的单一气象文件转成地面与 PBL 参数,还有垂直剖面文件两者。这三个阶段必需要分别进行,因为每个阶段都会产生下个阶段的输入数据! 所以,当然需要依序进行三次才行!

step 1: 中央气象局的数据转换

AERMET 可以读入的气象场参数数据主要格式为 TD-3280 与 CD-144 等,不过,咱们中央气象局的气象场数据,并不是这两种格式喔! 你可以自行到『大气水文研究数据库』(ps2)去查阅相关的气象局下载数据。因此,如果需要让 AERMET 可以读入气象场数据, 就得要将中央气象局的数据进行转换。不过,要转换也有点麻烦~因为 AERMET 有规定自己的读取格式!相关格式可以参考 AERMET 用户手册的附录 C (ps1),里面就有谈到相关的读取格式。

不过,光是从大气水文研究数据库下载数据,可能就花费许多时间了,更何况还得要参考上述的文档去转换成为 AERMET 可以认识的格式! 鸟哥考虑到大家的困难~就先根据上述的文档,编译好了一组可以在 Linux 系统上面运作的 cwb2aermet-static.exe 文件。这个文件只能在 Linux 底下运作! 不过运作之前还是得要注意输入数据的格式问题!基本上,就是直接从中央气象局的数据去分析就是了。

  • 步骤一:先从大气水文数据库下载中央气象局数据与探空数据

一般研究人员可以从大气水文数据库所提供的界面去申请下载,当然,您得要有所谓研究人员的资格,否则,可能就得要发文去给相关的单位申请。 在 2000 年以前,我们想要做这种研究,是得样向中央气象局申请购买,然后对方会寄光盘片来,一打开...里面都是图片档~然后一张一张打印出来, 再重复输入到类似 Excel 的文件里面后,才能做后续的分析。现在已经都有电子档,格式也都调整成固定的模式,已经改善非常非常多了。

上述的网站里面顺利的登录之后,点击『数据库』的『基本查找』之后,点击中央气象局的『局属逐时』、『探空』这两个格式就好, 往下拉动后,到达时间设置的部份。这次我们选择 2016 年的数据来解释的话,那就勾选 2016 年的 12 个月的数据。 之后就按下『送出查找』,你就会看到类似如下的画面:

大气水文数据库的中央气象局数据查找结果
大气水文数据库的中央气象局数据查找结果

如上图,按下『全选』然后再按下右上角的『产生压缩档』之后,过不多久,就可以下载压缩档了!这是因为数据量非常庞大,没有压缩的话,很耗带宽啊! 等到你下载之后,在将该文件解开,里面就有 2016 年全年的地面测站数据与探空数据。至于文件名的制定方式,通常是这样的:

  • 地面数据: 201601_cwb_hr.txt (2016年1月份的逐时数据)
  • 探空数据: 201601_upair.txt (2016年1月份的探空数据)

最后,将下载的文件通过 zip 解压缩之后,就可以得到正确的文件了。在 Linux 系统底下,将 24 个文件通通放置到同一个目录去,假设为 cwb 目录好了, 那么就会有点像这样:

# 1. 假设用户名为 user,预计操作 AERMET 目录在家目录的 aermet 底下:
[user@localhost ~]$ mkdir aermet
[user@localhost ~]$ cd aermet
[user@localhost aermet]$ mkdir cwb
[user@localhost aermet]$ cd cwb

# 2. 假设你通过各种方式,已经将名为 2018091217311031398.zip 放置到本目录中,并将他解压缩
[user@localhost cwb]$ ll
-rw-rw-r-- 1 user user 55361553  7月 24 16:46 2018091217311031398.zip  <==必须存在这个文件

[user@localhost cwb]$ unzip 2018091217311031398.zip  <==进行解压缩!
Archive:  2018091217311031398.zip
  inflating: 201601_upair.txt
  inflating: 201602_upair.txt
  ...

[user@localhost cwb]$ ll
-rw-rw-r-- 1 user user  7867084  7月 24 16:48 201601_cwb_hr.txt
-rw-rw-r-- 1 user user   685822  7月 24 16:48 201601_upair.txt
-rw-rw-r-- 1 user user  7359676  7月 24 16:48 201602_cwb_hr.txt
-rw-rw-r-- 1 user user   700462  7月 24 16:48 201602_upair.txt
-rw-rw-r-- 1 user user  7867084  7月 24 16:48 201603_cwb_hr.txt
-rw-rw-r-- 1 user user   731511  7月 24 16:48 201603_upair.txt
-rw-rw-r-- 1 user user  7613380  7月 24 16:48 201604_cwb_hr.txt
-rw-rw-r-- 1 user user   811665  7月 24 16:48 201604_upair.txt
-rw-rw-r-- 1 user user  7867084  7月 24 16:48 201605_cwb_hr.txt
-rw-rw-r-- 1 user user   915487  7月 24 16:48 201605_upair.txt
-rw-rw-r-- 1 user user  7466068  7月 24 16:48 201606_cwb_hr.txt
-rw-rw-r-- 1 user user   816301  7月 24 16:48 201606_upair.txt
-rw-rw-r-- 1 user user  7613380  7月 24 16:48 201607_cwb_hr.txt
-rw-rw-r-- 1 user user   854182  7月 24 16:48 201607_upair.txt
-rw-rw-r-- 1 user user  7613380  7月 24 16:48 201608_cwb_hr.txt
-rw-rw-r-- 1 user user   844361  7月 24 16:48 201608_upair.txt
-rw-rw-r-- 1 user user  7367860  7月 24 16:48 201609_cwb_hr.txt
-rw-rw-r-- 1 user user   980635  7月 24 16:48 201609_upair.txt
-rw-rw-r-- 1 user user  7613380  7月 24 16:48 201610_cwb_hr.txt
-rw-rw-r-- 1 user user  1029069  7月 24 16:48 201610_upair.txt
-rw-rw-r-- 1 user user  7367860  7月 24 16:48 201611_cwb_hr.txt
-rw-rw-r-- 1 user user   839664  7月 24 16:48 201611_upair.txt
-rw-rw-r-- 1 user user  7613380  7月 24 16:48 201612_cwb_hr.txt
-rw-rw-r-- 1 user user   851132  7月 24 16:48 201612_upair.txt
-rw-rw-r-- 1 user user 55361553  7月 24 16:46 2018091217311031398.zip

[user@localhost cwb]$ rm 2018091217311031398.zip

这样就完成下载文件在 Linux 的解压缩工作了!如果你不熟 Linux 的话,那么,就先不要玩模式了!大部分的模式操作都是在 Linux 系统底下运作的! 如果不熟悉 Linux ,会很难入门啊!所以,基本功 (蹲马步) 是需要的!请在本站慢慢的先学习 Linux 基础吧!

  • 步骤二:根据仿真区域的环境,选择正确的测站点,并分别截取地面、探空数据

因为 AERMET 只会分析一个地面测站以及一个高空测站的数据,但是中央气象局的数据,通常是全台的数据!所以,你得要先知道,你要取得的是哪一个县市的地面测站! 你可以参考底下的链接:

举例来说,我们可能想要知道高雄市附近的扩散仿真,因此,选择了高雄测站的『 467440 』这一个站址,然后,探空数据只有两个, 一个是台北 (466920) 一个是花莲 (466990),毕竟我们是在西岸,所以,探空数据也只能选择 466920 这一个测站地址。知道了测站信息之后, 接下来就可以通过底下的方式来截取所需要的探空与地面测站数据了!

  • 范例年份: 2016
  • 范例测站: 467440
    • 经度: 120.3157
    • 纬度: 22.5660
    • 海拔高度: 2.3
  • 范例探空: 466920
  • 范例地面观测文件: cwb_2016_surface
  • 范例探空数据文件: cwb_2016_upair
# 先进入到刚刚创建的 aermet 目录中,并截取地面观测数据
[user@localhost ~]$ cd ~/aermet
[user@localhost aermet]$ grep -h '^467440' ./cwb/2016*cwb*.txt | grep -v '\/\/\/' > cwb_2016_surface
[user@localhost aermet]$ grep -h '^466920' ./cwb/2016*up*.txt  | grep -v '\/\/\/' > cwb_2016_upair
[user@localhost aermet]$ ll
drwxrwxr-x 2 user user    4096  7月 24 16:49 cwb
-rw-rw-r-- 1 user user 2995344  7月 24 17:07 cwb_2016_surface  <==地面测站的观测数据
-rw-rw-r-- 1 user user 5035855  7月 24 17:07 cwb_2016_upair    <==探空数据的观测

有兴趣的朋友可以使用 vim 去看一下每一个文件的内容,否则就直接略过~这样就已经处理好等等我们需要的中央气象局的数据了!

  • 步骤三:从鸟站下载需要的转档程序,开始进行转档

接下来就是转档!通过鸟站下载程序后,直接将刚刚取得的数据转档即可。转档程序在这里

[user@localhost ~]$ cd ~/aermet
[user@localhost aermet]$ wget http://vbird.org.cn/enve/images/cwb2aermet-static.exe
[user@localhost aermet]$ chmod a+x cwb2aermet-static.exe
[user@localhost aermet]$ ./cwb2aermet-static.exe cwb_2016_surface cwb_2016_upair SF_2016_467440.EXT UP_2016_466920.FSL 22.5660 120.3157 2.3
 地面测站文件名:cwb_2016_surface
 探空测站文件名:cwb_2016_upair
 完成探空数据
 开始处理地面数据的读写
 完成地面数据的处理

[user@localhost aermet]$ ll
drwxrwxr-x 2 user user    4096  7月 24 16:49 cwb
-rw-rw-r-- 1 user user 2995344  7月 24 17:34 cwb_2016_surface
-rw-rw-r-- 1 user user 5020300  7月 24 17:34 cwb_2016_upair
-rwxrwxr-x 1 user user 1116552  7月 24 11:54 cwb2aermet-static.exe
-rw-rw-r-- 1 user user 1352736  7月 24 17:36 SF_2016_467440.EXT     <==用于 AERMET 的地面测站数据
-rw-rw-r-- 1 user user 1020756  7月 24 17:36 UP_2016_466920.FSL     <==用于 AERMET 的探空数据

转档程序的语法也挺单纯的:

[user@localhost ~]$ ./cwb2aermet-static.exe 地表观测值 探空观测值 地表输出档 探空输出档 测站纬度 测站精度 测站高度

这样就准备好了 AERMET 要读取的大气数据啰!

进行 AERMET 的程序编译

在 Linux 服务器上面运作模式有许多的好处,除了你能够让 aermet 的数据与所有同事共享之外 (只要有帐号), 也可以从任何地方取得同一份模式运作完的数据!此外,大家统一使用 Server 的资源,也可以不用担心会影响到你的 windows 工作用机器! 你也无须担心,如果你的 windows 死掉,或者是需要系统升级,会导致磁盘内的模式数据遗失!最后, Linux 系统的稳定性与资源分配都比 windows 来的好!因此,要跑模式,首选就是 Linux。

可惜的是, US EPA 编译完成的 AERMET 仅针对 Windows 系统,所以该代码无法在 Linux 上面运作。 为此,我们得要从 US EPA 下载原代码 (纯文本的代码文件),并且重新编译成为我们自己 Linux 可以运作的模样, 这样就能在我们的 Linux 上面运作了。整体流程也不难,鸟哥是以 CentOS 7 为范本进行编译, 你可以依据你的系统来进行重新改写的动作!

  • 步骤一:以管理员身份,安装好所需要的编译器以及函数库

首先,你必须要取得管理员的身份才行!如果不清楚如何处理,请向你的 Linux server 管理员询问。 假设你的身份已经是管理员了,接下来可以这样进行任务:

# 直接使用 CentOS 的 yum 功能,直接安装所需要的软件即可
[root@localhost ~]# yum -y groupinstall "Development Tools"
[root@localhost ~]# yum -y install libgfortran-static and glibc-static wget
[root@localhost ~]# gfortran -v
使用内置 specs。
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
目的:x86_64-redhat-linux
配置为:../configure --prefix=/usr --mandir=/usr/share/man .....
线程模型:posix
gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)

这样就搞定了我们编译过程中所需要的各项参数了!

  • 步骤二:文件下载与重新编辑编译脚本

你可以自己前往 US EPA 的官网下载所需要的软件,也可以通过底下的方式,直接使用你的 Linux server 在线直接下载原代码。 鸟哥这里使用的原代码为 v18081 这个版本~直接这样做即可:

# 
[user@localhost ~]$ cd ~/aermet
[user@localhost aermet]$ mkdir build
[user@localhost aermet]$ cd build
[user@localhost build]$ wget https://www3.epa.gov/ttn/scram/7thconf/aermod/aermet_source.zip
[user@localhost build]$ ll
-rw-rw-r--. 1 user user 475062  4月 27  2018 aermet_source.zip

[user@localhost build]$ unzip aermet_source.zip
[user@localhost build]$ vim compile.sh
#!/bin/bash

COMPILE_FLAGS=" -fbounds-check -Wuninitialized -Ofast -static -march=native -ffast-math -funroll-loops"
LINK_FLAGS=" -static -Ofast -march=native -ffast-math -funroll-loops"
sources="mod_AsosCommDates.for AERMET.FOR AERSURF.FOR AERSURF2.FOR ASOSREC.FOR AUDIT.FOR
	AUTCHK.FOR AVGCRD.FOR BANNER.FOR BULKRI.FOR CALMS.FOR CBLHT.FOR
	CHRCRD.FOR CHRCRD2.FOR CHROND.FOR CLHT.FOR CLMCRD.FOR CLOUDS.FOR
	COMPDT.FOR CUBIC.FOR CVG.FOR D028LV.FOR D144HD.FOR D144LV.FOR
	D3280H.FOR D3280L.FOR D6201H.FOR D6201L.FOR DATCRD.FOR DATER.FOR
	DEF256.FOR DEFINE.FOR DOCLDS.FOR DTCRD.FOR EQ_CCVR.FOR ERRHDL.FOR
	FDKEY.FOR FDPATH.FOR FETCH.FOR FLIWK1.FOR FLIWK2.FOR FLOPEN.FOR
	FLOS.FOR FLSDG.FOR FLSFC.FOR FLWRK1.FOR FLWRK2.FOR FMTCRD.FOR
	FNDCOMDT.FOR GEO.FOR GET620.FOR GETASOS.FOR GETCCVR.FOR GETFIL.FOR
	GETFLD.FOR GETFSL.FOR GETSFC.FOR GETTEMP.FOR GETWRD.FOR GMTLST.FOR
	GREG.FOR HDPROC.FOR HEADER.FOR HEAT.FOR HGTCRD.FOR HR0024.FOR
	HTCALC.FOR HTKEY.FOR HUMID.FOR HUSWX.FOR ICHRND.FOR INCRAD.FOR
	INTEQA.FOR INTHF.FOR ISHWX.FOR JBCARD.FOR LATLON.FOR LOCCRD.FOR
	LWRUPR.FOR MANDEL.FOR MDCARD.FOR MERGE.FOR MIDNITE.FOR MODEL.FOR
	MPCARD.FOR MPFIN.FOR MPHEAD.FOR MPMET.FOR MPOUT.FOR MPPBL.FOR
	MPPROC.FOR MPTEST.FOR MRCARD.FOR MRHDR.FOR MRPATH.FOR NETRAD.FOR
	NR_ANG.FOR NWSHGT.FOR OAUDIT.FOR OSCARD.FOR OSCHK.FOR OSDTCD.FOR
	OSDUMP.FOR OSFILL.FOR OSFILL2.FOR OSHRAV.FOR OSNEXT.FOR OSPATH.FOR
	OSPRNT.FOR OSQACK.FOR OSQAST.FOR OSRANGE.FOR OSREAD.FOR OSSMRY.FOR
	OSSUMS.FOR OSSWAP.FOR OSTEST.FOR OSTRA.FOR OSWRTE.FOR OTHHDR.FOR
	P2MSUB.FOR PRESET.FOR PTAREA.FOR PTGRAD.FOR RDHUSW.FOR RDISHD.FOR
	RDLREC.FOR RDSAMS.FOR READRL.FOR REALQA.FOR RHOCAL.FOR RNGCRD.FOR
	SAMWX.FOR SAUDIT.FOR SBLHT.FOR SCNGEN.FOR SECCRD.FOR SECCRD2.FOR
	SETHUS.FOR SETSAM.FOR SETUP.FOR SFCARD.FOR SFCCH.FOR SFCCH2.FOR
	SFCCRD.FOR SFCCRD2.FOR SFCHK.FOR SFCWXX.FOR SFEXST.FOR SFEXT.FOR
	SFPATH.FOR SFQASM.FOR SFQAST.FOR SFQATM.FOR SFTRA.FOR SMTHZI.FOR
	STONUM.FOR SUBST.FOR SUMHF.FOR SUMRY1.FOR SUMRY2.FOR SUNDAT.FOR
	TDPEST.FOR TEST.FOR THRESH1MIN.FOR UACARD.FOR UACHK.FOR UAEXST.FOR
	UAEXT.FOR UAMOVE.FOR UAPATH.FOR UAQASM.FOR UAQAST.FOR UATRA.FOR
	UAUDIT.FOR UAWNDW.FOR UCALCO.FOR UCALST.FOR VALCRD.FOR VARCRD.FOR
	VRCARD.FOR WRTCRD.FOR YR2TOYR4.FOR YR4TOYR2.FOR XDTCRD.FOR XTNDUA.FOR"

for file in ${sources}
do
        gfortran -m64 -c ${COMPILE_FLAGS} ${file}
done

gfortran -m64 -o aermet.exe ${LINK_FLAGS}  mod_AsosCommDates.o AERMET.o AERSURF.o  AERSURF2.o ASOSREC.o AUDIT.o  AUTCHK.o  AVGCRD.o  \
        BANNER.o  BULKRI.o  CALMS.o  CBLHT.o  CHRCRD.o  CHRCRD2.o  CHROND.o  CLHT.o  CLMCRD.o  CLOUDS.o  \
        COMPDT.o  CUBIC.o  CVG.o  D028LV.o  D144HD.o  D144LV.o  D3280H.o  D3280L.o  D6201H.o  D6201L.o   \
        DATCRD.o  DATER.o  DEF256.o  DEFINE.o  DOCLDS.o  DTCRD.o  EQ_CCVR.o  ERRHDL.o  FDKEY.o FDPATH.o  \
        FETCH.o  FLIWK1.o  FLIWK2.o  FLOPEN.o  FLOS.o  FLSDG.o  FLSFC.o  FLWRK1.o  FLWRK2.o  FNDCOMDT.o  \
        FMTCRD.o  GEO.o  GET620.o  GETASOS.o  GETCCVR.o  GETFIL.o  GETFLD.o  GETFSL.o  GETSFC.o  GETTEMP.o  GETWRD.o  GMTLST.o  GREG.o  HDPROC.o  HEADER.o  HEAT.o \
        HGTCRD.o  HR0024.o  HTCALC.o  HTKEY.o  HUMID.o  HUSWX.o  ICHRND.o  INCRAD.o  INTEQA.o  INTHF.o  ISHWX.o  JBCARD.o \
        LATLON.o  LOCCRD.o  LWRUPR.o  MANDEL.o  MDCARD.o  MERGE.o  MIDNITE.o  MODEL.o  MPCARD.o  MPFIN.o  MPHEAD.o  MPMET.o \
        MPOUT.o  MPPBL.o  MPPROC.o  MPTEST.o  MRCARD.o  MRHDR.o  MRPATH.o  NETRAD.o  NR_ANG.o  NWSHGT.o  OAUDIT.o  OSCARD.o \
        OSCHK.o  OSDTCD.o  OSDUMP.o  OSFILL.o  OSFILL2.o  OSHRAV.o  OSNEXT.o  OSPATH.o  OSPRNT.o  OSQACK.o  OSQAST.o  OSRANGE.o  OSREAD.o  OSSMRY.o \
        OSSUMS.o  OSSWAP.o OSTEST.o  OSTRA.o  OSWRTE.o  OTHHDR.o  P2MSUB.o  PRESET.o  PTAREA.o  PTGRAD.o  RDHUSW.o  RDISHD.o  RDLREC.o \
        RDSAMS.o  READRL.o  REALQA.o  RHOCAL.o  RNGCRD.o  SAMWX.o  SAUDIT.o  SBLHT.o  SCNGEN.o  SECCRD.o  SECCRD2.o  SETHUS.o \
        SETSAM.o  SETUP.o  SFCARD.o  SFCCH.o  SFCCH2.o  SFCCRD.o  SFCCRD2.o  SFCHK.o  SFCWXX.o  SFEXST.o  SFEXT.o  SFPATH.o  \
        SFQASM.o  SFQAST.o  SFQATM.o  SFTRA.o  SMTHZI.o  STONUM.o  SUBST.o  SUMHF.o  SUMRY1.o  SUMRY2.o  SUNDAT.o  TDPEST.o \
        TEST.o  THRESH1MIN.o UACARD.o  UACHK.o  UAEXST.o  UAEXT.o  UAMOVE.o  UAPATH.o  UAQASM.o  UAQAST.o  UATRA.o  UAUDIT.o  UAWNDW.o  \
        UCALCO.o  UCALST.o  VALCRD.o  VARCRD.o  VRCARD.o  WRTCRD.o  YR2TOYR4.o  YR4TOYR2.o  XDTCRD.o  XTNDUA.o

[user@localhost build]$ sh compile.sh
[user@localhost build]$ ll aermet.exe
-rwxrwxr-x. 1 user user 2900600  7月 25 00:16 aermet.exe

[user@localhost build]$ cd ~/aermet/
[user@localhost aermet]$ ln -s build/aermet.exe .
[user@localhost aermet]$ ll
lrwxrwxrwx. 1 user user      16  7月 25 00:21 aermet.exe -> build/aermet.exe   <==这就是重点!
drwxrwxr-x. 2 user user   12288  7月 25 00:16 build
drwxrwxr-x. 2 user user    4096  7月 24 16:49 cwb
-rw-rw-r--. 1 user user 2995344  7月 24 23:57 cwb_2016_surface
-rw-rw-r--. 1 user user 5020300  7月 24 23:57 cwb_2016_upair
-rwxrwxr-x. 1 user user 1116552  7月 24 11:54 cwb2aermet-static.exe
-rw-rw-r--. 1 user user 1352736  7月 24 23:57 SF_2016_467440.EXT
-rw-rw-r--. 1 user user 1020756  7月 24 23:57 UP_2016_466920.FSL

这样就编译好了 AERMET 主代码!接下来的三个步骤,全部都需要用到这个家伙喔!

step 2: 处理 AERMET 的 stage1 流程

如同上述的数据,要完成 AERMET 的处理,需要有三个基本的阶段 (stage),第一个阶段是解析出我们需要的数据, 第二个阶段则是集成地面数据与探空数据成为唯一的一个气象档,第三个阶段则是处理出地面数据+探空数据两个 AERMOD ready 的文件。 全部的三个阶段都是使用刚刚我们编译成功的 aermet.exe 来运行的。那 aermet 怎么知道要处理那一个阶段呢?这就需要我们撰写设置档来处置了。

至于设置档的文件名,通常扩展名会指定为 .inp 就是了,而设置档内容大致分为 6 个部份,这 6 部份可称为设置关键字或路径 (pathway):

  • JOB:说明整体运作的信息
  • UPPERAIR:处理探空数据 (sounding data) 的解析与数据保证工作
  • SURFACE:处理地面观测站逐时气象数据
  • ONSITE:用户提供的测站当地大气信息
  • MERGE:集成大气数据
  • METPREP:评估给 AERMOD 使用的边界层参数

假设以我们这次仿真的 2016 年全年高雄地区的 AERMET stage1 的设置为例,它的设置内容,有点类似这样:

JOB
    MESSAGES       MSG.STAGE1
    REPORT         RPT.STAGE1

UPPERAIR
    DATA           UP_2016_466920.FSL FSL
    EXTRACT        UP_2016_466920.EXT
    QAOUT          UP_2016_466920.QA
    XDATES         2016/01/01 TO 2016/12/31
    LOCATION       466920 25.04N 121.51E -8
    AUDIT          UAPR UAHT UATT UATD UAWD UAWS

** 这底下是关于地面测站,其中 SF_2016_467440.EXT 就是直接从气象局数据转换得来的文件
SURFACE
    EXTRACT        SF_2016_467440.EXT
    QAOUT          SF_2016_467440.QA
    XDATES         2016/01/01 TO 2016/12/31
    LOCATION       467440 22.566N 120.316E 0 2.3

基本语法说明如下:

  • 每一个路径在同一个设置档中,基本上只能出现一次,且该路径全部的细部设置,都需要连续写在同一个区块中。以上述的内容为例, 若以 JOB 来看,它里面有两个设置,分别是 MESSAGES 以及 REPORT,那么这两个设置就一定要在该 JOB 底下!不能写在其他地方,是这样的意思。
  • 每一行设置值,最大只能到 132 个字符,这 132 个字符包含前面的空白字符喔!
  • 可以拥有空白行,为了让整个设置档更容易了解。
  • 在每一行的第 1, 2 个字符,如果出现两个星号 (**) 时,那一行就是注解。因此,如果你针对该行有什么特别的说明,担心自己忘记时, 就可以使用这样的方式处理。但请注意,不是每一行出现的第 1, 2 个字符串喔,是每一行第 1, 2 个字符,就是行首的意思! 例如上述范例中的说明喔!
  • 英文本可以是大写也能是小写,因为缺省是给 Windows 系统运作的。不过,因为我们将之改版成为 Linux 版本,Linux 大小写是不同的。 因此,在 AERMET 的说明文档中,它建议文件名最好都使用大写!这是因为 AERMET 会主动的将设置档内的文本都自动更改为大写, 所以,如果文件名使用小写英文的话,AERMET 会找不到文件名!所以,都用大写吧!
  • 在每一个 pathway (如 JOB, UPPERAIR) 里面,有很多的设置值 (keyword),某些设置值是主要的,一定要存在于 pathway 里面, 某些则是参数类型,可有可无。某些设置是可以重复出现的!底下我们在 stage3 时,就会看到重复出现的一些设置值喔!

再回头来看一下,我们现在有的文件有两个,其中探空数据是尚未经过 QA 的类型,但是地面数据则已经是经过 QA 之后的类型了。 也就是说:

  • UP_2016_466920.FSL :内容是尚未经过 QA 的探空数据型态,格式为 FSL 格式;
  • SF_2016_467440.EXT :内容是已经经过 QA 的地面观测值,所以直接用在 AERMET 即可。

现在,让我们来创建这个 stage1.inp 的输入文件:

[user@localhost ~]$ cd ~/aermet
[user@localhost aermet]$ vim stage1.inp
** 这个部份在说明整体工作的意思,消息输出在 MSG.STAGE1 的内容,报告则在 RPT.STAGE1 啰!
JOB
    MESSAGES       MSG.STAGE1
    REPORT         RPT.STAGE1

** 这个部份在讲解地面观测值!其中 SF_2016_467440.EXT 是鸟哥程序转换过来的,AERMET 自动生成 SF_2016_467440.QA
SURFACE
    EXTRACT        SF_2016_467440.EXT
    QAOUT          SF_2016_467440.QA
    XDATES         2016/01/01 TO 2016/12/31
    LOCATION       467440 22.566N 120.316E 0 2.3
    AUDIT          PRCP SLVP PRES TMPD DPTP RHUM WDIR WSPD

** 这个部份在讲探空数据,其中 UP_2016_466920.FSL 是经过鸟哥程序转换过来的,AERMET 会主动生成 UP_2016_466920.EXT 与 UP_2016_466920.QA
UPPERAIR
    DATA           UP_2016_466920.FSL FSL
    EXTRACT        UP_2016_466920.EXT
    QAOUT          UP_2016_466920.QA
    XDATES         2016/01/01 TO 2016/12/31
    LOCATION       466920 25.04N 121.51E -8
    AUDIT          UAPR UAHT UATT UATD UAWD UAWS

上述的文件中,除了 JOB 的内容大致上就是转档过程中的错误消息告知 (例如原始数据是否有缺值、是否有其他数值不合理而改变等等), 在地面观测值与探空数据的说明如下:

  • DATA:指的就是 AERMET 所需要的观测值未格式化之前的数据,因为我们的探空数据只能做成符合 AERMET 的 INPUT 数据, 因此,只有在 UPPERAIR 的路径里面拥有这个信息而已,而且,主要的格式为 FSL 喔!
  • EXTRACT:解开我们需要的数据后,转出的文件。因为地面观测值 (SURFACE) 的数据已经是从中央气象局转换过来的, 所以,地面测站的数据就是从中央气象局过来的数据,无须重新解开。至于探空数据则需要重新解开取得所需要的内容。 因此,在 UPPERAIR 的部份,这个文件名得要重新另存一个新档,通常扩展名就会是 .EXT (EXTRACT) !
  • QAOUT:进行数据品质保证工作的过程档,也是 AERMET 自己生成的!通常扩展名会取 .QA
  • XDATES:就是取得测站的数据的年月日!通常都是整年的数据!因此,就给开头 (2016/01/01) 到结尾 (2016/12/31) 的数据即可! 中间使用 TO 来链接~
  • LOCATION:就是测站点的位置!所以,请继续前往底下的网站,找出来探空数据以及地面测站的经纬度座标。LOCATION 的内容比较需要注意:
    • 气象局测站数据:https://e-service.cwb.gov.tw/wdps/obs/state.htm
    • 第一个数值就是测站代码,测站代码请由上面的链接找出来!测站代码不能写错,写错的话,AERMET 会找不到数据喔!
    • 第二个数值是纬度,需要填写北纬或南纬。台湾在北纬,所以才会是 22.566N 或 25.04N 之类的。
    • 第三个数值是精度,需要填写东经会西经。台湾在东经,所以才会是 120.316E 或 121.51E。
    • 第四个数值是时间转换。地面观测数据原本就是台湾地区本地时间,所以无须转换。但是探空数据全球都统一使用格林威治时间 (GMT or UTC), 因此需要转换时间成为台湾时间。不过由于 AERMET 是美国环保署发展的,为了方便他们自己,所以时区全部为正值。 台湾时间则需要填写为负值 (-8) 才行!这个第一次接触 AERMET 的朋友,可能会完全搞混啦!要注意!要注意!
    • 第五个数值则是地表高度,这个数值只对地面测站有意义,探空数据的这个数值会被忽略!
  • AUDIT:刚刚上面不是讲到 QA (数据的品质保证) 嘛?那是针对哪些数据进行呢?数据的简写可以参考 AERMET 用户手册 B-1, B-2 的表格。 我们这里仅列出我们有兴趣的部份数据检测而已:
    • PRCP:降水量,数值为: mm * 1000
    • SLVP:水平面气压,单位为 hpa*10
    • PRES:测站点的气压,单位 hpa*10
    • TMPD:干球温度 °C * 10
    • DPTP:露点温度 °C * 10
    • RHUM:相对湿度,单位 %
    • WDIR:风向,360 度角,北风为 0 度,东风 90 度这样。
    • WSPD:风速,单位 m/s * 10
    • UAPR:大气压力, hpa * 10
    • UAHT:高度, m
    • UATT:干球温度 °C * 10
    • UATD:露点温度 °C * 10
    • UAWD:风向,360 度角
    • UAWS:风速 m/s*10

这个设置档设置妥当之后,接下来就是需要运行!运行过程也是很简单!下达这样的指令即可:

[user@localhost aermet]$ ./aermet.exe stage1.inp
   AERMET Version  18081

   Pre-processing the Setup Information

   Processing the Setup Information

              ********************************************************
              ***        AERMET Setup Finished Successfully        ***
              ********************************************************

+  Stage 1: Extracting upper air data for month/day/year 01/01/16
+  Stage 1: Extracting upper air data for month/day/year 01/01/16
.....
+  Stage 1: Extracting upper air data for month/day/year 12/31/16
+  Stage 1: Extracting upper air data for month/day/year 12/31/16

+  Stage 1: QA'ing upper air data for month/day/year 01/01/16
+  Stage 1: QA'ing upper air data for month/day/year 01/01/16
....
+  Stage 1: QA'ing upper air data for month/day/year 12/31/16
+  Stage 1: QA'ing upper air data for month/day/year 12/31/16

+  Stage 1: QA'ing surface data for month/day/year 01/01/16
+  Stage 1: QA'ing surface data for month/day/year 01/02/16
....
+  Stage 1: QA'ing surface data for month/day/year 12/31/16
   Processing completed; writing summary files


              ********************************************************
              ***   AERMET Data Processing Finished Successfully   ***
              ********************************************************

   The Summary Report Generated by AERMET Is In:
     RPT.STAGE1
# 对!这样就跑完了!过程会有相当相当多的信息,每天会跑出一个信息!所以要注意查看。

[user@localhost aermet]$ ll
-rw-rw-r--. 1 user user   10346  7月 26 15:03 MSG.STAGE1           <==主要的消息输出档
-rw-rw-r--. 1 user user   13091  7月 26 15:03 RPT.STAGE1           <==成果报告档
-rw-rw-r--. 1 user user 1352736  7月 24 23:57 SF_2016_467440.EXT   <==中央气象局地面观测转出档
-rw-rw-r--. 1 user user 1353656  7月 26 15:03 SF_2016_467440.QA    <==AERMET QA 后的文件
-rw-rw-r--. 1 user user     987  7月 26 14:51 stage1.inp           <==我们刚刚上头撰写的参数设置档
-rw-rw-r--. 1 user user  767656  7月 26 15:03 UP_2016_466920.EXT   <==经由 FSL 转档过来的数据
-rw-rw-r--. 1 user user 1020756  7月 24 23:57 UP_2016_466920.FSL   <==中央气象局取得的探空数据
-rw-rw-r--. 1 user user  767620  7月 26 15:03 UP_2016_466920.QA    <==AERMET QA 后的文件

有兴趣的话,我个人建议你一定要去 MSG.STAGE1 看看,因为所有的可能错误消息都在里面!比较多的数据都是『缺值』! 例如中央气象局的探空数据,可能因为某些缘故有缺乏~缺乏数据时,AERMET 会略过啦!

step 3: 处理 AERMET 的 stage2 流程

Stage2 的流程很简单,就是要将刚刚创建好的经过 QA 的文件集成成为一个气象场文件数据!连设置档的内容都很单纯!

[user@localhost aermet]$ vim stage2.inp
JOB
    MESSAGES       MSG.STAGE2
    REPORT         RPT.STAGE2

UPPERAIR
    QAOUT          UP_2016_466920.QA  <==由 stage1 产生的 QA 文件

SURFACE
    QAOUT          SF_2016_467440.QA  <==由 stage1 产生的 QA 文件

MERGE
    OUTPUT         MERGE.STAGE2       <==预计要创建的唯一气象场文件
    XDATES         2016/01/01 TO 2016/12/31

比较重要的是 MERGE 这个 pathway,这个路径主要在处理 stage2 的集成工作!最重要的就是输出 (OUTPUT) 这个设置值就是了! 所以整体设置很单纯!接下来,你只要这样运行即可:

[user@localhost aermet]$ ./aermet.exe stage2.inp
   AERMET Version  18081

   Pre-processing the Setup Information

   Processing the Setup Information

              ********************************************************
              ***        AERMET Setup Finished Successfully        ***
              ********************************************************

+  Stage 2: Merging month/day/year 01/01/16
+  Stage 2: Merging month/day/year 01/02/16
.....
+  Stage 2: Merging month/day/year 12/30/16
+  Stage 2: Merging month/day/year 12/31/16
   Processing completed; writing summary files


              ********************************************************
              ***   AERMET Data Processing Finished Successfully   ***
              ********************************************************

   The Summary Report Generated by AERMET Is In:
     RPT.STAGE2

[user@localhost aermet]$ ll
-rw-rw-r--. 1 user user 4072136  7月 26 15:14 MERGE.STAGE2
-rw-rw-r--. 1 user user     543  7月 26 15:14 MSG.STAGE2
-rw-rw-r--. 1 user user   19539  7月 26 15:14 RPT.STAGE2
-rw-rw-r--. 1 user user     240  7月 26 15:14 stage2.inp

新产生的数据也不过就是上述的文件而已。比较重要的是第一个 MERGE.STAGE2 文件名!这个是等等 stage3 会用到的文件喔!

step 4: 处理 AERMET 的 stage3 流程

AERMET 的第三阶段,就是要产生 AERMOD 能够读取的气象数据了!而当中最重要的,大概就是 PBL 的相关信息!其中就以仿真区域的地表特征最重要! 我们在前一章节有提到流体力学的特性,在表面的时候,可能会有流速为 0 的情境发生!但是这个流体的情况与表面粗糙度有关! 因此,在设计仿真区域的特征时,就得要提供这方面的仿真表面数据才行。

基本上,仿真范围内的地表面,不可能都是一模一样的!因此,US EPA 有另外提供一个名为 AERSURFACE 的模块来处理! 不过,AERSURFACE 还是需要其他地形特征的输入参数才可以运作,因此,这里我们还是将仿真区域假设为单一样貌的地表特征! 这样比较好处理。

台湾地区的土地利用型态研究,通过环保署的项目计划结果,可以使用底下的数据来设置喔!

环保署模式技术支持计划提供的参考值
环保署模式技术支持计划提供的参考值 (ps3, page 4-209)

如果以我们这个案例当中想要仿真的高雄市区来说,应该是可以选择 7 号都市区的设置值。那么就来瞧一瞧 stage3.inp 的内容应该要有哪些设置吧!

[user@localhost aermod]$ vim stage3.inp
JOB
    MESSAGES       MSG.STAGE3
    REPORT         RPT.STAGE3

METPREP
    DATA           MERGE.STAGE2
    XDATES         2016/01/01 TO 2016/12/31
    MODEL          AERMOD
    METHOD         WIND_DIR RANDOM
    METHOD         REFLEVEL  SUBNWS
    METHOD         STABLEBL BULKRN
    METHOD         ASOS_ADJ NO_ADJ
    METHOD         UASELECT SUNRISE
    NWS_HGT        WIND      14

    OUTPUT         aermet_2016_467440.SFC
    PROFILE        aermet_2016_466920.PFL

    FREQ_SECT      ANNUAL 1
    SECTOR         1    0   360
    SITE_CHAR      1   1  0.16  0.8  1.2

METPREP 这个 pathway 主要是在进行大气信息的评估计算,里面的设置值大概有这些:

  • DATA:就是来自 stage2 集成的那个唯一气象数据文件!
  • XDATES:就是 2016 一整年
  • MODEL:主要的输出数据是给 AERMOD 用的!这一般也是默认值
  • METHOD:主要的大气特征评估方式,若需要详细的信息,则请参考 AERMET 手册
  • NWS_HGT:主要就是测站风速采样点的高度,一般采样口高度大概在 10m 左右!
  • OUTPUT:就是地面测站的观测数据以及相关 PBL 的信息。
  • PROFILE:就是高空数据的风速风向等大气信息
  • FREQ_SECT:就是地表数据的设置值,后续的 ANNUAL 指全年一样,且设置号码为 1 号
  • SECTOR:仿真区域的分区,针对上述的 1 号区域设计,范围为 0~360 度,代表全区!
  • SITE_CHAR:针对第 1 号的第 1 个分区,设计的三个数值。数值请参考上表!

设计妥当之后,自然就是开始跑啰!运行过程也是很简单:

[user@localhost aermet]$ ./aermet.exe stage3.inp
   AERMET Version  18081

   Pre-processing the Setup Information

   Processing the Setup Information

              ********************************************************
              ***        AERMET Setup Finished Successfully        ***
              ********************************************************

+  Stage 3: Now processing month/day/year 01/01/16
+  Stage 3: Now processing month/day/year 01/02/16
....
+  Stage 3: Now processing month/day/year 12/30/16
+  Stage 3: Now processing month/day/year 12/31/16
   Processing completed; writing summary files


              ********************************************************
              ***   AERMET Data Processing Finished Successfully   ***
              ********************************************************

   The Summary Report Generated by AERMET Is In:
     RPT.STAGE3

[user@localhost aermet]$ ll
-rw-rw-r--. 1 user user  579744  7月 27 00:48 AERMET_2016_466920.PFL  <==这个是高空气象场
-rw-rw-r--. 1 user user 1554894  7月 27 00:48 AERMET_2016_467440.SFC  <==这个是地面测站数据喔!
-rw-rw-r--. 1 user user   60385  7月 27 00:48 MSG.STAGE3
-rw-rw-r--. 1 user user   23565  7月 27 00:48 RPT.STAGE3
-rw-rw-r--. 1 user user     572  7月 27 00:22 stage3.inp

如上所示,跑出来的最终两个文件,就是我们需要的 AERMOD 的输入参数了!就这么简单喔!

风花图的制作

完成了 AERMET 的输出之后,再来就是最好拿个分析软件,探索一下风向变化是否符合实际的环境!毕竟,许多转换软件, 或者是自己撰写的软件,可能会有部份错误的数据转换。鸟哥写的第一版转档数据,也是出现过数据不符合的情况 (这是因为 AERMET 是给美国本土的数据处理,跟我们认知的中央气象局的数具有点不同!),跑完 AERMOD 害我吓一跳!所以, 还是分析一下比较好。最简单的分析,就是探索风向的风花图!

绘制风花图最简单的软件就是由 Lakes Environmental Software 所开发的 WRPLOT View 这个软件! 相关的链接位置在底下的超链接上面,请自行前往下载正确的文件来安装处理。不过, WRPLOT View 是 windows 的软件, 这意味着,您得要将刚刚在 Linux 上面产生的文件下载到你的 windows 系统上面才行。

软件下载完毕之后,先前往该上述链接去按下『 Registration 』,并进入到注册的页面,开始进行注册! 注册完毕之后,Lakes 公司会提供一组验证码给妳,该验证码可以让你的软件操作使用一年 (详细情况,请参考 Lakes 提供给您的认证信的说明)。之后就开始在你的 windows 上面点击两下刚刚下载的软件, 安装妥当之后,直接点击『 WRPLOT View 』,该软件会提醒『Do you want to register WRPLOT Viewer now?』, 点击『Yes』之后,输入刚刚收到的信件内容的启动码,这样就可以开始使用该软件了。

如果经过一年之后,还想使用这个软件呢?那就请再次的前往上述的网站注册 (register),然后再次的启动该软件, 就又可以再用一年喔!软件启动之后会有点像这样:

WRPLOT viewer 软件操作与运行
WRPLOT viewer 软件操作与运行

如上,选择『 Add File 』的按钮,并将刚刚我们创建好的 aermet 属于 SFC 的文件名加载即可!加载之后, 就会出现如下的图标!注意看到测站的代码以及日期有没有问题!同时,缺省的情况下,风花图会是全年的平均! 如果你只想要看某些日期 (不同的季节),就得要在底下的 Date Range 项目底下去指定了!

WRPLOT viewer 软件操作与运行
WRPLOT viewer 软件操作与运行

如果一切都 OK 没啥大问题,你就可以点击『 Wind Rose 』的按钮,即可看到如下的风花图的图标啰!相当有趣! 如果还想要知道其他的频率相关问题,就直接点击其他的页面查阅即可!

WRPLOT viewer 软件操作与运行
WRPLOT viewer 软件操作与运行

这个软件非常简单!希望大家用的开心!

参考数据

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

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