planete_h.F90
路径
LMDZ.MARS\libf\phymars\planete_h.F90
所属目录 / 模块
libf\phymars
文件定位
planete_h.F90 定义 planete_h 共享模块,用来保存火星轨道参数、年长、倾角、边界层湍流下限,以及由轨道输入派生出的偏心率、半通径和近日点太阳经度。它本身不推进物理时间步,而是在初始化阶段由 tabfi 或 1D 初始化路径写入基础量,再由 iniorbit 计算 e_elips/p_elips/lsperi,供 solarlong 和 orbite 把 sol 日期、太阳经度、日火距离和太阳赤纬联系起来。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
planete_h |
module |
1 |
保存行星轨道、年长、倾角、湍流下限和派生轨道几何量的共享模块。 |
aphelie |
module variable, REAL,SAVE |
5 |
远日点日火距离,单位 Mkm。 |
periheli |
module variable, REAL,SAVE |
6 |
近日点日火距离,单位 Mkm。 |
year_day |
module variable, REAL,SAVE |
7 |
一个火星年的 sol 数。 |
peri_day |
module variable, REAL,SAVE |
9 |
近日点日期,单位 sol。 |
obliquit |
module variable, REAL,SAVE |
10 |
行星倾角,单位 degree。 |
lmixmin |
module variable, REAL,SAVE |
11 |
边界层混合长度下限参数。 |
emin_turb |
module variable, REAL,SAVE |
13 |
湍流能量下限参数。 |
coefvis |
module variable, REAL,SAVE |
14 |
可见光系数共享槽;本次源码搜索未找到 phymars 内除本模块外的读写点。 |
coefir |
module variable, REAL,SAVE |
15 |
红外系数共享槽;本次源码搜索未找到 phymars 内除本模块外的读写点。 |
lsperi |
module variable, REAL,SAVE |
17 |
近日点太阳经度,单位 rad,由 iniorbit 计算。 |
e_elips |
module variable, REAL,SAVE |
18 |
轨道偏心率,由远日点和近日点距离计算。 |
p_elips |
module variable, REAL,SAVE |
19 |
椭圆半通径,iniorbit 中除以 unitastr 后以 AU 保存。 |
unitastr |
real parameter |
21 |
天文单位,149.597927 Mkm。 |
lsp2solp |
subroutine |
28 |
给定近日点太阳经度 lsp,反推近日点 sol solp。 |
iniorbit |
subroutine |
54 |
根据 aphelie/periheli/year_day/peri_day 初始化 e_elips/p_elips/lsperi 并打印诊断。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
comcstfi_h |
pi |
lsp2solp 和 iniorbit 使用圆周率做角度、异常近点角和太阳经度换算。 |
- |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
| - |
- |
- |
本文件不调用自定义例程,只使用 atan、tan、sqrt、sin、cos、abs、nint、modulo 等 Fortran intrinsic。 |
上游写入与调用点
| 调用方 / 写入方 |
源码位置 |
关系 |
tabfi.F |
use planete_h 在 62-64 行;默认值在 123-133 行;重启控制表读取在 190-198 行;call iniorbit() 在 549 行 |
3D 物理初始化路径设置 year_day/periheli/aphelie/peri_day/obliquit/lmixmin/emin_turb,可交互修改 peri_ls 并调用 lsp2solp,最后调用 iniorbit 生成派生轨道量。 |
init_testphys1d_mod.F90 |
use planete_h 在 15 行;默认值在 141-154 行;paleomars 分支在 369-401 行 |
1D/testphys 路径设置同一组轨道和湍流参数;paleomars 为真时从 callphys.def 读 obliquit/eccentric/Lsperi,再改写 periheli/aphelie/peri_day。 |
phyredem.F90 |
use planete_h 在 22-23 行;控制表写入在 110-119 行 |
物理 start/restart 写出时把年长、近日点/远日点距离、近日点 sol、倾角、混合长度和湍流能量下限保存到 tab_cntrl。 |
下游读取点
| 读取方 |
源码位置 |
读取内容 |
solarlong.F |
8 行;36-58 行 |
读取 peri_day/year_day/e_elips/lsperi,把 sol 日期转换为太阳经度 psollong。 |
orbite.F |
8 行;40-43 行 |
读取 e_elips/p_elips/obliquit/lsperi,把太阳经度转换为日火距离 pdist_sol 和太阳赤纬 pdecli。 |
co2condens_mod.F |
31 行、874 行 |
读取 obliquit,在低倾角且非古气候分支下参与 CO2 极冠相关条件判断。 |
physiq_mod.F |
89 行 |
读取 obliquit;源码附近注释说明 CO2 冷阱倾角判断现由 co2condens 处理。 |
read_dust_scenario_mod.F90 |
15 行、188-191 行 |
读取 year_day,当尘埃注入或 dustscaling_mode==2 时检查情景文件时间维长度是否等于年长。 |
输入
| 输入 |
来源 |
类型 / 维度 |
单位 |
含义 |
aphelie |
tabfi 默认值、restart tab_cntrl(16) 或 1D paleomars 换算 |
real scalar |
Mkm |
远日点日火距离。 |
periheli |
tabfi 默认值、restart tab_cntrl(15) 或 1D paleomars 换算 |
real scalar |
Mkm |
近日点日火距离。 |
year_day |
tabfi 默认值或 restart tab_cntrl(14);1D 默认值 |
real scalar |
sol |
火星年长度。 |
peri_day |
tabfi 默认值、restart tab_cntrl(17)、lsp2solp 或 call_dayperi |
real scalar |
sol |
从北半球春分起算的近日点日期。 |
obliquit |
tabfi 默认值、restart tab_cntrl(18) 或 1D getin("obliquit") |
real scalar |
degree |
轨道倾角。 |
lsp |
tabfi 交互修改项 peri_ls |
real scalar |
degree |
传给 lsp2solp 的近日点太阳经度。 |
输出
| 输出 |
去向 |
类型 / 维度 |
单位 |
含义 |
solp |
tabfi 的 peri_day |
real scalar |
sol |
lsp2solp 由近日点太阳经度反推的近日点日期。 |
e_elips |
solarlong、orbite |
real saved scalar |
- |
轨道偏心率 (aphelie - periheli)/(aphelie + periheli)。 |
p_elips |
orbite |
real saved scalar |
AU |
半通径 0.5*(periheli+aphelie)*(1-e^2)/unitastr。 |
lsperi |
solarlong、orbite |
real saved scalar |
rad |
近日点太阳经度,iniorbit 用平均近点角和偏近点角求得后归一到 [0,2*pi)。 |
共享状态与副作用
- 所有可变模块量都是
REAL,SAVE,并用 OpenMP THREADPRIVATE 分组声明;并行运行时每个线程持有私有副本。
lsp2solp 不只返回 solp,还会重算并写入模块变量 e_elips。
iniorbit 写入 e_elips/p_elips/lsperi,并向标准输出打印输入轨道量、偏心率、半通径、平均近点角、偏近点角和近日点太阳经度。
coefvis/coefir 在本文件中声明为共享状态,但本次 rg 未发现 phymars 内实际读写点;复现时不要假定它们已参与当前主路径。
核心逻辑
- 初始化路径先写基础轨道量:
aphelie/periheli/year_day/peri_day/obliquit。3D 路径来自 tabfi 默认值或 startfi.nc 控制表;1D 路径来自默认常数或 paleomars 配置。
- 如用户在
tabfi 交互修改 peri_ls,lsp2solp 先用远日点/近日点距离求 e_elips,把输入的近日点 Ls 转成偏近点角,再由 Kepler 方程形式反推出 peri_day。
iniorbit 重新由远日点/近日点距离计算 e_elips,并计算 AU 单位的 p_elips。
iniorbit 用 (year_day - peri_day)/year_day 得到平均近点角,Newton 迭代求偏近点角 zx0,收敛阈值为 1.e-12,最多 100 次。
iniorbit 由 zx0 和 e_elips 计算 lsperi,再用 modulo(lsperi,2*pi) 归一化。
- 后续
solarlong 用 peri_day/year_day/e_elips/lsperi 把日期转为 Ls;orbite 用 e_elips/p_elips/lsperi/obliquit 把 Ls 转为距离和赤纬。
伪代码
initialize base orbit values from tabfi, restart, or 1D configuration
if user changes peri_ls in tabfi:
e_elips = (aphelie - periheli) / (aphelie + periheli)
zx0 = eccentric_anomaly_at_Ls0(peri_ls, e_elips)
solp = year_day * (1 - (zx0 - e_elips * sin(zx0)) / (2*pi))
peri_day = solp
iniorbit:
e_elips = (aphelie - periheli) / (aphelie + periheli)
p_elips = 0.5 * (periheli + aphelie) * (1 - e_elips^2) / unitastr
zanom = 2*pi * (((year_day - peri_day) / year_day) - nearest_integer)
solve zx0 - e_elips*sin(zx0) = abs(zanom) by Newton iteration
if zanom < 0:
zx0 = -zx0
lsperi = modulo(-2 * atan(sqrt((1+e_elips)/(1-e_elips)) * tan(zx0/2)), 2*pi)
参与的主题流程
| 主题 |
参与方式 |
| 轨道 / 季节换算 |
保存并初始化 peri_day/year_day/e_elips/lsperi,支撑 sol 与 Ls 的互转。 |
| 太阳几何 |
保存 obliquit、p_elips 和 lsperi,支撑日火距离和太阳赤纬计算。 |
| 辐射调用链 |
orbite 的 dist_sol/declin 下游影响短波通量缩放、太阳角、近红外 CO2 加热、坡面和热层路径。 |
| restart 可复现性 |
phyredem 把基础轨道和湍流参数写入控制表;tabfi 可从控制表恢复这些值并重新调用 iniorbit。 |
| 1D 古气候试验 |
init_testphys1d_mod.F90 的 paleomars 分支通过 obliquit/eccentric/Lsperi 改写本模块轨道状态。 |
写法特点
- 这是自由格式
.F90 模块,但变量名沿用较老的 planete_h 头文件风格。
- 共享变量未声明
PROTECTED,源码第 23 行注释也提示理想情况下应保护;当前实现依赖初始化顺序约束。
lsp2solp 的局部 degrad = 180.d0/pi 让输入 lsp 按 degree 解释;lsperi 模块变量则以 rad 保存。
iniorbit 的 Newton 迭代结束后无论是否因收敛退出,都会再执行一次 zx0 = zx0 + zdx;复现时应保留该字面行为。
复现要点
- 调用
solarlong 或 orbite 前必须保证 iniorbit 已在当前线程的 planete_h 副本上执行,否则 e_elips/p_elips/lsperi 可能未定义或过期。
aphelie/periheli 用 Mkm,p_elips 输出为 AU;不要在 orbite 中重复除以天文单位。
- 3D restart 路径恢复的是基础量,再由
tabfi 调 iniorbit 重建派生量;restart 文件不直接保存 e_elips/p_elips/lsperi。
- 1D
paleomars 分支会把 Lsperi 从 degree 转为 rad,仅用于 call_dayperi;随后仍需依赖初始化链路调用 iniorbit 来生成 lsperi/p_elips/e_elips。
read_dust_scenario_mod.F90 中 realday=mod(zday,669.) 仍硬编码 669,但时间维一致性检查用 year_day;古气候或非标准年长配置下要分别检查这两处行为。
待确认
coefvis/coefir 在当前 phymars 搜索范围内没有除声明外的读写点;是否由预处理、外部分支或历史接口使用,需后续全仓库或构建配置核对。
- 1D
paleomars 分支中 Lsperi 范围检查源码写成 if (eccentric < 0. .or. eccentric > 360.),疑似应检查 Lsperi;本页按源码字面记录,不判断修复。
相关页面