dynredem restart 写出串并行对照

源码基线:LMDZ.COMMON-6.3\LMDZ.COMMON。 Mars 运行参与度:条件经过;Mars 动力写 restart.nc 时经过。

输入范围

libf/dyn3d_common/dynredem.F90
libf/dyn3d_common/dynredem_mod.F90
libf/dyn3dpar/dynredem_p.F90

当前 restart 元数据

变化 串行位置 并行位置 作用
controle_descriptor dynredem.F90:239 dynredem_p.F90:240 描述 controle 数组每个 entry。
descriptor dynredem.F90:222/233 dynredem_p.F90:223/234 descriptor 条数维。
description_size dynredem.F90:223/234 dynredem_p.F90:224/235 每条描述字符串长度维。
put_char1 dynredem_mod.F90:186 同模块 写字符数组到 NetCDF。
int2fmtstr dynredem_mod.F90:263 同模块 生成控制项编号。
tab_cntrl(32)=time dynredem.F90:415 dynredem_p.F90:432 把当前 restart time 写回控制数组。

例程清单

文件 例程 作用
dynredem.F90 dynredem0, dynredem1 串行创建 restart,并追加时间记录和状态场。
dynredem_p.F90 dynredem0_p, dynredem1_p 并行创建/追加 restart,root 负责 NetCDF 写。
dynredem_mod.F90 cre_var, put_var1, put_var2, put_char1, dynredem_write_u/v, dynredem_read_u, int2fmtstr, err NetCDF helper。

创建流程

dynredem0 / dynredem0_p
  -> 构造 dscrpt_tab_cntrl 控制项描述表
  -> 按 planet_type 选择 temps 或 Time 维
  -> 定义 descriptor 和 description_size
  -> 写 controle_descriptor
  -> 定义 controle、经纬度、垂直层、hybrid 坐标、几何、area、phisinit
  -> 定义 ucov/vcov/teta/tracer/masse/ps 时间变量

controle_descriptor 把半径、自转角速度、重力、Cp、kappa、sol 长、动力时间步、能量、压力、enstrophy、enthalpy、角动量、参考压力和 zoom 参数等说明写进 restart。

追加流程

dynredem1 / dynredem1_p
  -> 打开 restart.nc
  -> 查询 temps 或 Time
  -> nb += 1
  -> tab_cntrl(32) = time
  -> 重写 controle
  -> 写 time record 和 ucov/vcov/teta/masse/ps/q

当前 time 由上层 leapfrogleapfrog_p 传入。Mars 分支使用 REAL(itau)/REAL(day_step)time_0-floor(time_0)day_end-day_ini 的组合;非 Mars fallback 使用 JH_curcontrole(32) 和 time coordinate 应代表调用方传入的 restart time。

串并行差异

复现检查

  1. restart 文件应包含 controle_descriptordescriptordescription_size
  2. controle(32) 应等于写文件时传入 dynredem1*time
  3. time coordinate 名可能是 tempsTime
  4. 并行问题要同时查 leapfrog_p 的 gather/swap。

相关页面