solang.F
路径
LMDZ.MARS\libf\phymars\solang.F
所属目录 / 模块
libf\phymars
文件定位
solang.F 定义 solang_mod 模块和 solang 子程序,用物理网格的经纬度三角缓存、太阳赤纬和当前时角计算每个格点的太阳天顶角余弦 mu0,并用 mu0>0 给出当前时间片是否日照的 fract。它是 physiq 日变化辐射分支的太阳角计算入口,也被 nirco2abs 在近红外 CO2 日积分中复用。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
solang_mod |
module |
1 |
日变化太阳角辅助模块。 |
solang |
subroutine |
7 |
按格点经纬度和太阳赤纬/时角计算 pmu0 与 pfract。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
| - |
- |
本文件没有 use 依赖,全部数据通过显式参数传入。 |
- |
调用的关键例程
| 被调用例程 |
所在模块 / 来源 |
调用位置 |
作用 |
| - |
- |
- |
本文件不调用自定义例程,也不调用非平凡 intrinsic。 |
下游调用点
| 调用方 |
源码位置 |
用途 |
physiq_mod.F |
use solang_mod 在 66 行;调用在 1017-1018 行 |
diurnal=.true. 时,用 sinlon/coslon/sinlat/coslat 和由 declin/zday 构造的 ztim1/2/3 写入 comsaison_h::mu0/fract。 |
nirco2abs.F |
use solang_mod 在 12 行;调用在 216-218 行 |
近红外 CO2 加热率的日平均积分中,对子时间点计算 mu0_int/fract_int。 |
输入
| 输入 |
来源 |
类型 / 维度 |
含义 |
kgrid |
调用方 |
integer scalar |
物理格点数。 |
psilon(kgrid) |
comgeomfi_h::sinlon |
real array |
格点经度正弦。 |
pcolon(kgrid) |
comgeomfi_h::coslon |
real array |
格点经度余弦。 |
psilat(kgrid) |
comgeomfi_h::sinlat |
real array |
格点纬度正弦。 |
pcolat(kgrid) |
comgeomfi_h::coslat |
real array |
格点纬度余弦。 |
ptim1 |
调用方 |
real scalar |
sin(declin)。 |
ptim2 |
调用方 |
real scalar |
cos(declin)*cos(time);physiq 中 time 写成 2*pi*(zday-.5)。 |
ptim3 |
调用方 |
real scalar |
-cos(declin)*sin(time);实参注释写作 SIN(DECLI)*SIN(TIME),但调用方和公式实际用于经度正弦项。 |
输出
| 输出 |
去向 |
类型 / 维度 |
含义 |
pmu0(kgrid) |
comsaison_h::mu0 或局部 mu0_int |
real array |
太阳天顶角余弦;夜侧可为负值,源码没有把负值钳为 0。 |
pfract(kgrid) |
comsaison_h::fract 或局部 fract_int |
real array |
当前时间片日照标志;pmu0>0 时为 1,否则为 0。 |
共享状态与副作用
- 模块没有保存状态、文件 I/O 或标准输出。
- 子程序先把
pmu0 和 pfract 全部清零,再覆盖计算结果。
- 夜侧
pmu0 保留几何余弦负值;注释中的夜侧归零行已被注释掉。
核心逻辑
- 初始化所有格点的
pmu0=0、pfract=0。
- 对每个格点计算:
pmu0 = sin(lat)*ptim1 + cos(lat)*ptim2*cos(lon) + cos(lat)*ptim3*sin(lon)
- 若
pmu0 > 0,设置 pfract=1;否则保持 pfract=0。
伪代码
for jl in 1..kgrid:
pmu0[jl] = psilat[jl]*ptim1
+ pcolat[jl]*ptim2*pcolon[jl]
+ pcolat[jl]*ptim3*psilon[jl]
pfract[jl] = 1 if pmu0[jl] > 0 else 0
参与的主题流程
| 主题 |
参与方式 |
| 日变化太阳几何 |
physiq 在 diurnal=.true. 分支使用本例程更新每个格点即时 mu0/fract。 |
| 辐射 |
mu0/fract 进入短波辐射、坡面和相关诊断路径;非日变化分支由 mucorr 提供日平均等效值。 |
| 近红外 CO2 加热 |
nirco2abs 用本例程在日积分子步上重新计算太阳角。 |
写法特点
- 固定格式 Fortran 文件,但模块化封装为
solang_mod。
- 注释头保留长波辐射历史文字,实际功能是太阳角计算。
- 只判断
pmu0>0 得到 0/1 日照标志,没有计算部分时间步日照比例;调用方若要日平均,需要自行积分或使用 mucorr。
复现要点
ptim2/ptim3 的符号由调用方构造;physiq 和 nirco2abs 都使用 ztim3=-cos(declin)*sin(2*pi*(zday-.5))。
- 不要假定夜侧
mu0 已经钳为 0;需要非负太阳角的调用方应自行处理或使用 fract。
- 本例程只处理日变化瞬时几何;
diurnal=.false. 时 physiq 改用 mucorr 计算日平均等效太阳角。
待确认
- 参数注释中
PTIM3 写作 SIN(DECLI)*SIN(TIME),但源码公式和调用方实参均对应 -COS(declin)*SIN(time);本页按实际调用和公式记录。
相关页面