dynetat0.F90
路径
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\dynetat0.F90
所属目录/模块
LMDZ.COMMON\libf\dyn3d_common
文件定位
dynetat0.F90 定义 SUBROUTINE dynetat0,从动力 restart/start NetCDF 文件读取控制数组、网格、几何、动力状态、tracer、气柱质量和地表压力。它同时根据 planet_type 区分 Earth-like、Titan 和 planeto-like/Mars start 文件布局,并处理 timestart 选择多时间片。
Mars 运行参与度
必经/条件经过:COMMON `gcm` 和 MARS `phymars/nogcm.F90` 在 read_start 路径调用 `dynetat0("start.nc",...)`;MARS newstart/start2archive 也调用 dynetat0 读取起始状态。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
dynetat0 |
subroutine |
4 |
读取动力 start/restart NetCDF 初态。 |
check_dim |
internal subroutine |
307 |
检查文件维度与编译维度一致。 |
get_var1 |
internal subroutine |
320 |
读取一维变量。 |
get_var2 |
internal subroutine |
328 |
读取二维变量并修正经度周期端点。 |
get_var2_t |
internal subroutine |
350 |
读取含时间维的二维变量。 |
get_var3 |
internal subroutine |
380 |
读取 U 网格三维变量。 |
get_var3u_t |
internal subroutine |
387 |
读取 U 网格含时间维三维变量并修正周期端点。 |
get_var3v_t |
internal subroutine |
418 |
读取 V 网格含时间维三维变量并修正周期端点。 |
err |
internal subroutine |
449 |
统一处理 NetCDF 错误并调用 ABORT_gcm。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
infotrac |
tname, nqtot, isotope 相关数组 |
确定 tracer 变量名和缺失 tracer 的默认/同位素初始化。 |
- |
netcdf |
nf90_open, NF90_NOWRITE, nf90_noerr, nf90_strerror, nf90_get_var, nf90_inq_varid, nf90_inq_dimid, nf90_inquire_dimension, nf90_close |
NetCDF 文件读 API。 |
- |
control_mod |
planet_type, timestart |
判断 start 文件布局和选择时间片。 |
- |
comvert_mod |
pa, preff |
写垂直坐标参考参数。 |
- |
comconst_mod |
im, jm, lllm, daysec, dtvr, rad, omeg, g, cpp, kappa, pi |
写维度和物理常量。 |
- |
logic_mod |
fxyhypb, ysinus |
写网格函数分支。 |
- |
serre_mod |
clon, clat, grossismx, grossismy |
写 zoom 参数。 |
- |
temps_mod |
annee_ref, day_ref, itau_dyn, start_time, day_ini, hour_ini |
写时间和日期状态。 |
- |
ener_mod |
etot0, ptot0, ztot0, stot0, ang0 |
写初始能量/角动量诊断基准。 |
- |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
NF90_OPEN, NF90_CLOSE |
NetCDF |
68, 291 |
打开和关闭 start 文件。 |
get_var1/2/2_t/3u_t/3v_t |
本文件内部 |
多处 |
读取控制、经纬度、几何和状态变量。 |
check_dim |
本文件内部 |
139-141 |
确认 im/jm/llm。 |
nf90_inq_varid, nf90_inq_dimid, nf90_inquire_dimension, nf90_get_var |
NetCDF |
168-205, 221-229, 272-285 |
查询并读取时间轴和 tracer。 |
ABORT_gcm |
dyn3d/abort_gcm.F |
多处 |
缺变量、读失败、维度不符或找不到时间时退出。 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
fichnom |
调用参数 |
character |
- |
NetCDF start 文件名,常见为 start.nc。 |
controle |
NetCDF 变量 |
real(100) |
多种 |
编码维度、日期、常量、能量、垂直/zoom 参数。 |
rlonu/rlatu/rlonv/rlatv |
NetCDF 变量 |
1D |
rad |
U/V 网格经纬度。 |
cu/cv/aire/phisinit |
NetCDF 变量 |
2D |
多种 |
几何伸长、面积和地表位势。 |
temps 或 Time |
NetCDF 变量/维度 |
1D |
day |
可用时间片。 |
vcov/ucov/teta/masse/ps |
NetCDF 变量 |
2D/3D + time |
多种 |
动力状态变量。 |
| tracer 变量 |
NetCDF 变量名来自 tname(iq) |
3D + time |
tracer 单位 |
各 tracer 初值。 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
vcov |
调用方数组 |
(iip1,jjm,llm) |
covariant wind |
V covariant wind。 |
ucov |
调用方数组 |
(iip1,jjp1,llm) |
covariant wind |
U covariant wind。 |
teta |
调用方数组 |
(iip1,jjp1,llm) |
K |
位温。 |
q |
调用方数组 |
(iip1,jjp1,llm,nqtot) |
tracer 单位 |
tracer 场。 |
masse |
调用方数组 |
(iip1,jjp1,llm) |
kg 或质量单位待确认 |
层空气质量。 |
ps |
调用方数组 |
(iip1,jjp1) |
Pa |
地表压力。 |
phis |
调用方数组 |
(iip1,jjp1) |
m2 s-2 待确认 |
地表位势。 |
time0 |
调用方标量 |
real |
day fraction |
当前时间片在动力积分中的初始小数日。 |
| 多个 module 状态 |
comconst_mod/comvert_mod/temps_mod/... |
多种 |
多种 |
从 controle 解码出的常量、日期和 zoom 参数。 |
共享状态与副作用
例程写入动力常量、垂直坐标、时间、能量和 zoom 相关 module 全局状态;读取失败或维度不符会 abort;内部读取函数会检查经度周期端点,不一致时打印 warning 并把最后经度点改为第一个经度点。
核心逻辑
- 打开 NetCDF start 文件,读取
controle 数组。
- 根据
planet_type 选择 Earth-like 或 planeto-like 布局:Mars/generic 使用 idecal=4,Earth/Titan 使用 idecal=5。
- 从
controle 解码网格维度、日期、行星常量、能量、垂直坐标和 zoom 参数。
- 对 Mars,把
hour_ini 从控制数组第 29 项读取;其他行星设为 0。
- 检查
im/jm/llm 与编译维度 iim/jjm/lllm 一致。
- 读取经纬度、
cu/cv/aire/phisinit。
- 读取
temps 或回退读取 Time,根据 timestart 选择最后时间片或匹配时间片。
- Mars 路径把
day_ini/hour_ini/time0 重组为整数日加小数日。
- 读取
vcov/ucov/teta。
- 对每个 tracer,按
tname(iq) 读取;缺失时置零,Earth isotope 路径可做理论初始化。
- 读取
masse 和 ps,关闭文件。
- 非 Mars 路径将
time0 的整数部分累加到 day_ini。
伪代码
open start NetCDF
read controle
if planet_type is mars or generic:
decode planeto layout
else:
decode earth-like layout
write constants, dates, energy, vertical, zoom state
check file dimensions against compiled dimensions
read longitude/latitude and geometry fields
read temps or Time axis
select indextime from timestart or last value
adjust Mars day_ini/hour_ini/time0
read vcov, ucov, teta
for each tracer name:
read tracer at selected time or initialize missing tracer
read masse and ps
close file
参与的主题流程
| 主题 |
参与方式 |
| restart-io |
读取动力 start.nc 初态,是 dynredem 写出 restart 的反向路径。 |
| dynamics-time-integration |
提供进入 leapfrog 的初始状态。 |
| Mars start handling |
Mars 使用 planeto-like 控制数组布局,并处理 timestart 和 hour_ini。 |
写法特点
Fortran 90 子程序内含多个内部读取 helper。读取 helper 同时做周期端点修正,这意味着输出数组可能不是 NetCDF 原值的逐字节拷贝。
复现要点
- Mars/generic 的
controle 解码偏移与 Earth-like 不同,不能直接按 Earth start 文件布局解析 Mars start。
timestart<0 默认选最后一个时间片;非负时必须在时间轴中找到误差小于 0.01 的时间。
- 缺失 tracer 不一定 abort:会置零;Earth isotope 情况还可能按父 tracer 做简化初始化。
- 经度周期端点不一致时,代码会强制
iip1 点等于第 1 点。
待确认
controle 数组各项单位除源码上下文外未全部显式声明,部分单位需结合写出端 dynredem 确认。
- Mars start 文件中
hour_ini=tab_cntrl(29) 的历史约定需和 MARS start 生成器对照。
相关页面