startarchive2icosa — ICOSA 初始场转换链

路径

LMDZ.MARS\util\startarchive2icosa

所属目录/模块

util

目录定位

startarchive2icosa 是把 LMDZ.MARS 的 start_archive.nc(lon-lat 网格初始场)转换为 Dynamico ICOSA 正二十面体网格初始场的离线工具链。它解决的问题是:LMDZ GCM 的 restart 文件使用规则经纬网格,而 Dynamico 使用非结构化的正二十面体网格,两者不能直接互用。

整个工具链分三步:(1)start_archive2icosa 主程序通过 XIOS 把 lon-lat 场重映射到 ICOSA 网格并输出 *_prefinalize.nc;(2)icosa_finalize.bash 用 NCO 工具修补维度名、补充缺失变量;(3)rearrange_startphy 按经纬度匹配重新排列物理场的列顺序,使其与 ICOSA restart 文件一致。

README 明确标注此工具仍在开发中,用户需自行调整硬编码变量。

目录文件总览

文件 类型 作用
start_archive2icosa.f90 Fortran 主程序 核心重映射工具:读 lon-lat start_archive,通过 XIOS 插值写 ICOSA 网格的 start_icosa_prefinalize.ncstartfi_prefinalize.nc
rearrange_startphy.f90 Fortran 主程序 列重排工具:按经纬度匹配把 startfi.nc 的列顺序重排为与 startphy_icosa_ref.nc 一致
iodef.xml XIOS 配置 定义输入/输出字段名、网格和轴,供 start_archive2icosa 的 XIOS 调用使用
compile bash 脚本 编译两个 Fortran 主程序,链接 XIOS、NetCDF、HDF5
icosa_finalize.bash bash 脚本 后处理:维度重命名、补充 controle/soildepth/Time 等缺失变量、调用 rearrange_startphy
job_mpi SLURM 脚本 Occigen HPC 提交脚本示例(2 节点 28 进程)
run_icosa.def_no_start Dynamico 配置 无 start 文件的 Dynamico 运行配置样例(用于生成 *_ref.nc
tracer.def_no_start Dynamico tracer 配置 无 start 文件的 tracer 定义样例(11 个 tracer)
README 文本 使用说明

定义的符号

start_archive2icosa.f90

符号 类型 行号 作用
start_archive2icosa program 1 主程序:MPI+XIOS 并行读取 lon-lat 场,重映射到 ICOSA 非结构网格,输出 prefinalize 文件

rearrange_startphy.f90

符号 类型 行号 作用
rearrange_startphy program 1 列重排:按 lon/lat 匹配把 startfi.nc 各列重排为 startphy_icosa_ref.nc 的列顺序

依赖的模块

use 模块 文件 用途
xios start_archive2icosa.f90 XIOS 场发送/接收、网格/轴定义、上下文管理
mod_wait start_archive2icosa.f90 XIOS 等待辅助
netcdf 两个 f90 文件 NetCDF4 读写
mpif.h start_archive2icosa.f90 MPI 初始化与通信

输入

start_archive2icosa 主程序

输入文件 来源 格式 含义
start_archive_nc4.nc 用户从 start_archive.nc 转换 NetCDF4 LMDZ lon-lat 初始场(温度、风场、tracer、土壤、SSO 参数等)
surface_nc4.nc 用户准备 NetCDF4 Mars 地形文件(含 zMOL 等高程变量)
start_icosa_ref.nc Dynamico 运行产出 NetCDF 目标 ICOSA 网格参考(lon_mesh/lat_mesh/bounds_*_mesh
startphy_icosa_ref.nc Dynamico 运行产出 NetCDF 物理列参考(controlelatitude/longitude
iodef.xml 本目录 XML XIOS 字段/网格/轴定义

rearrange_startphy 程序

输入文件 含义
startphy_icosa_ref.nc 目标列顺序参考(latitude/longitude
startfi.nc 待重排的物理场文件(由 icosa_finalize.bash 生成)

输出

start_archive2icosa 主程序

输出文件 含义
start_icosa_prefinalize.nc ICOSA 动力学初始场(theta_rhodzuvpsco2、各 tracer、SSO 参数等)
startfi_prefinalize.nc ICOSA 物理初始场(tsurfemistsoilinertiedat、tracer 地表值等)

icosa_finalize.bash 后处理

输出文件 含义
start_icosa.nc 最终 Dynamico start 文件(补充 u/W/geopot/q/nq 等)
startfi.nc 最终 Dynamico startfi 文件(补充 soildepth/Time/controle 等)

核心逻辑

start_archive2icosa.f90

  1. MPI+XIOS 初始化MPI_INITxios_initialize 获取通信子 → xios_context_initialize("test")
  2. 读地形文件维度:打开 surface_nc4.nc,从 zMOL 变量获取 src_topo_ni_glo/src_topo_nj_glo,按 MPI rank 沿纬度分割
  3. 读 start_archive 维度:打开 start_archive_nc4.nc,从 temp 获取 src_ni_glo/src_nj_glo/src_nlev;从 tsoil 获取 src_nsoil/src_nslope;硬编码 src_nq=11
  4. 读坐标和控制参数:从 start_archive 读 rlonv/rlatu(弧度→度)、ap/bp;从 startphy_icosa_ref.nccontrolegravity=controle(7)kappa=controle(9));preff 硬编码为 610 Pa
  5. 读目标网格:从 start_icosa_ref.nclon_mesh/lat_mesh/bounds_*_mesh,按 MPI rank 分配列
  6. XIOS 网格/轴定义:设置 src_domain_regular(rectilinear)、src_topo_domain_regularsrc_domain_regular_clean(去掉经度最后一列的冗余点)、dst_domain_unstructured(ICOSA);定义 lev/lev_p1/nq/soil_layers/subslope
  7. 时间循环(单步 src_nt=1):
    • 地形:xios_recv_field("zMOL")xios_send_field("topo", zMOL*gravity*1000)(km→m²/s²)
    • 地表压力:xios_recv_field("src_ps") → 计算层界面压力 src_ap(l)+src_bp(l)*psxios_send_field("ps_clean")
    • 地表温度/发射率:接收 subslope 维度 → 去掉最后一列 → 发送
    • q2(湍流动能):接收 src_q2surfsrc_q2atm,拼成 lev_p1 维度
    • 温度→theta_rhodzT * (ΔP/g) / ((P_mean/preff)^κ)
    • 风场:u/v 直接去掉最后一列发送
    • 11 个 tracer(循环 i=1,src_nq):按硬编码的 if/elseif 分支映射到 co2_cleandust_number_cleandust_mass_cleanccn_number_cleanccn_mass_cleanh2o_ice_cleanh2o_vap_cleanstormdust_*topdust_*,同时处理地表 tracer 值
    • 土壤温度/热惯量:tsoil(含 subslope)和 inertiedat
    • SSO 参数:ZMEA/ZSTD/ZSIG/ZGAM/ZTHE*_clean
    • 反照率/粗糙度:albedodat/z0*_clean
  8. 收尾:rank 0 向 startfi_prefinalize.nccontrole,向 start_icosa_prefinalize.nciteration=0xios_finalizeMPI_FINALIZE

rearrange_startphy.f90

  1. startphy_icosa_ref.nc 读所有列的 latitude/longitude
  2. startfi.nclatitude/longitude
  3. 逐列匹配:对 startfi.nc 的第 i 列,在 ref 中找 lon/lat 相对误差 ≤10⁻⁵ 的第 j 列,记录 cell_index(i)=j
  4. 按维度分类遍历所有变量:1D(physical_points)、2D(nvertex×physical_points、subslope×physical_points、lev_p1×physical_points、subsurface_layers×physical_points)、3D(subsurface_layers×subslope×physical_points),按 cell_index 重排并原地写回

伪代码

program start_archive2icosa:
  MPI_INIT + xios_initialize
  read surface_nc4.nc: get topo grid (zMOL)
  read start_archive_nc4.nc: get atm grid (temp, tsoil), ap/bp, lon/lat
  read startphy_icosa_ref.nc: get controle (gravity, kappa)
  read start_icosa_ref.nc: get ICOSA mesh (lon_mesh, lat_mesh, bounds)
  set XIOS domains (rectilinear src + unstructured dst) and axes
  time loop (1 step):
    recv topo → send topo (convert km→m²/s²)
    recv ps → compute layer pressures → send ps_clean
    recv tsurf/emis → strip last lon → send *_clean
    recv q2surf+q2atm → stack → send q2_clean
    recv temp → compute theta_rhodz → send theta_rhodz_clean
    recv u/v → strip last lon → send u_clean/v_clean
    for i=1..11: recv tracer[i] → send to named field (co2/dust/ccn/h2o/stormdust/topdust)
    recv tsoil/inertiedat → send tsoil_clean/inertiedat_clean
    recv SSO (ZMEA/ZSTD/ZSIG/ZGAM/ZTHE) → send *_clean
    recv albedodat/z0 → send *_clean
  rank 0: write controle to startfi_prefinalize, iteration to start_icosa_prefinalize
  finalize XIOS + MPI

program rearrange_startphy:
  read ref lon/lat from startphy_icosa_ref.nc
  read current lon/lat from startfi.nc
  for each cell i: find matching ref cell j by lon/lat (relative error ≤ 1e-5)
  for each variable: rearrange by cell_index and write back in place

参与的主题流程

主题 参与方式
Dynamico 初始场制备 从 LMDZ restart 生成 ICOSA 可用的 start/startfi 文件
LMDZ→Dynamico 迁移 工具链的关键中间步骤

写法特点

复现要点

待确认

复现风险

相关页面