dyn1d/read_profile_mod.F90
路径
LMDZ.MARS\libf\phymars\dyn1d\read_profile_mod.F90
文件定位
read_profile_mod.F90 是 1D testphys1d 初始化路径的 tracer 初始廓线读取模块。它根据 infotrac 中的 tname 逐个寻找运行目录下的 profile_<tracer> ASCII 文件,把地表储量和大气层混合比写入 qsurf、q。缺少文件时,它为 CO2、HDO 和尘埃提供特殊默认初始化,其余 tracer 保持 0。
本文件只处理 tracer 廓线;温度廓线由 profile_temp_mod 单独生成。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
read_profile_mod |
module | 1 | 包装 1D tracer profile 读取例程。 |
read_profile |
subroutine | 39-207 | 读取 profile_<tracer> 文件,填充 qsurf(nb_tracer) 和 q(nb_layer,nb_tracer),并处理缺文件默认值。 |
接口
| 实参 | 方向 | 维度/单位 | 说明 |
|---|---|---|---|
nb_tracer |
输入 | integer | traceur.def 读取出的 tracer 数量。 |
nb_layer |
输入 | integer | 大气层数。 |
qsurf(nb_tracer) |
输出 | kg m-2 | 每个 tracer 的地表储量或地表值;先整体置 0。 |
q(nb_layer,nb_tracer) |
输出 | kg kg-1 atmosphere | 每层 tracer 混合比;先整体置 0。 |
play(nb_layer) |
输入 | Pa | 层中压力;尘埃 Conrath 默认廓线使用。 |
使用的模块状态
| 模块 | 符号 | 用途 |
|---|---|---|
| infotrac | tname |
当前 1D tracer 名称列表;用于构造文件名和识别特殊 tracer。 |
| tracer_mod | igcm_co2, igcm_h2o_vap, igcm_h2o_ice, igcm_dust_number, igcm_dust_mass, igcm_ccn_number, igcm_ccn_mass |
当对应 profile_* 文件存在时,写入这些物理 tracer 索引。 |
aeropacity_mod |
topdustref |
Conrath dust 默认廓线的垂直尺度参数。 |
dust_param_mod |
odpref |
Conrath dust 默认廓线使用的参考压力。 |
| comcstfi_h | pi |
lifted dust 质量到数浓度换算。 |
文件格式
对每个 tracer 名 trim(tname(iq)),例程尝试打开:
profile_<tracer>
文件存在时的读取顺序是:
line 1 qsurf(iq)
line 2..nb_layer+1 q(1:nb_layer, iq)
util/extractcolumnfor1D.F90 生成同名文件时也按这个顺序写:先写 surface 值,再逐层写变量值;如果找不到 surface 变量,则用第一层大气值代替 surface。
主流程
- 把
q(:,:)、qsurf(:)置 0,并清空本地name_tracer。 - 扫描
tname,记录h2o_vap/h2o_ice/hdo_vap/hdo_ice/dust_mass/dust_number在nb_tracer维中的位置。 - 对每个 tracer:
- 打印 tracer 名。
- 打开
profile_<name>。 - 若打开成功,先读
qsurf(iq),再读nb_layer行q(ilayer,iq)。 - 若 tracer 名是
co2/h2o_vap/h2o_ice/dust_number/dust_mass/ccn_number/ccn_mass,在文件存在分支中同步写入对应tracer_mod::igcm_*索引。 - 若打开失败,打印 warning,再按 tracer 名进入缺文件默认分支。
- 所有 tracer 扫描结束后,若 HDO 或 dust 标志被置位,再统一派生缺失的 HDO 或尘埃廓线。
缺文件默认值
| tracer | 行为 |
|---|---|
co2 |
q(:,co2)=0.95,qsurf(co2) 仍保持初始 0。 |
hdo_vap |
设置 hdo_vap=.true.,循环结束后若存在 h2o_vap,令 q(:,hdo_vap)=q(:,h2o_vap)*2*155.76e-6*5。 |
hdo_ice |
设置 hdo_ice=.true.,循环结束后若存在 h2o_ice,令 qsurf(hdo_ice) 和 q(:,hdo_ice) 等于对应 H2O ice 的 2*155.76e-6*5 倍。 |
dust_mass 或 dust_number |
设置 dust=.true.,循环结束后用 Conrath dust 默认廓线同时写 dust_mass 和 dust_number。 |
| 其他 tracer | 保持初始化的 q=0、qsurf=0。 |
Conrath dust 默认廓线
当 dust=.true. 时,源码先固定 lifted dust 参数:
nueff_lift = 0.5
reff_lift = 3.e-6 m
rho_dust = 2500 kg m-3
再计算:
varian = sqrt(log(1 + nueff_lift))
r3n_q = exp(-4.5*varian**2) * (3/4) / (pi*rho_dust)
ref_r0 = exp(2.5*varian**2)
r0_lift = reff_lift/ref_r0
mass2number_lift = r3n_q/r0_lift**3
zp = (odpref/play(ilayer))**(70/topdustref)
q(dust_mass) = max(exp(0.007*(1 - max(zp,1))), 1.e-3)
q(dust_number) = q(dust_mass) * mass2number_lift
这里 play 是层中压力;压力越低时 zp 增大,指数项降低,但质量混合比有 1.e-3 下限。
调用关系
| 方向 | 符号/文件 | 说明 |
|---|---|---|
| 调用方 | init_testphys1d_mod | 无 start1D.txt 时调用 read_profile(nq,nlayer,qsurf(1,:,1),q,play),再把 qsurf 复制到所有 slope。 |
| 生成同格式文件 | extractcolumnfor1D | 从 GCM NetCDF 输出抽取单柱变量,写 profile_<var> 文件供 1D 初始化使用。 |
| 相邻温度初始化 | profile_temp_mod | 温度 profile 独立生成;不经过本例程。 |
复现要点
profile_<tracer>文件名直接来自tname,包括大小写和下划线;文件名不做别名映射。- 文件第一行是
qsurf,不是第一层大气值;这与extractcolumnfor1D的写出格式一致。 - 缺文件并不会停止,除了后续特殊初始化可能因缺少对应 tracer 索引而出错;普通 tracer 缺文件就是全 0。
tracer_mod::igcm_*索引只在对应 profile 文件存在时写入;若 CO2 或 H2O 文件缺失,索引是否已由其他初始化路径设置需结合 tracer_mod 和 init_testphys1d_mod 复核。- 若只配置了
dust_mass或只配置了dust_number,但缺文件触发dust=.true.,源码仍会写两个 dust 索引;缺失另一 tracer 名时存在越界风险。 - HDO 派生依赖主同位素索引存在;若
hdo_vap缺文件但没有h2o_vaptracer,源码不会派生 HDO vap,保持 0。
待确认
- 当前常用 1D 案例中哪些 tracer 依赖
profile_<tracer>文件、哪些依赖默认值,需要结合具体运行目录确认。 igcm_*索引只在文件存在分支写入是否有意设计;缺文件默认 CO2/HDO/dust 路径可能依赖别处已完成的索引初始化。- 单 dust tracer 缺另一 dust tracer 时的索引 0 风险需要代码维护者确认。
相关页面
- dyn1d/index.md - dyn1d 子目录索引。
- init_testphys1d_mod - 调用本例程的 1D 初始化入口。
- profile_temp_mod - 温度廓线构造。
- infotrac -
tname来源。 - tracer_mod -
igcm_*tracer 索引。 - extractcolumnfor1D -
profile_*文件生成工具。 - testphys1d.F90 - 1D 主程序。