CMAQ代码说明
代码结构分析
drive.F 主程序
- 一些数组说明:
- CGRID,指针,指向PCGRID,所有物种瞬时浓度的存储数组
- AGRID平均浓度的数组,输出时在wr_aconc.F文件中判断是否是输出物种和输出层数
- SGRID输出到CONC文件的瞬时物种浓度的数组,即CGRID的子集
- 依次运行的模块
- GRID_INIT():网格定义
- CGRID_SPCS_INIT():物种定义
- PAGRD_INIT():PA模块网格定义
- PCGRID_INIT():定义物种PCGRID数组
- CONC_DEFN() | A_CONC_DEFN():获取输出的CONC、ACONC文件对应的物种名称
- WVEL_INIT():读取环境变量“CTM_WVEL” ,是否输出沉降速度
- INITSCEN():输出IC到CONC文件
- PA_INIT():PA模块初始化,创建输出文件并初始化数组
- FLCHECK():文件header信息检查
- 分配相关数组的内存:AGRID、RCONC、CFLAG、ASTEP
- ADVSTEP():计算时步
- SCIPROC():理化过程计算程序
- 调用的子程序
- GRID_CONF.F 网格设置,会调用HGRD_DEFN.F和VGRD_DEFN.F, 其中,HGRD读取”GRIDDESC”文件,VGRD读取MET_CRO_3D文件中的垂直信息
- CGRID_SPCS.F 物种设置,读取GC_nml,AE_nml等物种定义文件
- PAGRD_DEFN.F 读取环境变量中的一些设置,PA模块有关
- PCGRID_DEFN.F 定义物种数组,PCGRID, 这是CGRID指针的目标,即CGRID指向PCGRID
- STD_CONC.F、AVG_CONC.F 定义物种名称CONC_SPCS、AVG_SPCS
- initscen.F 输出IC到CONC文件
- pa_init.F、flcheck.F
- advstep.F 根据CFD条件(Courant-number conditions)计算时步,TSTEP(2)指运行的时间步长,TSTEP(1)指输出的时间步长(run脚本设置,在initscen.F读取),NREPS指输出时间步长中的时步数量,NREPS=TSTEP(1)/TSTEP(2)
- sciproc.F 理化过程
SCIPROC程序说明
CHEM: grdriver.F
- 第一次运行需要smvgear初始化 GRVARS_INIT、GRINIT、JSPARSE
- 排放:默认不需要
- 定义MET_CRO_3D文件的网格的起始位置 (注意boxmodel待修改) SUBHFILE(MET_CRO_3D)
- FIND_DEGRADED:确定degradation(降解)的物种
- 从气象文件中读取TA, QV, DENS, PRES
- PHOT.F 计算光解速率-这里会读取气象数据, 主要流程:
- 初次运行:
- SUBHFILE: GRID_CRO_2D,MET_CRO_2D,MET_CRO_3D
- LOAD_REF_DATA():读取CSQY_DATA文件中的数据
- 从GRID_CRO_2D读取纬度 LAT
- 判断landuse类型,计算FRACTION_LANDUSE;判断是否有SEAICE变量;定义一些数组
- 读取经度LON, 计算CONLAT, SINLAT
- 读取地面高度HT
- O3和NO2指针
- 读取一些变量:SNOCOV (snow cover)
- 太阳相关参数计算,输入经纬度、年份和天,SOLEFM3
- 计算太阳高度角:GETZEN2
- 判断是否是夜晚 DARK
- 读取变量:ZH、ZF、DENS、TA、PRES、WBAR、CLDT、CLDB、CFRAC
- AERO_PHOTDATA:计算气溶胶特性
- NEW_OPTICS:计算晴空光解速率
- NEW_OPTICS:计算有云情况下光解速率
- 初次运行:
- 进入block循环:
- PA_IRR_CKBLK、PA_IRR_BLKSTRT
- CALCKS:计算反应速率
- INIT_DEGRADE
- SMVGEAR:化学模块积分
- FINAL_DEGRADE
AERO: aero_driver.F
第一次运行,初始化:
- 打开气象文件
- 打开能见度文件 OPVIS: opvis.F
- 打开气溶胶参数(粒径和标准差)文件OPDIAM: opdiam.F
- 定义MET_CRO_3D文件的网格的起始位置 (注意boxmodel待修改) SUBHFILE(MET_CRO_3D)
读取气象:PRES、TA、QV、DENS、GSW
进入格点循环:
- 从CGRID数组中提取相关数据:EXTRACT_AERO、EXTRACT_PRECURSOR、EXTRACT_SOA
- 计算气溶胶过程 AEROPROC: aero_subs.F
- GETPAR: getpar.f 计算M3, mass, 气溶胶密度,直径
- ORGAER: SOA传统生成路径, SOA_DEFN.F
- POAAGE:POA氧化,poaage.F
- HETCHEM:非均相反应(N2O5, sulfate, GLY, MGLY),hetchem.f
- GETPAR
- VOLINORG:NPF和SNA+Cl的气粒转化
- coagulation:GETCOAGS
- GETPAR
- 更新CGRID数组:UPDATE_AERO、UPDATE_PRECURSOR、UPDATE_SOA
- 计算每个模态中PM2.5的占比:INLET25: aero_subs.F
- 输出:
- 计算能见度相关 GETVISBY:aero_subs.F
- 计算不同模态 M2 and M3值
- 粒径分布 计算直径和标准差 GETPAR
气溶胶排放处理:
```fortran
EMIS_DEFN.F 排放处理主程序,会调用AERO_EMIS_INIT 和 GET_AERO_EMISAERO_EMIS.F
AERO_EMIS_INIT
GET_AERO_EMIS1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
## 非均相机制修改说明
1. smvgear chem solver 修改文件:
```fortran
! part 1. 准备mech.def文件,增加
! iorganic heteorogeneous reactions from hetchem version 5.0.2
<HET_N2O5> N2O5 = 2.0*HNO3 # 1.0~<HETERO_N2O5IJ>;
<HET_N02I> NO2 = ANO3I # 1.0~<HETERO_NO2I>;
<HET_NO2J> NO2 = ANO3J # 1.0~<HETERO_NO2J>;
<HET_SO2I> SO2 = ASO4I # 1.0~<HETERO_SO2I>;
<HET_SO2J> SO2 = ASO4J # 1.0~<HETERO_SO2J>;
<HET_HO2> HO2 = # 1.0~<HETERO_HO2>;
! part 2. 运行chemech工具,生成RXNS_DATA_MODULE.F90和RXNS_FUNC_MODULE.F90
! 将这两个文件替换成新的
! part 3. 修改下面两个文件
AEROSOL_CHEMISTRY.F ! 主要涉及非均相反应速率
grdriver.F ! 增加DORN变量,判别白天夜间
box model 修改
代码上的改动
- 增加rdconc.F 文件,读取observation数据; 并在FILES_CTM.EXT中增加GAS_DATA定义
- 修改driver.F文件,将读取的obs赋值到CGRID数组
- 修改sciproc.F文件,开关相应的过程
- 修改EMIS_DEFN.F文件,注释和MGEMIS有关的项,同时修改ASX_DATA_MOD.F,注释OCEAN_1相关,这样不需要准备ocean文件了
- 修改Makefile,增加rdconc
- 修改initscen.F,注释CALL OPWDEP,不生成WETDEP文件
输入文件
1 | ICON_eastasia36_EASTASIA36_profile |
ekman曲线
- 运行VOC+NOx两组实验,每组(0, 0.2, 0.4, 0.6, 0.8, 1, 1.2),共49组实验
- 存在问题:
- 观测数据缺少NO:增加FixNOratio 选项,根据模拟的NO/NO2比例,基于NO2的观测设置NO的浓度
- 观测数据缺少$NH_3$: 模式中NH3消耗很快,基本都是0,因此增加输入NH3排放
- 模拟的臭氧浓度很高:考虑沉降过程,sciproc中打开vdiff,需要METDOT3D文件
RIR分析
- 运行VOC物种
MCM版本
- MCM版本用于RIR分析
- 由于PA没有编译,不能分析硝酸盐的生成途径
S07版本
要模拟硝酸盐,NH3需要作为输入
PA 说明
- pa.inp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27! what(1) key, module and SID; SCCS file; date and time of last delta:
! @(#)pa.inp 2.1 /project/mod3/ICL/src/procan/pa/SCCS/s.pa.inp 12 Dec 1996 14:10:18
IRRTYPE =
PARTIAL;
IRR_OUTPUT HNO3prod = PROD[HNO3];
!DESCRIPTION = 'PROD change in HNO3';
IRR_OUTPUT HNO3fromNO2_OH = <25>;
IRR_OUTPUT HNO3fromN2O5_Gas = 2*<13>;
IRR_OUTPUT HNO3fromNO3_HO2 = 0.2*<39>;
IRR_OUTPUT HNO3fromNO3_Org = <BP07>+<BP10>+<BP13>+<BP33>+<BP36>
+<BP39>+<BP45>+0.15*<BP66>+<BP74>
+0.967*<BP77>+0.5*<BP56>+0.6*<IS31>;
IRR_OUTPUT HNO3fromNO2_Het = 0.5*<HET_N02>;
IRR_OUTPUT HNO3fromN2O5_Het = 2.0*<HET_N2O5>;
IRR_OUTPUT HNO3fromHET_N2O5 = <HET_N2O5IJ>+<HET_N2O5K>
+<HET_H2NO3PIJA>+<HET_H2NO3PKA>;
IRR_OUTPUT HNO3fromHET_NO55 = <HET_N2O5IJ>+<HET_N2O5K>;
IRR_OUTPUT HNO3fromHET_NO3 = <HET_NO3>;
IRR_OUTPUT HNO3fromOrganic = <HYD_MT>+2*<HYD_ISOP>;
ENDPA;- 对应的mech 方程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44!!! 气相反应
<13> N2O5 + H2O = 2*HNO3 # 1.00e-22;
<25> OH + NO2 = HNO3 # 3.2e-30^-4.50&3.0e-11&0.41&1.24;
<39> NO3 + HO2 = 0.8*OH + 0.8*NO2 + 0.2*HNO3 # 4.00e-12;
!!! 非均相反应
<HET_N2O5> N2O5 = 2.0*HNO3 # 1.0~<HETERO_N2O5IJ>;
! 注意是0不是O,估计在mech中写错了!!!
<HET_N02I> NO2 = ANO3I # 1.0~<HETERO_NO2I>;
<HET_NO2J> NO2 = ANO3J # 1.0~<HETERO_NO2J>;
<HET_N2O5IJ> N2O5 = HNO3 + H2NO3PIJ # 1.0~<HETERO_N2O5IJ>;
<HET_N2O5K> N2O5 = HNO3 + H2NO3PK # 1.0~<HETERO_N2O5K>;
<HET_H2NO3PIJA> H2NO3PIJ = HNO3 # 1.0~<HETERO_H2NO3PAIJ>;
<HET_H2NO3PKA> H2NO3PK = HNO3 # 1.0~<HETERO_H2NO3PAK>;
!!! 有机部分
<BP07> HCHO + NO3 = HNO3 + HO2 + CO # 2.00e-12@2431;
<BP10> CCHO + NO3 = HNO3 + MECO3 # 1.40e-12@1860;
<BP13> RCHO + NO3 = HNO3 + RCO3 # 1.40e-12@1601;
<BP33> GLY + NO3 = HNO3 + 0.70*HO2 + 1.40*CO + 0.3*HCOCO3
# 2.80e-12@2390;
<BP36> MGLY + NO3 = HNO3 + CO + MECO3 # 1.40e-12@1895;
<BP39> CRES + NO3 = HNO3 + BZO + XC # 1.40e-11;
<BP45> BALD + NO3 = HNO3 + BZCO3 # 1.34e-12@1860;
<BP66> IPRD + NO3 = 0.15*MACO3 + 0.15*HNO3 + 0.799*RO2C + 0.799*xHO2 +
0.051*RO2XC + 0.051*zRNO3 + 0.572*xCO + 0.227*xHCHO + 0.218*xRCHO +
0.008*xMGLY + 0.572*xRNO3 + 0.85*yR6OOH + 0.278*XN - 0.815*XC
# 1.00e-13;
<BP74> HOCCHO + NO3 = HNO3 + MECO3 # 1.0*K<BP10>;
<BP77> ACROLEIN + NO3 = 0.031*xHO2 + 0.967*MACO3 + 0.031*RO2C + 0.002*RO2XC +
0.002*zRNO3 + 0.967*HNO3 + 0.031*xCO + 0.031*xRNO3 + 0.033*yROOH +
0.002*XN - 1.097*XC # 1.18e-15;
<BP56> MACR + NO3 = 0.5*IMACO3 + 0.5*RO2C + 0.5*HNO3 + 0.5*xHO2 + 0.5*xCO +
0.5*yROOH + 1.5*XC + 0.5*XN # 1.50e-12@1815;
<IS31> NIT1 + NO3 = 0.6*NIT1NO3OOA + 0.6*HNO3 + 0.4*NIT1NO3OOB # 3.15e-13@448;
!!!
<HET_NO3> NO3 = HNO3 # 1.0~<HETERO_NO3>;
!!! 颗粒态硝酸盐水解
! Hydrolysis of particle-phase nitrates
<HYD_MT> AMTNO3J = HNO3 + 1.00*AMTHYDJ #9.259E-5;
<HYD_ISOP> AISOPNNJ = 2.0*HNO3 + 0.5*AMTHYDJ #9.259E-5;
- 问题:使用revised非均相机制NO2非均相的贡献很大
