第7章 气候数据处理与Shop模块
climate.py(约384行)和 shop/ 模块共同构成了OGGM的气候数据供应链。不同于地表高程数据(以单个GeoTIFF形式直接可用),气候数据来自多个来源——CRU TS、ERA5、GSWP3-W5E5、CMIP5/6 GCMs——格式各异,需要统一处理为标准化版本才能提供给物质平衡模型。本章深入解析这一数据标准化工作流的每个环节。
如果你的目标是把站点气象、区域再分析或水文模型气候输入接入OGGM,最低要求是准备月尺度温度、月总降水、参考高程和时间坐标。先让数据写成OGGM标准的climate_historical.nc,再进入第8章物质平衡模型;不要直接跳到动力学模拟。
青藏高原、天山、祁连山等区域的降水低估和高程订正误差常常比动力学参数误差更先控制结果。使用默认气候数据时,应检查prcp_fac、temp_bias、参考高程和物质平衡校准结果,并尽量用本地观测或区域产品进行独立验证。
7.1 气候数据架构概览
OGGM将气候数据生产划分为两个层级:climate.py 作为顶层调度器,接受源格式的NetCDF文件并写出标准化的climate_historical.nc;shop/ 下的各模块负责从原始数据源下载和初步预处理——即"数据获取层"和"格式标准化层"的分离。
完整数据流如下:
Shop模块(获取与初步处理)
│
├── shop/cru.py → CRU TS 4.04 月异常 + CRU CL2 气候场
├── shop/w5e5.py → GSWP3-W5E5 重分析
├── shop/ecmwf.py → ERA5 / ERA5-Land / CERA-20C
├── shop/gcm_climate.py → CMIP5/6 / CESM-LME / ISIMIP
│
▼
climate.py(标准化处理)
│
▼
climate_historical.nc → MassBalanceModel (第8章)
进阶
不同气候数据集的时间分辨率和空间参考各不相同:CRU是月均0.5度网格,ERA5是小时级0.25度网格,CMIP6 GCM可能达到1.5度。标准化过程将所有数据统一为OGGM要求的月均NetCDF格式(变量:temp, prcp, ref_hgt, time),并与冰川的高度带对齐。这种标准化使物质平衡模型可以被"可插拔"的气候数据源驱动。
7.2 标准化NetCDF格式
write_monthly_climate_file 定义了所有气候文件的标准Schema:
| 变量 | 维度 | 单位 | 描述 |
|---|---|---|---|
temp | (time,) | deg C | 月均温度 |
prcp | (time,) | kg m-2 month-1 (即 mm month-1) | 月总降水量 |
ref_hgt | 标量 | m | 参考高程(温度对应的海拔) |
time | (time,) | days since 1800-01-01 | CF惯用的时间编码 |
gradient | (time,) | K m-1 | 温度梯度(可选,否则用-0.0065 K/m) |
注意降水不是速率(mm/s),而是月累积量(mm/month)。这使得在物质平衡中可以直接乘以物质平衡天数估算月度融化与积累。温度以摄氏度(而非开尔文)为单位,避免了在每次物质平衡计算中都要减去273.15。
7.3 顶层调度函数(process_climate_data)
process_climate_data(约第138-222行)根据 cfg.PARAMS['baseline_climate'] 的设置路由不同的处理策略:
def process_climate_data(gdir):
src = cfg.PARAMS['baseline_climate']
if src == 'CRU':
# 从CRU CL2 + CRU TS构建
process_cru_data(gdir)
elif src == 'ERA5':
# 从ECMWF ERA5构建
process_ecmwf_data(gdir)
elif src == 'W5E5':
# 从GSWP3-W5E5构建
process_w5e5_data(gdir)
elif src == 'CUSTOM':
# 用户提供的NetCDF
process_custom_climate_data(gdir)
elif src == 'HISTALP':
# 欧洲山地HISTALP数据集
process_histalp_data(gdir)
process_custom_climate_data(约第36-135行)是通用入口:读取用户提供的NetCDF文件,验证变量、单位和维度,然后执行必要的最近邻空间插值和垂直外推。
7.4 历史Delta方法
historical_delta_method(约第225-383行)是处理"混合气候数据集"的核心技术——当你有两个不同时期、空间分辨率或精度的气候源时如何将它们融合。该方法广泛应用于CRU(将低分辨率CRU TS异常叠加到高分辨率CRU CL2气候场上)。
7.4.1 温度:加法异常
对温度使用可加性异常(anomaly):
T_recon(t) = T_clim + (T_obs(t) - T_obs_clim)
即:目标温度的长期平均 + 观测异常。这里隐含假设温度异常在不同空间分辨率下是保守的——0.5度网格上的年际温度距平可以合理地放在更细网格的30年平均场上。这个假设在大多数山地气候中成立。
7.4.2 降水:乘法缩放
对降水首选乘法(比率)缩放:
P_recon(t) = P_clim * (P_obs(t) / P_obs_clim)
比率法隐含假设降水的相对变化(而非绝对变化)在不同分辨率下是保守的。当P_obs_clim接近零时(如干旱月份),/ 会导致数值爆炸。此时会降级为加法异常法(fallback='additive')。
7.4.3 混合数据集
当两个数据集有重叠时间窗口时(如CERA-20C覆盖1901-2010,ERA5覆盖1950-至今),会先计算重叠期偏差,再合并时间序列。标准差缩放通过滚动窗口确保合并后的方差连续性。
7.5 Shop模块:CRU TS
shop/cru.py 实现了经典的CRU TS方案。CRU CL2提供1961-1990年的30年平均气候场(10'分辨率 ~18km格网),CRU TS 4.04提供1901年以来的月异常(0.5度分辨率)。
7.5.1 3x3窗口选择
对于每条冰川,在不规则CRU网格中选择距离冰川质心最近的3x3=9个格点单元。每个单元包含该月异常的时间序列。
7.5.2 异常插值
9个CRU TS格点上的异常通过三线性插值(经度、纬度、月份维度)映射到CRU CL2细网格的每个格点——这是一种coarse-to-fine的方案。最后取冰川质心所在CRU CL2格点的12个月温度场,叠加CRU TS异常,得到完整的1901至今的月气候序列。
7.6 Shop模块:W5E5 / GSWP3-W5E5
shop/w5e5.py 处理GSWP3-W5E5数据集——这是目前最受欢迎的气候驱动数据之一,覆盖1901-2019年(之后延续至ERA5),使用0.5度分辨率。数据存储为"pre-flattened"格式(已将二维格网展平为一维数组存储于NetCDF中),通过最近邻选择找到冰川对应的格点。
单位转换是W5E5处理的关键步骤:
# W5E5原始数据单位
temp_raw = ... # 开尔文 [K]
prcp_raw = ... # kg m^{-2} s^{-1} (降水速率)
# 转换为OGGM标准单位
temp_C = temp_raw - 273.15 # K → °C
prcp_mm = prcp_raw * 86400 * days_in_month # kg m-2 s-1 → mm month-1
在pre-flattened格式中,格点的索引已预先计算、存储,直接读取一行即可获取该格点的全部时间序列,将IO开销降至最低。
7.7 Shop模块:ECMWF
shop/ecmwf.py 是最复杂的shop模块之一,需处理四种ECMWF数据产品:
| 数据集 | 分辨率 | 时间覆盖 | 说明 |
|---|---|---|---|
| ERA5 | 0.25° | 1950-至今 | 最常用的现代再分析 |
| ERA5-Land | 0.1° | 1950-至今 | 陆地表面增强版,地形更精细 |
| CERA-20C | 1.125° | 1901-2010 | 耦合气候再分析,10个集合成员 |
| ERA5dr | 0.25° | 1950-至今 | 降尺度版本的ERA5 for 山地研究 |
ECMWF数据以两种格式存储——"flattened"(时空展平)和标准gridded(四维:时间、垂直层、纬度、经度)。模块通过auto_detect机制识别格式,自动选择合适的读取路径。CERA-20C的10个集合成员通过取算术平均(ensemble mean)来处理。
7.8 Shop模块:GCM气候
shop/gcm_climate.py 处理全球气候模式(GCM)的输出,包括CMIP5/6、CESM-LME、LMR、ModE-RA等。这些数据的挑战在于:每个GCM有自己的气候态偏差(bias),直接使用原始输出会导致物质平衡偏差。
7.8.1 标准异常方法
OGGM采用"异常方法"消除GCM偏差:
T_recon(t) = T_ref_clim + (T_gcm(t) - T_gcm_clim)
P_recon(t) = P_ref_clim * (P_gcm(t) / P_gcm_clim)
其中 T_ref_clim 和 P_ref_clim 来自观测/再分析参考场(如W5E5),T_gcm_clim 和 P_gcm_clim 是GCM在参考期(通常1980-2010)的自身气候态。这保留了GCM的年际变率和趋势信号,而使用参考数据的绝对值避免偏差影响物质平衡的绝对水平。
7.8.2 ISIMIP3b路径
对于CMIP6的ISIMIP3b数据,GCM输出已经过外部偏差校正(bias correction)。OGGM通过apply_bias_correction=False参数跳过自身的异常校正。ISIMIP3b是OGG-M/IPCC评估中的首选CMIP6数据源。
7.9 气候数据源比较
| 数据源 | 时期 | 分辨率 | 变量 | Shop路径 |
|---|---|---|---|---|
| CRU TS 4.04 + CL2 | 1901-2019 | 10' / 0.5° | T, P | shop/cru.py |
| GSWP3-W5E5 | 1901-2019 | 0.5° | T, P, SW↓, LW↓, etc. | shop/w5e5.py |
| ERA5 | 1950-至今 | 0.25° | T, P, SW↓, LW↓ | shop/ecmwf.py |
| ERA5-Land | 1950-至今 | 0.1° | T, P | shop/ecmwf.py |
| CERA-20C | 1901-2010 | 1.125° | T, P | shop/ecmwf.py |
| CMIP5 GCMs | 1861-2100 | ~1-2° | T, P | shop/gcm_climate.py |
| CMIP6 ISIMIP3b | 1850-2100 | 0.5° | T, P | shop/gcm_climate.py |
| HISTALP | 1800-2014 | 站点/区域 | T, P | shop/histalp.py |
7.10 关键参数速查
| 参数名 | 默认值 | 作用 |
|---|---|---|
baseline_climate | 'W5E5' | 历史基线气候数据选择 |
hydro_year_month | 10(北半球)/ 5(南半球) | 水文年开始月(与冰川年对齐) |
temp_use_gradient | True | 使用气候文件的温度梯度进行垂直外推 |
temp_default_gradient | -0.0065 | 默认温度递减率 (K/m) |
climate_qc_max_months | 3 | 插值前允许的最大缺测月数 |
clip_negative_prcp | True | 将负降水值(数值误差)设为0 |
temp_bias | 0.0(用户设定) | 系统温度偏移(校准参数,单元K) |
7.11 总结
climate.py 和 shop/ 模块是OGGM的"数据桥梁"——将来源各异的气候数据源转化为统一的、可直接用于物质平衡模型的格式。历史Delta方法体现了气候数据融合中的经典策略:长期气候场(来自高分辨率数据)+年际异常(来自长序列数据)的组合。理解这层转换逻辑,对于正确解读模型的物质平衡模拟至关重要——尤其是当切换气候数据源时,温度偏差和降水比率的差异会系统性地改变模拟结果。
下一章将直接使用这里生成的climate_historical.nc来构建物质平衡模型——从简单的线性模型到温度指数模型(temperature-index model)和完全的月分量模型。