dyn1d/writerestart1D_mod.F90
路径
LMDZ.MARS\libf\phymars\dyn1d\writerestart1D_mod.F90
文件定位
writerestart1D_mod.F90 是 1D testphys1d 的文本 restart 写出模块。它不写 NetCDF;唯一公开例程 writerestart1D 把当前单柱表压、tracer、风和温度状态写入一个 ASCII 文件,调用方在当前源码中传入固定文件名 restart1D.txt。
唯一直接调用点在 testphys1d 末尾:
if (startfiles_1D) call writerestart1D('restart1D.txt',psurf,pa,preff,tsurf(1,:),nlayer,size(tsurf,2),temp,u,v,nq,noms,q)因此这个模块只在 startfiles_1D=.true. 时参与输出;默认 startfiles_1D=.false. 时不会写 restart1D.txt。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
writerestart1D_mod |
module | 1-36 | 包装 1D 文本 restart 写出例程。 |
writerestart1D |
subroutine | 7-34 | 写出 restart1D.txt 格式的 ASCII restart。 |
文件共 36 行。模块没有全局变量、没有 SAVE 状态、没有分配/释放,也没有 NetCDF 调用。
接口
SUBROUTINE writerestart1D(filename,psurf,pa,preff,tsurf,nlayer,nslope,temp,u,v,nq,qnames,q)| 实参 | 方向 | 维度/单位 | 写出用途 |
|---|---|---|---|
filename |
in | 字符串 | 输出文件名;当前调用方传 restart1D.txt。 |
psurf, pa, preff |
in | Pa 或垂直坐标相关标量 | 第一行 ps 记录。 |
tsurf |
in | (nslope) K |
teta 记录中的坡面地表温度部分。 |
nlayer, nq, nslope |
in | 整数 | 控制垂直层、tracer 和坡面循环长度。 |
temp |
in | (nlayer) K |
teta 记录中的大气温度剖面。 |
u, v |
in | (nlayer) m s-1 |
u、v 记录。 |
qnames |
in | (nq) 字符串 |
每个 tracer 行的名称标签。 |
q |
in | (nlayer,nq) |
每个 tracer 的垂直混合比剖面。 |
写出格式
例程固定使用 Fortran unit 1:
open(1,file = filename,status = "replace",action = "write")status="replace" 表示目标文件已存在时会被覆盖。写出顺序如下:
| 顺序 | 记录标签 | 内容 |
|---|---|---|
| 1 | ps |
psurf, pa, preff |
2..nq+1 |
tracer 名称 | qnames(i), q(1:nlayer,i),每个 tracer 一行。 |
nq+2 |
u |
u(1:nlayer) |
nq+3 |
v |
v(1:nlayer) |
nq+4 |
teta |
tsurf(1:nslope), temp(1:nlayer) |
最后执行 close(1)。没有错误码检查、没有显式格式字符串,所有记录都使用 list-directed write(1,*)。
与读取路径的对应关系
init_testphys1d_mod 在 therestart1D=.true. 时读取 start1D.txt:
- 先读取第一行的标签和
psurf, pa, preff。 - 逐 tracer 读取名称和
q(1,:,iq),并检查文件中的 tracer 名必须等于traceur.def中的tname(iq)。 - 读取
u、v和teta记录。 teta记录前nslope个值进入tsurf,后nlayer个值进入temp。
因此 restart1D.txt 可作为下一次运行的 start1D.txt 使用,但调用方/运行脚本需要负责重命名或复制;本例程不会自动写 start1D.txt。
调用关系
| 方向 | 符号/页面 | 说明 |
|---|---|---|
| 调用方 | testphys1d | 主程序时间循环结束后,在 startfiles_1D 为真时写 restart1D.txt。 |
| 读取方 | init_testphys1d_mod | 后续运行以 start1D.txt 读取同类文本格式。 |
| 配置背景 | testphys1d 配置 | startfiles_1D 和 1D restart 工作流说明。 |
复现要点
- 输出文件是 ASCII 文本,不是 NetCDF;
startfi.nc由 phyredem 负责。 restart1D.txt的 tracer 行顺序必须和下一次运行的traceur.def一致,否则 init_testphys1d_mod 会在名称检查处停止。teta行同时包含nslope个tsurf和nlayer个temp;改变nslope或nlayer后复用旧 restart 会导致读取错位或失败。status="replace"会覆盖同名文件;保留历史 restart 需要在运行脚本层面改名。- 例程没有
iostat检查;磁盘权限或路径错误会由 Fortran 运行时处理。
待确认和风险
- 当前调用方传入
q的源码声明是 allocatable 三维数组(1,nlayer,nq),而writerestart1Ddummy 形参是二维q(nlayer,nq);这是否依赖编译器宽松参数关联或构建选项,需要编译验证。 - 固定使用 unit 1,若调用时已有其他文件占用 unit 1,可能发生冲突;当前唯一调用点未见并发打开。
restart1D.txt和start1D.txt名称不同,本例程只写前者,不负责下一次运行的文件准备。
相关页面
- dyn1d/index.md - dyn1d 子目录索引。
- testphys1d - 唯一直接调用方。
- init_testphys1d_mod - 对应的
start1D.txt读取方。 - testphys1d 配置 - 1D restart 配置背景。
- phyredem -
startfi.ncNetCDF 写出路径。