conf_phys.F
路径
LMDZ.MARS\libf\phymars\conf_phys.F
所属目录 / 模块
libf\phymars
文件定位
conf_phys.F 定义 conf_phys_mod 模块(第 1 行)和 conf_phys(ngrid,nlayer,nq) 子程序(第 7 行),是 Mars PCM 物理参数化的运行时配置入口。它不计算物理 tendency;它的职责是在物理初始化阶段读取 run.def/callphys.def 风格的配置键,写入 callkeys_mod、dust_param_mod、dimradmars_mod、datafile_mod、time_phylmdz_mod 等共享状态,并在同一个入口内执行大量依赖/互斥校验。
从源码结构看,配置流程分三段:非 MESOSCALE 分支先读取动力-物理共享调度键(第 101-129 行),随后检查并读取 callphys.def(第 133-1291 行),最后给长波辐射设置默认值并可选读取 radia.def 覆盖(第 1304-1381 行)。因此,复现实验时不能只保存 callphys.def;还要记录源码默认值、是否存在 radia.def、以及编译宏 MESOSCALE 对默认值和 bcast 路径的影响。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
conf_phys_mod |
module |
1 |
物理配置读取模块,包含 conf_phys。 |
conf_phys |
subroutine |
7 |
读取运行时配置,设置物理开关和共享参数,并执行配置一致性检查。 |
modname |
local character parameter |
85 |
传给 abort_physic 的错误定位名。 |
old_flag |
local real |
82 |
检查废弃配置键,例如 ecritphy 和 albedo_h2o_ice。 |
callg2d |
local logical |
94 |
radia.def 读取的废弃未用标志;源码注释说明可能从 radia.def 读到。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
ioipsl_getin_p_mod |
getin_p |
读取配置键并覆盖源码默认值。 |
否 |
callkeys_mod |
startphy_file, callrad, water, co2clouds, callthermos 等大量开关 |
本文件最主要的写入目标;保存全局物理开关和运行时参数。 |
否 |
time_phylmdz_mod |
steps_per_sol, outputs_per_sol, iphysiq, ecritstart, daysec, dtphys, slow_diagfi |
物理步长、输出频率、restart 输出频率和诊断输出节奏。 |
否 |
dimradmars_mod |
naerkind, name_iaer, ini_scatterers, tauvis |
设置辐射气溶胶种类数、名称表和可见光参考尘埃光学厚度。 |
否 |
dust_param_mod |
dustbin, doubleq, active, lifting, freedust, dustscaling_mode, reff_driven_IRtoVIS_scenario 等 |
尘埃循环配置枢纽;本文件设置 bin 数、双矩尘埃、起尘、自由尘埃和辐射缩放模式。 |
否 |
aeropacity_mod |
iddist, topdustref |
尘埃垂直分布类型和自定义顶高。 |
否 |
datafile_mod |
datadir |
外部数据根目录,供下游读光学表、尘埃场景、化学和云表。 |
否 |
wstats_mod, write_output_mod, writediagsoil_mod |
callstats, output_diagfi, diagsoil |
控制 stats.nc、diagfi.nc、diagsoil.nc 输出。 |
否 |
tracer_mod |
nuice_sed, ccn_factor, nuiceco2_sed, nuice_ref, nuiceco2_ref |
读取水冰/CO2 冰沉降方差和 CCN 因子。 |
否 |
surfdat_h |
水冰/CO2 极冠反照率、霜阈值、热惯量等 |
设置地表冰、霜和极冠相关参数。 |
否 |
co2condens_mod, calchim_mod |
scavco2cond, ichemistry |
CO2 凝结清除和光化学调用频率。 |
否 |
paleoclimate_mod, comsoil_h, microphys_h |
古气候、土壤吸附、水冰接触参数 |
读取古气候、吸附和云微物理参数,并校验依赖。 |
否 |
dust_coagulation_mod, nonoro_gwd_mix_mod, lwxn_mod |
尘埃凝并、非地形 GW 混合、长波参数 |
读取对应过程开关或默认参数。 |
否 |
tracer_mass_fixer_dyn_mod, moldiff_MPF_mod |
call_mass_fixer_dyn, call_mass_fixer_moldiff_MPF |
读取 tracer 质量修正开关。 |
否 |
mod_phys_lmdz_transfert_para |
bcast |
非 MESOSCALE 并行路径下广播文件存在性、radia.def 读入值等。 |
否 |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
getin_p |
ioipsl_getin_p_mod |
第 101 行起,多处 |
读取配置键。调用前通常先写入源码默认值,再允许配置覆盖。 |
bcast |
mod_phys_lmdz_transfert_para |
第 143、1371-1381 行 |
非 MESOSCALE 并行路径广播 callphys.def/radia.def 读取结果。 |
abort_physic |
外部错误处理入口 |
多处,例如第 104、311、342、893、1225-1280、1290 行 |
配置冲突、废弃键或缺失配置文件时终止运行。 |
ini_scatterers |
dimradmars_mod |
第 1064 行 |
在知道 naerkind 后分配辐射气溶胶数组。 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
ngrid |
conf_phys 实参 |
integer scalar |
网格列数 |
传给 ini_scatterers 分配气溶胶数组。 |
nlayer |
conf_phys 实参 |
integer scalar |
垂直层数 |
传给 ini_scatterers。 |
nq |
conf_phys 实参 |
integer scalar |
tracer 数 |
控制是否安全写入 name_iaer(2:)。 |
run.def 风格键 |
getin_p |
scalar |
混合 |
非 MESOSCALE 分支读取 outputs_per_sol, slow_diagfi, iphysiq, ecritstart 等。 |
callphys.def |
当前运行目录 |
formatted file |
- |
必须存在;不存在则第 1289-1291 行终止。 |
radia.def |
当前运行目录 |
formatted file |
- |
可选长波辐射调参文件;存在时覆盖 callemis, iradia, ilw*, lwxn_*, semi 等。 |
编译宏 MESOSCALE |
预处理 |
compile-time |
- |
改变若干默认值并跳过非 MESOSCALE 的 bcast 路径。 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
callkeys_mod 开关 |
下游物理过程 |
saved scalars |
混合 |
辐射、尘埃、水循环、CO2、PBL、高层大气等主开关。 |
dust_param_mod 状态 |
尘埃循环 |
scalar/module variables |
混合 |
尘埃 bin、双矩尘埃、起尘、自由尘埃和缩放模式。 |
dimradmars_mod::naerkind/name_iaer |
辐射和光学属性路径 |
integer + character array |
- |
定义气溶胶种类数和名称顺序,供 suaer/aeroptproperties/updatereffrad 等使用。 |
time_phylmdz_mod 调度量 |
物理调度、输出和 restart |
scalar |
steps / seconds |
物理调用频率、输出频率、restart 间隔。 |
datafile_mod::datadir |
数据读取模块 |
character |
path |
外部数据根目录。 |
| 诊断输出开关 |
wstats_mod, write_output_mod, writediagsoil_mod |
logical |
- |
控制 stats.nc、diagfi.nc、diagsoil.nc 是否写出。 |
| 终端日志 |
stdout |
text |
- |
打印每个关键配置值和警告。 |
共享状态与副作用
conf_phys 会写入大量 SAVE/THREADPRIVATE 模块变量,尤其是 callkeys_mod 中的运行时开关。OpenMP 复现时要确认初始化流程在每个线程上的传播路径与源码一致。
callphys.def 缺失直接终止;radia.def 缺失不是错误,源码使用第 1308-1318 行的默认长波设置。
- 它会打开、关闭
callphys.def 和 radia.def,并在非 MESOSCALE 路径广播文件状态和值。
- 它在
naerkind 确定后调用 ini_scatterers(ngrid,nlayer),这意味着辐射气溶胶数组大小取决于本入口读到的配置,而不是后续辐射模块自行决定。
- 它含大量
abort_physic 配置守卫。复现失败时,很多错误不是数值发散,而是配置组合在初始化阶段被拒绝。
核心逻辑
- 进入
conf_phys 后,在非 MESOSCALE 分支读取物理输出和调用频率。废弃键 ecritphy 若存在会立即终止;outputs_per_sol 还必须整除 steps_per_sol。
- OpenMP master 检查
callphys.def 是否存在,非 MESOSCALE 时广播 ierr。不存在则在第 1289-1291 行终止。
- 对每个配置项先写源码默认值,再调用
getin_p。例如 iaervar=8、callrad=.true.、calldifv=.true.、callsoil=.true.、dustbin=0、water=.false.、co2clouds=.false.、callthermos=.false.。
- 读取并校验主物理开关:辐射/NLTE/NIR、垂直扩散、热羽流、干对流、Yamada4/ATKE、CO2 凝结、土壤、地形/非地形重力波、尘埃注入、古气候、水循环、CO2 云、吸附和热层。
- 尘埃逻辑先设置
dustbin/active/doubleq/submicron/lifting/freedust/dustscaling_mode,再校验组合。例如 active 需要 doubleq,submicron 需要双矩尘埃,freedust 需要 dustbin > 0,dustinjection=1 需要 lifting 和 freedust。
dustiropacity 只接受 tes 或 mcs。tes 写 dustrefir=9.3E-6,mcs 写 21.6E-6;若启用 reff_driven_IRtoVIS_scenario,源码要求使用 tes 参考波长。
- 水/CO2 云逻辑读
sedimentation/activice/water/hdo/activeco2ice/CLFvarying/co2clouds/...,然后执行依赖检查:例如 activice 需要 water,activeco2ice 需要 co2clouds,microphys 需要 water 和 doubleq,scavenging 需要 microphys 且 dustbin >= 1。
naerkind 读取后先检查 activice 至少需要两个 scatterer,再调用 ini_scatterers。随后按 doubleq/active、rdstorm、topflows、water/activice、co2clouds/activeco2ice、submicron/active 的组合填充 name_iaer。
- 高层大气逻辑读取
callthermos 及其子开关。若 callthermos=.false.,则 callconduct/calleuv/callmolvis/callmoldiff/thermochem 任一为真都会终止;最后还要求 photochem 和 callthermos 均依赖 water。
- 主配置完成后,设置长波默认值:
callemis=.true., ilwd=1, ilwn=1, ilwb=1, lwxn_linear=.true., lwxn_ncouche=3, lwxn_alphan=0.4, semi=0。若 radia.def 存在,则按固定顺序读取并覆盖这些值。
伪代码
subroutine conf_phys(ngrid, nlayer, nq):
if not MESOSCALE:
reject obsolete ecritphy
read outputs_per_sol, slow_diagfi, iphysiq, ecritstart
require outputs_per_sol divides steps_per_sol
check callphys.def exists; broadcast result when parallel
if missing: abort
for each callphys key:
assign source default
getin_p(key, variable)
print selected value
enforce local dependency and incompatibility rules
read naerkind
require active water ice has enough scatterers
ini_scatterers(ngrid, nlayer)
fill name_iaer according to dust, water, CO2, storm, topflow flags
require thermosphere child switches depend on callthermos
require photochem and callthermos depend on water
assign longwave defaults
if radia.def exists:
read fixed-order longwave overrides
broadcast overrides when parallel
end subroutine
参与的主题流程
| 主题 |
参与方式 |
| 辐射 |
设置 callrad, callslope, callnlte, nltemodel, callnirco2, nircorr, iradia, rayleigh, naerkind, name_iaer 和长波 radia.def 覆盖。 |
| 尘埃循环 |
设置 iaervar, tauvis, iddist, topdustref, dustbin, doubleq, lifting, freedust, dustscaling_mode, dustinjection, rdstorm, topflows, dust_coagulation 等。 |
| 水循环 |
设置 water, activice, microphys, supersat, cloud_adapt_ts, scavenging, caps, 水冰反照率/霜阈值、热惯量和吸附相关开关。 |
| CO2 循环 |
设置 callcond, co2clouds, activeco2ice, co2useh2o, CLFvaryingCO2, satindexco2, scavco2cond 和 CO2 冰沉降参数。 |
| 边界层 / 湍流 / 重力波 |
设置 calldifv, calltherm, calladj, callyamada4, callatke, callrichsl, calllott, calllott_nonoro, calljliu_gwimix。 |
| 高层大气 / 化学 |
设置 photochem, ichemistry, callthermos, callconduct, calleuv, callmolvis, callmoldiff, thermochem, solvarmod, fixed_euv_value, solvaryear, euveff。 |
写法特点
- 固定格式 Fortran,很多字符串和
getin_p 调用跨行续写;用行号审查时要同时看续行。
- 大多数默认值直接写在
getin_p 前一两行,因此“默认值”是源码事实,不是 callphys.def 文件事实。
- 该文件把配置读取、默认值、互斥检查和少量初始化动作放在一个长子程序中;新增开关时容易同时影响多个主题。
radia.def 读取是固定顺序文本读取,不按键名读取;文件格式不匹配会错位。
复现要点
- 保存
callphys.def 的同时记录源码版本,因为默认值和依赖检查写死在 conf_phys.F。
- 检查运行目录是否存在
radia.def。存在时长波设置不再完全由源码默认值控制。
- 记录
MESOSCALE 编译状态;例如 callstats、callslope 默认值和并行广播路径都受它影响。
- 记录
naerkind 与 name_iaer 的派生结果。下游辐射路径依赖气溶胶名称顺序,不只是依赖开关真假。
- 若启用微物理、清除、CO2 云、热层或尘埃注入,必须复核本文件中的依赖规则,否则运行会在初始化阶段终止。
待确认
radia.def 中 callg2d 被读取和广播,但源码注释称它是 obsolete unused flag;其历史用途需结合旧辐射路径确认。
semi 在 callkeys_mod 中的物理含义仍需结合长波半隐式路径进一步确认。
abort_physic 未在本文件显式 use,应来自上层接口或外部链接环境;本文只记录调用位置和错误语义。
相关页面