check_fields.F90

路径

LMDZ.MARS\libf\phymars\check_fields.F90

所属目录 / 模块

libf\phymars

文件定位

check_fields.F90 定义 check_fields_mod,为 physiq 主物理步提供可选的防御性场检查。它不改变物理状态,也不输出 NetCDF;当 physiq_mod.Fcheck_physics_inputscheck_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 检查 uv
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 名

共享状态与副作用

核心逻辑

  1. check_physics_fields 初始化 ok_q=.true.,然后依次调用温度、风、表面压力检查。
  2. 表面压力检查使用 pplev(:,1),即假定 physiq 传入的第一个界面压力是近地表压力。
  3. nqmx>=1,继续调用 check_tracers 检查所有 tracer。
  4. 任一 ok_tok_wok_psok_q.false. 时,调用 abort_physic("check_physics_fields", trim(message)//" Invalid field values", 1)
  5. check_temperature 遍历 klon*klev,用 x.ne.x 检测 NaN,并检查 50-350 K 默认范围。
  6. check_winds 分别检查 uv 的 NaN 和 abs(value)>500
  7. check_ps 遍历 klon,检查 NaN 和 80-2000 Pa 范围。
  8. 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_inputscheck_physics_outputs 两个 getin_p 开关在运行时启用额外 sanity check
tracer 系统 tracer_mod:nqmx 遍历 tracer 数量,用 tracer_mod:noms 输出负值 tracer 名

写法特点

复现要点

待确认

相关页面