newstart.F
路径
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。
- 同步 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、F90 USE、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。
相关页面