Python——基于ERA5数据的饱和水汽压差(VPD)批量计算(Clausius-Clapeyron 克劳修斯-克拉伯龙关系)

一、前言

之前我发布过基于CRU数据和Goff-Gratch公式计算VPD的博客,见下方:

基于CRU数据计算VPD的博客

但是,CRU数据的分辨率还是较为粗糙(0.5°×0.5°),而ERA5 land数据集分辨率能很好地满足我的需求(0.1°×0.1°)。但是,ERA5 land数据集并不提供水汽压和湿度变量供于下载,这导致利用Goff-Gratch公式很难进行计算。

结合近期文献阅读和整理,这里提供另一种既具权威性也易操作的方法供大家参考。

(注:这里所指的权威性主要指使用该方法的期刊等级和被引量,具体见文末)


二、定义

饱和水汽压差(Vapor Pressure Deficit,简称VPD) 是指在一定温度下,饱和水汽压与空气中的实际水汽压之间的差值。VPD对于植被生理状态具有重要影响。

简言之,VPD = 饱和水汽压 - 实际水汽压


三、计算方法

(一)公式

Clausius-Clapeyron是一个数学公式,用来描述气体或蒸气的压力和温度之间的关系,其表现形式如下,具体不作赘述。此方程不是我们最终计算的方程,而是水汽压和温度间关系的理论框架

Python——基于ERA5数据的饱和水汽压差(VPD)批量计算(Clausius-Clapeyron 克劳修斯-克拉伯龙关系)_第1张图片

基于Clausius-Clapeyron方程的理论框架以及大量的实验数据,最终学术界得到一种经验性的用以计算特定温度下水汽压的公式,即August-Roche-Magnus马格努斯方程

Python——基于ERA5数据的饱和水汽压差(VPD)批量计算(Clausius-Clapeyron 克劳修斯-克拉伯龙关系)_第2张图片通常来说,只使用T>0℃情景的方程(图上红框),除非你需要研究冰面上的气压情况。

但正如上面说的,Magnus方程是基于经验性的,其参数网上有很多不同版本(最为困扰的一点)

读者当然可以使用上图中的方程计算,我这里使用另一个参数版本,原因是其被《SCIENCE ADVANCES》引用过,我就姑且信其所然(出了问题找他吧哈哈)。公式如下:

Python——基于ERA5数据的饱和水汽压差(VPD)批量计算(Clausius-Clapeyron 克劳修斯-克拉伯龙关系)_第3张图片

局限性:我目前暂无法评估不同参数得到结果的可靠性差异,希望有了解的同僚给予指正。

(二)数据

ERA5 land 2m temperature 地表温度数据     

ERA5 land 2m dewpoint temperature 地表露点温度数据

下载地址:ERA5 land数据集下载地址

注:原数据是开尔文单位,需要转换为摄氏单位。


三、Python脚本

import os
import numpy as np
from osgeo import gdal

# Magnus公式的计算函数
def Magnus(t_celsius):
    return 0.611 * np.exp((17.5 * t_celsius) / (t_celsius + 240.978))
def process_tif(input_path, output_path):
    # 打开输入TIFF文件
    ds = gdal.Open(input_path)
    band = ds.GetRasterBand(1)
    temp_data = band.ReadAsArray()

    # 将温度从开尔文转换为摄氏度
    temp_celsius = temp_data - 273.15

    # 计算饱和水汽压
    es = Magnus(temp_celsius)

    # 创建输出TIFF文件
    driver = gdal.GetDriverByName('GTiff')
    out_ds = driver.Create(output_path, ds.RasterXSize, ds.RasterYSize, 1, gdal.GDT_Float32)
    out_ds.SetGeoTransform(ds.GetGeoTransform())
    out_ds.SetProjection(ds.GetProjection())

    # 写入数据到输出文件
    out_band = out_ds.GetRasterBand(1)
    out_band.WriteArray(es)
    out_band.SetNoDataValue(-9999)
    out_band.FlushCache()

    # 关闭数据集
    del ds
    del out_ds

def main(input_folder, output_folder):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    for file_name in os.listdir(input_folder):
        if file_name.endswith('.tif'):
            input_path = os.path.join(input_folder, file_name)
            output_path = os.path.join(output_folder, f"es_{file_name}")
            process_tif(input_path, output_path)
            print(f"Processed {file_name}")

if __name__ == "__main__":
    input_folder = r'输入文件夹路径'  
    output_folder = r'输出文件夹路径' 
    main(input_folder, output_folder)

结果:

可以看到二者结果相差不大,但是分辨率提升明显,预期目的基本达到。

重要事项:

① 提供的代码是用于计算实际水汽压(或饱和水汽压),而非VPD,VPD还需二者做差

露点温度对应实际水汽压,地表温度对应饱和水汽压!!!


参考:

[1] Z.Q. Zhong, B. He, Y.P. Wang, et al, Disentangling the effects of vapor pressure deficit on northern terrestrial vegetation productivity.Sci. Adv.9,eadf3166(2023).

[2] A. Barkhordarian, K.W.Bowman, N.Cressie,et al, Emergent constraintson tropical atmospheric aridity—Carbon feedbacks andthefutureofcarbon sequestration. Environ. Res.Lett. 16,114008 (2021).

[3] D. Zhao, Z. Zhang, Y. Zhang, Soil moisture dominates the forest dominates the forest productivity decline during the 2022 China compound drought-heatwave event. Geophysical Research Letters, e2023GL104539(2023).

你可能感兴趣的:(算法,python,arcgis,数据分析,开发语言)