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

news2024/7/31 1:21:27

说明

在这里插入图片描述
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 model
    q_sim = hbv_main(len(temp), p, temp, precip, dpem)

    # Calculate Nash-Sutcliffe Efficiency
    nse = 1.0 - (np.sum((q_obs - q_sim) ** 2.)) / (np.sum((q_obs - np.mean(q_obs)) ** 2.))
    nse = 1.0 - nse
    return nse


def hbv_main(n_days, params, air_temp, prec, dpem):
    Tsnow_thresh = 0.0
    ca = 410.

    # Initialize arrays for the simiulation
    snow = 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 parameters
    d = 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_day
        if air_temp[i_day] < Tsnow_thresh:

            # Precip adds to the snow pack
            snow[i_day] = snow[i_day - 1] + prec[i_day]

            # Too cold, no liquid water
            liq_water[i_day] = 0.0

            # Adjust potential ET base on difference between mean daily temp
            # and long-term mean monthly temp
            pe[i_day] = (1. + c * (air_temp[i_day] - monthly[month[i_day]])) * dpem[month[i_day]]

            # Check soil moisture and calculate actual evapotranspiration
            if soil[i_day - 1] > pwp:
                ea[i_day] = pe[i_day]
            else:
                # Reduced ET_actual by fraction of permanent wilting point
                ea[i_day] = pe[i_day] * (soil[i_day - 1] / pwp)

                # See comments below
            dq[i_day] = liq_water[i_day] * (soil[i_day - 1] / fc) ** beta
            soil[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] * k2
            q[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 rain

            snow[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 adjustment
            pe[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 ET
            soil[i_day] = soil[i_day - 1] + liq_water[i_day] - dq[i_day] - ea[i_day]

            # Upper reservoir water levels
            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)
            # Lower reservoir water levels
            s2[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 reservoirs
            q[i_day] = max(0, s1[i_day] - l) * k0 + s1[i_day] * k1 + (s2[i_day] * k2)
        # Resulting Q
        qm[i_day] = (q[i_day] * ca * 1000.) / (24. * 3600.)

    # End of simulation
    return qm


def main(calibrate=False):
    # =======================================================================

    # Calibration Flag - *Set to 'True' during calibration to prevent plotting

    # Read paramter values
    para_init = np.genfromtxt('params_calibrate.dat', skip_header=1, usecols=[1], unpack=True)

    if calibrate:
        pass
    else:
        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 observed
    q_obs = np.genfromtxt('Qobs.txt')
    main()

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

附件

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

其他

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【已解决】idea使用debug启动一直卡着不动

debug启动时一直卡着不动出现下图提示&#xff0c;但是正常启动又可以启动 翻译结果是&#xff1a;方法断点可能会大大降低调试速度。很明显&#xff0c;有断点的位置没加对或者误加断点了&#xff0c;以下是解决方法。 打开 .idea文件夹&#xff0c;找到workspace.xml文件 找…

基于Javaweb实现ATM机系统开发实战(九)存款功能实现

先看前端界面确定后端需要处理的参数&#xff0c;把一些参数进行修改&#xff1a; <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> <% taglib prefix"c" uri"http://java.sun.com…

JavaScript运算符优先顺序

● 我们可以通过MDN去查看运算符的优先级 ● 可以看到运算符是从左到右还是从右到左进行运算的&#xff1b; let x, y; x y 25 - 10 - 5; console.log (x, y);上面的运算会现实10 10&#xff0c;为什么会得到这样的结果呢&#xff1f;因为你查看mdn那个表你会发现&#xf…

使用Jquery为页面添加元素,并设置元素的背景图片时,背景图总会延迟几秒才会出现的问题

介绍 使用 jquery&#xff0c;为页面添加元素时&#xff0c;同时动态设置元素的背景图&#xff0c;总是会导致背景图延迟几秒才会出现&#xff0c;如下图所示&#xff1a; 解决方式 创建一个 image 对象&#xff0c;定义 image 对象的 src 属性&#xff1b;在 image 对象的 o…

Linux搭建node环境-MobaXterm+node+pm2安装

1.登录session 2.安装X11-forwarding 我也不知道这个有什么用&#xff0c;但是有个叉叉在那里有点难受&#xff0c;就把它解决了什么是X11-forwarding&#xff1f;怎么使用&#xff1f; yum install xorg-x11-xauth xorg-x11-fonts-* xorg-x11-font-utils xorg-x11-fonts-Ty…

软件架构介绍

一、定义 软件架构&#xff1a;可以简单理解为满足干系人关键诉求的一系列宏观决策。 二、软件质量属性 软件架构师大部分时间在解决以下产品质量模型中的质量属性问题。 三、程序员和架构师区别 从思维逻辑方面来看&#xff0c; 程序员从功能和业务逻辑方面去想问题。 架…

​大华智慧园区综合管理平台存在任意文件上传漏洞

免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 大华智慧园区综合管理平台简介 大华智慧园区综合管理…

HTML5学习简记

目录 HTML定义 标签 HTML基本骨架 常见标签 标题标签 段落标签 换行与水平线标签 文本格式化标签 图像标签 绝对路径与相对路径 超链接标签 音频与视频标签 列表标签 无序列表 有序列表 定义列表 表格标签 表格结构标签 合并单元格 表单标签 input标签 input标签占…

前端工程化第一章:webpack5基础(上)

文章目录 1. 什么是webpack&#xff1f;2. webpack使用2.2. 前置知识2.1. 创建一个项目 3. webpack打包3.1. 创建一个webpack.config.js文件3.2. 入口&#xff08;entry&#xff09;3.2.1. webpack.config.js3.2.2. src/index.js3.2.3. package.json 3.3. 输出&#xff08;outp…

SpringMvc异常处理机制

预期异常和运行异常&#xff0c;前者通过捕获&#xff0c;后者通过规范代码开发、测试等手段减少发生概率。 系统dao层、service层、controller层出现都可通过throws Exception向上抛出&#xff0c;最终由SpringMvc前端控制器交由异常处理器进行异常处理。 SpringMvc项目异常处…

有必要买apple pencil吗?ipad触控笔推荐平价

科技的飞速发展改变了人们的生活。在各种电子、数码产品不断涌现的今天&#xff0c;这款能与平板电脑相匹配的电容笔就应运而生了。随着国内的电容笔技术的进步&#xff0c;它的使用领域也在不断地扩展&#xff0c;逐渐开始取代苹果原装电容笔。下面&#xff0c;我将为大家介绍…

IDEA使用GIT提交代码中文日志(commit message)乱码

最近换了新的开发环境&#xff0c;导致提交gti中文注释乱码&#xff0c;遂记录一下解决方案 idea中查看git提交信息显示中文是正常的 gitee上显示乱码 本地显示也是乱码 一、命令修改编码格式 git 安装目录下执行 git config --global i18n.commitencoding utf-8git config …

《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(6)-Charles安卓手机抓包大揭秘

1.简介 Charles和Fiddler一样不但能截获各种浏览器发出的 HTTP 请求&#xff0c;也可以截获各种智能手机发出的HTTP/ HTTPS 请求。 Charles也能截获 Android 和 Windows Phone 等设备发出的 HTTP/HTTPS 请求。 今天宏哥讲解和分享Charles如何截获安卓移动端发出的 HTTP/HTTP…

2023 年 7 月中旬使用各种随身 wifi 的电脑无法上网的解决方法

微软近日推送了安全更新&#xff0c;在 Win10 下编号为 KB5028166&#xff0c;在 Win11 下编号为 KB5028185。此补丁会导致部分电脑无法上网&#xff0c;主要是使用了各种品牌的随身 Wifi 的电脑。 具体症状表现为从控制面板的网络连接&#xff08;ncpa.cpl&#xff09;打开详细…

vue项目展示pdf文件

记录贴 最近我有个需求,就是在h5页面上展示pdf文件,分页,最后一页有个蒙层阴影渐变的效果,尝试过一些插件,但都不是很好用,最后用了pdfjs-dist加上canvas 可以看下效果 先下载: npm i pdfjs-dist2.5.207下面展示代码 html: <template><canvas v-for"pageNumb…

浅谈设计模式之单例模式

0 单例模式简介 单例模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。单例模式指的是单一的一个类&#xff0c;该类负责创建自己的对象&#xff0c;并且保证该对象唯一。该类提供了一种访问其唯一对象的方法&#xff0c;外部需要调用该类的对象可以通过方法获…

Python 自学 day06 JSON 数据传输,折线图,柱状图,动态柱状图

1.python JSON的知识 1.1 什么是 JSON 答&#xff1a; JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据. JSON本质上是一个带有特定格式的字符串。 1.2 JSON 的主要功能 答&#xff1a;json就是一种在各个编程语言中流通的…

栈和队列OJ

文章目录 1.用队列实现栈2.用栈实现队列3.设计循环队列4.循环队列经典题 1.用队列实现栈 typedef int QDataType; typedef struct QueueNode {struct QueueNode* next;QDataType data; }QNode;typedef struct Queue {QNode* head;QNode* tail; }Queue; typedef struct MyStack …

⛳ Java数组

Java数组的目录 ⛳ Java数组&#x1f3a8; 一&#xff0c;一维数组&#x1f463; 1.1&#xff0c;概念&#x1f4e2; 1.2&#xff0c;基本用法1&#xff0c;语法格式2&#xff0c;代码 &#x1f4bb; 1.3&#xff0c;内存结构&#x1f4dd; 1.4&#xff0c;练习 &#x1f381; …

天翎MyApps低代码平台唯品会金牌客服管理系统

项目痛点&#xff1a; 作为一家知名的创新大型电商&#xff0c;唯品会秉承“传承品质生活&#xff0c;提升幸福体验”的企业使命。基于客服铁军锻造项目&#xff0c;实现基于金牌案例的提交、评审、积分&#xff0c;学习功能。 项目中的晋升机制、案例产生学习机制、双激励机制…