phyetat0_mod.F90
路径
LMDZ.MARS\libf\phymars\phyetat0_mod.F90
所属目录 / 模块
libf/phymars
文件定位
phyetat0_mod.F90 是物理初始状态读取和兜底初始化模块。它在 startphy_file=.true. 时打开 startfi.nc,通过 iostart 读取地表、土壤、坡面、云分数、热羽流、非地形重力波、tracer 表面储量、古气候和质量修正相关状态;在 startphy_file=.false. 时走无 startfi.nc 的学术/理想化初始化路径,给反照率、发射率、土壤地热通量和少量共享状态设置缺省值。
本文件不是物理倾向计算器,而是把 tabfi、iostart、soil_settings 和多个共享状态模块串起来,决定一次运行从哪一个物理初始场和 restart 记忆状态开始。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
phyetat0_mod |
module |
1 |
物理初始状态读取模块 |
tab_cntrl_mod(100) |
saved module array |
5 |
为 XIOS/动力控制表缓存行星、网格和时间控制参数 |
phyetat0 |
subroutine |
13 |
读取或构造物理初始状态,填充调用方传入的物理状态数组和多个共享模块变量 |
ini_tab_controle_dyn_xios |
subroutine |
961 |
把动力网格、物理常数和时间步参数写入 tab_cntrl_mod |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
tracer_mod |
noms |
按 tracer 名称读取地表 tracer 字段 |
- |
surfdat_h |
phisfi, albedodat, z0, z0_default, zmea, zstd, zsig, zgam, zthe, hmons, summit, base, watercaptag |
读取或初始化地表位势、反照率、粗糙度、次网格地形和水冰标签 |
- |
surfini_mod |
icelocationmode |
缺少 watercaptag 时切换水冰定位模式 |
- |
iostart |
nid_start, open_startphy, close_startphy, get_field, get_var, inquire_field, inquire_dimension, inquire_dimension_length |
打开 startfi.nc、查询维度/字段并读取 NetCDF 初始场 |
- |
nonoro_gwd_ran_mod |
du_nonoro_gwd, dv_nonoro_gwd |
恢复非地形随机重力波动量记忆项 |
- |
nonoro_gwd_mix_mod |
du_eddymix_gwd, dv_eddymix_gwd, de_eddymix_rto, df_eddymix_flx, dh_eddymix_gwd, dq_eddymix_gwd |
恢复非地形重力波混合方案记忆项 |
- |
tracer_mass_fixer_dyn_mod |
mass_predyn_*, found_startfi_*, call_mass_fixer_dyn |
恢复动力 tracer 质量修正的前一步全局质量 |
- |
compute_dtau_mod |
dtau |
恢复尘埃光学厚度时间记忆 |
- |
dust_rad_adjust_mod |
dust_rad_adjust_prev, dust_rad_adjust_next |
恢复尘埃辐射调整前后状态 |
- |
dust_param_mod |
dustscaling_mode |
控制 tauscaling 缺省值 |
- |
ioipsl_getin_p_mod |
getin_p |
读取 run.def 中的 timestart 和无 startfi 缺省参数 |
- |
comsoil_h |
flux_geo |
无 startfi.nc 时清零地热通量 |
- |
comslope_mod |
nslope, major_slope |
读取坡面分布并确定主坡面 bin |
- |
paleoclimate_mod |
paleoclimate, h2oice_depth, co2ice_depth, coef_ssdif |
读取或缺省初始化古气候地下冰状态 |
- |
comcstfi_h |
pi |
no-startfi 路径下设置表面压力缺省值 |
- |
geometry_mod |
latitude |
南极古气候 CO2 冰缺省值判定 |
- |
soil_settings_mod |
soil_settings |
读取土壤层深、热惯量、土壤温度和土壤 tracer |
- |
tabfi_mod |
tabfi |
读取或构造物理控制表和初始日期 |
- |
callkeys_mod |
startphy_file, rdstorm, hdo, CLFvarying, CLFfixval |
控制是否读 startfi、沙尘暴地形字段、HDO 地表 tracer 和云分数路径 |
- |
comcstfi_h |
g, mugaz, omeg, rad, rcp |
ini_tab_controle_dyn_xios 写控制表 |
- |
time_phylmdz_mod |
hour_ini, daysec, dtphys |
ini_tab_controle_dyn_xios 写控制表 |
- |
mod_grid_phy_lmdz |
nbp_lon, nbp_lat, nbp_lev |
ini_tab_controle_dyn_xios 写控制表 |
- |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
open_startphy |
iostart.F90 |
141 |
打开 startfi.nc |
tabfi |
tabfi.F / tabfi_mod |
145, 148 |
从文件或 no-startfi 路径读取/构造物理控制表 |
get_field |
iostart.F90 |
多处 |
读取网格场、地表场、三维场、土壤和 restart 记忆字段 |
get_var |
iostart.F90 |
多处 |
读取标量、时间轴和质量修正标量 |
getin_p |
ioipsl_getin_p_mod |
242, 389, 558 |
读取 surfalbedo_without_startfi、timestart、surfemis_without_startfi |
abort_physic |
abort |
多处 |
必需字段缺失或时间索引不合法时中止 |
ini_tab_controle_dyn_xios |
本文件 |
435 |
填充 tab_cntrl_mod |
soil_settings |
soil_settings.F |
878 |
读取和插值土壤初始状态 |
close_startphy |
iostart.F90 |
文件末段 |
关闭 startfi.nc |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
fichnom |
调用方 |
character |
- |
物理初始场文件名,常见为 startfi.nc |
tab0 |
调用方 / tabfi |
real array |
- |
物理控制表缓存 |
Lmodif |
调用方 |
integer |
- |
tabfi 的修改/读取模式标志 |
nsoil, ngrid, nlay, nq, nqsoil |
调用方 |
integer |
- |
土壤层、物理格点、垂直层、tracer 和土壤 tracer 数量 |
startphy_file |
callkeys_mod |
logical |
- |
是否读取 startfi.nc |
timestart |
run.def / getin_p |
integer |
- |
多时间初始场中选择的 Time 索引;缺省 -9999 表示最后一个时刻 |
surfalbedo_without_startfi |
run.def / getin_p |
real |
- |
无 startfi 时的地表反照率 |
surfemis_without_startfi |
run.def / getin_p |
real |
- |
无 startfi 时的地表发射率 |
CLFvarying, CLFfixval, rdstorm, hdo, paleoclimate |
callkeys_mod / paleoclimate_mod |
logical/real |
- |
控制云分数、沙尘暴地形字段、HDO 和古气候 restart 字段路径 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
tsurf, tsoil, emis, albedo, q2, qsurf, qsoil, co2ice, watercap, perennial_co2ice, totcloudfrac, wstar 等实参 |
physiq_mod.F、newstart.F 等调用方 |
arrays |
混合 |
物理初始状态、地表储量、土壤和 restart 记忆场 |
phisfi, albedodat, z0, zmea/zstd/zsig/zgam/zthe, hmons/summit/base, watercaptag |
surfdat_h |
module arrays |
混合 |
地表位势、反照率、粗糙度、次网格地形和水冰标签 |
subslope_dist, major_slope |
comslope_mod |
module arrays/scalar |
- |
次网格坡面分布和主坡面索引 |
dtau, tauscaling, dust_rad_adjust_prev/next |
dust 相关模块/调用方 |
arrays |
- |
尘埃光学厚度和辐射调整 restart 状态 |
du_*, dv_*, dh_*, dq_*, de_*, df_* |
非地形重力波模块 |
arrays |
- |
随机 GW 和 eddy-mix GW 的记忆 tendency/flux |
mass_predyn_*, found_startfi_* |
tracer_mass_fixer_dyn_mod |
scalars/logicals |
kg 或源码定义 |
动力 tracer 质量修正的 restart 标量和存在性标志 |
h2oice_depth, co2ice_depth, coef_ssdif, perennial_co2ice |
paleoclimate_mod / 调用方 |
arrays |
m 或源码定义 |
古气候地下冰和常年 CO2 冰状态 |
tab_cntrl_mod |
本模块 / XIOS 控制表路径 |
real(100) |
混合 |
网格、物理常数、时间步和初始时刻控制参数 |
共享状态与副作用
tab_cntrl_mod 使用 SAVE,并声明为 !$OMP THREADPRIVATE(tab_cntrl_mod);多线程运行时每个线程持有独立控制表副本。
phyetat0 在 startphy_file=.true. 时会打开并关闭 startfi.nc,大量读取 NetCDF 字段;缺少必需字段时调用 abort_physic 终止。
- 函数会写入多个 module 级状态,而不只填调用方实参,包括
surfdat_h、comslope_mod、paleoclimate_mod、非地形重力波模块、尘埃模块和 tracer 质量修正模块。
- no-startfi 路径不会调用
soil_settings,而是把 flux_geo(:,:)=0.;同时要求 nslope==1,否则中止。
- 多时间轴
startfi.nc 通过 timestart 选择 indextime;缺省 -9999 使用最后一个 Time。
核心逻辑
- 根据
startphy_file 决定是否打开 startfi.nc,随后调用 tabfi。有 startfi 时从文件读控制表;无 startfi 时用空文件标识走理想化初始化。
- 如果 start 文件存在坡面定义,读取
def_slope 和 subslope_dist,归一化坡面分布并确定 major_slope;若无 startfi 且 nslope!=1,直接中止。
- 读取必需地表字段:
phisfi、albedodat、ZMEA、ZSTD、ZSIG、ZGAM、ZTHE、tsurf、emis、q2 等。缺字段时按源码规则中止或给缺省值。
- 若存在
Time 维度,读取时间轴并用 timestart 选择 indextime;随后初始化 tab_cntrl_mod。
- 读取尘埃、云分数、热羽流、地表温度/反照率/发射率、粗糙度、湍流能量和非地形重力波记忆场。
- 若
call_mass_fixer_dyn 为真,读取 8 个主要大气成分的 mass_predyn_* 标量,只有字段存在且值大于 0 时才设置对应 found_startfi_*。
- 按 tracer 名称读取
qsurf:h2o_vap 读取 h2o_ice 地表 tracer,HDO 分支把 hdo_vap 映射到 hdo_ice,co2 优先读 co2ice,其他缺失非 CO2 tracer 清零。
- 读取
watercap 和 watercaptag。没有 watercap 时把负的 h2o_ice 地表储量转移到 watercap 后清零;没有 watercaptag 时设置 icelocationmode=4。
- 有 startfi 时调用
soil_settings 读取土壤状态;古气候字段存在时读取 h2oice_depth、coef_ssdif、co2ice_depth、perennial_co2ice,缺失时填源码缺省值。
- 关闭
startfi.nc,返回已填充的物理初始状态。
伪代码
phyetat0(fichnom, ...)
if startphy_file:
open_startphy(fichnom)
tabfi(nid_start, Lmodif, ...)
else:
tabfi(0, 0, 0, ...)
read or initialize slope distribution
read required surface/orography fields or apply no-startfi defaults
choose Time index from timestart if Time dimension exists
ini_tab_controle_dyn_xios(day_ini)
read dust scaling, dust radiative adjustment, dtau
read cloud fraction, wstar, tsurf, albedo, emis, z0, q2
read non-orographic gravity-wave restart memory
read tracer-mass-fixer mass_predyn_* scalars when enabled
for each tracer:
map selected tracer names to surface storage field names
read qsurf, abort only for missing CO2 surface state
read watercap/watercaptag and soil settings
read paleoclimate arrays or set defaults
close_startphy when opened
ini_tab_controle_dyn_xios(idayref)
tab_cntrl_mod(1:11,27) = grid sizes, constants, day/time controls
参与的主题流程
| 主题 |
参与方式 |
| 物理初始化 |
从 startfi.nc 或 no-startfi 缺省路径构造 physiq 首步需要的地表、土壤、tracer 和记忆状态 |
| restart 兼容 |
对缺字段提供源码定义的 fallback,或在必需字段缺失时中止 |
| 次网格坡面 |
读取 def_slope、subslope_dist,归一化坡面分布并设置 major_slope |
| 尘埃循环 |
恢复 tauscaling、dtau 和尘埃辐射调整状态 |
| 水循环 / HDO |
读取水冰地表储量、watercap、watercaptag,并处理 HDO 地表冰映射 |
| CO2 循环 |
读取 co2ice 地表状态和古气候常年 CO2 冰字段 |
| 非地形重力波 |
恢复随机 GW 和 eddy-mix GW 记忆 tendency/flux |
| 古气候 / lag-layer |
初始化地下 H2O/CO2 冰深度和地下水扩散系数 |
| XIOS/控制表 |
ini_tab_controle_dyn_xios 填充 tab_cntrl_mod 供控制表路径使用 |
写法特点
- 本文件是大型初始化例程,许多字段的缺省值和错误处理是 restart 格式契约的一部分;复现时不能只看变量名,需要逐字段确认
found 分支。
get_field 的 indextime 参数只在存在时间轴或相应字段按时间保存时有意义;timestart=-9999 表示选择最后一个可用时间。
tab_cntrl_mod 只填了固定槽位:1=nbp_lon、2=nbp_lat-1、3=nbp_lev、4=idayref、5=rad、6=omeg、7=g、8=mugaz、9=rcp、10=daysec、11=dtphys、27=hour_ini。
复现要点
startfi.nc 至少需要包含 phisfi、albedodat、ZMEA、ZSTD、ZSIG、ZGAM、ZTHE、tsurf、emis、q2;若定义了坡面字段,还需要可读的 subslope_dist。
hmons、summit、base 缺失时只有 rdstorm=.true. 才中止;否则三者清零。
totcloudfrac 分支按源码字面行为记录:CLFvarying 为真时尝试读取 totcloudfrac,但随后仍把 totcloudfrac(:)=CLFfixval。这看起来可能覆盖文件值,复现时应按源码执行并等待开发者确认意图。
- 非地形 GW 读取块中
dv_nonoro_gwd 出现两次读取;df_eddymix_flx 的字段名字符串带尾随空格 "df_eddymix_flx ",这可能影响 restart 字段匹配。
mass_predyn_* 只有在 startphy_file .and. call_mass_fixer_dyn 时读取,且字段值必须大于 0 才视为有效。
watercap 缺失时,负的 h2o_ice 地表储量会被解释为永久水冰储库并转移到 watercap;负的 hdo_ice 地表储量会直接清零。
paleoclimate 字段缺省值包括 h2oice_depth=-999.、co2ice_depth=-999.、coef_ssdif=4.e-4;若最后一个纬度为南极,perennial_co2ice(ngrid,:)=10*1.6e3。
- 无
startfi.nc 路径要求 nslope==1,并通过 surfalbedo_without_startfi、surfemis_without_startfi 提供地表反照率和发射率。
待确认
totcloudfrac 在 CLFvarying 分支中读入后又被 CLFfixval 覆盖,需确认是有意固定云分数还是遗漏了 else。
dv_nonoro_gwd 的重复读取块是否为拷贝残留。
get_field("df_eddymix_flx ",...) 字段名包含尾随空格,需确认 restart 文件中实际变量名是否也包含空格或 NetCDF 层是否会裁剪。
- 局部变量
igcm_co2_tmp 在古气候块中被查找但后续未见实际使用,需确认是否为遗留逻辑。
相关页面