check_fields.F90
路径
LMDZ.MARS\libf\phymars\check_fields.F90
所属目录 / 模块
libf\phymars
文件定位
check_fields.F90 定义 check_fields_mod,为 physiq 主物理步提供可选的防御性场检查。它不改变物理状态,也不输出 NetCDF;当 physiq_mod.F 中 check_physics_inputs 或 check_physics_outputs 开关打开时,分别在物理步开始和结束调用 check_physics_fields,检查温度、水平风、表面压力和 tracer 场是否出现 NaN 或超出硬编码的合理范围。
该文件的定位是调试和复现实验保护:正常生产路径默认不开启这些检查;一旦检查失败,它先向标准输出打印具体格点、层号和值,然后通过 abort_physic 中止物理步。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
check_fields_mod |
module |
1 |
封装物理场一致性检查例程和默认阈值 |
check_physics_fields |
subroutine |
13 |
聚合检查温度、风、表面压力和 tracer;失败时调用 abort_physic |
check_temperature |
subroutine |
46 |
检查温度 NaN、低于最小阈值和高于最大阈值 |
check_winds |
subroutine |
101 |
检查 u/v 风速 NaN 和绝对值过大 |
check_ps |
subroutine |
155 |
检查表面压力 NaN、低于最小阈值和高于最大阈值 |
check_tracers |
subroutine |
207 |
检查 tracer NaN,并统计/警告负 tracer 混合比 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
dimphy |
klon, klev |
给温度、风、压力和 tracer 数组提供物理网格维度 |
- |
tracer_mod |
nqmx |
在 check_physics_fields 中决定 tracer 维度和是否调用 tracer 检查 |
- |
tracer_mod |
nqmx, noms |
在 check_tracers 中循环所有 tracer,并用 noms(iq) 打印 tracer 名 |
- |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
check_temperature |
check_fields_mod / check_fields.F90 |
行 31 |
检查 temp(klon,klev) |
check_winds |
check_fields_mod / check_fields.F90 |
行 32 |
检查 u 和 v |
check_ps |
check_fields_mod / check_fields.F90 |
行 33 |
用 pplev(:,1) 当作表面压力检查 |
check_tracers |
check_fields_mod / check_fields.F90 |
行 35 |
在 nqmx>=1 时检查 tracer 场 |
abort_physic |
物理层通用中止例程 |
行 40 |
任一检查失败后中止运行 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
message |
调用方 |
character |
- |
诊断前缀;physiq 传入 "begin physiq:" 或 "end of physiq:" |
temp |
physiq 状态场 |
real (klon,klev) |
K |
待检查温度 |
u, v |
physiq 状态场 |
real (klon,klev) |
m/s |
待检查水平风 |
pplev |
physiq 压力界面 |
real (klon,klev+1) |
Pa |
层界面压力;本文件只用 pplev(:,1) 作为表面压力 |
q |
physiq tracer 状态 |
real (klon,klev,nqmx) |
tracer mixing ratio |
待检查 tracer 混合比 |
temp_min, temp_max |
直接调用 check_temperature 的可选参数 |
real scalar |
K |
覆盖默认温度阈值 |
wind_max |
直接调用 check_winds 的可选参数 |
real scalar |
m/s |
覆盖默认风速绝对值上限 |
ps_min, ps_max |
直接调用 check_ps 的可选参数 |
real scalar |
Pa |
覆盖默认表面压力阈值 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
ok |
各检查子例程调用方 |
logical |
- |
.true. 表示该字段通过检查;.false. 表示至少发现一个 NaN 或越界值 |
| 诊断文本 |
标准输出 |
write(*,*) |
- |
打印出错字段、数值、水平点 i、垂直层 k 或 tracer 名 |
共享状态与副作用
- 模块内定义硬编码默认阈值:温度 50-350 K,风速绝对值上限 500 m/s,表面压力 80-2000 Pa。
check_physics_fields 本身没有可选阈值参数;只有底层 check_temperature、check_winds、check_ps 支持直接调用时覆盖阈值。
- 所有检查都只读输入数组,不写回
temp/u/v/pplev/q。
- 出错时通过
write(*,*) 打印诊断,随后 check_physics_fields 调用 abort_physic 中止。
abort_physic 在本文件中没有显式 use;按当前源码只能确认它由构建/宿主作用域提供,需在接口清理时再确认来源。
核心逻辑
check_physics_fields 初始化 ok_q=.true.,然后依次调用温度、风、表面压力检查。
- 表面压力检查使用
pplev(:,1),即假定 physiq 传入的第一个界面压力是近地表压力。
- 若
nqmx>=1,继续调用 check_tracers 检查所有 tracer。
- 任一
ok_t、ok_w、ok_ps、ok_q 为 .false. 时,调用 abort_physic("check_physics_fields", trim(message)//" Invalid field values", 1)。
check_temperature 遍历 klon*klev,用 x.ne.x 检测 NaN,并检查 50-350 K 默认范围。
check_winds 分别检查 u、v 的 NaN 和 abs(value)>500。
check_ps 遍历 klon,检查 NaN 和 80-2000 Pa 范围。
check_tracers 对每个 tracer 统计 NaN 和负值;NaN 会让 ok=.false.,负值只打印 warning,不会中止。
伪代码
check_physics_fields(message, temp, u, v, pplev, q):
ok_q = true
check_temperature(message, temp, ok_t)
check_winds(message, u, v, ok_w)
check_ps(message, pplev(:,1), ok_ps)
if nqmx >= 1:
check_tracers(message, q, ok_q)
if any of ok_t, ok_w, ok_ps, ok_q is false:
abort_physic("check_physics_fields",
message + " Invalid field values", 1)
check_temperature:
tmin = optional temp_min or 50 K
tmax = optional temp_max or 350 K
for each grid point and level:
fail if temp is NaN
fail if temp < tmin or temp > tmax
check_winds:
wmax = optional wind_max or 500 m/s
for each grid point and level:
fail if u or v is NaN
fail if abs(u) or abs(v) exceeds wmax
check_ps:
pmin/pmax = optional values or 80/2000 Pa
for each grid point:
fail if ps is NaN or outside range
check_tracers:
for each tracer:
count NaNs and negative values
NaNs fail the check
negative values print a warning only
参与的主题流程
| 主题 |
参与方式 |
主物理时间步 physiq |
physiq_mod.F 在行 105 use check_fields_mod, only: check_physics_fields,并在行 828-830 和 4153-4155 分别检查物理输入和输出 |
| 调试 / 复现实验保护 |
通过 check_physics_inputs、check_physics_outputs 两个 getin_p 开关在运行时启用额外 sanity check |
| tracer 系统 |
用 tracer_mod:nqmx 遍历 tracer 数量,用 tracer_mod:noms 输出负值 tracer 名 |
写法特点
- NaN 检测使用
x.ne.x,没有依赖 IEEE 模块。
- 阈值是模块常量,不来自
callphys.def;check_physics_fields 也没有把可选阈值向上传递。
check_tracers 中负 tracer 的 ok=.false. 被注释掉,因此负 tracer 只作为警告,不触发 abort_physic。
nb_bad_nan 在所有 tracer 上累计,但源码没有直接打印 NaN 总数;NaN 的影响体现在 ok=.false. 并最终中止。
复现要点
- 默认运行不会自动检查这些场;需要在物理配置链中打开
check_physics_inputs 或 check_physics_outputs。
- 若在非常规火星实验中出现温度低于 50 K、高于 350 K,或表面压力超出 80-2000 Pa,即使数值不是 NaN,也会触发中止。
pplev(:,1) 必须对应表面压力;若上游垂直坐标约定改变,该检查会误判。
- tracer 负值不会中止运行;若复现实验要求负 tracer 作为硬错误,需要修改源码或额外检查。
- 由于
check_physics_outputs 检查的是 zt/zu/zv/zplev/zq,它能定位物理过程更新后的异常,但不能直接指出具体是哪一个物理子方案首次产生异常。
待确认
abort_physic 的显式模块来源未在本文件声明;本页按外部/宿主可见例程记录。
check_physics_inputs 和 check_physics_outputs 的默认值在 physiq_mod.F 中为 .false.,具体配置文件是否显式打开需按实验个案核查。
相关页面