dyn1d/init_testphys1d_mod.F90
快速理解
它做什么: 1D testphys1d 列模式初始化主例程,把配置/初始场/物理公共模块串起来生成 physiq 前所需单格点状态。
基本过程: 读 run.def/callphys.def/traceur.def/start1D.txt/profile → 分配并填充大气/地表/土壤/tracer/几何/垂直层/时间。
关键结果: 输出 psurf/u/v/temp/q/play/plev/qsurf/tsoil 等状态,供物理主循环直接使用。
路径
LMDZ.MARS\libf\phymars\dyn1d\init_testphys1d_mod.F90
文件定位
init_testphys1d_mod.F90 是 1D testphys1d 列模式的初始化主例程。它把 run.def/callphys.def、traceur.def、start1D.txt、startfi.nc、profile 文件和一组物理公共模块串在一起,生成 physiq 前需要的单格点大气、地表、土壤、tracer、几何、时间和配置状态。
调用方是 dyn1d/testphys1d.F90,主程序在时间循环前调用 init_testphys1d(...),随后把本例程填好的 psurf/u/v/temp/q/play/plev/qsurf/tsoil 等状态送入物理过程。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
init_testphys1d_mod |
module | 1 | 包装 1D 物理测试初始化例程。 |
init_testphys1d |
subroutine | 7-848 | 读取配置和初始场,分配/填充 1D 物理状态,初始化几何、垂直层、tracer、坡面、土壤和水控制量。 |
接口和主要实参
| 实参 | 方向 | 维度/单位 | 说明 |
|---|---|---|---|
start1Dname, startfiname |
输入 | 字符串 | restart 文本文件和物理 restart NetCDF 名。调用方传入 start1D.txt、startfi.nc。 |
therestart1D, therestartfi |
输入 | logical | 控制是否从 start1D.txt 和 startfi.nc 读初始场。 |
ngrid, nlayer, nq |
输出或输入输出 | 单格点、垂直层数、tracer 数 | ngrid 固定服务 1D;nq 从 traceur.def 首行读取。 |
q, dq, dqdyn |
输出 allocatable | (1,nlayer,nq) |
tracer 混合比和 tendency 工作数组。 |
zqsat |
输出 allocatable | (nlayer) |
饱和相关工作数组,初始化分配。 |
time, day0, day, ndt, dttestphys |
输出 | sol 或秒 | 从配置/restart 建立初始时间、积分 sol 数、物理步长和总步数。 |
psurf, u, v, temp, w |
输出 | Pa, m s-1, K | 单柱表压、风、温度和垂直风。 |
play, plev |
输出 | Pa | 层中和界面压力,由 ap/bp/aps/bps 与 psurf 构造。 |
latitude, longitude, cell_area |
输出 | rad, rad, m2 | 1D 网格几何;默认纬度 0 度,经度 0。 |
ctrl_h2ovap, ctrl_h2oice 等 |
输出 | logical, s, kg kg-1 | 水汽/水冰 profile 强制与松弛控制。 |
使用的模块状态
本例程写入或依赖大量公共状态,关键链路如下:
| 模块 | 主要符号 | 用途 |
|---|---|---|
comcstfi_h, planete_h |
rad/daysec/omeg/g/r/cpp/year_day/periheli/aphelie/peri_day 等 |
设置火星物理常数和轨道默认值。 |
infotrac |
nqtot/tname/nqperes/nqfils |
直接读取 traceur.def,建立 1D tracer 名称和简化父子关系。 |
comvert_mod |
ap/bp/aps/bps/presnivs/pseudoalt |
由 disvert_noterre 和 init_vertical_layers 填充后构造 plev/play。 |
surfdat_h, comsoil_h, comslope_mod |
albedodat/inertiedat/qsurf/tsoil/qsoil/nslope 等 |
初始化地表、土壤、坡面和 surface tracer 状态。 |
logic_mod, callkeys_mod |
photochem/callthermos/water/adsorption_soil/paleoclimate 等 |
决定化学初始化、水控制、地下冰和古气候分支。 |
dimphy, phys_state_var_init_mod, comgeomfi_h |
init_dimphy, phys_state_var_init, ini_fillgeom |
建立物理维度、日期状态和几何三角函数缓存。 |
tracer_mod |
initracer, igcm_* |
建立物理侧 tracer 索引,随后用于 CO2、H2O、土壤冰等数组位置。 |
初始化流程
1. 常数和 tracer 数组
- 设置火星默认常数:
rad=3397200m、daysec=88775s、g=3.72m s-2、mugaz=43.49g mol-1、rcp=.256793、year_day=669、obliquit=25.2、eccentric=0.0934、Lsperi=251。 - 设置地表和边界层默认值:
z0_default=1.e-2、emin_turb=1.e-6、lmixmin=30、inertieice=2100、rho_H2O_ice=920、cell_area(1)=1。 - 打开
traceur.def。缺失、首行读取失败或nq<1都会停止。 - 分配
tname(nq)、q(1,nlayer,nq)、dq(1,nlayer,nq)、dqdyn(1,nlayer,nq)、zqsat(nlayer)和tnom_transp(nq)。 - 每个 tracer 行先尝试读取
tname, tnom_transp两列;失败则只读tname,并把 transporting fluid 设为air。 tnom_transp=='air'的 tracer 计入父 tracer;其他 tracer 向前查找父名并累加nqfils。找不到父 tracer 时调用abort_gcm('infotrac_init','Un traceur est orphelin',1)。
2. 时间、restart 和垂直坐标
- 初始化 physics distribution:有 XIOS 时使用
COMM_LMDZ,否则使用串行 communicator1。 - 无
startfi.nc时从getin("day0")和getin("time")读取初始日期和小时,并把小时转为 sol 分数。 - 有
startfi.nc时调用open_startphy,读取controle和Time,并从tab_cntrl(3)取day0。 - 设置
nlevel=nlayer+1、nsoil=nsoilmx、默认day_step=48、默认ndt=10。配置中的ndt先表示积分 sol 数,随后乘以day_step转为物理步数;dttestphys=daysec/day_step。 - 默认
psurf=610Pa、pa=20、preff=610。若therestart1D为真,则从start1D.txt第一行读取psurf, pa, preff。 - 默认
hybrid=.true.,可由getin("hybrid")改写。随后调用disvert_noterre和init_vertical_layers,再用plev=ap+psurf*bp、play=aps+psurf*bps构造压力,并用zlay=-200*r*log(play/plev(1))/g估算层高。
3. 轨道、几何和物理公共状态
CO2cond_ps默认 1,可配置但必须在[0,1]。tauvis默认 0.2。- 无
startfi.nc时可启用paleomars,读取obliquit/eccentric/Lsperi,并通过call_dayperi换算peri_day。源码中Lsperi合法性判断的条件仍引用eccentric,这是一个需要保留源码事实的可疑分支。 - 纬度默认 0 度并转为弧度,经度固定 0 弧度。
- 依次调用
init_interface_dyn_phys、init_regular_lonlat、init_geometry、init_geometry_cell_area_for_outputs、init_dimphy、phys_state_var_init、ini_fillgeom、conf_phys、initracer。 - 若
iphysiq不是 1,本例程强制设为 1。
4. 坡面、tracer profile 和地表
nslope默认 1,可配置为 1、3、5、7;其他值直接error stop。- 无
startfi.nc时重新初始化坡面相关数组,并为 3/5/7 坡面写入硬编码坡度def_slope和面积分布subslope_dist。 - 有
startfi.nc时检查 restart 中的nslope是否等于配置值,不一致则停止;一致时使用 restart 的坡面分布。 - 读取
slope_inclination和slope_orientation,分别写入theta_sl和psi_sl。 - 无
start1D.txt时调用read_profile(nq,nlayer,qsurf(1,:,1),q,play)初始化 tracer profile,并把qsurf复制到所有 slope。 - 有
start1D.txt时逐 tracer 读取名称和垂直廓线,并检查文件中的 tracer 名等于tname(iq)。 - 无
startfi.nc时读取albedo、inertia、subsurface_ice_depth、z0,并设置zmea/zstd/zsig/zgam/zthe=0、地形 GW tendency 为 0、tauscaling=1、totcloudfrac=1、phisfi=0。 ptif=2*omeg*sinlat(1);u、v默认来自getin("u")、getin("v")的地转风,restart 路径从start1D.txt读取。w=0,q2=0。- 无
startfi.nc时设置 surface CO2 ice 默认值,并可由getin("co2ice")改写。
5. 温度、土壤、化学和水 profile 控制
pks=psurf**rcp。- 无
start1D.txt时用zlay/1000构造 km 高度,调用profile_temp(nlayer+1,zkm,teta),令tsurf=teta(0)、temp=teta(1:);restart 路径从start1D.txt读取temp后关闭文件。 - 无
startfi.nc时设置qsoil=0,构造土壤层深:mlayer(isoil)=2.e-4*(1+isoil**2.9*(1-exp(-real(isoil)/20.))),界面layer用相邻中层平均。 - 若
subsurface_ice_depth>0,按冰/土边界所在层改写inertiedat;若启用adsorption_soil,还按ads_massive_ice或孔隙度把地下水冰质量写入qsoil(:,:,igcm_h2o_ice_soil,:)。 - 若无地下冰,所有土壤层使用表层热惯量;随后把
inertiedat复制到inertiesoil,把tsurf复制到tsoil。 flux_geo默认 0,可由getin("flux_geo")读取单值后复制到全数组。- 若
photochem或callthermos为真,检查是否存在profile_h2o_vap来决定flagh2o,分配临时qdyn(2,1,llm,nq)和psdyn(2,1),调用inichim_newstart,再把第一列结果写回q。 watercaptag默认.false.,可通过getin("watercaptag")控制水冰地表库;无startfi.nc时watercap=0。- 若
water为真,可设置ctrl_h2ovap和ctrl_h2oice。打开profile_ref_h2o_vap或profile_ref_h2o_ice逐层读取参考 mixing ratio;relaxtime_h2ovap和relaxtime_h2oice小于 0 表示强制 profile,不小于 0 表示按秒级时间常数松弛。
配置键和外部文件
| 名称 | 类型 | 默认/要求 | 作用 |
|---|---|---|---|
traceur.def |
必需文本 | 首行为 nq |
定义 tracer 数量、名称和可选 transporting fluid。 |
start1D.txt |
可选文本 | therestart1D 为真时读取 |
表压、温度、风和 tracer profile restart。 |
startfi.nc |
可选 NetCDF | therestartfi 为真时读取 |
物理 restart,提供 controle、Time 和 slope/地表状态。 |
day0, time, day_step, ndt |
getin |
0, 0, 48, 10 |
初始时间、每天步数和积分长度。 |
psurf, hybrid, CO2cond_ps, tauvis |
getin |
610, .true., 1, 0.2 |
表压、垂直坐标、CO2 凝结压力因子和尘埃可见光光学厚度。 |
paleomars, obliquit, eccentric, Lsperi |
getin |
.false. 和现代火星默认 |
古气候轨道参数。 |
latitude, nslope, slope_inclination, slope_orientation |
getin |
0, 1, 源码默认数组 |
单柱位置和坡面几何。 |
albedo, inertia, subsurface_ice_depth, z0, co2ice, flux_geo |
getin |
源码默认值 | 地表反照率、热惯量、地下冰深度、粗糙度、CO2 冰和地热通量。 |
profile_h2o_vap |
可选存在性检查 | 存在则不由化学例程初始化 H2O vap | 控制 inichim_newstart 的 flagh2o。 |
profile_ref_h2o_vap, profile_ref_h2o_ice |
条件必需文本 | ctrl_h2ovap/ctrl_h2oice 为真时必须存在 |
逐层参考水汽/水冰 mixing ratio。 |
调用关系
| 方向 | 符号/文件 | 说明 |
|---|---|---|
| 调用方 | testphys1d.F90 | 主程序 use init_testphys1d_mod, only: init_testphys1d,在时间循环前调用。 |
| 被调 | disvert_noterre | 生成 1D hybrid/sigma 垂直坐标系数。 |
| 被调 | call_dayperi | 在 paleomars 分支把 Lsperi/eccentric 转成 peri_day。 |
| 被调 | tracer_mod | initracer(ngrid,nq) 建立物理 tracer 索引。 |
| 被调 | phys_state_var_init_mod | 初始化物理状态变量公共模块。 |
| 被调 | comgeomfi_h | ini_fillgeom 缓存纬经度三角函数。 |
| 被调 | inichim_newstart | 化学或热层分支初始化化学 tracer。 |
| 被调 | read_profile_mod | 无 restart 时读取 tracer 初始 profile。 |
| 被调 | profile_temp_mod | 无 restart 时构造温度廓线。 |
复现要点
traceur.def是硬需求;即使tracer_mod另有tracer.def回退路径,本例程在读取 tracer 数量时只打开traceur.def。start1D.txt的 tracer 名顺序必须和traceur.def中的tname(iq)一致,否则 restart 读取会停止。nslope只能是 1、3、5、7;restart 与配置的 slope 数不一致会停止。ndt在配置中表示 sol 数,但例程内最终乘以day_step变成时间步数;复现实验时不要把两者混淆。ctrl_h2ovap或ctrl_h2oice为真时,对应profile_ref_h2o_vap或profile_ref_h2o_ice必须至少包含nlayer行。- 启用
photochem或callthermos时,inichim_newstart使用动态网格形状的临时数组包装 1D 数据;如果 tracer 名或化学数据文件缺失,失败会发生在该后续例程中。
待确认和风险
Lsperi范围检查处的源码条件引用了eccentric,不像是有意设计;本文按源码事实记录,是否应修正需代码维护者确认。traceur.def的 modern 格式兼容性未在本文件中实现;当前读取逻辑是旧式首行数量格式。qdyn和psdyn在化学初始化分支中分配后未在本例程内显式释放;Fortran 例程返回时是否释放取决于 allocatable 局部变量语义和编译器实现,未做运行验证。- 地下冰写入
qsoil时使用igcm_h2o_ice_soil,该索引依赖tracer_mod::initracer是否识别对应 tracer。
相关页面
- dyn1d/index.md - dyn1d 子目录索引。
- testphys1d 配置 - 1D 运行配置入口。
- infotrac - dyn1d tracer 元数据 stub 和 1D tracer 名称链。
- comvert_mod - 垂直坐标状态。
- disvert_noterre - 非地球垂直离散。
- comcstfi_h - 物理常数状态。
- comgeomfi_h - 几何缓存。
- tracer_mod - 物理 tracer 索引。
- inichim_newstart - 化学初始场构造。
- testphys1d.F90 - 1D 主程序。
- read_profile_mod - 1D tracer 初始廓线读取。
- profile_temp_mod - 1D 温度廓线构造。
- writerestart1D_mod - 1D 文本 restart 写出方。