aeroptical.F90
路径
LMDZ.MARS\util\aeroptical.F90
所属目录/模块
util
文件定位
aeroptical.F90 是 LMD Mars GCM 输出的离线气溶胶不透明度计算工具。它读取 diagfi.nc、stats.nc 或 concat.nc 类 NetCDF 文件中的气溶胶质量混合比、有效半径和大气密度 rho,再读取外部 ASCII 光学性质表,在用户指定参考波长处计算每种 aerosol 的 extinction 或 absorption opacity,输出 input_OPAext.nc 或 input_OPAabs.nc。
程序支持最多 20 种 aerosol。每种 aerosol 由一行输入指定:
<aerosol_name>,<aerosol_mmr>,<aerosol_reff>,<aerosol_rho>,<optpropfile_name>
其中 aerosol_reff 可以是 GCM 文件中的变量名,也可以是一个以 m 为单位的固定数值。若用户要求,还会计算柱积分光学厚度 tau_<aerosol_name>。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
aeroptical |
program |
1 |
主程序:读取用户配置、GCM 文件和光学表,计算 opa_* 和可选 tau_*。 |
status_check |
subroutine |
577 |
NetCDF 错误检查;非 nf90_noerr 时打印错误并停止。 |
inidims |
subroutine |
598 |
从输入 GCM 文件读取并复制经纬度、高度、时间、可选 controle,并定义输出维度。 |
init2 |
subroutine |
981 |
复制 aps/bps/ap/bp/sigma/aire/phisinit,并在需要时计算 delta_z。 |
依赖
| 依赖 |
用途 |
use netcdf |
使用现代 NetCDF Fortran nf90_* API 读写输入/输出文件。 |
aeropt_mod |
读取 ASCII 光学性质表,插值 Qext/omeg,创建 aerosol 日志并释放缓存。 |
调用的关键例程
| 被调用例程 |
所在位置 |
作用 |
nf90_open / nf90_create / nf90_close |
NetCDF 库 |
打开 GCM 文件、创建 *_OPAext.nc 或 *_OPAabs.nc、关闭文件。 |
nf90_inq_varid / nf90_get_var / nf90_get_att |
NetCDF 库 |
查找并读取 MMR、reff、rho、坐标、辅助变量和属性。 |
nf90_def_dim / nf90_def_var / nf90_put_att / nf90_put_var |
NetCDF 库 |
定义输出维度、坐标、opacity、tau 和辅助变量。 |
create_logfile |
aeropt_mod |
为每种 aerosol 创建 aeropt_log_<name>.txt。 |
read_optpropfile |
aeropt_mod |
读取对应 aerosol 的光学性质 ASCII 表。 |
interp_wvl_reff |
aeropt_mod |
在参考波长和有效半径处插值得到 Qext 与 omeg。 |
end_aeropt_mod |
aeropt_mod |
每种 aerosol 处理结束后释放光学表缓存。 |
inidims / init2 / status_check |
本文件 |
输出文件初始化、辅助字段复制、层厚计算和错误处理。 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
| GCM 输入文件名 |
stdin / aeroptical.def |
NetCDF 文件 |
- |
diagfi.nc、stats.nc、concat.nc 等。 |
datadir |
stdin / aeroptical.def |
目录 |
- |
光学性质 ASCII 文件所在目录。 |
wvl_val |
stdin / aeroptical.def |
标量 |
m |
输出不透明度校准的参考波长。 |
opatype |
stdin / aeroptical.def |
ext 或 abs |
- |
计算 extinction 或 absorption opacity。 |
compute_col |
stdin / aeroptical.def |
yes 或 no |
- |
是否计算柱积分光学厚度。 |
| aerosol 列表 |
stdin / aeroptical.def |
最多 20 行 |
- |
每行指定 aerosol 名称、MMR 变量名、reff 变量名或固定值、粒子密度和光学表名。 |
| MMR 变量 |
GCM NetCDF |
(lon,lat,alt,Time) |
kg/kg |
对应 aerosol 的质量混合比。 |
| reff 变量 |
GCM NetCDF 或用户固定值 |
(lon,lat,alt,Time) 或标量 |
m |
aerosol 有效半径。 |
rho |
GCM NetCDF |
(lon,lat,alt,Time) |
kg m-3 |
大气密度,opacity 公式必需。 |
zzlev / altitude / ap,bp,ps,rho / zareoid |
GCM NetCDF |
多种 |
m、km、Pa |
可选柱积分时用于构造层厚 delta_z。 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
input_OPAext.nc |
磁盘 NetCDF |
文件 |
- |
opatype=ext 时的输出文件。 |
input_OPAabs.nc |
磁盘 NetCDF |
文件 |
- |
opatype=abs 时的输出文件。 |
opa_<aerosol> |
输出 NetCDF |
(longitude,latitude,altitude,Time) |
opacity/km |
每层 extinction 或 absorption opacity。 |
tau_<aerosol> |
输出 NetCDF |
(longitude,latitude,Time) |
/ |
可选柱积分光学厚度。 |
delta_z |
输出 NetCDF |
(longitude,latitude,altitude,Time) |
km |
可选;柱积分使用的层厚。 |
| 坐标和辅助字段 |
输出 NetCDF |
多种 |
输入属性 |
longitude/latitude/altitude/Time,可选 controle、aps/bps/ap/bp/sigma/aire/phisinit。 |
aeropt_log_<name>.txt |
磁盘 ASCII |
文本 |
- |
每种 aerosol 的半径越界和相关缺测日志。 |
副作用
- 输出 NetCDF 使用
nf90_clobber,同名 *_OPAext.nc 或 *_OPAabs.nc 会被覆盖。
- 每种 aerosol 创建或覆盖一个
aeropt_log_<name>.txt。
- 读写大型 4D 数组,内存随
lon*lat*alt*time 和 aerosol 数量增长。
- 必需坐标、
rho、选中 MMR 变量、光学表、参考波长范围或柱积分层厚路径失败时会停止。
核心逻辑
- 读取用户输入:输入 GCM 文件、光学表目录、参考波长、opacity 类型、是否柱积分,以及 aerosol 列表。
- 解析 aerosol 列表:
reffname_aer 若能读成数值,视为固定有效半径并广播到全网格;
- 否则视为 GCM 文件中的有效半径变量名。
- 创建输出文件:
ext 输出 *_OPAext.nc;
abs 输出 *_OPAabs.nc。
- 复制坐标和辅助字段:
inidims 复制 longitude/latitude/altitude/Time 和可选 controle。
init2 复制 hybrid 或 sigma 坐标、aire、phisinit。
- 可选计算层厚
delta_z:
- 优先使用
zzlev 的界面高度,单位 m 转 km。
- 若 altitude
long_name 是 pseudo-alt,优先用 ap/bp/ps/rho 从层质量公式计算层厚,否则退到 pseudo-alt 中点差。
- 若 altitude 单位是
m,用 altitude 层中心差估算层厚。
- 若 altitude 单位是
Pa,要求 zareoid 存在,用 zareoid 层中心差估算层厚。
- 检查变量存在性:每种 aerosol 必须有 MMR;如果 reff 是变量名,也必须存在。不存在的 aerosol 被跳过;所有 aerosol 都不可算时停止。
- 读取
rho:全局读取 atmospheric density,所有 aerosol 共用。
- 逐 aerosol 计算 opacity:
- 读取 MMR 和 reff。
- 调
aeropt_mod 创建日志、读取光学表。
- 对固定 reff,只插值一次
Qext/omeg;对 reff 变量,在每个格点/层/时间插值。
- 若
Qext 或 MMR 缺测,输出缺测。
- extinction opacity 公式为:
opa = 750 * Qext * mmr * rho / (rho_aer * reff)
- absorption opacity 进一步乘
(1 - omeg)。
- 可选柱积分:累加
tau += opa * delta_z。若整列都是缺测,tau 设为 missing;若至少一个有效 opacity 为 0,允许 tau=0。
- 写输出并清理:写
opa_* 和可选 tau_*,释放 aerosol 数组和 aeropt_mod 缓存。
伪代码
read gcmfile, datadir, wvl_val, opatype, compute_col
read aerosol lines until blank
open gcmfile
create output file by opatype
inidims: copy lon/lat/alt/Time and define output dims
init2: copy vertical/static auxiliaries and compute delta_z if requested
for each aerosol:
verify MMR and optional reff variable
read rho
for each valid aerosol:
read MMR
read reff or fill constant reff
create aeropt log
read optical property table
define opa_<aerosol>
for time, lon, lat, alt:
interpolate Qext/omeg at wvl and reff
opa = 750 * Qext * mmr * rho / (rho_aer * reff)
if absorption: opa *= (1 - omeg)
if compute_col: tau += opa * delta_z
write opa_<aerosol>
if compute_col: define and write tau_<aerosol>
release arrays and optical table
close files
参与的主题流程
| 主题 |
参与方式 |
| util 气溶胶诊断链 |
与 aeropt_mod 配套,把 GCM aerosol tracer 和外部光学表转换为可画图或比较的 opacity/tau。 |
| 后处理与观测比较 |
可接在 concatnc、localtime、hrecast 或原始 diagfi 输出之后,为气溶胶光学厚度分析提供字段。 |
| 柱量诊断 |
与 gencol 都属于从 tracer 派生柱量或光学量的 util 工具。 |
复现要点
aeroptical.def 中每个 aerosol 行用逗号分隔;示例包括 dust,dustq,reffdust,2500,optprop_dustvis_TM_n50.dat。
wvl_val 和 reff 固定值都必须用 m。
rho_aer 是 aerosol 粒子材料密度,单位 kg/m3,直接进入分母。
- 输入 GCM 文件必须含
rho;每个 aerosol 必须含 MMR 变量。
- 如果选择柱积分,文件必须能通过
zzlev、pseudo-alt + ap/bp/ps/rho、m 单位高度、或 Pa 坐标加 zareoid 之一构造 delta_z。
- 参考波长超出光学表范围会停止;有效半径超出表范围会输出 missing 并写日志。
待确认
- extinction opacity 公式中的常数
750 在源码中无推导注释;页面按源码记录,物理单位换算需开发者确认。
- 压力坐标分支中
delta_z(:,:,1,:) = ... 出现在按单点循环内部,疑似应写单个 (ilon,ilat,1,it);复现时按源码字面行为执行。
- 若 MMR 无
missing_value 属性,默认 missval=1.e+20;不同输入文件约定可能导致缺测识别不一致。
aeroptlogfile 通过 internal write 生成,可能包含前导空格;实际文件名需按 Fortran 输出检查。
复现风险
- 输出文件和日志会覆盖同名文件。
- 光学表、reff、wavelength 单位混用会直接改变结果量级。
compute_col=yes 对层厚路径要求高;zrecast 后 pressure 坐标缺少 zareoid 会停止。
- 多 aerosol 大文件会重复读取和分配 4D 数组,运行时间和内存需求较高。
相关页面