ecRad 1.5.0 算法原理详解
本文聚焦 ecRad 的"算法内部":光谱如何离散、云与气溶胶的光学性质如何参数化、二流方程如何求解、云重叠与云内不均匀性如何建模、五种求解器各自的数学结构、以及支撑 SPARTACUS 的矩阵指数与线性代数实现。所有公式、常数、变量名与分支逻辑均来自 radiation/、ifsrrtm/ 下的实际源码。
配套的接口与文件约定请见 ecRad-输入输出详解.md,本文不再重复 namelist 与 NetCDF 变量定义。
0. 阅读地图
ecRad 的一次完整辐射计算可以拆成四层数学问题:
- 光谱离散层:把连续谱段压缩为若干"g 点"(相关 k 分布),使每条谱线的透过率可由少量采样点加权求和近似(第 1、2 节)。
- 光学性质层 :由水凝物含量、有效粒径、气溶胶混合比、湿度等物理量,参数化出每个 g 点/波段的消光光学深度
od、单散射反照率ssa、不对称因子g(第 3 节)。 - 云结构层:把次网格的云量、重叠、云内不均匀性离散为"区域"(region)与重叠矩阵(第 5 节)。
- 辐射传输求解层:在区域/子列上求解二流方程,逐层做 adding 组合得到通量(第 4、6 节)。
第 7 节单独说明被 SPARTACUS 反复调用的矩阵指数与矩阵求解实现。
1. 三段式解耦与主调用时序
ecRad 的核心设计是"气体光学 / 云-气溶胶光学 / 求解器"三段完全分离,统一由 radiation_interface.F90 中的 radiation 例程按固定顺序调用。对每一块列(block)依次执行:
gas_optics(radiation_gas派发到radiation_ifs_rrtm或radiation_ecckd):算出每个 g 点的气体od/ssa/g。- 气溶胶光学:由混合比与湿度得到气溶胶的
od/scat_od/scat_od_g,并按 g 点与气体合并。 - 云光学:由液/冰水路径与有效粒径得到每个波段 的云
od/scat_od/g(云光学天然定义在波段上,而非 g 点)。 - 求解器:
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 分布的基本原理
在均匀路径上,谱段 Δν 内的平均透过率为
Tˉ(u)=Δν1∫Δνe−kνudν=∫0∞e−kup(k)dk
其中 p(k) 是吸收系数在谱段内的概率密度。把 p(k) 离散为 Ng 个点后,积分变为加权求和:
Tˉ(u)≈j=1∑Ngwje−kju
这正是"k 分布": kj 是吸收系数分位点, wj 是权重(g 点的"宽度")。在非均匀路径上,各层的 k 排序近似保持一致(相关 假设),于是 k 可作为固定的吸收系数随压力、温度重排,从而用同样的 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)。设 W 为液水路径(g m⁻²), re 为有效半径(μm):
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=W1+c4re+c5re2+c6re3c1+c2re+c3re2
scat_od=od(1−1+c10re+c11re2c7+c8re+c9re2),g=1+c15re+c16re2c12+c13re+c14re2
有效半径先被夹到 1.2μm,50μm。
3.2 冰云
冰云模型均为"有效直径 De 的多项式 + 有理式",差别在于对温度/冰水含量的依赖与系数来源:
- Fu-IFS (
radiation_ice_optics_fu.F90):以 Fu 有效直径 De=re⋅(106/0.64952) μm 为自变量,od与 1/De 成线性,ssa、g为 De 的三次多项式。 re 上限 100 μm,g被夹到略小于 1(否则 delta-Eddington 缩放会使散射光学深度归零而除零)。 - Baran / Baran2016 :
od/scat_od/g为 De 的多项式。 - Baran2017 (
radiation_ice_optics_baran2017.F90):引入温度依赖,先修正冰水混合比 qi:
qimod=qiexpc1(T−c2)
再以 qimod 的不同幂次驱动三个有理式:
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)**两类:
- 疏水类型:光学性质与湿度无关,直接由质量消光系数 κ、
ssa、g查表; - 亲水类型:质量消光系数、
ssa、g都依赖相对湿度,需按 RH 索引查表。
湿度增长的核心是先用液态饱和比湿算相对湿度:
RH=qH2Osat,liqqH2O,irh=calc_rh_index(RH)
再对每个波段/类型取该 RH 档位的系数。某类型对光学深度的贡献为
Δod=factor gΔp⋅qaer⋅κ(band,irh,type)
其中 Δp/g 把质量混合比换算为柱质量。散射光学深度与不对称因子按同样的 Δod⋅ssa、 Δod⋅ssa⋅g 累加,最后在 g 点层面与气体散射合并。
若 use_general_aerosol_optics,则先从高光谱分辨率文件读取,再用 spectral_def%calc_mapping 做权重矩阵 mapping 与质量消光系数的矩阵乘法,平均到当前气体模型的波段或 g 点。合并时按"散射光学深度加权"求等效 ssa 与 g:
ssamix=∑iodi∑iscat_odi,gmix=∑iscat_odi∑iscat_odigi
3.4 Delta-Eddington 缩放
短波中,前向散射峰被近似为"未发生散射",由 radiation_delta_eddington.h 提供:
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 二流微分方程
以光学深度 τ 为坐标(自上而下增大),向上流 F+、向下流 F− 满足
dτdF+=γ1F+−γ2F−−γ3S,dτdF−=γ2F+−γ1F−+γ4S
其中 S 为直接太阳束(短波)或普朗克源(长波)。 γ 系数由单散射反照率 ssa、不对称因子 g、太阳天顶角余弦 mu0 决定。
4.2 长波 gamma 系数(Fu et al. 1997)
长波取漫射因子 LwDiffusivity = 1.66(Elsasser 因子,等效天顶角 arccos(1/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、 γ4=1−γ3:
γ1=2−ssa(45+43g),γ2=ssa(43−43g),γ3=21−43μ0g
注意 SwDiffusivity = 2.0 在 γ 计算中并不直接出现(已内含于上式系数),只在 SPARTACUS 求解器中另作漫射角使用。
4.4 Meador & Weaver 解析解
对单层,令
k=max(γ1−γ2)(γ1+γ2),10−12
(Meador & Weaver 1980 Eq. 18,下界 10−12 防止短波奇异)。定义 exp2=e−2kτ 与
Rfactor=k+γ1+(k−γ1)exp21
则漫射反射率与透过率为
ρ=γ2(1−exp2)Rfactor(Eq. 25),T=2ke−kτRfactor(Eq. 26)
短波直接项 :令 γ4=1−γ3,
α1=γ1γ4+γ2γ3,α2=γ1γ3+γ2γ4
直接反射 ref_dir(Eq. 14)与直接束散射后透射 trans_dir_diff(Eq. 15)由 α1,α2,k,μ0 组合而成;纯直接透射为 Tdd=e−τ/μ0。源码对 ref_dir+trans_dir_diff≤1 做了强制夹取,并在 kμ0≈1 时对 μ0 施加极小扰动以避免除零。
长波源项:假设普朗克函数在层内随光学深度线性变化(Stackhouse & Stephens 1991 Eq. 5 & 12),
c=τ(γ1+γ2)Bbot−Btop
再由 ρ、 T 组合出层顶向上发射 source_up 与层底向下发射 source_dn。等温层版本 calc_reflectance_transmittance_isothermal_lw 简化为 source = B(1-\rho-T)。
4.5 低光学深度极限
当 τ≤10−3(长波)时,指数与分母同时趋于病态,改用线性极限:
ρ=γ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≤0,
ex≈1−8x+128x2−3072x318
即先算 exp(x/8) 的 Padé 逼近,再连续平方三次。该近似在负参数下不会变号,且可向量化。
5. 云重叠与云内不均匀性
5.1 三种重叠方案与 alpha/beta 参数
radiation_cloud_cover.F90 定义三种方案(枚举 IOverlapMaximumRandom / IOverlapExponentialRandom / IOverlapExponential,名称 Max-Ran / Exp-Ran / Exp-Exp)。相邻两层云量 f1,f2 的组合云量为:
- Max-Ran (最大-随机):相邻层取最大,非相邻层随机, pair=max(f1,f2)。
- Exp-Ran (指数-随机):相邻层用重叠参数 α 插值于"最大"与"随机"之间:
pair=αmax(f1,f2)+(1−α)(f1+f2−f1f2)
- Exp-Exp(指数-指数):相邻与非相邻层都用指数重叠,无解析总云量公式。
α 为 Hogan & Illingworth(2000)参数(1 = 最大重叠,0 = 随机)。若输入是 Shonk et al.(2010)的 β 参数(use_beta_overlap),先转换:
α=β+∣f1−f2∣+1/β−1(1−β)∣f1−f2∣(β<1)
5.2 累积云量的递归与 Exp-Exp 的对象合并
对 Max-Ran 与 Exp-Ran,从顶层向下递推累积乘积:
cum_product←cum_product⋅1−fj1−pair(j),cum_cloud_cover(j+1)=1−cum_product
当 fj≥ MaxCloudFrac 时直接置 cum_product=0。
Exp-Exp 没有解析式,源码用"凹云对象 "近似:把云量先单调增、再单调减的连续层合并为一个对象,用各对象最大云量层的重叠参数之积作为对象间 α;然后反复挑出相关性最强的一对对象合并,直至只剩一个。这样既得到与指数重叠一致的累积云量,又能让 McICA 把全部有云 g 点分配到真正含云的子列,降低噪声。
5.3 重叠矩阵(u_matrix / v_matrix)
radiation_overlap.F90 把逐层的重叠关系组织为方向性重叠矩阵 。对每个层界面(含大气顶与地表,共 nlev+1 个),先算非方向性重叠矩阵 Oul(上区域 u、下区域 l 的联合面积),再归一化为:
uul=fllowerOul,vlu=fuupperOul
含义: u 矩阵把界面下方的向上流映射到界面上方的向上流( y=Ux), v 矩阵同理作用于向下流。含云区域的重叠参数 α 由边界 α 通过去相关缩放 op1/s(decorrelation_scaling,默认 1)得到云内不均匀性重叠参数。诊断云量可由 1−∏jv11(j) 得到。
对两个云区域(Tripleclouds), O 的构建分两层:先用 α 处理"晴空/含云"的划分,再在"两层都含云"的部分内用 αinhom 处理"薄/厚"云区的划分(calc_alpha_overlap_matrix)。若使用 β 参数,则改用 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)=σ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σ))
厚云区占比由总面积守恒反解,且缩放值保证平均光学深度守恒:
od_scaling(3)=f3fc−f2od_scaling(2)
这里 σ 即 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
状态更新与归一化:
istatei←mod(A⋅istatei, M),ri=Mistatei
向量版一次维护 512 条流(NMaxStreams),初始化时用 A0 预热,之后每步用 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
取整得索引与权重,四点加权求和。查找表由 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,区域 j 与 j+1 之间的边缘长度与传输率(乘以层厚 dz):
edge(1)=π4fclear(1−fclear)min(inv_eff_size, min_eff_size1)
ratedirect(j→j+1)=dz⋅fjedge(j)tanθs,ratediffuse(j→j+1)=dz⋅fjedge(j)tanθd
漫射角取 tanθd=π/2(tan_diffuse_angle_3d);太阳角 tanθs=1/μ02−1+overhead_sun_factor ,并把 μ0 下限设为 min_mu0_3d = 0.004625(约一个太阳半径)。传输率上限 max_3d_transfer_rate 防止过度耗散。
(2)构建 3nreg×3nreg 层传输矩阵 。矩阵分块对应 [向上流 | 向下流 | 直接束]:
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 求出 eM(见第 7 节)。设 eM 分块为 \[P,Q,R,S,T,U,0,0,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 与分形因子
fractal_factor=max(1, 2.5xdiffuseinv_eff_size) 1
描述散射后水平迁移对侧向交换的削弱。最大模式直接用 u,v 矩阵做重叠投影(SPARTACUS 原始方法)。
6.5 SPARTACUS 长波
radiation_spartacus_lw.F90 与短波结构相同,但无直接束,矩阵维度为 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 求 n 个 m×m 矩阵的指数。算法:
- 求 1-范数 ∥A∥1,由 ∥A∥/θ3 的二进制指数确定缩放次数,使 ∥A/2s∥≤θ3;阈值
θ3=3.925724783138660
- 对缩放后的 A 计算 7 阶 Padé 逼近。令 A2=A2, A4=A22, A6=A2A4,系数
c=17297280, 8648640, 1995840, 277200, 25200, 1512, 56, 1
U=A(c8A6+c6A4+c4A2+c2I),V=c7A6+c5A4+c3A2+c1I
eA/2s≈(V−U)−1(V+U)
- 反复平方 s 次(
repeated_square)得到 eA。
源码对 2×2、3×3 用专门例程(Cramer 法则 / 无主元 LU),其余用通用 LU;短波稀疏模式跳过左下三角乘法。
7.2 Putzer / 对角化解析解
对 SPARTACUS 中"保守交换"结构的特殊矩阵,fast_expm_exchange 给出闭式解,避免通用 expm:
2×2 (结构 (−aab−b)),用 Putzer 算法:
factor=max(10−12,a+b)1−e−(a+b)
R=(1−factorafactorafactorb1−factorb)
3×3 (结构 −aa0b−b−cc0d−d ),用对角化 eM=Vdiag(eλ)V−1,特征值为
λ1,2=−21(a+b+c+d)±21(a+b+c+d)2−(ac+ad+bd)
7.3 单精度安全性设计
这些例程"为速度牺牲精度",显式声明只保证单精度。工程上有几处防护:
k下界 10−12、k*mu0≈1时的扰动,防止短波奇异;- 反射/透射/源项多处
min(1,max(0,...))夹取,避免低云量 + 高云光学深度下的越界; fast_expm_exchange_*中对 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 能力最终落在矩阵指数这一数值核心上。