基于Penman-Monteith公式的潜在蒸散发计算

1948年,彭曼将能量平衡与传质方法结合起来,根据日照、温度、湿度和风速的标准气候记录,导出了一个计算开放水面蒸发量的方程式。这个所谓的组合后,许多研究人员进一步发展了该方法,并通过引入阻力因子将其推广到了作物的面应用。对各种计算方法性能的分析表明,需要制定一个标准的计算潜在蒸散发 ETo 的方法。推荐使用粮农组织 Penman-Monteith 方法作为唯一标准方法。它是一种在广泛的位置和气候下极有可能正确预测 ETo 的方法,并且可以在数据缺失的情况下应用。

组合公式的 Penman-Monteith 形式为:
E T 0 = 0.408 Δ ∗ ( R n − G ) Δ + γ ∗ ( 1 + 0.34 u 2 ) + 900 T + 273 + γ ∗ u 2 ∗ ( e s − e a ) Λ + γ ( 1 + 0.34 u 2 ) ET_0=\frac{0.408\Delta*(R_n-G)}{\Delta+\gamma*(1+0.34u_2)}+\frac{\frac{900}{T+273}+\gamma*u_2*(e_s-e_a)}{\Lambda+\gamma(1+0.34u_2)} ET0=Δ+γ(1+0.34u2)0.408Δ(RnG)+Λ+γ(1+0.34u2)T+273900+γu2(esea)
式中 R n R_n Rn为净辐射( M J ∗ m − 2 ∗ d − 1 MJ*m^{-2}*d^{-1} MJm2d1): G G G为土壤热通量( M J ∗ m − 2 ∗ d − 1 MJ*m^{-2}*d^{-1} MJm2d1),计算逐日蒸散发量时忽略: T T T为日平均温度( 0 C ^0C 0C); u 2 u_2 u2为2m高度处风速( m ∗ s − 1 m*s^{-1} ms1); e s es es e a ea ea分别为饱和水汽压与实际水汽压( k P a kPa kPa); Δ \Delta Δ为饱和水汽压—温度曲线斜率( k P a ∗ o C − 1 kPa* {^oC^{-1}} kPaoC1); γ \gamma γ为温度计常数( k P a ∗ o C − 1 kPa* {^oC^{-1}} kPaoC1)。采用上式可计算逐日 E T 0 ET_0 ET0

先根据上式设计计算ET0的函数,其中Rn、u2、es、ea以及△需要再设计函数进行计算。

def pm_fao56(tmean, wind, rs=None, rn=None, g=0, tmax=None, tmin=None,
             rhmax=None, rhmin=None, rh=None, pressure=None, elevation=None,
             lat=None, n=None, nn=None, rso=None, a=1.35, b=-0.35, ea=None,
             albedo=0.23, kab=None, as1=0.25, bs1=0.5, clip_zero=True):
    """
    计算潜在蒸散量的函数

    输入参数:
    tmean:日平均气温 [°C]
    wind:日平均风速 [m/s]
    rs: 入射太阳辐射 [MJ/ ((m^2)*d)]
    rn:净辐射 [MJ m-2 d-1]
    g: 土壤热通量 [MJ m-2 d-1]
    tmax:日最高气温 [°C]
    tmin:日最低气温 [°C]
    rhmax: 日最大相对湿度 [%]
    rhmin: 最小日相对湿度 [%]
    rh: 日平均相对湿度 [%]
    pressure:大气压[kPa]
    elevation:观测点高程 [m]
    lat: 观测点纬度 [rad]
    n: 实际日照时间 [hour]
    nn: 最大可能日照时间或日照时数 [hour]
    rso: 晴空太阳辐射 [MJ m-2 day-1]
    a: 净长波辐射的经验系数 [无单位]
    b: 净长波辐射的经验系数 [无单位]
    ea: 实际水蒸气压 [kPa]
    albedo: 地表反照率 [无单位]
    kab:从as1,bs1推导出用于估算晴空辐射的系数  [degrees].
    as1: 回归常数,表示阴天时地外辐射到达地球的比例 (n = 0) [无单位]
    bs1: 地外辐射经验系数 [无单位]
    clip_zero: 如果为True,则将所有负值替换为0

    输出参数:潜在蒸散发 [mm/d].

    """
    if tmean is None:
        tmean = (tmax + tmin) / 2
    pressure = calc_press(elevation, pressure)
    gamma = calc_psy(pressure)
    dlt = calc_vpc(tmean)

    gamma1 = (gamma * (1 + 0.34 * wind))

    ea = calc_ea(tmean=tmean, tmax=tmax, tmin=tmin, rhmax=check_rh(rhmax),
                 rhmin=check_rh(rhmin), rh=check_rh(rh), ea=ea)
    es = calc_es(tmean=tmean, tmax=tmax, tmin=tmin)

    rn = calc_rad_net(tmean, rn, rs, check_lat(lat), n, nn, tmax, tmin, rhmax,
                      rhmin, rh, elevation, rso, a, b, ea, albedo, as1, bs1,
                      kab)

    den = dlt + gamma1
    num1 = (0.408 * dlt * (rn - g)) / den
    num2 = (gamma * (es - ea) * 900 * wind / (tmean + 273)) / den
    pet = num1 + num2
    pet = clip_zeros(pet, clip_zero)
    return pet

函数pm_fao56()中calc_press()、calc_psy()、calc_vpc()、calc_ea()、 calc_es()以及calc_rad_net()是分别计算站点大气压强、湿度常数、空气温度下饱和蒸汽压曲线的斜率、实际水汽压、饱和水汽压以及净辐射的函数,clip_zeros()函数的作用是将负值设置为0。这些函数的设计不再赘述。

实例12:下面基于上述函数利用郑州市2016年的包含日平均温度、日最高温度、日最低温度以及太阳辐射等信息的数据进行郑州市2016年的潜在蒸散发估算。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
from PemanFAO56 import PMcombination as PM
data = pd.read_csv("E:\ETProject3(方法分开)\PMFAO56_to_ET\data\data1\zz.txt", parse_dates=True, index_col="date")
et0_coagmet = data["et_asce0"]
meteo = pd.DataFrame({"tmean":data["tavg"],
                      "tmax":data["tmax"],
                      "tmin":data["tmin"],
                      "rhmax":data["rhmax"]*100,
                      "rhmin":data["rhmin"]*100,
                      "u2":data["windrun"]*1000/86400,
                      "rs":data["solar"]*86400/1000000})

tmean, tmax, tmin, rhmax, rhmin, wind, rs = [meteo[col] for col in meteo.columns]
lat = 34.37 * np.pi / 180

et0_fao56 = PM.pm_fao56(tmean, wind, rs=rs, elevation=1138, lat=lat,
                         tmax=tmax, tmin=tmin, rhmax=rhmax, rhmin=rhmin)

plt.figure()
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
x=range(1,367)
y=et0_fao56
plt.plot(x,y,color='red')
plt.xlabel('Date day')
plt.ylabel('ET0 mm/d')
plt.title('ET0 by PM')
plt.show()

结果如下:

在这里插入图片描述

  • 28
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值