dyn1d/init_testphys1d_mod.F90

路径

LMDZ.MARS\libf\phymars\dyn1d\init_testphys1d_mod.F90

文件定位

init_testphys1d_mod.F90 是 1D testphys1d 列模式的初始化主例程。它把 run.def/callphys.deftraceur.defstart1D.txtstartfi.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.txtstartfi.nc
therestart1D, therestartfi 输入 logical 控制是否从 start1D.txtstartfi.nc 读初始场。
ngrid, nlayer, nq 输出或输入输出 单格点、垂直层数、tracer 数 ngrid 固定服务 1D;nqtraceur.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/bpspsurf 构造。
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_noterreinit_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 数组

  1. 设置火星默认常数:rad=3397200 m、daysec=88775 s、g=3.72 m s-2、mugaz=43.49 g mol-1、rcp=.256793year_day=669obliquit=25.2eccentric=0.0934Lsperi=251
  2. 设置地表和边界层默认值:z0_default=1.e-2emin_turb=1.e-6lmixmin=30inertieice=2100rho_H2O_ice=920cell_area(1)=1
  3. 打开 traceur.def。缺失、首行读取失败或 nq<1 都会停止。
  4. 分配 tname(nq)q(1,nlayer,nq)dq(1,nlayer,nq)dqdyn(1,nlayer,nq)zqsat(nlayer)tnom_transp(nq)
  5. 每个 tracer 行先尝试读取 tname, tnom_transp 两列;失败则只读 tname,并把 transporting fluid 设为 air
  6. tnom_transp=='air' 的 tracer 计入父 tracer;其他 tracer 向前查找父名并累加 nqfils。找不到父 tracer 时调用 abort_gcm('infotrac_init','Un traceur est orphelin',1)

2. 时间、restart 和垂直坐标

  1. 初始化 physics distribution:有 XIOS 时使用 COMM_LMDZ,否则使用串行 communicator 1
  2. startfi.nc 时从 getin("day0")getin("time") 读取初始日期和小时,并把小时转为 sol 分数。
  3. startfi.nc 时调用 open_startphy,读取 controleTime,并从 tab_cntrl(3)day0
  4. 设置 nlevel=nlayer+1nsoil=nsoilmx、默认 day_step=48、默认 ndt=10。配置中的 ndt 先表示积分 sol 数,随后乘以 day_step 转为物理步数;dttestphys=daysec/day_step
  5. 默认 psurf=610 Pa、pa=20preff=610。若 therestart1D 为真,则从 start1D.txt 第一行读取 psurf, pa, preff
  6. 默认 hybrid=.true.,可由 getin("hybrid") 改写。随后调用 disvert_noterreinit_vertical_layers,再用 plev=ap+psurf*bpplay=aps+psurf*bps 构造压力,并用 zlay=-200*r*log(play/plev(1))/g 估算层高。

3. 轨道、几何和物理公共状态

  1. CO2cond_ps 默认 1,可配置但必须在 [0,1]
  2. tauvis 默认 0.2。
  3. startfi.nc 时可启用 paleomars,读取 obliquit/eccentric/Lsperi,并通过 call_dayperi 换算 peri_day。源码中 Lsperi 合法性判断的条件仍引用 eccentric,这是一个需要保留源码事实的可疑分支。
  4. 纬度默认 0 度并转为弧度,经度固定 0 弧度。
  5. 依次调用 init_interface_dyn_physinit_regular_lonlatinit_geometryinit_geometry_cell_area_for_outputsinit_dimphyphys_state_var_initini_fillgeomconf_physinitracer
  6. iphysiq 不是 1,本例程强制设为 1。

4. 坡面、tracer profile 和地表

  1. nslope 默认 1,可配置为 1、3、5、7;其他值直接 error stop
  2. startfi.nc 时重新初始化坡面相关数组,并为 3/5/7 坡面写入硬编码坡度 def_slope 和面积分布 subslope_dist
  3. startfi.nc 时检查 restart 中的 nslope 是否等于配置值,不一致则停止;一致时使用 restart 的坡面分布。
  4. 读取 slope_inclinationslope_orientation,分别写入 theta_slpsi_sl
  5. start1D.txt 时调用 read_profile(nq,nlayer,qsurf(1,:,1),q,play) 初始化 tracer profile,并把 qsurf 复制到所有 slope。
  6. start1D.txt 时逐 tracer 读取名称和垂直廓线,并检查文件中的 tracer 名等于 tname(iq)
  7. startfi.nc 时读取 albedoinertiasubsurface_ice_depthz0,并设置 zmea/zstd/zsig/zgam/zthe=0、地形 GW tendency 为 0、tauscaling=1totcloudfrac=1phisfi=0
  8. ptif=2*omeg*sinlat(1)uv 默认来自 getin("u")getin("v") 的地转风,restart 路径从 start1D.txt 读取。w=0q2=0
  9. startfi.nc 时设置 surface CO2 ice 默认值,并可由 getin("co2ice") 改写。

5. 温度、土壤、化学和水 profile 控制

  1. pks=psurf**rcp
  2. start1D.txt 时用 zlay/1000 构造 km 高度,调用 profile_temp(nlayer+1,zkm,teta),令 tsurf=teta(0)temp=teta(1:);restart 路径从 start1D.txt 读取 temp 后关闭文件。
  3. startfi.nc 时设置 qsoil=0,构造土壤层深: mlayer(isoil)=2.e-4*(1+isoil**2.9*(1-exp(-real(isoil)/20.))),界面 layer 用相邻中层平均。
  4. subsurface_ice_depth>0,按冰/土边界所在层改写 inertiedat;若启用 adsorption_soil,还按 ads_massive_ice 或孔隙度把地下水冰质量写入 qsoil(:,:,igcm_h2o_ice_soil,:)
  5. 若无地下冰,所有土壤层使用表层热惯量;随后把 inertiedat 复制到 inertiesoil,把 tsurf 复制到 tsoil
  6. flux_geo 默认 0,可由 getin("flux_geo") 读取单值后复制到全数组。
  7. photochemcallthermos 为真,检查是否存在 profile_h2o_vap 来决定 flagh2o,分配临时 qdyn(2,1,llm,nq)psdyn(2,1),调用 inichim_newstart,再把第一列结果写回 q
  8. watercaptag 默认 .false.,可通过 getin("watercaptag") 控制水冰地表库;无 startfi.ncwatercap=0
  9. water 为真,可设置 ctrl_h2ovapctrl_h2oice。打开 profile_ref_h2o_vapprofile_ref_h2o_ice 逐层读取参考 mixing ratio;relaxtime_h2ovaprelaxtime_h2oice 小于 0 表示强制 profile,不小于 0 表示按秒级时间常数松弛。

配置键和外部文件

名称 类型 默认/要求 作用
traceur.def 必需文本 首行为 nq 定义 tracer 数量、名称和可选 transporting fluid。
start1D.txt 可选文本 therestart1D 为真时读取 表压、温度、风和 tracer profile restart。
startfi.nc 可选 NetCDF therestartfi 为真时读取 物理 restart,提供 controleTime 和 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_newstartflagh2o
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 时构造温度廓线。

复现要点

  1. traceur.def 是硬需求;即使 tracer_mod 另有 tracer.def 回退路径,本例程在读取 tracer 数量时只打开 traceur.def
  2. start1D.txt 的 tracer 名顺序必须和 traceur.def 中的 tname(iq) 一致,否则 restart 读取会停止。
  3. nslope 只能是 1、3、5、7;restart 与配置的 slope 数不一致会停止。
  4. ndt 在配置中表示 sol 数,但例程内最终乘以 day_step 变成时间步数;复现实验时不要把两者混淆。
  5. ctrl_h2ovapctrl_h2oice 为真时,对应 profile_ref_h2o_vapprofile_ref_h2o_ice 必须至少包含 nlayer 行。
  6. 启用 photochemcallthermos 时,inichim_newstart 使用动态网格形状的临时数组包装 1D 数据;如果 tracer 名或化学数据文件缺失,失败会发生在该后续例程中。

待确认和风险

相关页面