start2archive.F
路径
LMDZ.MARS\libf\dynphy_lonlat\phymars\start2archive.F
所属目录/模块
libf/dynphy_lonlat/phymars
文件定位
start2archive.F 定义程序 start2archive,把一对起始场文件 start.nc 和 startfi.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_h、phisfi、z0_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。 |
iniconst、inigeom、inifilr |
动力初始化链 |
行 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.nc 的 controle 到 tab_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 维。 |
共享状态与副作用
- 读取
start.nc、startfi.nc,并创建或修改 start_archive.nc。
- 分配
q、物理网格数组、标量网格数组和临时 watercaptag_tmp,源码末尾没有显式 deallocate,程序结束时释放。
- 设置全局
planet_type='mars'。
- 修改
day_ini:若 day_ini>=669,循环减去 669,把日期折回火星年内。
- 将
tab_cntrl_fi(49:50) 改写为本程序重新计算的大气总质量和 CO2 冰总质量。
- 若
startfi.nc 的 day_ini_fi 与动力 day_ini 模 669 不一致,程序 stop。
- 若
start_archive.nc 不存在,使用 NF_CREATE(... NF_CLOBBER,NF_64BIT_OFFSET ...) 创建;若存在,则追加新记录而不重建头部。
核心逻辑
- 解析命令行选项,决定是否添加 SSO 字段。
- 调用
defrun_new(99,.TRUE.) 读取初始化运行参数,设置 planet_type='mars'。
- 初始化 tracer 信息,按
nqtot 分配动力 tracer 数组 q。
- 从
start.nc 读取动力初始场:协变风、位温、tracer、空气质量、地表压、地表位势和动力时刻。
- 再调用
defrun_new(99,.FALSE.),随后初始化动力常数、几何、滤波和物理网格。
- 分配物理网格和标量网格中间数组,从
startfi.nc 读取物理初始场,并读取其 controle 表。
- 调用
surfini 补全地表状态,检查动力和物理初始日期是否同步;之后把 day_ini 折回 0-668。
- 计算层界面压力和 Exner 函数;用
covnat + wind_scal 把风转到标量网格;用 T=teta*pk/cpp 把位温转温度。
- 对每个坡面,把
tsurf/watercap/perennial_co2ice/tsoil/inertiesoil/emis/albedo/qsurf/subslope_dist 从物理网格转到动力标量网格;再转换 inertiedat/q2/tauscaling/totcloudfrac/watercaptag。
- 若
add_sso_fields 为真,转换 zmea/zstd/zsig/zthe/zgam/albedodat/z0/hmons/summit/base。
- 找到名为
co2 的 tracer 索引,按网格面积和重力积分大气质量,按坡面分布和坡角修正积分 CO2 冰质量。
- 打开
start_archive.nc;若打开失败则创建文件并调用 ini_archive 写头。
- 查询
Time 维长度,令 ntime=timelen+1,写入 date=day_ini+hour_ini。
- 依次调用
write_archive 写地表冰、尘缩放、云量、发射率、反照率、地表压、地表温度、三维温度、风、q2、可选 SSO 字段、全部 tracer、全部地表 tracer、土壤温度和土壤热惯量。
- 关闭 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_new、iniconst、inigeom、iniphysiq,确保动力和物理网格状态与输入文件一致。 |
| start_archive NetCDF 写出 |
通过 ini_archive 建头、write_archive 追加变量,维护多时刻初始状态库。 |
| SSO 参数归档 |
在 add_sso_fields 为真时写出 ZMEA/ZSTD/ZSIG/ZTHE/ZGAM、albedodat、z0、summit/hmons/base。 |
写法特点
- 固定格式 Fortran 与现代
USE 混用,并依赖 netcdf.inc 和多个 include 公共块。
- 以程序当前目录中的固定文件名
start.nc、startfi.nc、start_archive.nc 工作,源码中没有参数化输入文件名。
start_archive.nc 打不开就创建;已有文件则追加,因此同一文件可以保存多个 Time 初始状态。
q2surf 写 q2S 的第 1 层,q2atm 从 q2S(1,2) 开始写三维大气部分。
- 土壤温度和土壤热惯量用
write_archive 的 -3 维度标记写出,表示包含 soil/slope 等非标准维度组合;具体维度解释在 write_archive.F 中待补页。
复现要点
- 运行目录必须同时有
start.nc、startfi.nc 和相关 run.def/物理配置;start_archive.nc 可不存在。
start.nc 与 startfi.nc 的初始日需要在模 669 意义下一致,否则程序停止。
- tracer 名称来自
infotrac_init/tname;归档中的 tracer 变量名直接使用 tname(iq) 和 tname(iq)//"_surf"。
- 若要给后续
startarchive2icosa 等工具提供 SSO 字段,需要运行时启用 --add-sso。
igcm_co2 依赖存在名为 co2 的 tracer;若 tracer 表中没有 co2,源码没有显式保护。
待确认
q2S(1,2) 指针式传参已确认由 write_archive 按 dim=3 的 edges 控制写入长度;多形状实参仍需结合编译器接口检查确认。
igcm_co2 在未找到 co2 tracer 时的行为没有保护,是否由 tracer 配置强制保证。
tab_cntrl_fi(49:50) 注释称传递 ptotal/co2icetotal,但前文注释又提到 99/100,需结合 ini_archive 的控制表布局继续核验。
- 导入但未直接使用的
ini_comsoil_h、ini_surfdat_h、phisfi、z0_default 是否为旧版本残留。
相关页面