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 由上层 leapfrog 或 leapfrog_p 传入。Mars 分支使用 REAL(itau)/REAL(day_step)、time_0-floor(time_0) 和 day_end-day_ini 的组合;非 Mars fallback 使用 JH_cur。controle(32) 和 time coordinate 应代表调用方传入的 restart time。
串并行差异
- 串行
dynredem1直接写完整数组。 - 并行
dynredem1_p只在 root/rank 0 执行 NetCDF 写。 - 并行 restart 写入前,字段是否已在 root 上完整准备由调用方保证。
复现检查
- restart 文件应包含
controle_descriptor、descriptor、description_size。 controle(32)应等于写文件时传入dynredem1*的time。- time coordinate 名可能是
temps或Time。 - 并行问题要同时查
leapfrog_p的 gather/swap。