【Hydro】一个简单的HBV水文模型产流Python实现

说明

在这里插入图片描述
HBV模型包括一系列自由参数,其值可以通过率定得到。同时也包括一些描述流域和气候特征的参数,它们的值在模型率定是假定不变。子流域的划分使得在一个子流域中可能有很多参数值。虽然在大多数应用中,各子流域之间参数值只有很小的变化,但仍应慎重选取这些参数。

HBV模型主要包括三个子程序:积雪及融雪模块在上层、土壤含水量计算在中层、响应路线在底层。

可以根据流域水系拓朴结构,分别模拟各子流域的径流过程,确定各子流域产流到达总流域出口所流经的子流域,计算各子流域径流到达总流域的出口时间,最后根据汇流时间叠加总流域产流量,形成流域总出口的径流过程。

以下代码,仅包含产流部分,请酌情参考~

源代码

输入数据:逐日降水、逐日气温
输出数据:逐日产流

import numpy as np
import matplotlib.pyplot as plt"""
Citation:
AghaKouchak A., Habib E., 2010, Application of a Conceptual Hydrologic
Model in Teaching Hydrologic Processes, International Journal of Engineering Education, 26(4), 963-973. AghaKouchak A., Nakhjiri N., and Habib E., 2012, An educational model for ensemble streamflow 
simulation and uncertainty analysis, Hydrology and Earth System Sciences Discussions, 9, 7297-7315, doi:10.5194/hessd-9-7297-2012.
"""def nse_cost(p):"""Purpose:"""# Call HBV modelq_sim = hbv_main(len(temp), p, temp, precip, dpem)# Calculate Nash-Sutcliffe Efficiencynse = 1.0 - (np.sum((q_obs - q_sim) ** 2.)) / (np.sum((q_obs - np.mean(q_obs)) ** 2.))nse = 1.0 - nsereturn nsedef hbv_main(n_days, params, air_temp, prec, dpem):Tsnow_thresh = 0.0ca = 410.# Initialize arrays for the simiulationsnow = np.zeros(air_temp.size)  #liq_water = np.zeros(air_temp.size)  #pe = np.zeros(air_temp.size)  #soil = np.zeros(air_temp.size)  #ea = np.zeros(air_temp.size)  #dq = np.zeros(air_temp.size)  #s1 = np.zeros(air_temp.size)  #s2 = np.zeros(air_temp.size)  #q = np.zeros(air_temp.size)  #qm = np.zeros(air_temp.size)  ## Set parametersd = params[0]  #fc = params[1]  #beta = params[2]  #c = params[3]  #k0 = params[4]  #l = params[5]  #k1 = params[6]  #k2 = params[7]  #kp = params[8]  #pwp = params[9]  #for i_day in range(1, n_days):# print i_dayif air_temp[i_day] < Tsnow_thresh:# Precip adds to the snow packsnow[i_day] = snow[i_day - 1] + prec[i_day]# Too cold, no liquid waterliq_water[i_day] = 0.0# Adjust potential ET base on difference between mean daily temp# and long-term mean monthly temppe[i_day] = (1. + c * (air_temp[i_day] - monthly[month[i_day]])) * dpem[month[i_day]]# Check soil moisture and calculate actual evapotranspirationif soil[i_day - 1] > pwp:ea[i_day] = pe[i_day]else:# Reduced ET_actual by fraction of permanent wilting pointea[i_day] = pe[i_day] * (soil[i_day - 1] / pwp)# See comments belowdq[i_day] = liq_water[i_day] * (soil[i_day - 1] / fc) ** betasoil[i_day] = soil[i_day - 1] + liq_water[i_day] - dq[i_day] - ea[i_day]s1[i_day] = s1[i_day - 1] + dq[i_day] - max(0, s1[i_day - 1] - l) * k0 - (s1[i_day] * k1) - (s1[i_day - 1] * kp)s2[i_day] = s2[i_day - 1] + s1[i_day - 1] * kp - s2[i_day] * k2q[i_day] = max(0, s1[i_day] - l) * k0 + (s1[i_day] * k1) + (s2[i_day] * k2)qm[i_day] = (q[i_day] * ca * 1000.) / (24. * 3600.)else:# Air temp over threshold: precip falls as rainsnow[i_day] = max(snow[i_day - 1] - d * air_temp[i_day] - Tsnow_thresh, 0.)liq_water[i_day] = prec[i_day] + min(snow[i_day], d * air_temp[i_day] - Tsnow_thresh, 0.)# PET adjustmentpe[i_day] = (1. + c * (air_temp[i_day] - monthly[month[i_day]])) * dpem[month[i_day]]if soil[i_day - 1] > pwp:ea[i_day] = pe[i_day]else:ea[i_day] = pe[i_day] * soil[i_day] / pwp# Effective precip (portion that contributes to runoff)dq[i_day] = liq_water[i_day] * ((soil[i_day - 1] / fc)) ** beta# Soil moisture = previous days SM + liquid water - Direct Runoff - Actual ETsoil[i_day] = soil[i_day - 1] + liq_water[i_day] - dq[i_day] - ea[i_day]# Upper reservoir water levelss1[i_day] = s1[i_day - 1] + dq[i_day] - max(0, s1[i_day - 1] - l) * k0 - (s1[i_day] * k1) - (s1[i_day - 1] * kp)# Lower reservoir water levelss2[i_day] = s2[i_day - 1] + dq[i_day - 1] * kp - s2[i_day - 1] * k2# Run-off is total from upper (fast/slow) and lower reservoirsq[i_day] = max(0, s1[i_day] - l) * k0 + s1[i_day] * k1 + (s2[i_day] * k2)# Resulting Qqm[i_day] = (q[i_day] * ca * 1000.) / (24. * 3600.)# End of simulationreturn qmdef main(calibrate=False):# =======================================================================# Calibration Flag - *Set to 'True' during calibration to prevent plotting# Read paramter valuespara_init = np.genfromtxt('params_calibrate.dat', skip_header=1, usecols=[1], unpack=True)if calibrate:passelse:q_sim = hbv_main(len(temp), para_init, temp, precip, dpem)plt.plot(q_obs, label='Q_obs', color='blue')plt.plot(q_sim, label='Q_sim', color='red', ls='--')plt.legend(fontsize=10)plt.ylabel('Stream Flow [cms]', fontsize=10)plt.xlabel('Number of Days from Run Start', fontsize=10)plt.tight_layout()plt.show()model_error = nse_cost(para_init)f_out = open('model_err.dat', 'w+')f_out.write(str(model_error) + '\n')f_out.close()if __name__ == '__main__':# Read Input (Air Temp.,PET, Precip.)month, temp, precip = np.genfromtxt('inputPrecipTemp.txt', usecols=[1, 2, 3], unpack=True)monthly, tpem, dpem = np.genfromtxt('inputMonthlyTempEvap.txt', unpack=True)month = month.astype(int)# Read Q observedq_obs = np.genfromtxt('Qobs.txt')main()

以上代码,运行结果
在这里插入图片描述

附件

源代码、HBV模型中文说明及输入文件下载

其他

HBV R包说明
HBV-EDU Hydrologic Mode MATLAB包

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/28959.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学生宿舍智能电表限电原理

学生宿舍智能电表限电石家庄光大远通电气有限公司生产销售系列学生公寓智能管理模块、学生公寓智能控电水电联控系统及相关公寓安全用电产品&#xff0c;产品销往全国各地&#xff0c;广泛应用于各种学校公寓物业及商业地产公司&#xff0c;为企事业单位物业管理提供便捷的水电…

Go语言之结构体

在实际开发中&#xff0c;我们可以将一组类型不同的、但是用来描述同一件事物的变量放到结构体中。例如&#xff0c;在校学生有姓名、年龄、身高、成绩等属性&#xff0c;学了结构体后&#xff0c;我们就不需要再定义多个变量了&#xff0c;将它们都放到结构体中即可。 在Go语言…

uni-app:scroll-view滚动盒子,实现横(纵)向滚动条

参照&#xff1a;scroll-view | uni-app官网 (dcloud.net.cn) 样式&#xff1a; 代码&#xff1a; <template><view class"box"><scroll-view scroll-x"true" class"scroll"><view class"box1"> <view c…

MySQL八股学习记录6-日志from小林coding

MySQL八股学习记录6-日志from小林coding MySQL日志分类undo logBuffer Poolredo logbinlogredo log 和undo log有什么区别主从复制是如何实现update语句执行过程为什么需要两阶段提交 MySQL日志分类 undo log:InnoDB存储引擎层生成的日志,实现事务中的原子性,主要用于事务回滚…

Linux进程控制(二)---进程等待

目录 什么是进程等待 为什么要进行进程等待&#xff1f; wait() waitpid() status的使用★ options★ 问题&#xff1a;既然进程具有独立性&#xff0c;进程退出码不也是子进程数据吗&#xff0c;父进程凭什么拿到呢&#xff1f;wait/waitpid究竟做了什么呢&#xff1f; …

Spring Cloud Hystrix简单实用

文章目录 一、简介二、快速开始1、pom依赖2、启动类注解3、服务降级配置HystrixCommand4、配置熔断策略5、测试 三、原理分析四、实际使用 一、简介 Hystrix&#xff0c;英文意思是豪猪&#xff0c;全身是刺&#xff0c;刺是一种保护机制。Hystrix也是Netflflix公司的一款组件。…

Kotlin获取Fragment中的组件

左边和右边分别是两个不同的Fragment&#xff0c;左边的Fragment中右一个Button组件&#xff0c;目标是想要获取这个组件的id&#xff0c;以便进行将右边的Fragment更改成另一个Fragmeent的操作。 left_fragment.xml <?xml version"1.0" encoding"utf-8&qu…

玩玩两个简单的python的web框架 flask、fastapi

IDEA连接远程解释器&#xff0c;本地代码编辑无法代码提示 一、Flask入门使用 官网 其它参考 注意 1.这里使用linux 192.168.72.126上远程解释器,需要/usr/bin/pip3 install flask&#xff0c;host参数不要使用localhost/127.0.0.1,即只监听本地的访问&#xff0c;会导致wind…

手机定屏死机问题操作指南

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、定屏死机问题抓取 Log 要求二、 复现定屏死机问题后做什么三、检查adb是否可连的方法四、连接adb 抓取以下Log五、如果adb不可连&#xff0c;执行下…

IDEA实用设置及插件

一、IDEA实用设置 二、IDEA实用插件 1. aiXcoder是一个基于最先进的深度学习技术的强大的代码完成器和代码搜索引擎。它有可能向您推荐一整行代码&#xff0c;这将帮助您更快地进行编码。AiXcoder还提供了一个代码搜索引擎&#xff0c;帮助您在GitHub上搜索API用例。 2. 阿里…

【iOS】—— 面向对象,Runtime,ARC等问题总结

对于暑假学习大多数是对之前学习的一个复习&#xff0c;在这里只做对之前学习欠缺知识的补充以及这些知识点涉及的一些问题&#xff0c;从问题入手学习。 文章目录 面向对象1.一个NSObject对象占多少内存&#xff1f;2.对象的isa指针指向哪里&#xff1f;3.OC的类信息存放在哪…

HarmonyOS/OpenHarmony应用开发-Stage模型UIAbility组件使用(五)

UIAbility组件间交互&#xff08;设备内&#xff09; UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时&#xff0c;会涉及到启动特定的UIAbility&#xff0c;该UIAbility可以是应用内的其他UIAbility&#xff0c;也可以是其他应用的UIAbility&#xff08;例如启动…