leapfrog_nogcm.F
快速理解
它做什么: 独立物理模式(nogcm)的时间积分主循环,在无完整 GCM 动力核心时用 Matsuno + leapfrog 步进。
基本过程: leapfrog/Matsuno 步进 → 牛顿松弛 + 水平混合替代动力 → 驱动物理倾向。
关键结果: 驱动 nogcm.F90 的独立物理模式时间演化。
路径
LMDZ.MARS\libf\dynphy_lonlat\phymars\leapfrog_nogcm.F
所属目录/模块
libf/dynphy_lonlat/phymars
文件定位
独立物理模式(nogcm)的时间积分主循环。在没有完整 GCM 动力核心的情况下,实现 Matsuno forward/backward + leapfrog 时间步进方案,并用牛顿松弛 + 水平混合替代动力过程,模拟气压、温度和 CO₂ 示踪剂的全局重分布。该例程是 nogcm.F90 的核心驱动。
作者:P. Le Van / L. Fairhead / F. Hourdin。SVN $Id: leapfrog.F 1446 2010-10-22$。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
leapfrog_nogcm |
subroutine | 6 | 独立物理模式时间积分主循环 |
globaverage2d |
function | 1021 | 全局面积加权二维平均(内部辅助函数) |
依赖的模块
| use 模块 | only 列表 | 用途 | 待确认 |
|---|---|---|---|
IOIPSL |
— | NetCDF 输出接口(#ifdef CPP_IOIPSL 条件编译) |
— |
infotrac |
nqtot, ok_iso_verif, tname |
示踪剂总数、同位素校验开关、示踪剂名称 | — |
write_field |
writefield |
场写入辅助 | — |
control_mod |
planet_type, nday, day_step, iperiod, iphysiq, less1day, fractday, ndynstep, iconser, dissip_period, offline, ip_ebil_dyn, ok_dynzon, periodav, ok_dyn_ave, iecri, ok_dyn_ins, output_grads_dyn |
运行控制参数 | — |
exner_hyb_m |
exner_hyb |
混合坐标 Exner 函数 | — |
exner_milieu_m |
exner_milieu |
中间层 Exner 函数 | — |
cpdet_mod |
cpdet, tpot2t, t2tpot |
温度相关 Cp(T) 适配 | — |
comuforc_h |
全模块 | 强迫场公共块 | — |
comvert_mod |
ap, bp, pressure_exner, presnivs, aps, bps, pseudoalt, preff, scaleheight |
垂直坐标系数与参数 | — |
comconst_mod |
daysec, dtvr, dtphys, dtdiss, cpp, ihf, iflag_top_bound, pi, kappa, r |
物理常数与时间步长 | — |
logic_mod |
iflag_phys, ok_guide, forward, leapf, apphys, statcl, conser, purmats, tidal, ok_strato |
逻辑控制开关 | — |
temps_mod |
jD_ref, jH_ref, itaufin, day_ini, day_ref, start_time, dt |
时间与日期 | — |
调用的关键例程
| 被调用例程 | 所在模块/文件 | 调用位置 | 作用 |
|---|---|---|---|
pression |
外部 | 303, 464, 584, 635 | 从混合坐标系数和 ps 计算层间气压 |
exner_hyb / exner_milieu |
exner_hyb_m / exner_milieu_m |
305-308, 466-469, 637-641 | 计算 Exner 函数(按 pressure_exner 分支) |
geopot |
外部 | 472, 809, 843, 953, 978 | 从位温 + Exner 计算位势 |
globaverage2d |
内部函数 | 337, 599, 656, 688, 699, 732, 746-747 | 全局面积加权二维平均 |
calfis |
外部 | 549-553 | 物理倾向计算入口 |
addfi |
外部 | 571-573 | 将物理倾向加到动力变量 |
massdair |
外部 | 585, 636 | 从气压计算空气质量 |
diagedyn |
外部 | 518-520 | 动力诊断(仅 Earth,ip_ebil_dyn >= 1) |
writehist |
IOIPSL | 852, 988 | 写入历史文件 |
writedynav |
IOIPSL | 822-823, 966-967 | 写入动力平均文件 |
bilan_dyn |
IOIPSL | 815-817, 959-961 | 动力收支诊断 |
dynredem1 |
外部 | 870-871, 1000-1001 | 写入 restart 文件 |
abort_gcm |
外部 | 321, 795, 935 | 中止/正常终止模拟 |
check_isotopes_seq |
外部 | 830, 915, 941 | 同位素序列校验(ok_iso_verif) |
tpot2t |
cpdet_mod |
841, 976 | 位温→温度转换(Cp(T) 适配) |
scopy |
BLAS | 371-375 | 数组复制(保存前一步变量) |
输入
| 输入 | 来源 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
ucov |
INOUT | real(ip1jmp1, llm) |
m/s | 纬向协变风 |
vcov |
INOUT | real(ip1jm, llm) |
m/s | 经向协变风 |
teta |
INOUT | real(ip1jmp1, llm) |
K | 位温 |
ps |
INOUT | real(ip1jmp1) |
Pa | 地表气压 |
masse |
INOUT | real(ip1jmp1, llm) |
kg | 空气质量 |
phis |
INOUT | real(ip1jmp1) |
m²/s² | 地表位势 |
q |
INOUT | real(ip1jmp1, llm, nqtot) |
— | 平流示踪剂 |
time_0 |
IN | real |
— | 初始时间(未使用) |
输出
所有输出通过 INOUT 参数回写:ucov/vcov/teta/ps/masse/q 在时间积分后被更新到最终状态。
共享状态与副作用
logic_mod变量:设置forward/leapf/apphys/statcl/conser/dt控制时间步进逻辑temps_mod::itaufin:根据nday/ndynstep/less1day重新计算终止步temps_mod::dt:在 forward 步设为dtvr,leapfrog 步设为2*dtvrcomuforc_h:全模块 USE(读写强迫场公共块)SAVE first:首次调用标记(用于 IOIPSL 初始化)SAVE dissip_conservative:耗散守恒标记SAVE igcm_co2:CO₂ 示踪剂索引- 文件 I/O:写入
restart.nc(dynredem1)、历史文件(writehist)、动力平均文件(writedynav)
核心逻辑
- 确定终止步
itaufin:根据nday(正=天数,负=步数)、less1day(分数天)、ndynstep(固定步数)计算 - 初始化倾向数组为零:
dudis/dvdis/dtetadis/dutop/dufi/dvfi/dtetafi/dqfi/dpfi - 初始气压与 Exner:调用
pression+exner_hyb/exner_milieu,并验证 PK 单调递减 - 计算参考气压因子
kpd = exp(-phis/(R*200))和全局平均p00d = globaverage2d(kpd) - 定位 CO₂ 示踪剂:遍历
tname找到"co2"的索引igcm_co2 - Matsuno Forward 步(label 1):
- 保存前一步变量(
scopy× 5) - 设
forward=.TRUE.,leapf=.FALSE.,dt=dtvr - 动力倾向置零(nogcm 无动力核心)
- 判断物理调用
apphys(按iphysiq频率)
- 保存前一步变量(
- 物理调用分支(
apphys为真时):- 重新计算气压、Exner、位势
- 调用
calfis计算物理倾向 - 调用
addfi施加物理倾向 - nogcm 特有:牛顿松弛气压 →
ps += (p0*kpd - ps) * (1 - exp(-dtphys/tau_ps)),tau_ps = 1s - nogcm 特有:位温修正
teta *= (ps_new/ps_old)^kappa - nogcm 特有:CO₂ 垂直混合(质量加权柱平均替代垂直分布)
- nogcm 特有:CO₂ 水平混合(牛顿松弛向全局平均,
tau_co2 = 10^5 s) - nogcm 特有:温度水平混合(牛顿松弛,
tau_teta = 10^7 s)
- Matsuno Backward / Leapfrog 步(label 2):
- 根据
purmats选择纯 Matsuno 或 Matsuno+Leapfrog 方案 - Leapfrog 步
dt = 2*dtvr
- 根据
- 输出与 restart:
- 按
iperiod频率写动力平均和诊断 - 按
iecri频率写历史文件 - 终止时写
restart.nc(dynredem1)
- 按
- 时间步进控制:通过
GO TO 1/2在 forward/backward/leapfrog 之间跳转
伪代码
Compute itaufin from nday / ndynstep / less1day
Zero all tendency arrays
Compute initial pressure, Exner function; verify PK monotonicity
Compute kpd = exp(-phis / (R*200)); p00d = global_average(kpd)
Locate CO2 tracer index (igcm_co2)
LOOP itau = 0 .. itaufin:
-- Matsuno Forward step --
Save current state (ucov, vcov, teta, masse, ps) → (...m1)
Set forward=.T., leapf=.F., dt=dtvr
Zero dynamic tendencies (nogcm has no dynamics)
IF physics due (apphys):
Recompute pressure, Exner, geopotential
CALL calfis → physical tendencies (dufi, dvfi, dtetafi, dqfi)
CALL addfi → apply tendencies
Newtonian relax ps toward p0*kpd (tau=1s)
Correct teta for ps change
Vertical-mix CO2 (column mass-weighted mean)
Horizontal-mix CO2 toward global mean (tau=1e5s)
Horizontal-mix teta toward global mean (tau=1e7s)
-- Matsuno Backward / Leapfrog step --
IF purmats: pure Matsuno (forward→backward→forward...)
ELSE: Matsuno forward+backward, then leapfrog (dt=2*dtvr)
IF output due: write history / averages / diagnostics
IF itau == itaufin: write restart.nc; stop
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| 独立物理模式(nogcm) | 提供完整的时间积分循环,替代 GCM 动力核心 |
| CO₂ 循环(nogcm 近似) | 用牛顿松弛和水平混合近似动力输运 |
| 初始场与 restart | 终止时写 restart.nc |
写法特点
- 固定格式 Fortran 77/90 混合:
.F后缀,f77 风格列格式但包含 f90USE和!注释 - GO TO 控制流:用 label 1(forward 步起点)和 label 2(backward/leapfrog 步起点)实现时间步进跳转
SAVE+DATA初始化:first/dissip_conservative/igcm_co2/airetot(globaverage2d内)使用 SAVE 保持状态- 条件编译:
#ifdef CPP_IOIPSL控制 IOIPSL I/O 功能;未定义时相关输出被跳过 - nogcm 特有物理:用 3 个牛顿松弛时间尺度(
tau_ps=1s/tau_co2=10^5s/tau_teta=10^7s)+ CO₂ 垂直混合替代完整动力核心 globaverage2d内部函数:面积加权全局平均,首次调用计算airetot并 SAVESTOP语句(line 1015):正常执行到末尾停止(abort_gcm在非零错误码时才真正中止)
复现要点
- 需要
nogcm.F90提供初始化的动力变量场 - 需要配置
control_mod中的运行参数(nday/iphysiq/iconser/purmats等) - 需要
calfis→physiq物理参数化链可用 - CO₂ 示踪剂名为
"co2"(字符串匹配tname) - 牛顿松弛常数硬编码在例程内:
tau_ps=1,tau_co2=1e5,tau_teta=1e7
待确认
comuforc_h全模块 USE 的具体读写变量待确认purmats纯 Matsuno 模式下的完整行为是否与 Leapfrog 分支一致待确认globaverage2d在极地格点(j=1,j=jjp1)的处理方式是否正确
相关页面
- nogcm — 唯一调用方,独立物理模式主程序
- callphysiq_mod — GCM 模式下的物理调用接口(对比)
- control_mod.md:运行控制参数。
- comvert_mod.md:垂直坐标系数。
- common-dependencies —
temps_mod时间与日期状态的 COMMON 边界。 - dynphy_lonlat/index — 所属目录概览