start2archive.F

路径

LMDZ.MARS\libf\dynphy_lonlat\phymars\start2archive.F

所属目录/模块

libf/dynphy_lonlat/phymars

文件定位

start2archive.F 定义程序 start2archive,把一对起始场文件 start.ncstartfi.nc 转换/追加到统一的 start_archive.nc。它先读取动力初始状态和物理初始状态,初始化动力/物理网格,消去分辨率依赖的风、温度和物理网格字段,再在 start_archive.nc 中创建或追加一个 Time 记录及对应变量。若传入命令行选项启用 add_sso_fields,还会把亚网格地形/粗糙度等 SSO 字段加入归档。

定义的符号

符号 类型 行号 作用
start2archive program 2 读取 start.nc/startfi.nc,转换动力与物理字段到归档坐标,创建或追加 start_archive.nc

依赖的模块

use 模块 only 列表 用途 待确认
infotrac infotrac_init,nqtot,tname 初始化 tracer 个数和名字,驱动 q/qsurf 分配和归档变量名。 无。
comsoil_h nsoilmx,inertiedat,inertiesoil,nqsoil,qsoil,ini_comsoil_h 提供土壤层数、土壤热惯量、土壤 tracer 数和土壤状态;ini_comsoil_h 在本文件中导入但未直接调用。 ini_comsoil_h 是否为历史残留需确认。
surfdat_h ini_surfdat_h,qsurf,watercaptag,phisfi,albedodat,z0,z0_default,zmea,zstd,zsig,zgam,zthe,hmons,summit,base 提供物理地表字段、地表 tracer、watercap 标签和可选 SSO 字段。 ini_surfdat_hphisfiz0_default 在本文件中未直接使用。
filtreg_mod inifilr 初始化动力滤波相关状态。 无。
mod_const_mpi COMM_LMDZ 传给 iniphysiq 作为 MPI communicator。 无。
control_mod planet_type 设置 planet_type='mars' 无。
comvert_mod ap,bp 传给 pression 计算层界面压力。 无。
comconst_mod daysec,dtphys,rad,g,r,cpp 为物理初始化和热力换算提供常数。 无。
temps_mod day_ini,hour_ini 使用动力初始日和小时,写入 Time 坐标。 无。
iniphysiq_mod iniphysiq 初始化物理网格和共享状态,使 phyetat0 读取后的字段可转换。 无。
phyetat0_mod phyetat0 读取 startfi.nc 物理初始状态。 无。
exner_hyb_m exner_hyb 由地表压和层界面压计算 Exner 函数,用于位温转温度。 无。
comslope_mod nslope,def_slope,def_slope_mean,subslope_dist 提供坡面数量、坡角和坡面分布,参与物理字段转换与 CO2 冰质量积分。 无。
comcstfi_h pi CO2 冰质量按坡角修正时使用。 无。
surfini_mod surfini 读取物理初始场后初始化/补全地表相关字段。 无。
program_options parse_args,add_sso_fields 解析命令行选项;控制是否写出 SSO 字段。 parse_args 支持的完整参数集合需查模块页。

include 依赖

include 用途
dimensions.h 提供 iim/jjm/llm,并用于 ngridmx=(2+(jjm-1)*iim - 1/jjm)
paramet.h 提供 ip1jm/ip1jmp1/iip1/jjp1 等派生维度。
comdissip.h 动力耗散公共状态,由 defrun_new/动力初始化链使用。
comgeom.h 提供动力经纬度、面积、cu/cv 等几何数组。
netcdf.inc 提供 NetCDF Fortran API 常量和例程。

调用的关键例程

被调用例程 所在模块/文件 调用位置 作用
parse_args program_options 行 150 解析命令行选项,尤其是 --add-sso
defrun_new defrun_new.F 行 157、178 第一次按初始化模式读运行参数;第二次按非初始化模式校验/设置运行参数。
infotrac_init infotrac 行 166 初始化 tracer 数和名字。
dynetat0 外部动力读取例程 行 172 start.nc 读取 vcov/ucov/teta/q/masse/ps/phis/timedyn
iniconstinigeominifilr 动力初始化链 行 179-181 初始化常数、动力几何和滤波。
iniphysiq iniphysiq_mod 行 184 初始化物理网格,传入动力经纬度、面积、cu/cv、火星常数和 iflag_phys=1
phyetat0 phyetat0_mod 行 213 startfi.nc 读取物理初始状态。
NF_OPEN/NF_INQ_VARID/NF_GET_VAR_* / NF_CLOSE NetCDF API 行 219-242 读取 startfi.nccontroletab_cntrl_fi
surfini surfini_mod 行 238 补全/初始化地表状态。
pression 外部动力例程 行 259 ap/bp/ps 计算 p3d 层界面压力。
exner_hyb exner_hyb_m 行 260 计算 pks/pk/pkf,供位温转温度。
covnat 外部动力例程 行 276 将协变风 ucov/vcov 转为自然风 un/vn
wind_scal wind_scal 行 277 把自然风转换到标量格点 us/vs
gr_fi_dyn 外部网格转换例程 多处 将物理网格字段转换回动力标量网格。
ini_archive ini_archive 行 424 start_archive.nc 不存在,创建头部和控制/静态变量。
write_archive write_archive 多处 start_archive.nc 追加变量。

输入

输入 来源 类型/维度 单位 含义
start.nc 当前工作目录 NetCDF 混合 动力起始场,读入风、位温、tracer、质量、地表压、地表位势和动力时刻。
startfi.nc 当前工作目录 NetCDF 混合 物理起始场,读入地表温度、土壤温度、反照率、发射率、地表 tracer、云/尘/水冰/CO2 冰等。
run.def 等运行配置 defrun_new/物理配置链 文本配置 - 提供动力和物理初始化所需运行参数。
命令行选项 program_options::parse_args 字符串 - --add-sso 控制是否额外写入 SSO 地形/粗糙度字段。
现有 start_archive.nc 当前工作目录,可选 NetCDF - 若能打开则追加新时间记录;否则创建新文件。

输出

输出 去向 类型/维度 单位 含义
start_archive.nc 当前工作目录 NetCDF 混合 统一归档文件;包含 Time 记录、地表/大气/土壤/tracer/可选 SSO 字段。
tab_cntrl_fi(49) 传给 ini_archive REAL kg(推断) 旧网格大气总质量 ptotal
tab_cntrl_fi(50) 传给 ini_archive REAL kg(推断) 旧网格 CO2 冰总质量 co2icetotal
Time start_archive.nc record coordinate sol/day date=day_ini+hour_ini,追加到 unlimited Time 维。

共享状态与副作用

核心逻辑

  1. 解析命令行选项,决定是否添加 SSO 字段。
  2. 调用 defrun_new(99,.TRUE.) 读取初始化运行参数,设置 planet_type='mars'
  3. 初始化 tracer 信息,按 nqtot 分配动力 tracer 数组 q
  4. start.nc 读取动力初始场:协变风、位温、tracer、空气质量、地表压、地表位势和动力时刻。
  5. 再调用 defrun_new(99,.FALSE.),随后初始化动力常数、几何、滤波和物理网格。
  6. 分配物理网格和标量网格中间数组,从 startfi.nc 读取物理初始场,并读取其 controle 表。
  7. 调用 surfini 补全地表状态,检查动力和物理初始日期是否同步;之后把 day_ini 折回 0-668。
  8. 计算层界面压力和 Exner 函数;用 covnat + wind_scal 把风转到标量网格;用 T=teta*pk/cpp 把位温转温度。
  9. 对每个坡面,把 tsurf/watercap/perennial_co2ice/tsoil/inertiesoil/emis/albedo/qsurf/subslope_dist 从物理网格转到动力标量网格;再转换 inertiedat/q2/tauscaling/totcloudfrac/watercaptag
  10. add_sso_fields 为真,转换 zmea/zstd/zsig/zthe/zgam/albedodat/z0/hmons/summit/base
  11. 找到名为 co2 的 tracer 索引,按网格面积和重力积分大气质量,按坡面分布和坡角修正积分 CO2 冰质量。
  12. 打开 start_archive.nc;若打开失败则创建文件并调用 ini_archive 写头。
  13. 查询 Time 维长度,令 ntime=timelen+1,写入 date=day_ini+hour_ini
  14. 依次调用 write_archive 写地表冰、尘缩放、云量、发射率、反照率、地表压、地表温度、三维温度、风、q2、可选 SSO 字段、全部 tracer、全部地表 tracer、土壤温度和土壤热惯量。
  15. 关闭 NetCDF 文件,打印完成信息。

伪代码

parse command line
read run.def in initialization mode
planet_type = "mars"
initialize tracer metadata
read start.nc dynamic state

read run.def in checking/runtime mode
initialize constants, geometry, filter, physics grid
read startfi.nc physics state and controle table
initialize surface state
assert start.nc/startfi.nc dates match modulo 669
fold day_ini into first Martian year

compute p3d and Exner functions
convert covariant winds to scalar-grid natural winds
convert potential temperature to temperature
map physics-grid surface/soil/tracer/cloud/dust/slope fields to scalar grid
if add_sso_fields:
    map SSO fields to scalar grid

find CO2 tracer index
integrate atmosphere mass and CO2 ice mass
store totals in tab_cntrl_fi(49:50)

open start_archive.nc
if missing:
    create it and call ini_archive
append new Time record
write all archive fields with write_archive
close archive

参与的主题流程

主题 参与方式
start/startfi 到 start_archive 转换 作为主程序入口,把成对 restart 文件规范化为可被 newstart/其他工具读取的 start_archive.nc
dynphy_lonlat 初始化链 复用 defrun_newiniconstinigeominiphysiq,确保动力和物理网格状态与输入文件一致。
start_archive NetCDF 写出 通过 ini_archive 建头、write_archive 追加变量,维护多时刻初始状态库。
SSO 参数归档 add_sso_fields 为真时写出 ZMEA/ZSTD/ZSIG/ZTHE/ZGAM、albedodat、z0、summit/hmons/base。

写法特点

复现要点

待确认

相关页面