mucorr.F

路径

LMDZ.MARS\libf\phymars\mucorr.F

所属目录 / 模块

libf\phymars

文件定位

mucorr.F 定义 mucorr_mod,只提供 mucorr 一个例程。它在不显式计算日变化循环时,根据太阳赤纬和各格点纬度,计算日平均等效太阳入射角余弦 pmu 以及日照时间比例 pfract。当前源码树中,physiq_mod.Fdiurnal=.false. 分支调用它,把输出写入共享太阳几何数组 mu0/fract,随后供辐射和相关地表/尘埃流程读取。

本文件不 use 其他模块,也不调用其他自定义例程;核心依赖是 Fortran 内置三角函数、平方根和反正切。源码末尾还对 pmu 做一次“大气厚度/行星半径”球面修正,但活动代码使用硬编码常数 1224.35.,而不是同一段中已计算但被注释掉的 alph=phaut/prad 公式。

定义的符号

符号 类型 行号 作用
mucorr_mod module 1 封装非日变化情形下的等效太阳角和日照比例计算。
mucorr subroutine 7 npts 个格点由 pdeclin/plat 计算 pmu/pfract,并应用球面修正。

依赖的模块

use 模块 only 列表 用途 待确认
- - 本文件没有 use 依赖。 -

调用的关键例程

被调用例程 所在模块 / 文件 调用位置 作用
- - - 本文件不调用其他自定义例程。

上游调用点

调用方 源码位置 调用条件 传入 / 接收关系
physiq_mod.F libf/phymars/physiq_mod.F:67, 1020-1021 IF (diurnal) THEN 调用 solang,否则调用 mucorr 传入 ngrid, declin, latitude, 10000., rad,输出写入 mu0, fract
nirco2abs.F libf/phymars/nirco2abs.F:203-205 注释说明非日变化 NIR CO2 加热率因非线性,不直接使用 physiq.Fmucorr 给出的平均 mu0 该文件改用 20 个日内积分步反复调用 solang,不是 mucorr 的直接调用者。

输入

输入 来源 类型 / 维度 单位 含义
npts 调用方 integer scalar, intent(in) - 待处理格点数。
pdeclin physiq_mod.Forbite 输出的 declin real scalar, intent(in) 弧度 太阳赤纬。
plat(npts) physiq_mod.F 传入的 latitude real array, intent(in) 弧度 每个物理格点纬度。
phaut 调用方,当前为 10000. real scalar, intent(in) 源码未标注 大气厚度;当前只进入 alph=phaut/prad,但活动修正公式未使用 alph
prad 调用方,当前为 rad real scalar, intent(in) phaut 一致 行星半径;当前只进入未被活动公式使用的 alph

输出

输出 去向 类型 / 维度 单位 含义
pmu(npts) physiq_mod.Fmu0 real array, intent(out) - 日平均等效太阳角余弦;末尾经球面修正后返回。
pfract(npts) physiq_mod.Ffract real array, intent(out) - 日照时间占一个 sol 的比例;当 pmu 被截断为 0 时也置为 0。

共享状态与副作用

核心逻辑

  1. 计算 pi,把 pdeclin 记为 z,预先得到 cz=cos(z)sz=sin(z)
  2. 对每个纬度点,计算 sin(phi)cos(phi)tan(phi),其中 cos(phi) 小于等于 1.e-9 时被钳制到 1.e-9
  3. t=-tan(phi)*sin(declin)/cos(declin)a=1-t*t 推导日照半角 tp;当 a<0 时先保留原始 ap,再把用于平方根的 a 钳制为 0。
  4. pmu=(sin(phi)*sin(declin)*t)/pi + cos(phi)*cos(declin)*sin(t)/pipfract=t/pi 计算日平均量。
  5. 若原始 ap<0,进入极昼/极夜分支,把 pmu 设为 sin(phi)*sin(declin)pfract 设为 1。
  6. 将非正 pmu 钳制为 0,再用 pfract 归一化 pmu;若归一化后 pmu 为 0,则把 pfract 也置为 0。
  7. 计算 alph=phaut/prad,但活动修正公式对每个格点执行 pmu=sqrt(1224.*pmu*pmu+1.)/35.;基于 alph 的公式保留在注释中。

伪代码

mucorr(npts, declin, lat, pmu, pfract, phaut, prad):
    pi = 4 * atan(1)
    cz = cos(declin)
    sz = sin(declin)

    for each grid point j:
        phi = lat[j]
        cphi = max(cos(phi), 1.e-9)
        sphi = sin(phi)
        t = -(sphi / cphi) * sz / cz
        a = 1 - t*t
        ap = a

        if t == 0:
            daylight_half_angle = pi / 2
        else:
            daylight_half_angle = atan_branch(sqrt(max(a, 0)) / t)

        pmu[j] = daily_mean_cosine(daylight_half_angle, sphi, sz, cphi, cz)
        pfract[j] = daylight_half_angle / pi

        if ap < 0:
            pmu[j] = sphi * sz
            pfract[j] = 1

        pmu[j] = max(pmu[j], 0)
        pmu[j] = pmu[j] / pfract[j]
        if pmu[j] == 0:
            pfract[j] = 0

    alph = phaut / prad
    for each grid point j:
        pmu[j] = sqrt(1224 * pmu[j]^2 + 1) / 35

参与的主题流程

主题 参与方式
太阳几何 physiq_mod.F 非日变化分支中替代逐时刻 solang,给出日平均 mu0/fract
辐射调用链 mu0/fract 进入 callradite、NIR CO2 加热和若干地表辐射相关计算,是关闭日变化时的太阳入射几何来源。
NIR CO2 吸收 nirco2abs.F 注释指出该过程对 mu0 非线性,因此非日变化时另做日内积分,而不是直接使用 mucorr 的平均 mu0

写法特点

复现要点

待确认

相关页面