leapfrog_nogcm.F
路径
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*dtvr
comuforc_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 风格列格式但包含 f90 USE 和 ! 注释
- 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 并 SAVE
STOP 语句(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)的处理方式是否正确
相关页面