leapfrog.F

源码路径:LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d\leapfrog.F。 Mars 运行参与度:必经;Mars 串行动力 GCM 主循环经过本文件。

文件定位

leapfrog 是串行 GCM 的时间推进主循环。它调度 Matsuno/leapfrog 时间层、动力 tendency、tracer 输送、动力-物理耦合、耗散、输出和 restart。当前 COMMON 源码已删除 leapfrog_nogcm.F,本页不再做 COMMON nogcm 对照。

入口状态

主要 inout 数组包括 ucov/vcov/teta/ps/masse/phis/q。它们由 dyn3d/gcm.F90 完成初始态、tracer、geometry、restart/history 初始化后传入。leapfrog 自身负责时间步内状态推进和周期性写出。

时间调度

label 1: Matsuno forward 起点
  -> 保存上一层状态
  -> forward=.true.; leapf=.false.; dt=dtvr
label 2: 主循环
  -> 设置 apphys/apdiss/conser
  -> caldyn / advtrac / integrd
  -> calfis / addfi
  -> dissip / sponge / top_bound
  -> history/dynav/restart
  -> 根据 iperiod 在 forward/backward/leapfrog 间跳转

Mars 日期以 jD_ref/jH_ref/day_ini/day_ref/hour_ini/day_step 组合计算,并形成当前物理时间 JH_cur。restart 写出时还要按 planet_type 分支选择传给 dynredem1time

restart 时间

当前行为重点:

分支 行号 行为
Mars 中途 restart, ecritstart>0 910-916 REAL(itau)/REAL(day_step)+time_0-floor(time_0);最终步且只在最终写时再减 day_end-day_ini
非 Mars 中途 restart fallback 921 CALL dynredem1("restart.nc",JH_cur,...)
Mars purmats 最终 restart 1065-1070 REAL(itau)/REAL(day_step);最终步且只在最终写时再减 day_end-day_ini
非 Mars 最终 restart fallback 1074 CALL dynredem1("restart.nc",JH_cur,...)

旧版 start_time 不是当前 主线。dynredem1 会把该 time 写入 time coordinate,并设置 tab_cntrl(32)=time

主流程

  1. 计算 pressure/Exner/geopotential。
  2. caldyn 得到 du/dv/dteta/dp/w/pbaru/pbarv
  3. 在需要 tracer advection 的步调用 advtrac
  4. integrd 把 tendency 写回动力状态。
  5. apphys 为真时调 calfis,再由 addfi 把 physics tendency 加回。
  6. apdiss 为真时调 dissip、可选 sponge/top_bound
  7. iecri/ecritstart/itaufin 写 history、dynav 和 restart。

Mars 路径边界

复现检查

  1. 先确定 forward/leapf/purmats 当前时间层。
  2. 对 restart,先区分 Mars/非 Mars 和 purmats 分支,再查 dynredem1tab_cntrl(32)
  3. 对 physics 差异,检查 iphysiq/iflag_phys/apphys
  4. 对耗散差异,检查 dissip_period/callsponge/iflag_top_bound

相关页面