【Hydro】部分基流分割方法及程序代码说明

news2024/11/22 6:19:14

目录

  • 说明
  • 一、数字滤波法
    • 单参数数字滤波
      • Lyne-Hollick滤波法
      • Chapman滤波法
      • Chapman-Maxwell滤波法
      • Boughton-Chapman滤波法
    • 双参数滤波法
      • Eckhardt滤波法
  • 二、其他基流分割方法
    • 基流指数(BFI)法
    • 时间步长(HYSEP)法
    • PART法
    • 加里宁-阿里巴扬基流估算改进方法
  • 三、计算程序及代码
    • SWAT Baseflow Program基流计算程序
      • 基本原理
      • Baseflow输入输出文件
    • Lyne-Hollick滤波法Python代码
    • grwat中的基流分割方法
  • 参考文献

说明

径流分为直接径流和基流,直接径流退水快而陡,基流退水慢而平缓。基流是指来源于地下水的径流,在枯水季节是径流的主要组成部分。基流相对稳定,对于维持河流生态、保障流域生产生活用水以及水环境保护具有重要的意义。
基流分割方法根据基流计算的原理, 分为图解法、 物理化学法、 数学物理法、 水文模型法和数值模拟法。常用的数值模拟法有数字滤波法、 BFI法、 HYSEP法、 PART法和加里宁法。

一、数字滤波法

数字滤波法利用数字滤波器将径流过程划分为直接径流和基流两个部分。直接径流代表快速响应特征,与数字信号中的高频部分相似,而基流代表慢速响应特征,与数字信号中的低频部分相似。该方法包括单参数滤波法和双参数滤波法(又称递归数字滤波法)。

单参数数字滤波

Lyne-Hollick滤波法

Lyne-Hollick滤波法由Lyne和Hollick于1979年首次提出, 并由Nathan和Mcmahon于1990年引入到水文中进行基流分割, 其基流分割方程为:
在这里插入图片描述

Chapman滤波法

Chapman 于1991年对Lyne-Hollick滤波法进行了改进, 提出了Chapman滤波法, 改进后的基流分割方程为:
在这里插入图片描述

Chapman-Maxwell滤波法

Chapman和Maxwell于1996把基流假定为同时刻的地表径流和前一时刻基流的加权平均, 提出了Chapman-Maxwell滤波法, 基流分割方程如下:
在这里插入图片描述

Boughton-Chapman滤波法

为使基流分割更为平滑, Boughton于1993年提出Boughton-Chapman滤波法, 基流分割方程为:
在这里插入图片描述

双参数滤波法

Eckhardt滤波法

Eckhardt在单参数的基础上提出了一种双参数数字滤波方法,包含2个滤波参数(退水常数α和最大基流指数BFImax), 方法更加灵活准确, 其计算如式所示:
在这里插入图片描述MRC方法可用BASEFLOW程序实现,双参数方法相对于单参数方法的优势在于可以通过调节 B F I m a x BFI_{max} BFImax来修改基流过程。 B F I m a x BFI_{max} BFImax不是一个可观测的量,Eckhardt给出了推荐值:对于常年性排水流域为0.8,对于季节性排水流域为0.5,对于常年性排水但是硬质基岩的流域为0.25。需要指出的是,当 B F I m a x BFI_{max} BFImax为0.5时,双参数和单参数数字滤波方法等价。

二、其他基流分割方法

基流指数(BFI)法

基流指数(BFI)法又称最小滑动法, 该方法以基流指数为权系数来计算基流量, 在区域枯季径流的研究中, 该值可反映区域地下水资源量的参数。通常情况下, 主要由地下水补给的河流BFI接近1, 而季节性河流的BFI值趋近0。

BFI法是英国水文所 (Institute of Hydrology) 提出的一种基流分割方法,又叫最小滑动法。其原理为:首先将年流量过程按照给定的时间间隔N分割为m(m=365/N) 段,确定每段的最小流量序列 (q1,q2,…,qm);然后从中确定拐点 (如果满足kqt小于qt-1和qt+1,则qt为拐点)。最后将所有的拐点连接得到基流过程,拐点之间的基流则通过线性插值得到。如果某时刻基流超过总径流,则将该时刻基流修改为总径流量。在实际分割中,通常k取值0.9或者0.979能得到较好的效果。此外,在地下水分析中基流指数BFI (一般以年或者多年为统计时期) 是反映流域特性的一个重要特征量,其定义为统计时期内基流所占总径流的比。

时间步长(HYSEP)法

Petty John和Henning于1979年提出了HYSEP程序, 此方法首次实现了基流计算的程序。HYSEP法是美国地质调查局(USGS)使用的主要基流计算方法。HYSEP法有固定步长法、 滑动步长法和局部最小值法3种方式。固定步长法(Fixed interval), 在上述所选取的时间间隔内, 将该时间间隔内的最小流量作为该时段内任意一天的基流。滑动步长法(Sliding interval), 将某天前后(2N-1)/2d内的最小流量作为该天的基流, 由此计算出每一天的基流。局部最小值法(Local minimum), 选择时间步长内中心点前后(2N-1)/2d内的最小流量作为相邻时间步长内中心点的基流值, 然后通过线性内插得到步长中心点之外时段的基流。3种方法均以本次计算的终点作为下次时间的起点, 重复以上过程便可计算出基流分割过程。

PART法

PART是美国地质调查局(USGS)提出的用于分割基流的另一种计算机程序, PART法适用于以谷地泻流方式排泄或测站位于下游终点的河流, 所需径流资料不少于一个水文年。该方法以日流量为数据源, 基于前期径流消退进行分割。这种方法首先将日平均流量数据排列成单维数组, 然后在数组中选择符合前期衰退要求的日值, 在符合条件的这些天数中, 如果日衰退量小于0.1个对数周期, 日径流量值即作为基流量, 在其余的日期中, 基流值则通过线性插值的方法来获得。

加里宁-阿里巴扬基流估算改进方法

基于水量平衡原理, 加里宁提出了基流的分割方法, 杨远东和陈利群等对其进行改进。实际资料表明, 改进的方法避免了地下水流量过程估算的任意性, 且减少了计算工作量, 所得成果是合理的, 方法是简易可行的。其估算方程为:
在这里插入图片描述

三、计算程序及代码

SWAT Baseflow Program基流计算程序

基本原理

该程序使用递归滤波技术来分离基本流量,并计算流量衰退常数(α),SWAT官网包含该程序的下载链接。SWAT Bflow程序的算法参照Arnold和Allen等人提出的单参数数字滤波方法,其滤波方程为:
在这里插入图片描述
滤波器可以在流量数据上通过三次(正向、反向和正向),这取决于用户从流量数据的试点研究中选择的基本流量估计值。通常,每次通过都会导致基本流量占总流量的百分比减少。对于所分析的数据,显示基流的最高、最低和平均减少量。此选项为用户提供了更多的灵活性,可以调整分离,以更准确地接近现场条件。可以参考相关论文,以及实际情况选择合适的通道。

根据base flow源代码,Baseflow 中3个通道(Bflow Pass1、2、3),的基流计算代码如下:

!! perform passes to calculate base flow
f1 = 0.925
f2 = 0.
f2 = (1. + f1) / 2.
surfq(1) = strflow(1) * .5
baseq(1,1) = strflow(1) - surfq(1)
baseq(2,1) = baseq(1,1)
baseq(3,1) = baseq(1,1)
!! make the first pass (forward)    
do i = 2, isumd
  surfq(i) = f1 * surfq(i-1) + f2 * (strflow(i) - strflow(i-1))
  if (surfq(i) < 0.) surfq(i) = 0.
  baseq(1,i) = strflow(i) - surfq(i)
  if (baseq(1,i) < 0.) baseq(1,i) = 0.
  if (baseq(1,i) > strflow(i)) baseq(1,i) = strflow(i)
end do

!! make the second pass (backward)     
baseq(2,isumd - 1) = baseq(1,isumd - 1)
do i = isumd - 2, 1, -1
  surfq(i) = f1 * surfq(i+1) + f2 * (baseq(1,i) - baseq(1,i+1))
  if (surfq(i) < 0.) surfq(i) = 0.
  baseq(2,i) = baseq(1,i) - surfq(i)
  if (baseq(2,i) < 0.) baseq(2,i) = 0.
  if (baseq(2,i) > baseq(1,i)) baseq(2,i) = baseq(1,i)
end do

!! make the third pass (forward)    
baseq(3,isumd - 1) = baseq(1, isumd - 1)
do i = 2, isumd
  surfq(i) = f1 * surfq(i-1) + f2 * (baseq(2,i)- baseq(2,i-1))
  if (surfq(i) < 0.) surfq(i) = 0.
  baseq(3,i) = baseq(2,i) - surfq(i)
  if (baseq(3,i) < 0.) baseq(3,i) = 0.
  if (baseq(3,i) > baseq(2,i)) baseq(3,i) = baseq(2,i)
end do

Baseflow输入输出文件

输入文件主要是参数文件file.lst、流量序列文件xxxxxxxx.prn。

对于file.lst,文件内容如下,对于第2-4行的变量,程序不要求数字位于该行的某个位置。但是,数字必须是行上的第一个数字,后面必须有一个空格,以将其与行上写的任何其他内容隔开。
在这里插入图片描述
文件变量格式为
在这里插入图片描述
NDMIN,用于计算地下水衰退方程中 alpha 值的最小天数。NDMIN 的默认设置为 10。
NDMAX,用于计算地下水衰退方程中 alpha 值的最大天数。NDMAX 的默认设置为 300。
IPRINT, 该变量控制每日数据的打印。0 不打印每日值,1 打印每日数值如果 IPRINT 设置为 1,则必须定义输出文件名 FLWFILE_OUT。 IPRINT 的默认设置为 0。
FLWFILE,包含每日流量数据的文件的名称。 文件名最多可包含 15 个字符。 可以同时处理多个的流量数据文件。
FLWFILE_OUT,每日过滤器结果写入的文件的名称。 仅当 IPRINT = 1 时才需要。文件名最多可包含 15 个字符。 必须为每个流数据文件指定不同的每日输出文件名。

对于xxxxxxxx.prn,
baseflow 程序以空格分隔数据,第一列为时间YYYYMMDD,第二列为流量,
除了转换制表符之外,还必须删除 USGS 放置在数据文件顶部的所有标题信息。 基流程序假定文件中的第一行用于标头信息。 所有其他行应包含日期和每日流量值。

输出文件主要为baseflow.dat,xxxxxxxx.out(当IPRINT为1时),baseflow.dat各指标为
Baseflow Fr1,由第一通道估计的基流贡献系数。
Baseflow Fr2 由第二通道估计的基流贡献系数。
Baseflow Fr3 由第三通道估计的基流贡献系数。
NPR 用于计算主衰退曲线的单个基流衰退数量。
Alpha Factor 基流衰退常数
Baseflow days 基流衰退在一个对数周期内下降的天数。

xxxxxxxx.out中各列为:
Streamflow 流量数据文件中的逐日流量, m 3 / s m^3/s m3/s
Bflow Pass1 第一通道估计的逐日基流, m 3 / s m^3/s m3/s
Bflow Pass2 第二通道估计的逐日基流, m 3 / s m^3/s m3/s
Bflow Pass3 第三通道估计的逐日基流, m 3 / s m^3/s m3/s

Lyne-Hollick滤波法Python代码

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np

def hollickLyneFilter(data, beta=0.925, invert=True):
    """
    Calculate baseflow from a given discharge timeseries using the 
    digital filter method proposed by Hollick and Lyne (1979).


    Definition
    ----------
    def hollickLyneFilter(data,beta=0.925,invert=True)

    Input
    -----
    data   : numpy.ndarray 1D

    Optional Input
    --------------
    beta   : float -> dimensionless filter parameter. The default value 
                      was proposed by Nathan and McMahon (1990)
    invert : True  -> add a backward filter pass
           : False -> no backward filterpass, will result in a phase shift

    Output
    ------
    numpy.ndarray 1D

    Literature
    ----------
    Lyne, V. & Hollick, M. 1979, “Stochastic time-variable rainfall-runoff modelling”, 
    Proceedings of the Hydrology and Water Resources Symposium, Perth, 10-12 September, 
    Institution of Engineers National Conference Publication, No. 79/10, pp. 89-92. 

    Nathan, R. J. & McMahon, T. A. 1990a, “Evaluation of automated techniques for base 
    flow and recession analysis”, Water Resources Research , Vol. 26, pp. 1465-1473. 
    """
    out = data.copy()

    for i in range(1, len(data)):
        bflow = beta * out[i-1] + (1 - beta) * .5 * (data[i]+data[i-1])
        out[i] = min(bflow, data[i])

    if invert:
        out = hollickLyneFilter(out[::-1], beta, invert=False)[::-1]

    return out[1:]


if __name__ == "__main__":
    data = np.array([368.500, 408.100, 493.600, 502.500, 453.100, 439.600, 408.100,
                     430.600, 417.100, 412.600, 390.100, 381.300, 360.300, 340.000,
                     293.100, 276.600, 283.100, 279.800, 270.200, 263.900, 239.800])
    bflow = hollickLyneFilter(data)
    print("", bflow)
    blow = hollickLyneFilter(data, invert=False)
    print("", bflow)
    blow = hollickLyneFilter(data, .8)
    print("", bflow)

grwat中的基流分割方法

grwat实现了几种基流滤波方法,包括Lyne和Hollick(1979)、Chapman(1991)、Boughton(1993)、Jakeman和Hornberger(1993)以及Chapman and Maxwell(1996)的方法。

hdata = spas %>%
  mutate(lynehollick = gr_baseflow(Q, method = 'lynehollick', a = 0.9),
         boughton = gr_baseflow(Q, method = 'boughton', k = 0.9),
         jakeman = gr_baseflow(Q, method = 'jakeman', k = 0.9),
         maxwell = gr_baseflow(Q, method = 'maxwell', k = 0.9)) %>% 
  pivot_longer(lynehollick:maxwell, names_to = 'Method', values_to = 'Qbase')

ggplot(hdata) +
  geom_area(aes(Date, Q), fill = 'steelblue', color = 'black') +
  geom_area(aes(Date, Qbase), fill = 'orangered', color = 'black') +
  scale_x_date(limits = c(ymd(19810101), ymd(19811231))) +
  facet_wrap(~Method)
#> Warning: Removed 93508 rows containing non-finite values (`stat_align()`).
#> Removed 93508 rows containing non-finite values (`stat_align()`).

在这里插入图片描述

参考文献

李芳等,黄河源区白河基流分割方法适用性分析
胡胜等,基于数字滤波法和SWAT模型的灞河流域基流时空变化特征研究
Baseflow filtering

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

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

相关文章

【JAVA学习笔记】60 - 坦克大战1.0-绘图坐标体系、事件处理机制

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter16/src/com/yinhai 绘图坐标体系 一、基本介绍 下图说明了Java坐标系。坐标原点位于左上角&#xff0c;以像素为单位。在Java坐标系中&#xff0c;第一个是x坐标&#xff0c;表示当前位置为…

Leetcode循环队列(数组实现及链表实现)

这道题十分考验我们对队列的理解。 文章目录 队列的介绍队列的实现进入正题数组的方法链表实现 队列的介绍 队列是一种只允许在一段进行插入&#xff0c;在另一端进行删除的数据操作的特殊线性结构&#xff0c;&#xff0c;因此决定了他具有先入先出的特点&#xff0c;其中进行…

2023软件测试高薪必备pytest-yaml 测试平台-1.新增项目和用例

前言 基于pytest-yaml-yoyo 框架写的接口测试平台&#xff0c;在web网页平台上维护yaml测试用例&#xff0c;执行用例&#xff0c;并查看allure报告。 pytest-yaml-yoyo 框架简介 https://gitee.com/yoyoketang/pytest-yaml-yoyo 本框架只需pip安装即可上手 pip install pyt…

C++类和对象万字详解(典藏版)

文章目录 前言认识类和对象使用 struct 定义类class 定义类类的声明和定义分离类大小的计算this指针this指针的常见的面试题 构造函数与构析函数构造函数初始化列表 构析函数默认生成的构造函数和构析函数 拷贝构造函数默认类型转化与 explicit 关键字 static 成员变量运算符重…

判断字符串是否为json

//营业时间返回数组String businessDate merchantInfoResp.getBusinessDate();Object obj JSON.parse(businessDate);if (obj instanceof JSONArray) {merchantInfoResp.setBusinessDateDesc(JSON.parseArray(JSON.toJSONString(obj), Integer.class));} else {//营业日期判断…

YB2408CAX系列是一款高效、高频的同步降压DC-DC转换器,最高可带载2A连续电流。

概述: YB2408CAX系列是一款高效、高频的同步降压DC-DC转换器&#xff0c;最高可带载2A连续电流。YB2408CAX系列可在2.7V到5.5V的宽输入电源电压下工作。内部的主开关和同步开关管的RoSO非常小&#xff0c;从而传导损耗很小&#xff0c;效率很高。该款芯片工作开关频率为1.5MHz…

向中学生郑重推荐电视剧《狂花凋落》

笔者为什么要向网友&#xff0c;特别是要向中学生网友&#xff0c;郑重推荐能真实反应当年“文革”时期知识青年上山下乡悲惨遭遇的电视剧《狂花凋落》&#xff0c;因为如果真的再来上一次那种亘古未有的人间浩劫&#xff0c;那么在蜜糖里泡大、丁点儿苦都吃不下的当今中学生&a…

操作系统备考学习 day12 (第五章)

操作系统备考学习 day12 第五章 &#xff08;输入/输出&#xff09;I/O管理5.1 I/O管理概述5.1.1 I/O设备I/O设备的分类 5.1.2 I/O控制器I/O设备的电子部件 5.1.3 I/O控制方式程序直接控制方式中断驱动方式DMA方式DMA控制器通道控制方式 5.1.4 I/O软件层次结构用户层软件设备独…

直播电商大变局:店播时代终于来了!

店播时代终于来了。 直播在2023年双十一的亮点&#xff0c;也是焦点。今年双十一&#xff0c;舆论场的注意力都集中在了几大平台的头部主播身上&#xff0c;却少有人注意店播的表现——根据淘宝直播官方数据&#xff0c;10月31日淘宝直播上有29个直播间开局即破亿&#xff0c;…

Pytorch从零开始实战08

Pytorch从零开始实战——YOLOv5-C3模块实现 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——YOLOv5-C3模块实现环境准备数据集模型选择开始训练可视化模型预测总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c…

应用层中一些零碎且易忘的知识点

邮件发送协议&#xff1a; SMTP&#xff1a;SMTP协议只能传送ASCII码文本数据&#xff0c;不能传送可执行文件或其他的二进制对象&#xff08;如带有图片、音频或视频数据的多媒体邮件&#xff09;MIMP&#xff1a;为解决SMTP传送非ASCII码文本的问题&#xff0c;提出了多用途因…

HR模块开发(1):简单的开发流程和注意事项

HR模块开发 一、模块概述 人力资源管理解决方案关注3个领域:每位雇员都发展和维护着‘公司内’和‘公司外’的种种‘关系’。运用科技,强化这些关系,可以提高忠诚度和生产力,公司整体得到商业价值。 员工关系管理员工职业生命周期管理员工事务处理管理HR模块的基本知识和构…

Linux: MV指令(覆盖替换重命名)

MV指令 mv [-bfiuv] [–help] [–version] [-S <附加字尾>] [-V <方法>] [源文件或目录] [目标文件或目录]-b 若需覆盖文件&#xff0c;则覆盖前先行备份-f 若目标文件或目录与现有的文件或目录重复&#xff0c;则直接覆盖现有的文件或目录-i 覆盖前先行询问用户–…

Python武器库开发-常用模块之copy模块(十五)

常用模块之copy模块(十五) 在Python编程中&#xff0c;我们经常遇到需要复制或拷贝数据的情况。为了避免不必要的问题和错误&#xff0c;Python提供了copy模块来处理复制操作。本文将介绍copy模块的用法&#xff0c;包括浅拷贝和深拷贝的概念以及如何在不同场景中使用。 我们…

【有源码】基于Python的篮球人才管理系统Springboot的篮球竞赛管理系统(源码、调试、lw、开题报告、ppt)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

算法题:16. 最接近的三数之和(Python Java 详解)

解题思路 Step1&#xff1a;先对数组排序&#xff0c;然后设置3个指针&#xff0c;指针1遍历范围为&#xff08;0~数组长度减2&#xff09;。 Step2&#xff1a;指针1位置确定时&#xff0c;指针1后面的数组元素首位各放置一个指针&#xff08;指针2、指针3&#xff09;。 S…

006 Linux 进程的概念 | 获取进程的PID

前言 本文将会向您进程的概念&#xff0c;程序与进程的区别&#xff0c;如何获取进程的标识符-pid 文章重点 1.描述进程——PCB 进程与程序的区别 CPU对进程列表的处理 2.获取进程PID 描述进程-PCB 进程概念 课本概念&#xff1a;程序的一个执行实例或正在执行的程序 内核…

在Flask中实现文件上传七牛云中并下载

在Flask中实现文件上传和七牛云集成 文件上传是Web应用中常见的功能之一&#xff0c;而七牛云则提供了强大的云存储服务&#xff0c;使得文件存储和管理变得更加便捷。在本篇博客中&#xff0c;我们将学习如何在Flask应用中实现文件上传&#xff0c;并将上传的文件保存到七牛云…

Java NIO 编程

1. 简介 Java NIO 是 JDK 1.4 中引入的新的 IO 方式&#xff0c;它主要包含 Buffer、Channel、Selector 这三个核心的组件&#xff0c;它与传统 IO 的区别如下&#xff1a; NIO IO 面向缓冲 面向流 同步非阻塞 同步阻塞 多路复用&#xff08;选择器&#xff09; 无 1.1…