aeroptical.F90

路径

LMDZ.MARS\util\aeroptical.F90

所属目录/模块

util

文件定位

aeroptical.F90 是 LMD Mars GCM 输出的离线气溶胶不透明度计算工具。它读取 diagfi.ncstats.ncconcat.nc 类 NetCDF 文件中的气溶胶质量混合比、有效半径和大气密度 rho,再读取外部 ASCII 光学性质表,在用户指定参考波长处计算每种 aerosol 的 extinction 或 absorption opacity,输出 input_OPAext.ncinput_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 在参考波长和有效半径处插值得到 Qextomeg
end_aeropt_mod aeropt_mod 每种 aerosol 处理结束后释放光学表缓存。
inidims / init2 / status_check 本文件 输出文件初始化、辅助字段复制、层厚计算和错误处理。

输入

输入 来源 类型/维度 单位 含义
GCM 输入文件名 stdin / aeroptical.def NetCDF 文件 - diagfi.ncstats.ncconcat.nc 等。
datadir stdin / aeroptical.def 目录 - 光学性质 ASCII 文件所在目录。
wvl_val stdin / aeroptical.def 标量 m 输出不透明度校准的参考波长。
opatype stdin / aeroptical.def extabs - 计算 extinction 或 absorption opacity。
compute_col stdin / aeroptical.def yesno - 是否计算柱积分光学厚度。
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,可选 controleaps/bps/ap/bp/sigma/aire/phisinit
aeropt_log_<name>.txt 磁盘 ASCII 文本 - 每种 aerosol 的半径越界和相关缺测日志。

副作用

核心逻辑

  1. 读取用户输入:输入 GCM 文件、光学表目录、参考波长、opacity 类型、是否柱积分,以及 aerosol 列表。
  2. 解析 aerosol 列表
    • reffname_aer 若能读成数值,视为固定有效半径并广播到全网格;
    • 否则视为 GCM 文件中的有效半径变量名。
  3. 创建输出文件
    • ext 输出 *_OPAext.nc
    • abs 输出 *_OPAabs.nc
  4. 复制坐标和辅助字段
    • inidims 复制 longitude/latitude/altitude/Time 和可选 controle
    • init2 复制 hybrid 或 sigma 坐标、airephisinit
  5. 可选计算层厚 delta_z
    • 优先使用 zzlev 的界面高度,单位 m 转 km。
    • 若 altitude long_namepseudo-alt,优先用 ap/bp/ps/rho 从层质量公式计算层厚,否则退到 pseudo-alt 中点差。
    • 若 altitude 单位是 m,用 altitude 层中心差估算层厚。
    • 若 altitude 单位是 Pa,要求 zareoid 存在,用 zareoid 层中心差估算层厚。
  6. 检查变量存在性:每种 aerosol 必须有 MMR;如果 reff 是变量名,也必须存在。不存在的 aerosol 被跳过;所有 aerosol 都不可算时停止。
  7. 读取 rho:全局读取 atmospheric density,所有 aerosol 共用。
  8. 逐 aerosol 计算 opacity
    • 读取 MMR 和 reff。
    • aeropt_mod 创建日志、读取光学表。
    • 对固定 reff,只插值一次 Qext/omeg;对 reff 变量,在每个格点/层/时间插值。
    • Qext 或 MMR 缺测,输出缺测。
    • extinction opacity 公式为:
opa = 750 * Qext * mmr * rho / (rho_aer * reff)
  1. 可选柱积分:累加 tau += opa * delta_z。若整列都是缺测,tau 设为 missing;若至少一个有效 opacity 为 0,允许 tau=0
  2. 写输出并清理:写 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。
后处理与观测比较 可接在 concatnclocaltimehrecast 或原始 diagfi 输出之后,为气溶胶光学厚度分析提供字段。
柱量诊断 gencol 都属于从 tracer 派生柱量或光学量的 util 工具。

复现要点

待确认

复现风险

相关页面