动力/物理格点互转例程组
输入范围
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dynphy_lonlat\gr_dyn_fi.F
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dynphy_lonlat\gr_dyn_fi_p.F
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dynphy_lonlat\gr_fi_dyn.F
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dynphy_lonlat\gr_fi_dyn_p.F
文件定位
这组例程在动力二维网格 (im,jm) 和物理列网格 ngrid/klon 之间复制标量场。串行版本按固定 lon-lat 展开规则处理极点和周期经度;并行版本通过 mod_interface_dyn_phys:index_i/index_j 映射当前物理列。
Mars 运行参与度
条件经过/接口兼容:COMMON 串行或并行动力-物理接口转换场时经过;Mars 物理初始化和部分 dyn1d 接口保持兼容。
例程清单
| 例程 | 文件 | 行数 | 方向 |
|---|---|---|---|
gr_dyn_fi |
gr_dyn_fi.F |
38 | 动力网格 -> 物理列,串行。 |
gr_dyn_fi_p |
gr_dyn_fi_p.F |
44 | 动力网格 -> 物理列,并行。 |
gr_fi_dyn |
gr_fi_dyn.F |
40 | 物理列 -> 动力网格,串行。 |
gr_fi_dyn_p |
gr_fi_dyn_p.F |
56 | 物理列 -> 动力网格,并行。 |
串行展开规则
gr_dyn_fi 将 pdyn(1,1,:) 复制到 pfi(1,:),将 pdyn(1,jm,:) 复制到 pfi(ngrid,:),中间纬圈 j=2:jm-1 按 ig=2+(j-2)*(im-1) 展开 im-1 个经度点。
gr_fi_dyn 做反向操作:北极和南极物理点复制到整条动力极点行;中间纬圈从物理列复制 im-1 个点,并设置 pdyn(im,j,:)=pdyn(1,j,:) 保持周期端点一致。
并行版本
gr_dyn_fi_p 和 gr_fi_dyn_p 使用:
mod_interface_dyn_phys:index_i/index_jdimphy:klonparallel_lmdz:OMP_CHUNK
OpenMP 循环遍历本线程/本 rank 的 klon 物理列。gr_dyn_fi_p 直接读 pdyn(index_i(ig),index_j(ig),l);gr_fi_dyn_p 写回同一位置,并在 i==1 时补写周期端点 pdyn(im,j,ifield),还会把极点行扩展到所有经度。
复现要点
- 串行接口的动力经向维度通常是
iip1,但展开中只复制im-1个非重复经度点。 - 并行接口不自行计算格点位置,完全依赖
Init_interface_dyn_phys已初始化的索引。 nfield是最后一维批量字段数,可用于一次转换多个层或多个变量。- 物理列中的两个极点是单点,写回动力网格时会扩展成整条极点行。
待确认
- 并行
_p版本在 Mars 当前 dyn1d 物理测试中是否会实际执行,需要编译宏和入口确认。