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,供 solarlongorbite 把 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 lsp2solpiniorbit 使用圆周率做角度、异常近点角和太阳经度换算。 -

调用的关键例程

被调用例程 所在模块 / 文件 调用位置 作用
- - - 本文件不调用自定义例程,只使用 atantansqrtsincosabsnintmodulo 等 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.defobliquit/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)lsp2solpcall_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 tabfiperi_day real scalar sol lsp2solp 由近日点太阳经度反推的近日点日期。
e_elips solarlongorbite real saved scalar - 轨道偏心率 (aphelie - periheli)/(aphelie + periheli)
p_elips orbite real saved scalar AU 半通径 0.5*(periheli+aphelie)*(1-e^2)/unitastr
lsperi solarlongorbite real saved scalar rad 近日点太阳经度,iniorbit 用平均近点角和偏近点角求得后归一到 [0,2*pi)

共享状态与副作用

核心逻辑

  1. 初始化路径先写基础轨道量:aphelie/periheli/year_day/peri_day/obliquit。3D 路径来自 tabfi 默认值或 startfi.nc 控制表;1D 路径来自默认常数或 paleomars 配置。
  2. 如用户在 tabfi 交互修改 peri_lslsp2solp 先用远日点/近日点距离求 e_elips,把输入的近日点 Ls 转成偏近点角,再由 Kepler 方程形式反推出 peri_day
  3. iniorbit 重新由远日点/近日点距离计算 e_elips,并计算 AU 单位的 p_elips
  4. iniorbit(year_day - peri_day)/year_day 得到平均近点角,Newton 迭代求偏近点角 zx0,收敛阈值为 1.e-12,最多 100 次。
  5. iniorbitzx0e_elips 计算 lsperi,再用 modulo(lsperi,2*pi) 归一化。
  6. 后续 solarlongperi_day/year_day/e_elips/lsperi 把日期转为 Ls;orbitee_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 的互转。
太阳几何 保存 obliquitp_elipslsperi,支撑日火距离和太阳赤纬计算。
辐射调用链 orbitedist_sol/declin 下游影响短波通量缩放、太阳角、近红外 CO2 加热、坡面和热层路径。
restart 可复现性 phyredem 把基础轨道和湍流参数写入控制表;tabfi 可从控制表恢复这些值并重新调用 iniorbit
1D 古气候试验 init_testphys1d_mod.F90paleomars 分支通过 obliquit/eccentric/Lsperi 改写本模块轨道状态。

写法特点

复现要点

待确认

相关页面