inichim_newstart.F90
路径
LMDZ.MARS\libf\aeronomars\inichim_newstart.F90
所属目录/模块
libf\aeronomars
文件定位
inichim_newstart.F90 定义 inichim_newstart_mod,提供 inichim_newstart 例程,用于在构造新 start 文件或 1D testphys1d 初始化时,为化学相关 tracer 填充三维初始场和地表储量。它不是时间步内的化学积分器,而是初始廓线装配器:先按 traceur.def 中的 noms 重建 tracer_mod 的 igcm_* 索引和 mmol 摩尔质量,再从 datadir 读取 atmosfera_LMD_may.dat、atmosfera_LMD_min.dat、可选 atmosfera_LMD_nitr.dat,把参考廓线按 log pressure 插值到 GCM 垂直层,最后把体积混合比转换为质量混合比写入 pq。
上游调用点包括 dynphy_lonlat/phymars/newstart.F 的交互式 ini_q / ini_q-h2o 分支,以及 1D dyn1d/init_testphys1d_mod.F90 中 photochem .or. callthermos 时的自动初始化分支。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
inichim_newstart_mod |
module |
1(END MODULE 822) |
包装化学初始场构造例程 |
inichim_newstart |
subroutine |
7(END SUBROUTINE 820) |
重建 tracer 索引,读取参考化学廓线,插值并写入 pq/qsurf |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
tracer_mod |
未限制 |
读取/重写 nqmx、noms、igcm_* tracer 索引和 mmol 摩尔质量 |
- |
vertical_layers_mod |
aps, bps |
由 pgcm=aps(l)+bps(l)*ps(i,j) 计算 GCM 层气压 |
- |
mod_grid_phy_lmdz |
nbp_lon, nbp_lat, nbp_lev |
决定 pq、ps、本地 mmean 的动态标量网格维度 |
- |
datafile_mod |
datadir |
拼接初始化数据文件路径 trim(datadir)//'/atmosfera_LMD_*.dat' |
- |
dust_param_mod |
doubleq, submicron, dustbin |
决定 dust tracer 命名模式和索引扫描分支 |
- |
intrplf_mod |
intrplf |
按 log pressure 把参考 VMR 廓线插值到 GCM 层 |
- |
callkeys_mod |
microphys, rdstorm, topflows |
决定 CCN、rocket dust、topflow dust tracer 是否参与索引扫描 |
- |
callkeys_mod |
co2clouds, co2useh2o, meteo_flux |
决定 CO2 云相关 CCN/meteor/H2O-CCN tracer 是否参与索引扫描 |
- |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
abort_physic |
LMDZ 物理工具(本例程未显式 use 其宿主模块) |
512, 528, 538, 620, 632, 645, 756, 810 |
tracer 数不匹配、N 物种组合不完整、数据文件缺失或离子组合不完整时中止 |
intrplf |
intrplf_mod / intrplf.F |
693 |
把 vmrinit(:,n) 从初始化文件的 log pressure 网格插值到当前 GCM 层 |
open / read / close |
Fortran intrinsic |
610-677 |
打开并读取 atmosfera_LMD_may/min/nitr.dat |
inquire |
上游 init_testphys1d_mod.F90 |
755(调用方) |
1D 路径检测 profile_h2o_vap,决定是否让本例程初始化 h2o_vap |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
ngrid |
调用方 |
integer |
- |
物理列数;用于 qsurf(1:ngrid,iq) |
nq |
调用方 |
integer |
- |
tracer 总数;赋给 tracer_mod::nqmx |
pq |
调用方 |
real (nbp_lon+1,nbp_lat,nbp_lev,nq) |
mass mixing ratio |
动态标量网格上的 tracer 场;本例程原地写入化学初始值 |
qsurf |
调用方 |
real (ngrid,nq) |
kg/m2 |
地表 tracer 储量;本例程对化学 tracer、CH4 和离子清零 |
ps |
调用方 |
real (nbp_lon+1,nbp_lat) |
Pa |
表面气压,用于 pgcm=aps+bps*ps |
flagh2o |
newstart / init_testphys1d |
integer |
- |
1 表示初始化 h2o_vap,0 表示保留已有水汽 |
flagthermo |
newstart / init_testphys1d |
integer |
- |
1 表示只初始化热层低压段,0 表示全层初始化 |
aps, bps |
vertical_layers_mod |
real (nbp_lev) |
Pa / - |
sigma/混合坐标系数 |
noms |
tracer_mod |
character array |
- |
tracer 名称列表,用于识别 igcm_* |
datadir |
datafile_mod |
character |
- |
外部初始化数据文件所在目录 |
dustbin, doubleq, submicron, microphys, rdstorm, topflows, co2clouds, co2useh2o, meteo_flux |
配置/共享模块 |
logical / integer |
- |
决定非化学 tracer 分支是否必须被计入 count |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
pq(:,:,:,iq) |
调用方 start 场 / 1D 初始场 |
real |
mass mixing ratio |
初始化文件中的 VMR 经 vmr*mmol/mmean 转换后的 tracer 质量混合比 |
qsurf(1:ngrid,iq) |
调用方 |
real |
kg/m2 |
flagthermo==0 时化学 tracer 地表储量清零;CH4 和离子也显式清零 |
tracer_mod::igcm_* |
共享 tracer 状态 |
integer |
- |
按 noms 重新识别后的 tracer 索引 |
tracer_mod::mmol |
共享 tracer 状态 |
real |
g/mole |
本例程为识别到的 tracer 设置摩尔质量 |
| 标准输出 |
终端/log |
text |
- |
打印 tracer 识别结果、错误说明和缺失数据文件提示 |
共享状态与副作用
- 直接写
tracer_mod 的大量 igcm_* 索引和 mmol,并把 nqmx=nq。这与 initracer.F 的识别逻辑类似,但是在 newstart/testphys 初始化路径中重新执行。
- 打开外部文件单元
210、220、230;对应 atmosfera_LMD_may.dat、atmosfera_LMD_min.dat、atmosfera_LMD_nitr.dat。文件缺失时打印 datadir 帮助信息并 abort_physic。
niq、vmrinit、vmrint 为本地 allocatable,行 546-548 分配,行 816-818 释放。
qsurf 被多处清零;特别是 flagthermo==0 时化学初始化文件内物种的地表储量全部清零。
- 对
pq 的写入受 flagthermo 和 flagh2o 控制:flagthermo==1 只在 exp(pgcm)<0.1 Pa 的低压层写入;flagh2o==0 时跳过 h2o_vap。
核心逻辑
- 重置 tracer 索引:设置
nqmx=nq,把 dust、water、chemistry、aerosol、ion 等 igcm_* 索引归零。
- 扫描非化学 tracer:按
dustbin、doubleq、microphys、submicron、rdstorm、topflows 等开关扫描 dust、CCN、rocket dust 和 topflow dust tracer,并更新 count。
- 扫描化学/水/气溶胶/离子 tracer:遍历
noms(1:nqmx),识别 CO2、CO、O、O1D、O2、O3、H、H2、OH、HO2、H2O2、N2、CH4、Ar、N/NO/NO2/N2D、He、H2O/HDO、CO2 ice、H2O ice、CO2 cloud CCN、离子和 Ar_N2,同步设置 mmol。
- 校验 tracer 数:若
count /= nqmx,打印已识别数量和名称并 abort_physic("tracer mismatch");否则打印所有 tracer。
- 决定 N 物种维度:若没有 NO,则要求 N/NO2/N2D 也不存在,
flagnitro=.false. 且 nspe=14;若有 NO,则要求 N、NO2、N2D 全部存在,flagnitro=.true. 且 nspe=18。
- 建立初始化文件物种映射:
niq(1:7) 对应 major species CO2、Ar、N2、O2、CO、O、H2;niq(8:14) 对应 H、OH、HO2、H2O、H2O2、O1D、O3;若 flagnitro,niq(15:18) 对应 N、NO、NO2、N2D。
- 读取初始化文件:
atmosfera_LMD_may.dat 提供温度、压力、总数密度和 7 个主物种;压力从 mbar 乘 100 转 Pa 后取 log。atmosfera_LMD_min.dat 提供 7 个 minor species;atmosfera_LMD_nitr.dat 在 flagnitro 时提供 4 个 N species。
- 按层插值并写入
pq:对每个 (i,j,l),计算 pgcm=log(aps(l)+bps(l)*ps(i,j)),对每个 species 调 intrplf 得 vmrint(n),累计 mmean=sum(vmrint*mmol);若满足 flagthermo/flagh2o 条件,写 pq=vmrint*mmol/mmean。
- 地表值和额外物种:
flagthermo==0 时清零初始化文件中 species 的 qsurf;若 CH4 tracer 存在,设 vmr=10.e-9 并全层初始化、地表清零;若 CO2+ 存在,要求其它离子和电子齐全并把所有离子 pq/qsurf 置零,否则任何其它离子单独存在都会中止。
- 释放本地数组:释放
niq/vmrinit/vmrint。
伪代码
inichim_newstart(ngrid,nq,pq,qsurf,ps,flagh2o,flagthermo):
nqmx = nq
reset all tracer_mod igcm_* indexes to 0
count = 0
scan noms for dust/CCN/storm/topflow tracers depending on callkeys and dust_param_mod
scan noms for chemistry, water, aerosol, ion, and Ar_N2 tracers
set igcm_* indexes and mmol values
if count != nqmx:
print found/expected and abort
if NO absent:
require N, NO2, N2D absent
nspe = 14
else:
require N, NO2, N2D present
nspe = 18
allocate niq(nspe), vmrinit(252,nspe), vmrint(nspe)
map initialization-file species order to tracer indexes
open datadir/atmosfera_LMD_may.dat
open datadir/atmosfera_LMD_min.dat
if nitrogen species enabled: open datadir/atmosfera_LMD_nitr.dat
read 252 levels of major/minor/(optional nitrogen) VMR profiles
convert pinit from mbar to Pa, then log(pinit)
for each GCM i,j,l:
pgcm = log(aps(l) + bps(l)*ps(i,j))
mmean = 0
for each initialization species n:
intrplf(pgcm, vmr, pinit, vmrinit(:,n), 252)
vmrint(n) = vmr
mmean += vmr * mmol(niq(n))
if flagthermo == 0 or (flagthermo == 1 and exp(pgcm) < 0.1):
for each species n:
if species is not h2o_vap or flagh2o == 1:
pq(i,j,l,iq) = vmrint(n) * mmol(iq) / mmean
if flagthermo == 0:
qsurf for initialization-file species = 0
if CH4 tracer exists:
initialize CH4 to 10 ppbv by mass mixing ratio and qsurf=0
if CO2+ tracer exists:
require full ion set and electron tracer
set all ion pq and qsurf to 0
else:
abort if any other ion exists without CO2+
deallocate local arrays
参与的主题流程
| 主题 |
参与方式 |
| newstart 初始场生成 |
newstart.F 的 ini_q 分支以 flagh2o=1 调用,初始化化学物种和水汽;ini_q-h2o 以 flagh2o=0 调用,保留已有水汽 |
| 1D testphys 初始化 |
init_testphys1d_mod.F90 在 photochem .or. callthermos 时调用;若存在 profile_h2o_vap,令 flagh2o=0,否则初始化水汽 |
| 化学初始廓线 |
从 datadir 下的 atmosfera_LMD_* 文件读取参考 VMR 廓线,按 log pressure 插值到 GCM 层 |
| tracer 索引维护 |
与 initracer 类似地按 noms 重建 igcm_* 和 mmol,保证后续化学/热层路径可用统一索引 |
写法特点
- 文件为自由格式
.F90 模块,但内部保留较长的顺序式 tracer 名称扫描逻辑。
- 初始化文件固定使用
nalt=252,species 数为 nspe=14 或 18,取决于 N 物种是否启用。
- 插值自变量为
log(pressure);初始化文件压力先从 mbar 转为 Pa,再取 log。
flagthermo==1 的阈值是 exp(pgcm)<0.1 Pa;源码注释称“thermosphere only”。
qsurf 是 intent(out),但只对特定化学/CH4/离子 tracer 显式赋值;调用方必须理解非这些 tracer 的 qsurf 值不会由本例程填全。
- 源码第 348-350 行识别
"hd" 时写的是 igcm_d = iq、mmol(igcm_d)=3.,而不是前面初始化过的 igcm_hd。本页按源码字面记录,是否为笔误待确认。
复现要点
datadir 必须包含 atmosfera_LMD_may.dat 和 atmosfera_LMD_min.dat;若 traceur 中启用 N species,还必须包含 atmosfera_LMD_nitr.dat。当前仓库 LMDZ.MARS\datadir 下未发现这三个文件,运行时需外部数据包或配置正确的 datadir。
count 必须等于 nqmx;任何 traceur 名称未被本例程扫描逻辑覆盖都会触发 tracer mismatch。
- NO 与 N/NO2/N2D 必须成组出现或成组缺失;离子物种也必须以 CO2+ 为首触发完整离子集合。
ini_q-h2o 或 1D 中存在 profile_h2o_vap 时,flagh2o=0 会跳过 h2o_vap 的 pq 写入,保留已有水汽。
flagthermo=1 只改低压热层段;低层化学 tracer 仍保留调用前值。
- CH4 若存在固定初始化为
10.e-9 VMR;离子若完整存在则初始化为 0。
待确认
abort_physic 的宿主模块未在本例程 use 列表中显式声明;是否依赖旧式外部过程或间接可见性,待编译链路确认。
"hd" 分支写入 igcm_d 而非 igcm_hd,疑似复制粘贴或拼写问题,需源码维护者确认。
tinit、zzfile、densinit 被读取或声明但当前活跃初始化只使用 pinit/vmrinit;这些字段是否用于历史版本或后续扩展待确认。
qsurf 为 intent(out) 但非化学 tracer 不在本例程内统一初始化;调用方是否在调用前后另有完整赋值需结合 newstart/1D 全流程确认。
相关页面