ecRad 1.5.0 算法原理详解

ecRad 1.5.0 算法原理详解

本文聚焦 ecRad 的"算法内部":光谱如何离散、云与气溶胶的光学性质如何参数化、二流方程如何求解、云重叠与云内不均匀性如何建模、五种求解器各自的数学结构、以及支撑 SPARTACUS 的矩阵指数与线性代数实现。所有公式、常数、变量名与分支逻辑均来自 radiation/、ifsrrtm/ 下的实际源码。

配套的接口与文件约定请见 ecRad-输入输出详解.md,本文不再重复 namelist 与 NetCDF 变量定义。


0. 阅读地图

ecRad 的一次完整辐射计算可以拆成四层数学问题:

  1. 光谱离散层:把连续谱段压缩为若干"g 点"(相关 k 分布),使每条谱线的透过率可由少量采样点加权求和近似(第 1、2 节)。
  2. 光学性质层 :由水凝物含量、有效粒径、气溶胶混合比、湿度等物理量,参数化出每个 g 点/波段的消光光学深度 od、单散射反照率 ssa、不对称因子 g(第 3 节)。
  3. 云结构层:把次网格的云量、重叠、云内不均匀性离散为"区域"(region)与重叠矩阵(第 5 节)。
  4. 辐射传输求解层:在区域/子列上求解二流方程,逐层做 adding 组合得到通量(第 4、6 节)。

第 7 节单独说明被 SPARTACUS 反复调用的矩阵指数与矩阵求解实现。


1. 三段式解耦与主调用时序

ecRad 的核心设计是"气体光学 / 云-气溶胶光学 / 求解器"三段完全分离,统一由 radiation_interface.F90 中的 radiation 例程按固定顺序调用。对每一块列(block)依次执行:

  1. gas_optics(radiation_gas 派发到 radiation_ifs_rrtm 或 radiation_ecckd):算出每个 g 点的气体 od/ssa/g。
  2. 气溶胶光学:由混合比与湿度得到气溶胶的 od/scat_od/scat_od_g,并按 g 点与气体合并。
  3. 云光学:由液/冰水路径与有效粒径得到每个波段 的云 od/scat_od/g(云光学天然定义在波段上,而非 g 点)。
  4. 求解器:solver_cloudless / solver_homogeneous / solver_mcica / solver_tripleclouds / solver_spartacus,由 sw_solver_name、lw_solver_name 分别选择。

关键解耦点:云光学按波段计算,气体与气溶胶按 g 点计算 ,求解器内部通过 config%i_band_from_reordered_g_sw/lw 把两者对应起来。这个映射是理解整个数据流的钥匙------云的光学性质在每个波段内对所有 g 点是相同的。


2. 光谱离散与相关 k 分布

2.1 相关 k 分布的基本原理

在均匀路径上,谱段 Δν\Delta\nu Δν 内的平均透过率为
Tˉ(u)= 1Δν ∫Δν e −kνu  dν=∫0∞e−k u p(k) dk \bar{T}(u) = \frac{1}{\Delta\nu}\int_{\Delta\nu} e^{-k_\nu u}\,d\nu = \int_0^\infty e^{-k\,u}\,p(k)\,dk Tˉ(u)=Δν1∫Δνe−kνudν=∫0∞e−kup(k)dk

其中 p(k)p(k) p(k) 是吸收系数在谱段内的概率密度。把 p(k)p(k) p(k) 离散为 Ng N_g Ng 个点后,积分变为加权求和:
Tˉ(u)≈ ∑j=1Ng wj e −kju \bar{T}(u) \approx \sum_{j=1}^{N_g} w_j\, e^{-k_j u} Tˉ(u)≈j=1∑Ngwje−kju

这正是"k 分布": kj k_j kj 是吸收系数分位点, wj w_j wj 是权重(g 点的"宽度")。在非均匀路径上,各层的 kk k 排序近似保持一致(相关 假设),于是 kk k 可作为固定的吸收系数随压力、温度重排,从而用同样的 jj j 索引贯穿整条廓线。

ecRad 中每个 g 点携带一个 od/ssa/g 三元组,辐射传输逐 g 点独立求解,最后按权重(spectral_def%weight)加权得到波段与全谱通量。

2.2 RRTMG-IFS 的 g 点结构

ifsrrtm/ 目录是 ECMWF 对 RRTMG 的实现。parsrtm.F90 中的关键常数:

常数 值 含义
JPBAND 29 总波段数(16 长波 + 13 可见/近红外 + 1 窗区)
JPSW 14 短波波段数
JPB1 / JPB2 16 / 29 短波在总波段中的起止索引
JPG 16 单个波段内最大 g 点数
JPGMAX 224 g 点总数上限

实际使用规模为短波 14 波段 / 112 g 点 (JPGPT = 112),长波 16 波段 / 140 g 点。短波每个波段约 8 个 g 点,长波约 8--16 个。

RRTMG 采用"预混合"的 g 点:即 k 分布已经由 HITRAN 谱线数据离线计算并合并成固定表,运行时只做压力-温度的内插与次要气体的比例修正(srtm_kgbXX 系列)。

2.3 ecCKD 的运行时离散(1.5 新增)

ecCKD(ECMWF Correlated k-Distribution)把 g 点的定义完全外置到 NetCDF 文件,运行时由 radiation_ecckd.F90 的 read_ckd_model 读取:

  • pressure / temperature:查找表的压力、温度网格;
  • solar_irradiance、rayleigh_molar_scattering_coeff:太阳辐照度与瑞利散射系数(短波);
  • planck_function、temperature_planck:普朗克函数查找表(长波);
  • 每类气体的吸收系数表。

因此 ecCKD 的 n_g_sw / n_g_lw 由文件决定,data/ 下提供的默认配置为 32/32 g 点,另附 38/27、64/64 等变体。这是与 RRTMG 最本质的差别:光谱离散从"编译期常量"变为"运行时数据"。

2.4 气体光学主流程与 g 点重排

无论 RRTMG 还是 ecCKD,气体光学输出的 g 点都会经过一次重排(reordering) ,使 g 点大致按气体光学深度递增排列。这一步是 SPARTACUS 的关键前提(见 6.4):SPARTACUS 假设前 ng3D 个 g 点气体光学深度较小、需要 3D 处理,一旦遇到超过 max_gas_od_3D 的 g 点即停止 3D 处理。映射关系保存在 config%i_band_from_reordered_g_sw/lw。


3. 云与气溶胶光学参数化

所有光学模型统一输出三元组 (od, scat_od, g),其中 od 为总光学深度、scat_od 为散射光学深度(ssa = scat_od/od)、g 为不对称因子。系数均从 NetCDF 文件读取(liq_optics_file_name、ice_optics_file_name)。

3.1 液态云

Slingo(1989)短波 + Lindner & Li(2000)长波 (radiation_liquid_optics_slingo.F90)。设 WW W 为液水路径(g m⁻²), re r_e re 为有效半径(μm):
od=W (c1+ c2re ) ,scat_od=od (1−c3−c4re),g=c5+c6re \text{od} = W\left(c_1 + \frac{c_2}{r_e}\right),\quad \text{scat\_od} = \text{od}\,(1 - c_3 - c_4 r_e),\quad g = c_5 + c_6 r_e od=W(c1+rec2),scat_od=od(1−c3−c4re),g=c5+c6re

有效半径被限制在 Slingo 声明的适用范围 4.2--16.6 μm(长波为 2--40 μm)。源码明确警告该参数化精度有限(参见 Nielsen et al. GMD 2014),因此默认不使用。

SOCRATES(Edwards-Slingo) (radiation_liquid_optics_socrates.F90)是默认模型,用 Pade 有理逼近表达对有效半径的依赖,每波段 16 个系数:
od=W  c1+c2re+c3re2 1+c4re+c5re2+c6re3 \text{od} = W\,\frac{c_1 + c_2 r_e + c_3 r_e^2}{1 + c_4 r_e + c_5 r_e^2 + c_6 r_e^3} od=W1+c4re+c5re2+c6re3c1+c2re+c3re2
scat_od=od (1− c7+c8re+c9re2 1+c10re+c11re2 ) ,g= c12+c13re+c14re2 1+c15re+c16re2 \text{scat\od} = \text{od}\left(1 - \frac{c_7 + c_8 r_e + c_9 r_e^2}{1 + c{10} r_e + c_{11} r_e^2}\right),\quad g = \frac{c_{12} + c_{13} r_e + c_{14} r_e^2}{1 + c_{15} r_e + c_{16} r_e^2} scat_od=od(1−1+c10re+c11re2c7+c8re+c9re2),g=1+c15re+c16re2c12+c13re+c14re2

有效半径先被夹到 1.2 μm,50 μm1.2\\,\\mu m, 50\\,\\mu m 1.2μm,50μm。

3.2 冰云

冰云模型均为"有效直径 De D_e De 的多项式 + 有理式",差别在于对温度/冰水含量的依赖与系数来源:

  • Fu-IFS (radiation_ice_optics_fu.F90):以 Fu 有效直径 De=re⋅(106/0.64952) D_e = r_e \cdot (10^6/0.64952) De=re⋅(106/0.64952) μm 为自变量,od 与 1/De 1/D_e 1/De 成线性,ssa、g 为 De D_e De 的三次多项式。 re r_e re 上限 100 μm,g 被夹到略小于 1(否则 delta-Eddington 缩放会使散射光学深度归零而除零)。
  • Baran / Baran2016 :od/scat_od/g 为 De D_e De 的多项式。
  • Baran2017 (radiation_ice_optics_baran2017.F90):引入温度依赖,先修正冰水混合比 qi q_i qi:

qimod=qiexp⁡ ⁣c1(T−c2) q_i^{\text{mod}} = q_i \exp\!\bigc_1 (T - c_2)\\big qimod=qiexpc1(T−c2)

再以 qimod q_i^{\text{mod}} qimod 的不同幂次驱动三个有理式:
od=W ⁣ (c1+ c2 1+c3(qimod)p1 ) ,scat_od=od ⁣ (c4+ c5 1+c6(qimod)p2 ) ,g=c7+ c8 1+c9(qimod)p3 \text{od} = W\!\left(c_1 + \frac{c_2}{1 + c_3 (q_i^{\text{mod}})^{p_1}}\right),\quad \text{scat\_od} = \text{od}\!\left(c_4 + \frac{c_5}{1 + c_6 (q_i^{\text{mod}})^{p_2}}\right),\quad g = c_7 + \frac{c_8}{1 + c_9 (q_i^{\text{mod}})^{p_3}} od=W(c1+1+c3(qimod)p1c2),scat_od=od(c4+1+c6(qimod)p2c5),g=c7+1+c9(qimod)p3c8

  • Yi (radiation_ice_optics_yi.F90):基于查找表插值,短波/长波系数规模不同。

3.3 气溶胶光学与湿度增长

radiation_aerosol_optics.F90 把气溶胶分为**疏水(hydrophobic)与亲水(hydrophilic)**两类:

  • 疏水类型:光学性质与湿度无关,直接由质量消光系数 κ\kappa κ、ssa、g 查表;
  • 亲水类型:质量消光系数、ssa、g 都依赖相对湿度,需按 RH 索引查表。

湿度增长的核心是先用液态饱和比湿算相对湿度:
RH= q H2O q H2O sat,liq ,irh=calc_rh_index(RH) \text{RH} = \frac{q_{H_2O}}{q_{H_2O}^{\text{sat,liq}}},\qquad \text{irh} = \texttt{calc\_rh\_index}(\text{RH}) RH=qH2Osat,liqqH2O,irh=calc_rh_index(RH)

再对每个波段/类型取该 RH 档位的系数。某类型对光学深度的贡献为
Δod= Δpg ⏟ factor ⋅qaer⋅κ(band,irh,type) \Delta \text{od} = \underbrace{\frac{\Delta p}{g}}{\text{factor}} \cdot q{\text{aer}} \cdot \kappa(\text{band}, \text{irh}, \text{type}) Δod=factor gΔp⋅qaer⋅κ(band,irh,type)

其中 Δp/g\Delta p/g Δp/g 把质量混合比换算为柱质量。散射光学深度与不对称因子按同样的 Δod⋅ssa\Delta\text{od}\cdot\text{ssa} Δod⋅ssa、 Δod⋅ssa⋅g\Delta\text{od}\cdot\text{ssa}\cdot g Δod⋅ssa⋅g 累加,最后在 g 点层面与气体散射合并。

若 use_general_aerosol_optics,则先从高光谱分辨率文件读取,再用 spectral_def%calc_mapping 做权重矩阵 mapping 与质量消光系数的矩阵乘法,平均到当前气体模型的波段或 g 点。合并时按"散射光学深度加权"求等效 ssa 与 g:
ssamix= ∑iscat_odi ∑iodi ,gmix= ∑iscat_odigi ∑iscat_odi \text{ssa}_{\text{mix}} = \frac{\sum_i \text{scat\_od}_i}{\sum_i \text{od}i},\qquad g{\text{mix}} = \frac{\sum_i \text{scat\_od}_i g_i}{\sum_i \text{scat\_od}_i} ssamix=∑iodi∑iscat_odi,gmix=∑iscat_odi∑iscat_odigi

3.4 Delta-Eddington 缩放

短波中,前向散射峰被近似为"未发生散射",由 radiation_delta_eddington.h 提供:
f=g2,od′=od(1−ssa f),ssa′= ssa(1−f)1−ssa f ,g′= g1+g f = g^2,\quad \text{od}' = \text{od}(1 - \text{ssa}\,f),\quad \text{ssa}' = \frac{\text{ssa}(1-f)}{1-\text{ssa}\,f},\quad g' = \frac{g}{1+g} f=g2,od′=od(1−ssaf),ssa′=1−ssafssa(1−f),g′=1+gg

源码提供三个变体:delta_eddington(用 ssa)、delta_eddington_scat_od(用 scat_od)、delta_eddington_extensive(用 scat_od 与 scat_od_g),以及逆变换 revert_delta_eddington。是否把缩放与气体一起做由 do_sw_delta_scaling_with_gases 控制:为真则在求解器内部对"云-气溶胶-气体混合物"统一缩放,为假则只对气溶胶单独缩放。


4. 二流方程

radiation_two_stream.F90 是所有求解器共用的核心。它把辐射场分解为向上/向下两个流,并用解析解给出单层的反射、透射与源项。

4.1 二流微分方程

以光学深度 τ\tau τ 为坐标(自上而下增大),向上流 F+F^+ F+、向下流 F−F^- F− 满足
dF+dτ =γ1F+−γ2F−−γ3S, dF−dτ =γ2F+−γ1F−+γ4S \frac{dF^+}{d\tau} = \gamma_1 F^+ - \gamma_2 F^- - \gamma_3 S,\qquad \frac{dF^-}{d\tau} = \gamma_2 F^+ - \gamma_1 F^- + \gamma_4 S dτdF+=γ1F+−γ2F−−γ3S,dτdF−=γ2F+−γ1F−+γ4S

其中 SS S 为直接太阳束(短波)或普朗克源(长波)。 γ\gamma γ 系数由单散射反照率 ssa、不对称因子 g、太阳天顶角余弦 mu0 决定。

4.2 长波 gamma 系数(Fu et al. 1997)

长波取漫射因子 LwDiffusivity = 1.66(Elsasser 因子,等效天顶角 arccos⁡(1/1.66)\arccos(1/1.66) arccos(1/1.66)):
γ1=Dw (1− 12 ssa(1+g)) ,γ2=Dw  12 ssa(1−g),Dw=1.66 \gamma_1 = D_w\left(1 - \tfrac{1}{2}\text{ssa}(1+g)\right),\qquad \gamma_2 = D_w\,\tfrac{1}{2}\text{ssa}(1-g),\qquad D_w = 1.66 γ1=Dw(1−21ssa(1+g)),γ2=Dw21ssa(1−g),Dw=1.66

源码用 factor = (LwDiffusivity*0.5)*ssa 减少乘法次数,等价于上式。

4.3 短波 gamma 系数(Zdunkowski PIFM)

短波采用 Zdunkowski et al.(1980)的 PIFM 系数,含直接束项 γ3 \gamma_3 γ3、 γ4=1−γ3 \gamma_4 = 1-\gamma_3 γ4=1−γ3:
γ1=2−ssa ( 54 + 34 g) ,γ2=ssa ( 34 − 34 g) ,γ3= 12 − 34 μ0g \gamma_1 = 2 - \text{ssa}\left(\tfrac{5}{4} + \tfrac{3}{4}g\right),\qquad \gamma_2 = \text{ssa}\left(\tfrac{3}{4} - \tfrac{3}{4}g\right),\qquad \gamma_3 = \tfrac{1}{2} - \tfrac{3}{4}\mu_0 g γ1=2−ssa(45+43g),γ2=ssa(43−43g),γ3=21−43μ0g

注意 SwDiffusivity = 2.0 在 γ\gamma γ 计算中并不直接出现(已内含于上式系数),只在 SPARTACUS 求解器中另作漫射角使用。

4.4 Meador & Weaver 解析解

对单层,令
k= max⁡(γ1−γ2)(γ1+γ2), 10−12 k = \sqrt{\max\big(\\gamma_1-\\gamma_2)(\\gamma_1+\\gamma_2),\\,10\^{-12}\\big} k=max(γ1−γ2)(γ1+γ2),10−12

(Meador & Weaver 1980 Eq. 18,下界 10−1210^{-12} 10−12 防止短波奇异)。定义 exp⁡2 =e−2kτ \exp_2 = e^{-2k\tau} exp2=e−2kτ 与
Rfactor= 1 k+γ1+(k−γ1) exp⁡2 R_{\text{factor}} = \frac{1}{k + \gamma_1 + (k-\gamma_1)\exp_2} Rfactor=k+γ1+(k−γ1)exp21

则漫射反射率与透过率为
ρ=γ2(1− exp⁡2 ) Rfactor(Eq. 25),T=2k e−kτ Rfactor(Eq. 26) \rho = \gamma_2 (1-\exp_2)\,R_{\text{factor}}\quad(\text{Eq. 25}),\qquad T = 2k\,e^{-k\tau}\,R_{\text{factor}}\quad(\text{Eq. 26}) ρ=γ2(1−exp2)Rfactor(Eq. 25),T=2ke−kτRfactor(Eq. 26)

短波直接项 :令 γ4=1−γ3 \gamma_4 = 1-\gamma_3 γ4=1−γ3,
α1=γ1γ4+γ2γ3,α2=γ1γ3+γ2γ4 \alpha_1 = \gamma_1\gamma_4 + \gamma_2\gamma_3,\qquad \alpha_2 = \gamma_1\gamma_3 + \gamma_2\gamma_4 α1=γ1γ4+γ2γ3,α2=γ1γ3+γ2γ4

直接反射 ref_dir(Eq. 14)与直接束散射后透射 trans_dir_diff(Eq. 15)由 α1,α2,k,μ0 \alpha_1,\alpha_2,k,\mu_0 α1,α2,k,μ0 组合而成;纯直接透射为 Tdd =e −τ/μ0 T_{dd} = e^{-\tau/\mu_0} Tdd=e−τ/μ0。源码对 ref_dir+trans_dir_diff≤1\text{ref\_dir} + \text{trans\_dir\_diff} \le 1 ref_dir+trans_dir_diff≤1 做了强制夹取,并在 kμ0≈1 k\mu_0 \approx 1 kμ0≈1 时对 μ0 \mu_0 μ0 施加极小扰动以避免除零。

长波源项:假设普朗克函数在层内随光学深度线性变化(Stackhouse & Stephens 1991 Eq. 5 & 12),
c= Bbot−Btop τ(γ1+γ2) c = \frac{B_{\text{bot}} - B_{\text{top}}}{\tau(\gamma_1+\gamma_2)} c=τ(γ1+γ2)Bbot−Btop

再由 ρ\rho ρ、 TT T 组合出层顶向上发射 source_up 与层底向下发射 source_dn。等温层版本 calc_reflectance_transmittance_isothermal_lw 简化为 source = B(1-\rho-T)。

4.5 低光学深度极限

当 τ≤10−3\tau \le 10^{-3} τ≤10−3(长波)时,指数与分母同时趋于病态,改用线性极限:
ρ=γ2τ,T= 1−kτ 1+τ(γ1−k) ,source=(1−ρ−T)⋅ 12 (Btop+Bbottom) \rho = \gamma_2\tau,\qquad T = \frac{1 - k\tau}{1 + \tau(\gamma_1 - k)},\qquad \text{source} = (1-\rho-T)\cdot\tfrac{1}{2}(B_{\text{top}}+B_{\text{bottom}}) ρ=γ2τ,T=1+τ(γ1−k)1−kτ,source=(1−ρ−T)⋅21(Btop+Bbottom)

短波 calc_reflectance_transmittance_z_sw 亦提供按层厚 depth(而非光学深度)的极限分支(Meador & Weaver Eq. 19/20/27)。

4.6 快指数近似

若编译时定义 FAST_EXPONENTIAL,则用 Padé 近似替代 exp:对 x≤0x\le 0 x≤0,
ex≈ 1 1−x8+x2128−x33072 8 e^{x} \approx \left\\frac{1}{1 - \\frac{x}{8} + \\frac{x\^2}{128} - \\frac{x\^3}{3072}}\\right^{8} ex≈1−8x+128x2−3072x318

即先算 exp⁡(x/8)\exp(x/8) exp(x/8) 的 Padé 逼近,再连续平方三次。该近似在负参数下不会变号,且可向量化。


5. 云重叠与云内不均匀性

5.1 三种重叠方案与 alpha/beta 参数

radiation_cloud_cover.F90 定义三种方案(枚举 IOverlapMaximumRandom / IOverlapExponentialRandom / IOverlapExponential,名称 Max-Ran / Exp-Ran / Exp-Exp)。相邻两层云量 f1,f2 f_1,f_2 f1,f2 的组合云量为:

  • Max-Ran (最大-随机):相邻层取最大,非相邻层随机, pair=max⁡(f1,f2)\text{pair} = \max(f_1,f_2) pair=max(f1,f2)。
  • Exp-Ran (指数-随机):相邻层用重叠参数 α\alpha α 插值于"最大"与"随机"之间:

pair=αmax⁡(f1,f2)+(1−α)(f1+f2−f1f2)\text{pair} = \alpha\max(f_1,f_2) + (1-\alpha)\big(f_1 + f_2 - f_1 f_2\big) pair=αmax(f1,f2)+(1−α)(f1+f2−f1f2)

  • Exp-Exp(指数-指数):相邻与非相邻层都用指数重叠,无解析总云量公式。

α\alpha α 为 Hogan & Illingworth(2000)参数(1 = 最大重叠,0 = 随机)。若输入是 Shonk et al.(2010)的 β\beta β 参数(use_beta_overlap),先转换:
α=β+ (1−β) ∣f1−f2∣ ∣f1−f2∣+1/β−1 (β<1) \alpha = \beta + \frac{(1-\beta)\,|f_1-f_2|}{|f_1-f_2| + 1/\beta - 1}\qquad(\beta<1) α=β+∣f1−f2∣+1/β−1(1−β)∣f1−f2∣(β<1)

5.2 累积云量的递归与 Exp-Exp 的对象合并

对 Max-Ran 与 Exp-Ran,从顶层向下递推累积乘积:
cum_product←cum_product⋅ 1−pair(j) 1−fj ,cum_cloud_cover(j+1)=1−cum_product \text{cum\_product} \leftarrow \text{cum\_product}\cdot\frac{1-\text{pair}(j)}{1-f_j},\qquad \text{cum\_cloud\_cover}(j+1) = 1 - \text{cum\_product} cum_product←cum_product⋅1−fj1−pair(j),cum_cloud_cover(j+1)=1−cum_product

当 fj≥ f_j \ge fj≥ MaxCloudFrac 时直接置 cum_product=0\text{cum\_product}=0 cum_product=0。

Exp-Exp 没有解析式,源码用"凹云对象 "近似:把云量先单调增、再单调减的连续层合并为一个对象,用各对象最大云量层的重叠参数之积作为对象间 α\alpha α;然后反复挑出相关性最强的一对对象合并,直至只剩一个。这样既得到与指数重叠一致的累积云量,又能让 McICA 把全部有云 g 点分配到真正含云的子列,降低噪声。

5.3 重叠矩阵(u_matrix / v_matrix)

radiation_overlap.F90 把逐层的重叠关系组织为方向性重叠矩阵 。对每个层界面(含大气顶与地表,共 nlev+1 个),先算非方向性重叠矩阵 Oul O_{ul} Oul(上区域 uu u、下区域 ll l 的联合面积),再归一化为:
uul = Oul fllower , vlu = Oul fuupper u_{ul} = \frac{O_{ul}}{f_l^{\text{lower}}},\qquad v_{lu} = \frac{O_{ul}}{f_u^{\text{upper}}} uul=fllowerOul,vlu=fuupperOul

含义: uu u 矩阵把界面下方的向上流映射到界面上方的向上流( y=Uxy = Ux y=Ux), vv v 矩阵同理作用于向下流。含云区域的重叠参数 α\alpha α 由边界 α\alpha α 通过去相关缩放 op1/sop^{1/s} op1/s(decorrelation_scaling,默认 1)得到云内不均匀性重叠参数。诊断云量可由 1−∏jv11(j) 1-\prod_j v_{11}(j) 1−∏jv11(j) 得到。

对两个云区域(Tripleclouds), OO O 的构建分两层:先用 α\alpha α 处理"晴空/含云"的划分,再在"两层都含云"的部分内用 αinhom \alpha_{\text{inhom}} αinhom 处理"薄/厚"云区的划分(calc_alpha_overlap_matrix)。若使用 β\beta β 参数,则改用 Shonk 的随机-最大分解形式(calc_beta_overlap_matrix)。

5.4 Tripleclouds 区域划分与 16 百分位

radiation_regions.F90 的 calc_region_properties 把每层的次网格光学深度分布离散为区域:区域 1 为晴空,区域 2/3 为薄/厚云区。

  • nreg = 2 :单一含云区,od_scaling(2)=1,reg_fracs(2)=cloud_fraction。
  • nreg = 3 :按 Shonk & Hogan(2008),用第 16 百分位代表薄云区。

对数正态分布:
od_scaling(2)= exp⁡ ⁣(− ln⁡(σ2+1) ) σ2+1 ,od_scaling(3)=2−od_scaling(2)\text{od\_scaling}(2) = \frac{\exp\!\big(-\sqrt{\ln(\sigma^2+1)}\big)}{\sqrt{\sigma^2+1}},\qquad \text{od\_scaling}(3) = 2 - \text{od\_scaling}(2) od_scaling(2)=σ2+1 exp(−ln(σ2+1) ),od_scaling(3)=2−od_scaling(2)

Gamma 分布 (IPdfShapeGamma):16 百分位在 FSD 较大时极小,故设下限 MinGammaODScaling = 0.025,并让薄云区面积占比随 FSD 在 0.5--0.9 之间线性上升:
od_scaling(2)=0.025+0.975exp⁡ ⁣−σ(1+0.5σ(1+0.5σ))\text{od\_scaling}(2) = 0.025 + 0.975\exp\!\Big-\\sigma\\big(1 + 0.5\\sigma(1+0.5\\sigma)\\big)\\Big od_scaling(2)=0.025+0.975exp−σ(1+0.5σ(1+0.5σ))

厚云区占比由总面积守恒反解,且缩放值保证平均光学深度守恒:
od_scaling(3)= fc−f2 od_scaling(2) f3 \text{od\_scaling}(3) = \frac{f_c - f_2\,\text{od\_scaling}(2)}{f_3} od_scaling(3)=f3fc−f2od_scaling(2)

这里 σ\sigma σ 即 fractional_std(分数标准差 FSD)。区域划分是波长无关的,只在 SPARTACUS 与 Tripleclouds 求解器中使用。


6. 五种求解器

6.1 Cloudless 与 Homogeneous

  • Cloudless (radiation_cloudless_sw/lw.F90):忽略云,只做晴空柱的逐层 adding,用于快速晴空通量与验证。
  • Homogeneous (radiation_homogeneous_sw/lw.F90):假设云水平充满格点(平面平行),得到 Independent Column Approximation(ICA)基准,适合与 3D 求解器对照。

两者的逐层组合都基于 4.4 的 Meador & Weaver 解析解,区别只在云量处理。

6.2 McICA

McICA(Pincus et al. 2003)用随机子列采样次网格云结构,代价是随机噪声。ecRad 的实现包含三个部件:

(1)随机云发生器 (radiation_cloud_generator.F90):对每层生成 od_scaling(0 表示晴空)。流程为:先由 5.2 得到累积云量 cum_cloud_cover 与 overhang,再用均匀随机数 trigger 决定各 g 点是否落在云中,最后用 PDF 采样器给出云内光学深度的缩放因子。

(2)随机数生成器 (radiation_random_numbers.F90):可选 Fortran 内建 random_number 或向量化 MINSTD 线性同余。MINSTD 参数为
A0=16807,A=48271,M=231−1 A_0 = 16807,\quad A = 48271,\quad M = 2^{31}-1 A0=16807,A=48271,M=231−1

状态更新与归一化:
istatei←mod(A⋅istatei, M),ri= istateiM \text{istate}_i \leftarrow \text{mod}(A\cdot\text{istate}_i,\ M),\qquad r_i = \frac{\text{istate}_i}{M} istatei←mod(A⋅istatei, M),ri=Mistatei

向量版一次维护 512 条流(NMaxStreams),初始化时用 A0 A_0 A0 预热,之后每步用 AA A,从而在批量请求时完全可向量化。选它的原因是 IFS 原有的 random_numbers_mix 在部分硬件上无法向量化。

(3)PDF 采样器 (radiation_pdf_sampler.F90):从 (CDF, FSD) 二维查找表双线性插值得到光学深度缩放。给定 CDF 值 cdf 与 FSD 值 fsd:
wcdf=cdf⋅(ncdf−1)+1,wfsd=(fsd−fsd1)⋅ Δfsd−1 +1 w_{\text{cdf}} = \text{cdf}\cdot(n_{\text{cdf}}-1)+1,\qquad w_{\text{fsd}} = (\text{fsd}-\text{fsd}1)\cdot\Delta^{-1}{\text{fsd}}+1 wcdf=cdf⋅(ncdf−1)+1,wfsd=(fsd−fsd1)⋅Δfsd−1+1

取整得索引与权重,四点加权求和。查找表由 setup_pdf_sampler 从文件读入(fsd、x 两个变量)。

6.3 Tripleclouds

Tripleclouds(Shonk & Hogan 2008)把每层拆为 1 个晴空 + 2 个含云区(薄/厚),对 3 个区域分别做二流求解再用重叠矩阵组合。它比 McICA 慢,但无随机噪声,且能表示光学深度方差对反射的影响。区域划分见 5.4,区域组合复用 5.3 的重叠矩阵。

6.4 SPARTACUS 短波

SPARTACUS(Hogan et al. 2016)在二流方程中加入侧向传输 ,以矩阵形式求解 3D 效应。核心步骤(radiation_spartacus_sw.F90):

(1)侧向传输率 。由 Hogan & Shonk(2013)Eq. 45/47,区域 jj j 与 j+1j+1 j+1 之间的边缘长度与传输率(乘以层厚 dzdz dz):
edge(1)=4πfclear(1−fclear)min⁡ ⁣(inv_eff_size, 1min_eff_size)\text{edge}(1) = \frac{4}{\pi} f_{\text{clear}}(1-f_{\text{clear}})\min\!\Big(\text{inv\_eff\_size},\ \frac{1}{\text{min\eff\size}}\Big) edge(1)=π4fclear(1−fclear)min(inv_eff_size, min_eff_size1)
ratedirect(j→j+1)=dz⋅ edge(j)tan⁡θsfj ,ratediffuse(j→j+1)=dz⋅ edge(j)tan⁡θdfj \text{rate}
{\text{direct}}(j\to j+1) = dz\cdot\frac{\text{edge}(j)\tan\theta_s}{f_j},\qquad \text{rate}
{\text{diffuse}}(j\to j+1) = dz\cdot\frac{\text{edge}(j)\tan\theta_d}{f_j} ratedirect(j→j+1)=dz⋅fjedge(j)tanθs,ratediffuse(j→j+1)=dz⋅fjedge(j)tanθd

漫射角取 tan⁡θd=π/2 \tan\theta_d = \pi/2 tanθd=π/2(tan_diffuse_angle_3d);太阳角 tan⁡θs= 1/μ02−1+overhead_sun_factor \tan\theta_s = \sqrt{1/\mu_0^2 - 1 + \text{overhead\_sun\_factor}} tanθs=1/μ02−1+overhead_sun_factor ,并把 μ0 \mu_0 μ0 下限设为 min_mu0_3d = 0.004625(约一个太阳半径)。传输率上限 max_3d_transfer_rate 防止过度耗散。

(2)构建 3nreg×3nreg 3n_{\text{reg}}\times 3n_{\text{reg}} 3nreg×3nreg 层传输矩阵 。矩阵分块对应 [向上流 | 向下流 | 直接束]:
M= ( −Γ1 +Γ2 −Γ3 +Γ2 −Γ1 +Γ4 0 0 −Γ0 ) dz M = \begin{pmatrix} -\Gamma_1 & +\Gamma_2 & -\Gamma_3\\ +\Gamma_2 & -\Gamma_1 & +\Gamma_4\\ 0 & 0 & -\Gamma_0 \end{pmatrix}dz M= −Γ1+Γ20+Γ2−Γ10−Γ3+Γ4−Γ0 dz

对角线元素为 od*gamma1、od*ssa*gamma3、od*ssa*(1-gamma3)、od/mu0,侧向传输率按方向加入对角线并置负于对应非对角元(transfer_rate_diffuse(j,j+1) 加在对角线、-transfer_rate_diffuse(j+1,j) 置于非对角)。源码用 IMatrixPatternShortwave 稀疏模式(左上 2×2 块稠密、右下三角)优化乘法。

(3)矩阵指数 :expm 求出 eMe^{M} eM(见第 7 节)。设 eMe^M eM 分块为 \[P,Q,R,S,T,U,0,0,V]\[P,Q,R,S,T,U,0,0,V] \[P,Q,R,S,T,U,0,0,V],则
ρ=−P−1Q,T=Sρ+T,ref_dir=−P−1R,trans_dir_diff=S ref_dir+U, Tdd =V\rho = -P^{-1}Q,\qquad T = S\rho + T,\qquad \text{ref\_dir} = -P^{-1}R,\qquad \text{trans\_dir\_diff} = S\,\text{ref\dir} + U,\qquad T{dd} = V ρ=−P−1Q,T=Sρ+T,ref_dir=−P−1R,trans_dir_diff=Sref_dir+U,Tdd=V

(4)3D 与平面平行的混合 。仅前 ng3D 个 g 点做 3D 处理;其余 g 点退化为 Meador & Weaver 平面平行解(对角块)。ng3D 由气体光学深度阈值 max_gas_od_3D 决定(见 2.4)。

(5)adding 方法 :从地表向上,逐层把下方总反照率与当前层组合(矩阵形式),并施加重叠与 entrapment 。entrapment 决定侧向流出的辐射有多少被"困"回本区域,有五种模式:Zero、EdgeOnly、Explicit、ExplicitNonFractal、Maximum(默认)。显式模式用水平迁移距离 xdiffuse,xdirect x_{\text{diffuse}},x_{\text{direct}} xdiffuse,xdirect 与分形因子
fractal_factor= 1 max⁡(1, 2.5 xdiffuse inv_eff_size) \text{fractal\factor} = \frac{1}{\sqrt{\max(1,\ 2.5\,x{\text{diffuse}}\,\text{inv\_eff\_size})}} fractal_factor=max(1, 2.5xdiffuseinv_eff_size) 1

描述散射后水平迁移对侧向交换的削弱。最大模式直接用 u,vu,v u,v 矩阵做重叠投影(SPARTACUS 原始方法)。

6.5 SPARTACUS 长波

radiation_spartacus_lw.F90 与短波结构相同,但无直接束,矩阵维度为 2nreg×2nreg 2n_{\text{reg}}\times 2n_{\text{reg}} 2nreg×2nreg,并额外处理侧边发射率 (side_emiss_thin = 1.4107)与层内普朗克源项。长波侧向传输使云侧面对周围区域有额外发射,这是长波 3D 效应的主要来源(Schaefer et al. 2016)。

6.6 Adding/ICA 与长波导数

  • Adding/ICA (radiation_adding_ica_sw/lw.F90):以 adding 方法实现 ICA,作为 McICA/Tripleclouds 的对照与噪声评估。
  • 长波导数 (radiation_lw_derivatives.F90):计算长波通量对地表温度、各层温度的解析导数,供资料同化或云-辐射反馈诊断使用。

7. 矩阵指数与数值方法

radiation_matrix.F90 为 SPARTACUS 提供向量化线性代数。所有例程的数组最内维都是"批"维,可一次处理 iend 个矩阵。

7.1 Higham scaling-and-squaring + 7 阶 Padé

expm 求 nn n 个 m×mm\times m m×m 矩阵的指数。算法:

  1. 求 1-范数 ∥A∥1 \|A\|_1 ∥A∥1,由 ∥A∥/θ3 \|A\|/\theta_3 ∥A∥/θ3 的二进制指数确定缩放次数,使 ∥A/2s∥≤θ3\|A/2^s\| \le \theta_3 ∥A/2s∥≤θ3;阈值

θ3=3.925724783138660 \theta_3 = 3.925724783138660 θ3=3.925724783138660

  1. 对缩放后的 AA A 计算 7 阶 Padé 逼近。令 A2=A2, A4=A22, A6=A2A4 A_2=A^2,\ A_4=A_2^2,\ A_6=A_2A_4 A2=A2, A4=A22, A6=A2A4,系数

c=17297280, 8648640, 1995840, 277200, 25200, 1512, 56, 1c = 17297280,\\ 8648640,\\ 1995840,\\ 277200,\\ 25200,\\ 1512,\\ 56,\\ 1 c=17297280, 8648640, 1995840, 277200, 25200, 1512, 56, 1
U=A(c8A6+c6A4+c4A2+c2I),V=c7A6+c5A4+c3A2+c1I U = A\big(c_8 A_6 + c_6 A_4 + c_4 A_2 + c_2 I\big),\qquad V = c_7 A_6 + c_5 A_4 + c_3 A_2 + c_1 I U=A(c8A6+c6A4+c4A2+c2I),V=c7A6+c5A4+c3A2+c1I
eA/2s≈(V−U)−1(V+U)e^{A/2^s} \approx (V - U)^{-1}(V + U) eA/2s≈(V−U)−1(V+U)

  1. 反复平方 ss s 次(repeated_square)得到 eAe^A eA。

源码对 2×2、3×3 用专门例程(Cramer 法则 / 无主元 LU),其余用通用 LU;短波稀疏模式跳过左下三角乘法。

7.2 Putzer / 对角化解析解

对 SPARTACUS 中"保守交换"结构的特殊矩阵,fast_expm_exchange 给出闭式解,避免通用 expm:

2×2 (结构 ( −a b a −b ) \begin{pmatrix}-a & b\\ a & -b\end{pmatrix} (−aab−b)),用 Putzer 算法:
factor= 1−e−(a+b)max⁡(10−12, a+b) \text{factor} = \frac{1 - e^{-(a+b)}}{\max(10^{-12},\,a+b)} factor=max(10−12,a+b)1−e−(a+b)
R= ( 1−factor a factor b factor a 1−factor b ) R = \begin{pmatrix}1-\text{factor}\,a & \text{factor}\,b\\ \text{factor}\,a & 1-\text{factor}\,b\end{pmatrix} R=(1−factorafactorafactorb1−factorb)

3×3 (结构 ( −a b 0 a −b−c d 0 c −d ) \begin{pmatrix}-a & b & 0\\ a & -b-c & d\\ 0 & c & -d\end{pmatrix} −aa0b−b−cc0d−d ),用对角化 eM=V diag(eλ) V−1e^{M}=V\,\text{diag}(e^{\lambda})\,V^{-1} eM=Vdiag(eλ)V−1,特征值为
λ1,2 =− 12 (a+b+c+d)± 12 (a+b+c+d)2−(ac+ad+bd) \lambda_{1,2} = -\Big\\tfrac{1}{2}(a+b+c+d)\\Big \pm \sqrt{\Big\\tfrac{1}{2}(a+b+c+d)\\Big^2 - (ac+ad+bd)} λ1,2=−21(a+b+c+d)±21(a+b+c+d)2−(ac+ad+bd)

7.3 单精度安全性设计

这些例程"为速度牺牲精度",显式声明只保证单精度。工程上有几处防护:

  • k 下界 10−1210^{-12} 10−12、k*mu0≈1 时的扰动,防止短波奇异;
  • 反射/透射/源项多处 min(1,max(0,...)) 夹取,避免低云量 + 高云光学深度下的越界;
  • fast_expm_exchange_* 中对 a=b=0a=b=0 a=b=0 的情形返回单位矩阵;
  • exp_fast 的 Padé 形式在负参数下恒正,避免指数近似变号。

8. 参考文献对照

主题 源码依据 文献
二流系数(长波) calc_two_stream_gammas_lw Fu et al. (1997) Eq. 2.9/2.10
二流系数(短波) calc_two_stream_gammas_sw Zdunkowski et al. (1980) PIFM
反射/透射解析解 calc_reflectance_transmittance_* Meador & Weaver (1980) Eq. 14--26
长波源项 calc_reflectance_transmittance_lw Stackhouse & Stephens (1991) Eq. 5/12
Max-Ran 重叠 cum_cloud_cover_max_ran Geleyn & Hollingsworth (1979)
alpha 重叠 calc_alpha_overlap_matrix Hogan & Illingworth (2000)
beta 重叠 beta2alpha, calc_beta_overlap_matrix Shonk et al. (2010)
Tripleclouds 16 百分位 calc_region_properties Shonk & Hogan (2008)
McICA cloud_generator Pincus et al. (2003)
随机云发生器 cloud_generator Räisänen et al. (2002)
MINSTD RNG radiation_random_numbers Park & Miller (1988)
SPARTACUS 短波 solver_spartacus_sw Hogan et al. (2016); Hogan & Shonk (2013)
SPARTACUS 长波 solver_spartacus_lw Schaefer et al. (2016)
矩阵指数 expm Higham (2005) scaling-and-squaring
Putzer 交换解 fast_expm_exchange_* Hogan et al. (GMD 2018) 附录
液态云光学 calc_liq_optics_socrates SOCRATES / Edwards & Slingo
冰云光学 calc_ice_optics_baran2017 等 Fu (1996/1998); Baran 系列; Yi et al.

9. 一句话总结

ecRad 的算法骨架是:相关 k 分布 把光谱压成 g 点,参数化 把物理量变成每 g 点/波段的光学性质,区域 + 重叠矩阵 把次网格云结构离散化,二流方程 + Meador & Weaver 解析解 给出单层光学响应,adding 方法 自下而上组合出通量;五种求解器的差别只在"如何离散云结构"与"是否加入侧向传输",而 SPARTACUS 的 3D 能力最终落在矩阵指数这一数值核心上。

相关推荐
挖掘狂人1 小时前
哈希算法:一根看不见的 "指纹",如何撑起整个互联网
算法·程序员·掘金技术征文
TTATTC1 小时前
Android 浏览器死活不弹证书框的那天,我用 .NET MAUI 给 WebView 写了一个 mTLS 拦截器
docker·开源
魔众1 小时前
1GB 显存跑声音克隆,LuxTTS 上了 AIGCPanel
开源
TTATTC1 小时前
百万行 Trace 交给 AI,方向和验证留给人,一套还原自定义 VMP 保护的分工方法
docker·开源
TTATTC1 小时前
从 proxy_pass 末尾斜杠到 WebAssembly 预压缩:深挖 Nginx 生产环境四大高频踩坑点
docker·开源
TTATTC1 小时前
消灭 AI 编程助手的幻觉代码:拆解 Google 官方文档 MCP 与三大云厂商知识检索架构
docker·开源
不会就选b2 小时前
算法日常・每日刷题--<动态规划>22
算法·动态规划
释厄6232 小时前
字画同体论——字即画·几何即字·漫画与小说=文本层
人工智能·算法
沫璃染墨2 小时前
从零入门数据结构与算法(一):复杂度分析——从算法效率到时间与空间复杂度
c语言·开发语言·数据结构·笔记·算法·飞书