dyn1d/init_testphys1d_mod.F90
路径
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=3397200 m、daysec=88775 s、g=3.72 m s-2、mugaz=43.49 g 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,否则使用串行 communicator 1。
- 无
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=610 Pa、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。 |
调用关系
复现要点
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。
相关页面