dyn1d/profile_temp_mod.F90
路径
LMDZ.MARS\libf\phymars\dyn1d\profile_temp_mod.F90
文件定位
profile_temp_mod.F90 是 1D testphys1d 初始化路径的温度廓线构造模块。它不读取 3D 初始场,也不更新物理公共状态;唯一例程 profile_temp 接收垂直层数和 km 高度数组,按 getin 配置生成温度数组,并无条件把结果写到 profile_temp.out。
当前调用方是 init_testphys1d_mod:无 start1D.txt restart 时,初始化例程用 zlay/1000 构造 zkm,调用 profile_temp(nlayer+1,zkm,teta),再把 teta(0) 写入 tsurf、teta(1:) 写入大气层温度 temp。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
profile_temp_mod |
module | 1 | 包装 1D 温度廓线构造例程。 |
profile_temp |
subroutine | 7-223 | 按配置生成 temp(nlev),可从 ASCII 文件读取,也可叠加正弦扰动,并写出 profile_temp.out。 |
tseiff(37) |
local DATA table | 57-62 | Seiff/Viking 标准温度表,按 2 km 间隔插值使用。 |
接口
| 实参 | 方向 | 维度/单位 | 说明 |
|---|---|---|---|
nlev |
输入 | integer | 温度数组长度;在 1D 初始化调用中是 nlayer+1,包含地表/界面用的第一项。 |
zkm(nlev) |
输入 | km | 对应高度;调用方由 zlay/1000 派生。 |
temp(nlev) |
输出 | K | 输出温度廓线。 |
配置键
| 键 | 源码默认 | 用途 |
|---|---|---|
ichoice |
1 |
温度廓线类型;run.def.1d 可把它覆盖为标准 Seiff 选项。 |
tref |
200 |
选项 1/6/7 的参考温度,单位 K。 |
isin |
0 |
为 1 时,在基础廓线后追加正弦扰动。 |
pic |
26.522 |
选项 6 中的层号中心,或选项 7 中的 km 高度中心。 |
largeur |
10 |
高斯扰动宽度。 |
hauteur |
30 |
高斯扰动幅度,单位 K。 |
温度廓线分支
profile_temp 先读取上述配置键,然后按 ichoice 选择基础温度:
ichoice |
分支 | 源码公式或行为 |
|---|---|---|
| 1 | 常温 | 所有层 temp=tref。 |
| 2 | Savidjari | temp=max(219 - 2.5*zkm, 140)。 |
| 3 | Lindner 极区廓线 | z<2.5 km 时 150 + 30*z/2.5;2.5<=z<5 km 时 180;更高层 max(180 - 2*(z-5), 130)。 |
| 4 | 逆温 | z<20 km 时 135;更高层 min(135 + 5*(z-20), 200)。 |
| 5 | Seiff/Viking 表 | iseiff=int(zkm/2)+1,低于约 70 km 时在 tseiff 2 km 表上做线性插值;更高层固定为 tseiff(37)=139 K。 |
| 6 | 常温 + 层号高斯扰动 | tmp=il-pic,temp=tref + hauteur*exp(-tmp*tmp/largeur/largeur)。 |
| 7 | 常温 + 高度高斯扰动 | tmp=zkm-pic,temp=tref + hauteur*exp(-tmp*tmp*4/largeur/largeur)。 |
>=8 |
ASCII 文件 | 打开运行目录文件 profile_temp,逐行读取 nlev 个温度值;打开失败则 error stop 'File "profile_temp" not found!'。 |
注意:源码注释写的是 ichoice=8 读取 ASCII profile,但条件是 ichoice.GE.8,所以 8 以上的值都会走同一文件读取分支。
扰动和输出
基础廓线生成后,若 isin==1,每层追加:
(1 - 1000/(1000 + zkm^2)) * (6*sin(zkm*pi/6) + 9*sin(zkm*pi/10.3))
这个扰动使用 comcstfi_h 的 pi。扰动与 ichoice 分支无关;即使温度来自 profile_temp 文件,也会在文件读入后叠加。
最后例程总是打开 profile_temp.out 并写出 nlev 行温度值。该文件是运行目录中的 ASCII 诊断/检查输出,不是后续源码中已发现的必需输入。
文件 I/O
| 文件 | 方向 | 条件 | 格式和内容 |
|---|---|---|---|
profile_temp |
输入 | ichoice>=8 |
运行目录 ASCII 文件,源码逐行 READ(11,*) temp(il),需要至少 nlev 行单列温度值。 |
profile_temp.out |
输出 | 每次调用 | 运行目录 ASCII 文件,逐行写出生成后的 temp(il)。 |
调用关系
| 方向 | 符号/文件 | 说明 |
|---|---|---|
| 调用方 | init_testphys1d_mod | 无 start1D.txt 时调用,用生成的 teta 初始化 tsurf 和 temp。 |
| 相关输入 | testphys1d 配置 | run.def.1d 中的 ichoice/tref/isin/pic/largeur/hauteur 控制本例程。 |
| 相邻 profile 读取 | read_profile_mod | 读取 tracer 初始廓线;与本文件的温度廓线分开。 |
复现要点
- 本例程使用的是高度
zkm,单位为 km;调用方负责把 m 转成 km。 profile_temp输入文件名不是profile,而是字面文件名profile_temp。ichoice的源码内默认值是 1,但run.def.1d样例可覆盖为 5;复现配置时以实际run.def为准。ichoice>=8文件读取没有行数保护;文件少于nlev行时,后续READ行为取决于 Fortran 运行时错误处理。profile_temp.out每次调用都会被status='unknown'打开并覆盖或复用,复现实验时可用它核对实际温度初值。- 选项 5 的 Seiff 表高层分支在
iseiff>=nseiff-1时直接取tseiff(37);不要把它外推成继续线性递减。
待确认
run.def.1d样例之外,实际生产 1D 个例是否常用ichoice=5或文件读取,需要结合运行目录确认。profile_tempASCII 样例文件尚未定位;页面只按源码读取格式记录。- 选项 6/7 注释称为 Christophe 1998 高斯扰动,但物理意图未在源码中进一步说明。
相关页面
- dyn1d/index.md - dyn1d 子目录索引。
- init_testphys1d_mod - 调用本例程的 1D 初始化入口。
- testphys1d 配置 -
ichoice和扰动配置键说明。 - comcstfi_h -
pi常数来源。 - testphys1d.F90 - 1D 主程序。
- read_profile_mod - tracer 初始廓线读取。