蒸散发计算:Hargreaves ET0 方程(公式、注意细节,python代码)

蒸散发计算:Hargreaves ET0 方程(公式、注意细节,python代码)


最近在使用日最高最低气温计算潜在蒸散发能力,从气温数据准备,到Hargreaves方程计算,也是几经波澜。写下这篇博客,一方面是为了记录,另外一方面也是想为正在做相关计算的你,减少一些无用功~
网上Hargreaves方程计算的教程基本都没写清楚,部分csdn下载包虽然收费,但那个代码真是一言难尽呀,代码混乱就算了,还没个清楚的说明文件,看的就很费劲。而且很多都是从GitHub上无脑复制过来,未经任何改动就直接拿来卖钱的。抄袭别人代码来卖钱,服务还做不好,嘴脸真是有够丑恶哈~
废话不说,咱直接开始 Hargreaves ET0 方程的介绍趴

Hargreaves ET0 方程计算公式

当太阳辐射、相对温度和(或)风速数据缺失时,或者说只有日最高最低气温时,可以选择使用Hargreaves ET0 方程来计算潜在蒸散发,其公式为
E T 0 = 0.0023 ( T m e a n + 17.8 ) ( T m a x + T m i n ) 0.5 R a ET_0 = 0.0023(T_{mean}+17.8)(T_{max}+T_{min})^{0.5}R_a ET0=0.0023(Tmean+17.8)(Tmax+Tmin)0.5Ra
其中, T m e a n , T m a x , T m i n T_{mean},T_{max},T_{min} Tmean,Tmax,Tmin分别为日平均气温、最高气温和最低气温,单位都为 C ° C° C°。其中 T m e a n T_{mean} Tmean如果没有小时气温数据来平均计算,可以用 T m e a n = ( T m a x + T m i n ) / 2 T_{mean}=(T_{max}+T_{min})/2 Tmean=(Tmax+Tmin)/2来简化替代。 R a R_a Ra是天顶辐射,单位是 m m d a y − 1 mmday^{-1} mmday1(这个单位需要注意一下,我就是在这被卡了好久的(哭死~))。
下面来详细介绍天顶辐射 R a R_a Ra的计算公式
R a = 24 × 60 π G s c d r [ w s s i n ( φ ) s i n ( δ ) + c o s ( φ ) c o s ( δ ) s i n ( w s ) ] R_a = \frac{24×60}{\pi}G_{sc}d_r[w_ssin(\varphi)sin(\delta)+cos(\varphi)cos(\delta)sin(w_s)] Ra=π24×60Gscdr[wssin(φ)sin(δ)+cos(φ)cos(δ)sin(ws)]
公式中 R a R_a Ra单位为 M J m − 2 d a y − 1 MJm^{-2}day^{-1} MJm2day1注意这里单位和Hargreaves 方程里 R a ( m m d a y − 1 ) R_a(mmday^{-1}) Ra(mmday1)的单位不一样
G s c G_{sc} Gsc为太阳常数为0.0820 ( M J m − 2 m i n − 1 ) (MJm^{-2} min^{-1}) (MJm2min1)
d r d_r dr为日地间相对距离的倒数
w s w_s ws为太阳时角(rad)
φ \varphi φ为地理纬度(rad)
δ \delta δ为太阳磁偏角(rad)
下面分辨介绍 φ , d r , δ , w s \varphi, d_r, \delta, w_s φ,dr,δ,ws的具体计算公式
首先 φ \varphi φ
φ = π 180 × [ 十进制度数纬度 ] \varphi = \frac{\pi}{180}×[十进制度数纬度] φ=180π×[十进制度数纬度]
为防止理解错,这里给了个例子~
在这里插入图片描述日地间相对距离的倒数 d r d_r dr 和太阳磁偏角 δ \delta δ的计算见下式:
d r = 1 + 0.033 c o s ( 2 π 365 J ) d_r= 1 + 0.033cos(\frac{2\pi}{365}J) dr=1+0.033cos(3652πJ)
δ = 0.409 s i n ( 2 π 365 J − 1.39 ) \delta= 0.409sin(\frac{2\pi}{365}J-1.39) δ=0.409sin(3652πJ1.39)
公式中: J J J是年内某天的日序数,在 1( 1 月 1 日)至 365 或 366( 12 月 31 日)之间。
日落时角 w s w_s ws 见下式:
w s = a r c c o s [ − t a n ( φ ) t a n ( δ ) ] w_s= arccos[-tan(\varphi)tan(\delta)] ws=arccos[tan(φ)tan(δ)]
在算法语言里没有反余弦函数,所以日落时角 ω s ω_s ωs 亦可用反正切函数计算:
w s = π 2 − a r c t a n [ − t a n ( φ ) t a n ( δ ) X 0.5 ] w_s= \frac{\pi}{2}-arctan[ \frac{-tan(\varphi)tan(\delta)}{X^{0.5}}] ws=2πarctan[X0.5tan(φ)tan(δ)]
其中:
X = 1 − [ t a n ( φ ) ] 2 [ t a n ( δ ) ] 2 X = 1− [tan(\varphi)]^2[tan(\delta )]^2 X=1[tan(φ)]2[tan(δ)]2
X ≤ 0 X\leq0 X0时, X = 0.00001 X=0.00001 X=0.00001
因为公式Hargreaves 方程里 R a R_a Ra单位为 m m d a y − 1 mmday^{-1} mmday1,所以需要把 R a ( M J m − 2 d a y − 1 ) R_a(MJm^{-2}day^{-1}) Ra(MJm2day1)转换成 R a ( m m d a y − 1 ) R_a(mmday^{-1}) Ra(mmday1)。具体转换如下:
R a ( m m d a y − 1 ) = 0.408 × R a ( M J m − 2 d a y − 1 ) R_a(mmday^{-1}) = 0.408×R_a(MJm^{-2}day^{-1}) Ra(mmday1)=0.408×Ra(MJm2day1)

Hargreaves ET0 python代码

这里给了我的Hargreaves方程代码。因为这是适应我的数据的代码,利用插值后的站点气温数据(2922,140,230)(时间,纬度,经度)计算南方[99°E~122°E, 21°N ~ 35°N]地区0.1°分辨率的蒸散发能力
在你们的程序上,应该不能直接运行。不过我给了详尽的注释,希望能给你们带来一些帮助。
R a R_a Ra 的计算

## 计算天顶辐射Ra
import h5py
import numpy as np
import pandas as pd
import math   #导入包

with h5py.File('temperature_daily.h5', 'r') as file:
    lons = file['longitude'][:]
    lats = file['latitude'][:] 
#导入进度纬度文件lons是[140]的一维数组,lats是[230]的一维数组
    
j=np.array(range(1,366),dtype=np.int32)
for ii in range(2016,2023):
    if ii % 4 == 0:
        mid = np.array(range(1,367),dtype=np.int32)
        j = np.hstack([j, mid]) 
    else:
        mid = np.array(range(1,366),dtype=np.int32)
        j = np.hstack([j, mid])
    del mid       # j 年内某天的日序数。把2015年到2022年的日序数都给标好,赋给j变量


hudu = np.empty((lats.shape[0],lons.shape[0]), dtype=np.float32)

for ii in range(lats.shape[0]):
    hudu[ii,:] = lats[ii]*math.pi/180   #hudu是φ 地理纬度,(140,230)

dr = np.empty((lats.shape[0],lons.shape[0]), dtype=np.float32)  #dr 日地间相对距离的倒数
fi = np.empty((lats.shape[0],lons.shape[0]), dtype=np.float32)  #fi 是 δ 太阳磁偏角
Ra = np.empty((2922,lats.shape[0],lons.shape[0]), dtype=np.float32) # Ra 是天顶辐射

for jj in range(2922):
    dr[:,:] = 1+0.033*math.cos(2*math.pi*j[jj]/365)
    fi[:,:] = 0.409*math.sin(2*math.pi*j[jj]/365-1.39)
    x = 1-np.tan(hudu)**2*np.tan(fi)**2 
    x = np.where(x<=0, 0.00001, x)
    ws = math.pi/2-np.arctan((-np.tan(hudu))*np.tan(fi)/(x**0.5))
    Ra[jj,:,:] = (
        24*60/math.pi*0.082*dr*
        (ws*np.sin(fi)*np.sin(hudu)+np.cos(hudu)*np.cos(fi)*np.sin(ws))
        )*0.408
    
with h5py.File('Ra.h5', 'w') as h5file:
	h5file.create_dataset('Ra', data=Ra)
	h5file.create_dataset('longitude', data=lons)
	h5file.create_dataset('latitude', data=lats)
	h5file.attrs['Description'] = 'ra 2015~2022'   #保存变量至HDF5文件

再计算ET0

import h5py
import numpy as np
import pandas as pd
import math #导入包

with h5py.File('temperature_daily.h5', 'r') as file:
    temperature_max = file['temperature_max'][:]
    temperature_min = file['temperature_min'][:]
    temperature_mean = file['station_temputure_mean'][:] #导入气温数据都是(2922,140,230)的数组

with h5py.File('Ra.h5', 'r') as file:
    Ra = file['Ra'][:] #导入气温 (2922,140,230)

et = 0.0023*(temperature_mean+17.8)*((temperature_max-temperature_min)**0.5)*Ra #ET0计算

with h5py.File('Ra.h5', 'a') as h5file:
	h5file.create_dataset('ET0', data=et) #保存至 HDF5文件

基本表现

多年空间平均
在这里插入图片描述
时间序列平均
在这里插入图片描述

参考

FAO Irrigation and Drainage Paper

https://blog.csdn.net/weixin_51956867/article/details/136112272?fromshare=blogdetail&sharetype=blogdetail&sharerId=136112272&sharerefer=PC&sharesource=m0_46211544&sharefrom=from_link

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值