orbite.F
路径
LMDZ.MARS\libf\phymars\orbite.F
所属目录 / 模块
libf\phymars
文件定位
orbite.F 定义 orbite_mod,只提供 orbite 一个例程。它把太阳经度 Ls 转换成当前太阳-行星距离 dist_sol 和太阳赤纬 declin,是 physiq_mod.F 中辐射几何准备的一步。
当前主路径中,physiq_mod.F 先用 solarlong 得到共享状态 zls,再在 callrad 分支中调用 orbite(zls,dist_sol,declin)。随后 declin 进入 solang 或 mucorr 计算 mu0/fract,dist_sol 则用于辐射、坡面直接辐射、近红外 CO2 吸收和热层等路径的太阳通量缩放。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
orbite_mod |
module |
1 |
封装太阳经度到日火距离和太阳赤纬的换算例程。 |
orbite |
subroutine |
7 |
由输入 pls 计算输出 pdist_sol 与 pdecli。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
planete_h |
e_elips, p_elips, obliquit, lsperi |
提供轨道偏心率、半通径、转轴倾角和近日点太阳经度。 |
- |
comcstfi_h |
pi |
把 obliquit 从度转换为弧度。 |
- |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
| - |
- |
- |
本文件不调用其他自定义例程,只使用 cos、sin、asin 等 Fortran intrinsic。 |
上游调用点
| 调用方 |
源码位置 |
调用条件 |
传入 / 接收关系 |
physiq_mod.F |
libf/phymars/physiq_mod.F:90, 1010 |
callrad 为真时,在完成 zls 计算后调用。 |
传入 zls,输出写入 comsaison_h::dist_sol 和 comsaison_h::declin。 |
输入
| 输入 |
来源 |
类型 / 维度 |
单位 |
含义 |
pls |
physiq_mod.F 中的 zls,由 solarlong 或初始日分支给出 |
real scalar, intent(in) |
rad |
太阳经度 Ls。 |
e_elips |
planete_h,由 iniorbit 或 1D 初始化轨道参数设置 |
real saved scalar |
- |
轨道偏心率。 |
p_elips |
planete_h::iniorbit |
real saved scalar |
AU |
椭圆半通径;源码注释称 ellipse parameter。 |
lsperi |
planete_h::iniorbit 或 1D 初始化 |
real saved scalar |
rad |
近日点太阳经度。 |
obliquit |
planete_h |
real saved scalar |
degree |
行星转轴倾角,进入赤纬公式前乘 pi/180.。 |
输出
| 输出 |
去向 |
类型 / 维度 |
单位 |
含义 |
pdist_sol |
physiq_mod.F 的 dist_sol,即 comsaison_h::dist_sol |
real scalar, intent(out) |
AU |
当前太阳-行星距离。 |
pdecli |
physiq_mod.F 的 declin,即 comsaison_h::declin |
real scalar, intent(out) |
rad |
当前太阳赤纬。 |
共享状态与副作用
- 本文件没有本地
SAVE 变量、module 状态、common block、文件 I/O 或诊断输出。
orbite 只读取 planete_h 和 comcstfi_h 中的共享常数/轨道状态,并通过两个 intent(out) 参数返回结果。
- 上游
physiq_mod.F 把输出写入 comsaison_h::dist_sol/declin;这些共享状态随后被辐射、近红外 CO2、坡面和热层路径读取。
planete_h::iniorbit 在源码行 73-100 计算 e_elips、p_elips 和 lsperi;若绕过该初始化,orbite 读到的轨道状态可能未定义或过期。
核心逻辑
- 接收当前太阳经度
pls,不对角度范围做归一化。
- 用椭圆轨道公式计算太阳-行星距离:
pdist_sol = p_elips / (1 + e_elips * cos(pls - lsperi))
- 用倾角和太阳经度计算太阳赤纬:
pdecli = asin(sin(pls) * sin(obliquit * pi / 180.))
- 直接返回两个标量;没有额外限幅、异常处理或日志输出。
伪代码
orbite(pls):
distance = p_elips / (1 + e_elips * cos(pls - lsperi))
declination = asin(sin(pls) * sin(obliquit * pi / 180))
return distance, declination
参与的主题流程
| 主题 |
参与方式 |
| 轨道 / 季节换算 |
把 solarlong 给出的 zls 转换成距离太阳的 AU 值和太阳赤纬。 |
| 太阳几何 |
declin 是 solang 与 mucorr 计算 mu0/fract 的上游输入。 |
| 辐射调用链 |
dist_sol 进入 callradite 和其他太阳通量缩放路径,用于按 1/dist_sol^2 调整 1 AU 太阳常数。 |
| 近红外 CO2 吸收 |
nirco2abs 接收 dist_sol/mu0/fract/declin 计算近红外 CO2 加热率。 |
| 坡面和热层路径 |
physiq 坡面直接辐射和 thermosphere 调用也读取 dist_sol,坡面参数还读取 declin。 |
写法特点
- 固定格式
.F 文件,但内容是一个 module 和一个 contained subroutine。
- 输入/输出均为单精度
REAL 标量。
obliquit 在 planete_h 中以度保存,本例程在赤纬公式中显式乘 pi/180.;pls 和 lsperi 则按弧度参与三角函数。
- 公式没有对
1 + e_elips*cos(pls-lsperi) 做分母保护,也没有对 asin 参数做限幅;复现时应保留源码行为。
复现要点
- 调用前必须确保
planete_h 中的 e_elips/p_elips/lsperi/obliquit 已经按当前运行的轨道参数初始化。
p_elips 在 planete_h::iniorbit 中除以 unitastr,因此 pdist_sol 返回 AU;不要再重复换算。
pls 必须是弧度。solarlong 输出 zls 时也使用弧度。
- 若使用 1D/testphys 的古气候或自定义轨道输入,要确认
peri_day、lsperi、e_elips 与 p_elips 的更新路径一致;本页只确认 orbite 字面读取 planete_h 变量。
dist_sol 和 declin 在 physiq_mod.F 中只在 callrad 分支下由 orbite 更新;关闭辐射时仍读取这两个量的自定义流程需要单独设置或确认上一次值。
待确认
- 1D 古气候初始化中自定义
eccentric/Lsperi 后,是否所有运行路径都会同步得到与 iniorbit 一致的 p_elips;需要结合 init_testphys1d_mod.F90 和 tabfi.F 的初始化顺序逐步核对。
asin 输入的极端数值保护不在本文件中处理;当前源码依赖轨道参数范围使公式保持在有效区间。
相关页面