tabfi.F
路径
LMDZ.MARS\libf\phymars\tabfi.F
所属目录 / 模块
libf/phymars
文件定位
tabfi.F 是物理初始化路径中的控制表读取和常数恢复模块。tabfi 从 startfi.nc 的 controle 数组读取火星半径、自转角速度、重力、气体摩尔质量、日长、物理时间步、轨道量、地表粗糙度、湍流下限、CO2 冰反照率/发射率、尘埃可见光学厚度和土壤体积热容;当 nid=0 时,它不读文件,而写入一组默认 Mars 常数。若 Lmodif=1 且处于串行运行,它还允许交互修改控制表中的若干物理常数,最后调用 iniorbit 生成轨道派生量。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
tabfi_mod |
module | 1 | 封装物理控制表读取和修改例程。 |
tabfi |
subroutine | 8 | 读取或默认初始化物理常数,并把关键常数回传给调用方。 |
依赖的模块
| use 模块 | only 列表 | 用途 | 待确认 |
|---|---|---|---|
ioipsl_getin_p_mod |
getin_p |
源码保留的 getin 接口,本例程当前执行语句未直接调用。 | 是否为历史接口残留。 |
comsoil_h |
volcapa |
写入土壤体积热容。 | - |
surfdat_h |
z0_default, emissiv, emisice, albedice, iceradius, dtemisice |
写入地表粗糙度、地表/冰发射率、冰反照率和 CO2 雪粒径参数。 | iceradius 在 only 列表中重复出现一次。 |
dimradmars_mod |
tauvis |
写入参考可见尘埃光学厚度。 | - |
iostart |
get_var |
从物理 start 文件读取 controle 数组。 |
- |
mod_phys_lmdz_para |
is_parallel |
禁止并行路径下交互修改 tab_control。 |
- |
comcstfi_h |
g, mugaz, omeg, rad, rcp |
写入公共物理常数。 | - |
time_phylmdz_mod |
daysec, dtphys |
写入日长和物理时间步。 | - |
planete_h |
aphelie, emin_turb, lmixmin, obliquit, peri_day, periheli, year_day, lsp2solp, iniorbit |
写入轨道和湍流参数,并调用轨道派生量初始化。 | - |
调用的关键例程
| 被调用例程 | 所在模块 / 文件 | 调用位置 | 作用 |
|---|---|---|---|
get_var |
iostart |
行 167 | 读取 controle 数组。 |
abort_physic |
物理错误处理 | 行 169、277 | 缺少 controle 或并行修改控制表时终止。 |
lsp2solp |
planete_h |
行 464 | 把交互输入的近日点太阳经度换算为 peri_day。 |
iniorbit |
planete_h |
行 549 | 用基础轨道量生成派生轨道状态。 |
被调用位置
| 调用方 | 文件 | 调用位置 | 作用 |
|---|---|---|---|
phyetat0 |
phyetat0_mod.F90 |
行 145、148 | 有 startfi 时读控制表;无 startfi 时走默认常数路径。 |
newstart |
dynphy_lonlat/phymars/newstart.F |
行 374、379 | 新建/修改初始场时读取并可修改物理控制表。 |
输入
| 输入 | 来源 | 类型 / 维度 | 单位 | 含义 |
|---|---|---|---|---|
nid |
调用方 | integer | - | start 文件逻辑标识;nid=0 时不读取 controle,改用默认常数。 |
Lmodif |
调用方 | integer | - | 是否允许交互修改控制表;1 表示修改模式。 |
tab0 |
调用方 | integer | - | 物理参数在 tab_cntrl 中的偏移。 |
输出
| 输出 | 去向 | 类型 / 维度 | 单位 | 含义 |
|---|---|---|---|---|
day_ini |
调用方 | integer*4 | sol | tab_cntrl(tab0+3),初始日期。 |
lmax |
调用方 | integer | layers | tab_cntrl(tab0+2),用于与物理层数核对。 |
p_rad, p_omeg, p_g, p_mugaz, p_daysec |
调用方 | real scalar | mixed | 同名动力/物理常数的回传值。 |
time |
调用方 | real scalar | - | tab_cntrl(tab0+4) 读取的时间值。 |
共享状态与副作用
tabfi 会直接写入多个共享模块变量:comcstfi_h 的 rad/omeg/g/mugaz/rcp,time_phylmdz_mod 的 daysec/dtphys,planete_h 的 year_day/periheli/aphelie/peri_day/obliquit/lmixmin/emin_turb,surfdat_h 的地表和 CO2 冰辐射参数,dimradmars_mod::tauvis,以及 comsoil_h::volcapa。它会向标准输出打印控制表前后状态;修改模式还会从标准输入读取关键字和值。并行运行时若 Lmodif=1 会 abort_physic。
核心逻辑
- 打印
nid/tab0/Lmodif。 - 若
nid=0,清零tab_cntrl并写入默认 Mars 常数、轨道量、地表粗糙度、CO2 冰辐射参数、尘埃光学厚度和土壤热容。 - 若
nid!=0,调用get_var("controle", tab_cntrl, found),随后按tab0+index读取各控制量并写入共享模块。 - 打印修改前的控制表值;若
Lmodif=1且并行运行则终止。 - 串行修改模式中循环读取用户关键字,允许修改
day_ini/z0/emin_turb/lmixmin/emissiv/emisice/albedice/iceradius/dtemisice/tauvis/obliquit/peri_day/peri_ls/periheli/aphelie/volcapa。 - 修改后再次打印控制表值,调用
iniorbit()。 - 若旧 start 文件没有
iceradius,把南北 CO2 雪粒径设为100.e-6,dtemisice设为0.4。
伪代码
if nid == 0:
set default Mars physical constants and surface/radiative parameters
else:
read controle into tab_cntrl
copy tab_cntrl(tab0 + indices) into shared modules and output args
print control values before modification
if Lmodif == 1:
abort if parallel
while user enters a keyword:
read replacement value and update matching shared variable
print control values after modification
call iniorbit()
patch old start files if iceradius is zero
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| 初始状态 / restart | phyetat0_mod 调用本例程恢复或默认生成物理控制表。 |
| 轨道和太阳几何 | 写入基础轨道量并调用 iniorbit,影响 solarlong、orbite 等下游。 |
| CO2 冰和地表辐射 | 初始化 albedice/emisice/iceradius/dtemisice/emissiv/z0_default 等参数。 |
| 土壤和边界层 | 初始化 volcapa、lmixmin、emin_turb。 |
写法特点
- 固定格式 Fortran,包含交互式
read(*,*)修改循环。 tab_cntrl本地长度固定为 100;物理参数通过tab0+index访问。getin_p被 use 但当前文件未直接调用。surfdat_h的 only 列表中iceradius重复出现。
复现要点
nid=0与nid!=0是两条完全不同的初始化路径;前者使用默认常数,后者依赖startfi.nc的controle数组。Lmodif=1只能在串行路径执行;并行修改会直接终止。- 修改
peri_ls不直接写入 restart 控制表字段,而是通过lsp2solp反推peri_day。 - 老 start 文件若
iceradius(1)=0,会触发 CO2 雪粒径和 metamorphism 时间尺度回退值。
待确认
getin_puse 是否仍有计划用途,当前源码未调用它。- 控制表
tab0+12/13/28-30等空档字段是否由历史版本或其他工具占用,需要结合写出端phyredem继续核对。
相关页面
phyetat0_mod:物理初始状态读取路径调用本例程。
planete_h:接收轨道参数并提供
lsp2solp/iniorbit。comcstfi_h:接收公共物理常数。
surfdat_h:接收地表辐射和粗糙度参数。
soil_settings:土壤热容与
volcapa的下游关系。time_phylmdz_mod:接收
tabfi读取或默认生成的daysec/dtphys,并由初始化路径派生steps_per_sol。