【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 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包

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

webpack插件compression-webpack-plugin

Vue配置compression-webpack-plugin实现Gzip压缩 1、为什么要压缩&#xff1f; 打包的时候开启gzip可以很大程度减少包的大小&#xff0c;页面大小可以变为原来的30%甚至更小&#xff0c;非常适合于上线部署。更小的体积对于用户体验来说就意味着更快的加载速度以及更好的用户…

使用IDEA社区版创建SpringBoot项目

文章目录 1.关于IDEA社区版的版本2.下载Spring Boot Helper3.创建项目4.配置Maven国内源4.1找不到settings.xml的情况4.2找得到settings.xml的情况 4.3删除repository目录下的所有文件和目录5.加载项目6.解决org.springframework.boot:spring-boot-starter-parent:pom:2.7.13.R…

NXP i.MX 6ULL工业开发板硬件说明书( ARM Cortex-A7,主频792MHz)

前 言 本文档主要介绍TLIMX6U-EVM评估板硬件接口资源以及设计注意事项等内容。 创龙科技TLIMX6U-EVM是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的评估板&#xff0c;由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证&#xff0c;稳…

我们如何在 Elasticsearch 8.6、8.7 和 8.8 中加速数据摄入

作者&#xff1a;Adrien Grand, Joe Gallo, Tyler Perkins 正如你们中的一些人已经注意到的&#xff0c;Elasticsearch 8.6、8.7 和 8.8 在各种数据集上带来了良好的索引加速&#xff0c;从简单的关键字到繁重的 KNN 向量&#xff0c;以及摄取管道繁重的摄取工作负载。 摄取涉及…

Java Mybatis拓展03

0目录 1.MyBatis当实体类和数据库字段名不对应 2.多表查询 1.MyBatis当实体类和数据库字段名不对应 方法2 测试 多表查询 加入子标签association 模糊查询 加入Address 对象 三表联查 2.五表联查 测试

使用 appium 进行微信小程序的自动化测试

目录 前言&#xff1a; 微信小程序结构 自动化用例的调整 示例代码 后记 前言&#xff1a; 微信小程序是一种流行的移动应用程序&#xff0c;它在移动设备上提供了丰富的功能和用户体验。为了确保微信小程序的质量和稳定性&#xff0c;自动化测试是必不可少的一环。Appiu…

el-table找出当前单元格与对应的上下列的值

当前单元格与对应的上下列的值如果不相同就设置个红色边框 当前单元格与对应的上下列的值如果不相同就设置个红色边框 当前单元格与对应的上下列的值如果不相同就设置个红色边框 以下是示例代码&#xff0c;对tableData数据的name字段进行处理 如果当前name值与上一条数据的na…

港联证券-尾盘集合竞价拉升意味着什么意思?

在股票市场中&#xff0c;尾盘集合竞价是指每个交易日的最后几分钟&#xff0c;即下午14:57到3:00之间的交易。在这段时间内&#xff0c;所有股票的买卖都将以竞价的方式进行&#xff0c;最终价格以最高买价与最低卖价的平均值确定&#xff0c;成交量也将作为当日的收盘价和成交…

科普一下Elasticsearch中BM25算法的使用

首先还是先了解几个概念&#xff0c;Elasticsearch是一个开源的分布式搜索和分析引擎&#xff0c;它使用一系列算法来计算文档的相关性分数&#xff08;relevance score&#xff09;。这些算法用于确定查询与文档的匹配程度&#xff0c;以便按相关性对搜索结果进行排序。以下是…

Unity URP 2D光照导入与配置

上面随时间变化的火烧云和晚霞&#xff0c;篝火的呼吸光照&#xff0c;都是URP的功劳。 1.什么是URP&#xff1f; URP 全称为 Universal Render Pipeline(通用渲染管线)。 它的特点是在手游和端游均能在保持性能的同时有良好的效果 也就说在多数情况下&#xff0c;在下面的平台…

10亿级用户,如何做 熔断降级架构?微信和hystrix的架构对比

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如极兔、有赞、希音、百度、网易、滴滴的面试资格&#xff0c;遇到一几个很重要的面试题&#xff1a; (1) 什么是熔断&#xff0c;降级&#xff1f;如何实现&#xff1f; (2) 服务熔…

linux内核调试工具记录

Linux性能测试使用的工具在github网站可见&#xff0c;网址如下&#xff1a; slides: http://www.slideshare.net/brendangregg/linux-performance-analysis-new-tools-and-old-secrets video: https://www.usenix.org/conference/lisa14/conference-program/presentation/greg…

LLM微调 | LoRA: Low-Rank Adaptation of Large Language Models

&#x1f525; 发表于论文&#xff1a;(2021) LoRA: Low-Rank Adaptation of Large Language Models &#x1f604; 目的&#xff1a;大模型预训练微调范式&#xff0c;微调成本高。LoRA只微调新增的小部分参数。 文章目录 1、背景2、动机3、LoRA原理4、总结 1、背景 adapter…

BUFG/BUFGCE/BUFH/BUFHCE/BUFH/BUFGHCE/BUFMR/BUFMRCE/BUFR/IBUF/IBUFDS

本文对BUFG/BUFGCE/BUFH/BUFHCE简单介绍&#xff0c;便于后续查看。 原语的使用&#xff1a;在vivado中找到所要用的原语&#xff0c;直接将其实例化到设计中即可。 文章目录 BUFGBUFGCEBUFHBUFHCEBUFMRBUFRBUFMRCEIBUFIBUFDS 下图为 7 系列 FPGA 时钟架构图&#xff1a; BU…

又卡了,大数据平台容器化运维走起

文章目录 一、背景二、方案总结三、方案实施3.0 转移数据修改docker默认存储位置3.1 手动清理3.2 定时容器日志清理3.3 限制 Docker 容器日志大小 大家好&#xff0c;我是脚丫先生 (o^^o) 大数据基础平台的搭建&#xff0c;我采用的是全容器化Apache的大数据组件。 之前还很美…

Java对象深拷贝、浅拷贝之枚举类型

问题&#xff1a;为什么属于引用类型的enum不会有深拷贝浅拷贝的问题&#xff1f; 解释&#xff1a; 在Java中&#xff0c;枚举类型是一种特殊的类类型。每个枚举值都是该枚举类型的一个实例&#xff0c;并且这些实例在枚举类型被初始化时就已经被创建。这些实例在程序的整个…

如何二次封装一个el-table组件并二次复用

*注:示例使用的是vue3和element进行二次封装的 首先我们来看效果图&#xff08;总共可以分为以下几个模块&#xff09;&#xff1a; 表格数据操作按钮区域表格信息提示区域表格主体内容展示区域表格分页区域 表单搜索没有封装在这里是为了降低代码的耦合性(有兴趣的可以查看我…

rt-thread构建含c++源码的工程

RT-Thread Components > C/C and POSIX layerscons构建项目会出错&#xff1a; vim libraries/SConscript &#xff0c;删除 pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp&#xff08;切记不要注释&#xff0c;要删除&#xff09; 再次scons构建项目&#…

【FPGA】基于C5的第一个SoC工程

文章目录 前言SoC的Linux系统搭建 前言 本文是在毕业实习期间学习FPGA的SoC开发板运行全连接神经网络实例手写体的总结。 声明&#xff1a;本文仅作记录和操作指南&#xff0c;涉及到的操作会尽量细致&#xff0c;但是由于文件过大不会分享文件&#xff0c;具体软件可以自行搜…

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

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