newstart.F
快速理解
它做什么: 交互式初始场编辑器,从 start_archive.nc 或已有 restart 构造新的动力与物理重启文件。
基本过程: 读控制表 → 装配/读取初始场 → 按用户选择修改地形/压力/tracer/地下冰/坡面 → 写 restart.nc/restartfi.nc。
关键结果: restart.nc/restartfi.nc,汇合 lect_start_archive/datareadnc/iniphysiq/phyredem 等初始化链。
路径
LMDZ.MARS\libf\dynphy_lonlat\phymars\newstart.F
所属目录/模块
libf/dynphy_lonlat/phymars
文件定位
newstart.F 定义交互式初始场编辑程序 newstart,用于从 start_archive.nc 或已有 start.nc/startfi.nc 构造新的动力与物理重启文件。程序读取控制表,初始化当前网格和物理共享状态,装配或读取动力/物理场,按用户选择修改地形、压力、tracer、地下冰、坡面数等状态,最后写出 restart.nc 和 restartfi.nc。
该程序是 lect_start_archive、datareadnc、defrun_new、iniphysiq、caldyn0 和 phyredem 等初始化链的汇合点。复现实验时要把它看成“start 文件生成流程”,而不是常规 GCM 运行的一步。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
newstart |
program | 2 | 交互式创建/修改 LMD Mars GCM 初始状态,并写出 restart.nc/restartfi.nc |
load_MONS_data |
subroutine | 2045 | 读取 MONS 地下冰数据,补南极缺测,并插值到 GCM 网格 |
依赖的模块
| use 模块 | only 列表 | 用途 | 待确认 |
|---|---|---|---|
ioipsl_getincom |
getin |
被 datareadnc 路径配合使用的配置读取体系 |
— |
mod_phys_lmdz_para |
is_parallel, is_sequential, is_mpi_root, is_omp_root, is_master |
在 tabfi 前强制串行/主进程标志 |
— |
infotrac |
infotrac_init, nqtot, tname |
读取 tracer 数量和名称 | — |
tracer_mod |
noms, mmol, igcm_* |
tracer 名、摩尔质量和关键 tracer 索引 | — |
surfdat_h |
phisfi, z0, zmea, zstd, zsig, zgam, zthe, albedodat, qsurf, tsurf, emis, hmons, summit, base, watercap, perennial_co2ice, slope-var init/end |
地表、坡面和 surface tracer 状态 | — |
comsoil_h |
inertiedat, inertiesoil, layer, mlayer, nsoilmx, tsoil, slope-var init/end, flux_geo, qsoil, nqsoil |
土壤层、热惯量、土壤温度和地下状态 | — |
control_mod |
day_step, iphysiq, anneeref, planet_type |
时间步控制和行星类型 | — |
geometry_mod |
longitude, latitude, cell_area |
物理重启文件写出的网格坐标和面积 | — |
lect_start_archive_mod |
lect_start_archive |
从 start_archive.nc 读取并重映射初始场 |
— |
tabfi_mod |
tabfi |
从 start/startfi 控制表初始化物理常数和时间 | — |
phyetat0_mod |
phyetat0 |
从 startfi.nc 读取物理初始状态 |
— |
phyredem |
physdem0, physdem1 |
写出 restartfi.nc |
— |
iostart |
open_startphy |
为 tabfi 打开物理 start 文件 |
— |
initracer_mod |
initracer |
初始化 igcm_* tracer 索引和物性 |
— |
dimradmars_mod |
albedo, slope-var init/end |
坡面数变化时重分配地表反照率数组 | — |
dust_param_mod |
tauscaling |
尘埃虚/真实值转换因子 | — |
turb_mod |
q2, wstar |
PBL/TKE restart 状态 | — |
filtreg_mod |
inifilr |
写出前初始化极区滤波 | — |
mod_const_mpi |
COMM_LMDZ |
iniphysiq 初始化通信器参数 |
— |
comvert_mod |
ap, bp, pa, preff |
垂直坐标和参考压力 | — |
comconst_mod |
lllm, daysec, dtphys, dtvr, cpp, kappa, rad, omeg, g, r, pi |
动力/物理常数和时间步 | — |
serre_mod |
alphax |
写出前质量计算路径中的诊断输出 | — |
temps_mod |
day_ini, hour_ini |
重启时间 | — |
ener_mod |
etot0, ptot0, ztot0, stot0, ang0 |
动力能量/动量初值控制量 | — |
iniphysiq_mod |
iniphysiq |
物理网格、共享状态和配置初始化 | — |
exner_hyb_m |
exner_hyb |
由压力计算 Exner 函数 | — |
inichim_newstart_mod |
inichim_newstart |
交互选项 ini_q/ini_q-h2o 的化学初始廓线构造 |
— |
comslope_mod |
nslope, def_slope, def_slope_mean, subslope_dist, init/end |
坡面数量和坡面分布 | — |
paleoclimate_mod |
h2oice_depth, co2ice_depth, coef_ssdif, init/end |
坡面数变化时保存并重映射古气候数组 | — |
subslope_mola_mod |
subslope_mola |
nslope 选项下重算坡面分布 |
— |
program_options |
parse_args |
解析命令行选项 | — |
datafile_mod |
datadir |
load_MONS_data 读取 MONS 文本数据路径 |
— |
INCLUDE 头文件:dimensions.h、paramet.h、comgeom2.h、comdissnew.h、clesph0.h、netcdf.inc;load_MONS_data 另含 comgeom.h。
调用的关键例程
| 被调用例程 | 所在模块/文件 | 调用位置 | 作用 |
|---|---|---|---|
parse_args |
program_options |
218 | 解析命令行选项 |
infotrac_init |
infotrac |
240 | 得到 nqtot 和 tname |
| NetCDF API | netcdf.inc |
271-339, 461 | 打开 start 文件并读取 controle |
open_startphy / tabfi |
iostart / tabfi_mod |
373-380 | 读取物理控制表、行星常数、时间 |
defrun_new |
defrun_new.F |
395 | 读取 run.def 运行参数 |
iniconst / inigeom |
动力初始化例程 | 397-398 | 初始化动力常数和几何 |
iniphysiq |
iniphysiq_mod.F90 |
403 | 初始化物理网格和共享状态 |
datareadnc |
datareadnc.F |
424 | 从 surface.nc 读取地表数据并插值 |
gr_dyn_fi / gr_fi_dyn |
网格转换工具 | 多处 | 动力网格与物理标量网格之间转换 |
lect_start_archive |
lect_start_archive.F |
453 | 读取并重映射 start_archive.nc |
dynetat0 |
动力 restart 读取例程 | 470 | 从 start.nc 读动力状态 |
phyetat0 |
phyetat0_mod.F90 |
475 | 从 startfi.nc 读物理状态 |
initracer |
initracer_mod |
514 | 初始化 tracer 索引和物性 |
inichim_newstart |
inichim_newstart_mod |
991, 1026 | 化学和水汽 tracer 初始化 |
initial0 |
外部工具 | 1383-1385 | isotherm 选项下清零风和 q2 |
load_MONS_data |
本文件 | 1643 | 读取 MONS 地下冰数据 |
end_* / ini_*_slope_var |
多个共享模块 | 1765-1859 | nslope 选项下重分配坡面维度数组 |
subslope_mola |
subslope_mola_mod |
1818 | 重新计算坡面面积分布 |
inifilr |
filtreg_mod |
1943 | 写出前初始化滤波 |
pression / exner_hyb |
动力/垂直坐标例程 | 1944, 1950 | 由 ps 和 ap/bp 算压力与 Exner 函数 |
massdair / geopot |
动力例程 | 1976, 2003 | 算层空气质量和位势 |
caldyn0 |
caldyn0.F |
2005 | 构造动力 restart 需要的辅助场 |
dynredem0 / dynredem1 |
动力 restart 写出例程 | 2011-2013 | 写 restart.nc |
physdem0 / physdem1 |
phyredem.F90 |
2017-2027 | 写 restartfi.nc |
interp_horiz |
水平插值例程 | 2148, 2150 | load_MONS_data 把 MONS 网格插到 GCM 网格 |
输入
| 输入 | 来源 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
start_archive.nc |
当前运行目录 | NetCDF | 混合 | 选项 0 时的归档初始场 |
start.nc |
当前运行目录 | NetCDF | 混合 | 选项 1 时的动力初始场 |
startfi.nc |
当前运行目录 | NetCDF | 混合 | 选项 1 时的物理初始场 |
controle |
start/startfi NetCDF 变量 | real(100) |
混合 | 动力和物理控制表;start/startfi 模式会把物理表前 50 项复制到 tab_cntrl(51:100) |
surface.nc |
datadir |
NetCDF | 混合 | start_archive 路径读取地形、反照率、热惯量、粗糙度和亚网格地形 |
run.def / include 链 |
defrun_new |
配置 | — | 运行参数、物理频率、网格和耗散参数 |
traceur.def / tracer.def |
infotrac_init/initracer |
配置 | — | tracer 数量、名称和物性识别 |
profile_<tracer> |
当前运行目录 | ASCII | 混合 | q=profile 选项读取的地表+垂直廓线 |
results_MONS_lat_lon_H_depth.txt |
datadir |
ASCII, 180x90 | %WEH, g/cm2 转 kg/m2 |
mons_ice 选项的 MONS 地下冰输入 |
| 交互式输入 | stdin | 字符串/数值 | 混合 | 选择输入文件类型和修改选项参数 |
输出
| 输出 | 去向 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
restart.nc |
当前运行目录 | NetCDF | 混合 | 动力重启文件;由 dynredem0/1 写出 |
restartfi.nc |
当前运行目录 | NetCDF | 混合 | 物理重启文件;由 physdem0/1 写出 |
ps |
restart.nc |
real(iip1,jjp1) |
Pa | 地表压力,可能经地形修正或 ptot 修改 |
ucov, vcov, teta, q, masse |
restart.nc |
3D/4D 动力数组 | 混合 | 协变风、位温、tracer 和层空气质量 |
tsurf, tsoil, inertiesoil, albedo, emis, q2, qsurf, qsoil |
restartfi.nc |
物理网格数组 | 混合 | 地表、土壤、辐射、PBL、地表 tracer 和土壤 tracer 状态 |
tauscaling, totcloudfrac, wstar, watercap, perennial_co2ice |
restartfi.nc |
real(ngridmx,...) |
混合 | 尘埃缩放、云分数、热羽流、水冰和持久 CO2 冰状态 |
共享状态与副作用
- 修改大量动力公共状态:
day_ini/hour_ini、day_step、dtvr/dtphys、rad/omeg/g/r/cpp/kappa、ap/bp/pa/preff、能量守恒量等。 - 写入
surfdat_h、comsoil_h、dimradmars_mod、turb_mod、paleoclimate_mod和comslope_mod的可重启状态。 nslope选项会释放并重新分配坡面维度数组,再把旧坡面状态复制到新坡面布局;旧nslope>1时使用最接近水平的旧坡面iflat作为模板。- 所有菜单修改都通过 stdin/stdout 交互;批处理复现需要预先准备输入流。
q=profile打开当前目录下profile_<tracer>;mons_ice打开datadir/results_MONS_lat_lon_H_depth.txt。- start_archive 路径读取后关闭
nid;start/startfi 路径读取两个输入文件,但关闭动作由下游 NetCDF 例程处理,源码片段中未见显式NF_CLOSE(nid_dyn/nid_fi)。
核心逻辑
- 初始化运行上下文:调用
parse_args,设置 Mars 常数cpp=744.499、preff=610、pa=20、planet_type="mars",并把并行标志强制为串行主进程,以便在iniphysiq前调用tabfi。 - 读取 tracer 元信息:
infotrac_init确定nqtot/tname,分配q(iip1,jjp1,llm,nqtot)和coefvmr(nqtot)。 - 选择输入源:
0:打开start_archive.nc,tab0=50,Lmodif=1。1:打开start.nc和startfi.nc,先读动力控制表,再把startfi.nc的前 50 项复制到tab_cntrl(51:100),tab0=0。
- 读控制表并初始化常数:从
controle读kappa/etot0/ptot0/ztot0/stot0/ang0,再通过open_startphy和tabfi得到rad/omeg/g/mugaz/daysec等物理常数。 - 初始化当前网格与物理:调用
defrun_new(99,.TRUE.)、iniconst、inigeom和iniphysiq,设置dtvr/day_step/dtphys。 - 装配地表静态场:如果不是直接从
start/startfi修改,则调用datareadnc("mola",...)读取surface.nc,再用gr_dyn_fi把地形、热惯量、反照率、粗糙度和亚网格地形送到物理网格共享数组。 - 读取初始状态:
- start_archive 路径调用
lect_start_archive,得到date/tsurf/tsoil/inertiesoil/albedo/emis/q2/t/ucov/vcov/ps/teta/phisold_newgrid/q/qsurf/tauscaling/totcloudfrac/watercap/perennial_co2ice,并把inertiedat复制到ithfi。 - start/startfi 路径调用
dynetat0和phyetat0,并从albedodat/inertiedat构造albfi/ithfi/surfithfi。
- start_archive 路径调用
- 同步 tracer 名和索引:调用
initracer;若旧文件的 tracer 名全是q01/q02/...,把noms(:)复制到tname(:)。 - 执行交互修改循环:用户可连续输入修改关键字;空输入结束循环。每个分支直接改内存中的动力/物理状态。
- 写出前动力一致化:start_archive 路径根据新旧地形差修正
ps=ps*exp((phisold_newgrid-phis)/(t(:,:,1)*r)),保持经度周期;随后调用pression/exner_hyb,必要时重建teta。 - 写出 restart:调用
geopot、caldyn0,然后写restart.nc;再调用physdem0/physdem1写restartfi.nc。
交互修改选项
| 选项 | 主要修改 | 关键实现细节 |
|---|---|---|
flat |
地形清零 | phis(:,:)=0 后同步 phisfi;可选择统一 ps |
bilball |
统一反照率和热惯量 | 用户输入 alb_bb/ith_bb,填 alb/ith 并同步 albfi/ithfi,重置 z0 为默认值 |
z0 |
统一地表粗糙度 | 输入 z0_default 并赋给 z0(:) |
coldspole |
南极永久帽地下温度和反照率 | 修改南极 tsoil 和 albfi(ngridmx) |
ptot |
调整总压 | 计算当前大气+CO2 冰总压,按目标总压缩放 ps;可选择保持 tracer 总质量而缩放混合比 |
qname |
改 tracer 名 | 交互选择 iq 并改 tname(iq) |
q=0 |
所有 tracer 清零 | 大气 tracer 设为 1.e-30,地表 tracer 设为 0 |
q=factor |
tracer 乘因子 | 选一个 tracer,同时缩放 q(:,:,:,iq) 和 qsurf(:,iq,:) |
q=x |
tracer 设常数 | 输入大气 kg/kg 和地表 kg/m2,填全域 |
q=profile |
tracer 从文本廓线初始化 | 读取 profile_<tracer>,第 1 行为地表值,之后为各大气层 |
freedust |
尘埃从虚光学深度缩放到真实值 | 用 tauscaling 乘 dust/ccn mass/number tracer,然后把 tauscaling(:)=1 |
ini_q |
初始化化学物种和水汽 | flagh2o=1,可选热层-only,调用 inichim_newstart |
ini_q-h2o |
初始化化学物种但保留水汽 | flagh2o=0,调用 inichim_newstart |
inihdo |
用 D/H 初始化 HDO | 输入 SMOW 倍数,按 HDO/H2O=2*155.76e-6*DoverH 填 HDO tracer |
composition |
修改 CO2/N2/Ar/O2/CO 主成分 | 选参考站点,输入新 VMR,换算 MMR 全域缩放,并由最丰富组分闭合 MMR 总和 |
wetstart |
设置南北梯度水汽 | h2o_vap=150e-6*(lat+pi/2)/pi |
ini_h2osurf |
限制/清理地表水冰 | 地表水冰截断到用户上限并去负值 |
noglacier |
去掉中低纬地表水冰 | abs(lat)<45 的 h2o_ice 地表储量置零 |
watercapn / watercaps |
加北/南永久水冰帽 | 极区 h2o_ice 地表储量设 1.e5 kg/m2 |
isotherm |
等温无风初始场 | 填 tsurf/tsoil,设 flagiso,清零 ucov/vcov/q2 |
co2ice=0 |
去 CO2 极冠 | qsurf(:,igcm_co2,:)=0,发射率取中纬参考值 |
therm_ini_s |
土壤热惯量重置为表层参考值 | inertiedat(:,isoil)=surfithfi(:) 并同步 inertiesoil/ithfi/ith |
subsoilice_n / subsoilice_s |
北/南半球地下冰层 | 输入纬度、起始深度和冰热惯量,用调和形式构造混合层热惯量 |
mons_ice |
按 MONS 数据布设地下冰 | 读取 MONS Hdn/d21,按半球系数把 d21 转深度,低于日变化热皮肤深度则下移 |
nslope |
改坡面数量 | 仅允许 1/3/5/7;重算 def_slope、subslope_dist,重分配并复制 slope-var 状态 |
load_MONS_data 逻辑
load_MONS_data 打开 datadir/results_MONS_lat_lon_H_depth.txt,跳过首行,按 180x90 网格读取纬度、经度、Hdn 和 d21。源码把纬度索引翻转成北到南顺序,并把 d21 从 g/cm2 乘 10 转成 kg/m2。由于南纬 -77 到 -90 缺少 d21,行 2118-2121 用 -75 度值到南极 0 的线性插值补齐。最后构造 2 度经纬边界、补一列周期经度,用 interp_horiz 分别把 Hdn 和 d21 插值到 (iip1,jjp1)。
在 mons_ice 分支中,只有 MONS_Hdn>=14.0 的格点会布设地下冰;深度为 MONS_d21*MONS_coeffN/S,且不得浅于用表层热惯量估算的日变化热皮肤深度。
伪代码
parse_args()
set Mars constants and serial flags
infotrac_init()
allocate q and coefvmr
ask user for input source:
if 0:
open start_archive.nc
read controle into tab_cntrl
tabfi(start_archive)
if 1:
open start.nc and startfi.nc
read both controle arrays
copy startfi controle(1:50) into tab_cntrl(51:100)
tabfi(startfi)
initialize dynamic constants from tab_cntrl
defrun_new, iniconst, inigeom, iniphysiq
if not reading existing start/startfi:
datareadnc(surface.nc fields)
gr_dyn_fi static surface fields into physics grid
if source is start_archive:
lect_start_archive(...)
ithfi = inertiedat
else:
dynetat0(start.nc)
phyetat0(startfi.nc)
copy albedodat/inertiedat into albfi/ithfi/surfithfi
initracer()
if old q01/q02 names:
tname = noms
loop:
print modification menu
read modif
if blank: exit
apply requested in-memory change
if source is start_archive:
correct ps for changed topography
enforce longitude periodicity
inifilr()
pression(ap,bp,ps) -> p3d
exner_hyb(ps,p3d) -> pks,pk,pkf
compute teta if needed
massdair and polar averaging for start_archive source
geopot()
caldyn0()
dynredem0/1("restart.nc")
physdem0/1("restartfi.nc")
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| 初始场生成 | 顶层交互式入口,从 start_archive 或 start/startfi 生成新 restart |
| 地形与亚网格初始化 | 调用 datareadnc 读取 MOLA/亚网格地形,并可用 flat/nslope 改写 |
| 化学初始化 | ini_q 和 ini_q-h2o 调用 inichim_newstart |
| 水循环/同位素初始化 | 可设置水汽梯度、地表水冰帽、地下冰、HDO |
| CO2 循环初始状态 | 可改总压、去 CO2 极冠、修改主成分 |
| 坡面与古气候状态 | nslope 分支重分配并复制 surfdat/comsoil/dimradmars/paleoclimate 坡面数组 |
写法特点
- 固定格式
.F文件混合 F77 common/include、F90USE、allocatable 和 whole-array 赋值。 - 程序高度交互式,错误输入多用
iostat循环重读;q=profile、mons_ice额外依赖当前目录或datadir文件。 choix_1的读取循环写作if ((choix_1 /= 0).OR.(choix_1 /=1)) EXIT,按布尔逻辑该条件恒真,会在第一次成功读入后退出;复现时按实际源码行为理解为“只读一次选择”。- start_archive 路径会在最终写出前按地形差指数修正
ps;若flat中用户已手动设置均一ps,源码仍会进入该地形修正分支。 composition分支支持 N2/Ar 缺失时的“隐式非 CO2 大气”特殊路径,硬编码非 CO2 摩尔质量33.87226017157708。
复现要点
- 当前目录必须有相应输入:
start_archive.nc或start.nc+startfi.nc。 - start_archive 路径还需要
datadir/surface.nc,mons_ice需要datadir/results_MONS_lat_lon_H_depth.txt。 run.def、callphys.def和 tracer 配置必须与编译维度、输入文件中的controle、nqtot、llm一致。- 若使用
ini_q/ini_q-h2o,还需要inichim_newstart读取的化学廓线数据文件。 - 交互输入顺序会决定输出 restart;建议保存 stdin 脚本或终端日志,避免不可复现的人工输入。
- 改
nslope会复制或投影旧坡面状态,而不是重新物理平衡所有坡面状态;后续运行初期可能需要 spin-up。
待确认
choix_1输入循环的.OR.条件是否为历史遗留笔误;本页按源码字面行为记录。flat分支中flagps0被置真但后续未见使用;均一ps是否仍应跳过地形压力修正待确认。composition分支中igcm_o2/igcm_co/igcm_o/igcm_h2为 0 时的数组访问风险需结合 tracer 配置确认。load_MONS_data打印提示写作callfis.def,是否应为callphys.def待确认;不影响实际读取datadir。
相关页面
- lect_start_archive — start_archive 读取与插值主例程。
- datareadnc —
surface.nc地表数据读取与网格映射。 - defrun_new —
run.def运行参数读取。 - iniphysiq_mod — 物理初始化入口。
- caldyn0 — 写动力 restart 前的动力辅助量计算。
- inichim_newstart — 化学 tracer 初始廓线构造。
- phyredem —
restartfi.nc写出。 - start2archive — 反向把 start/startfi 转为 start_archive。
- subslope_mola —
nslope分支重算坡面分布。