[学习分享]基于matlab的新安江模型_01_模型介绍与蓄满产流

写在前面的 

  最近笔者刚完成水文预报这门课的课程设计,课程设计要求根据课本自行实现新安江模型,完成径流模拟。现在课程设计已经基本全部做完,自己感觉做的也还不错,同时也因为蛮喜欢水文预报这门课的,所以想再对课程设计的整个过程做个整理分享出来,也希望能够帮助到一些困惑于课程设计的同学。

  需要注意的是,本文构建的新安江模型仅是一个简易版本的新安江模型。主要体现为:在分水源计算中只划分了地面径流和地下径流;在坡面汇流中地上部分径流未直接转换法(即没有考虑其汇流过程);在参数方面仅进行了简易的人为调参,并未进行更进一步的参数调整。

  同时笔者代码能力和语言表达能力有限,可能存在部分错误,如果有发现,也麻烦大家多多指正,谢谢!

内容大纲

  本文完成了从半分布式和集总式两个方面进行新安江模型的构建,模型各个部分具体使用的模块如下:

流程

集总式

半分布式

数据预处理

计算泰森多边形

计算泰森多边形

计算面雨量

蓄满产流计算

根据E0推求E,并进行三层蒸散发计算

根据E0推求EP,并进行三层蒸散发计算

根据蒸散发量E及面雨量推求净雨量PE

根据蒸散发量E及各子流域降雨量推求各子流域净雨量PE

根据净雨量及EU,EL,ED计算得出本时刻径流深及下一时刻初的土壤含水量W

根据净雨量及EU,EL,ED计算得出本时刻径流深及下一时刻初的土壤含水量W

循环上述三步骤计算得出整个流域每个时刻的径流深R

循环上述三步骤计算得出各个子流域每个时刻的径流深Ri

分水源计算

根据蒸发能力FC及净雨量PE将径流深分为地面径流Rs及地下径流Rg

根据蒸发能力FC及净雨量PE将径流深分为地面径流Rs及地下径流Rg

坡面汇流

地上径流使用单位线转换法直接将Rs转化为Qs

地下径流使用线性水库法将Rg转化为Qg

地上径流使用单位线转换法直接将Rs转化为Qs

地下径流使用线性水库法将Rg转化为Qg

河网汇流

由Qs和Qg线性相加计算Qt,再根据滞后演算法计算模拟流量Q

对每个子流域根据马斯京跟法分段演算法计算其在出口断面处流量并线性相加得到模拟流量Q

精度评定

绘制逐年实测径流和模拟径流及降水图并计算确定性系数DC均方根误差RSME

绘制逐年实测径流和模拟径流及降水图并计算确定性系数DC均方根误差RSME

  本文的公式参考主要来源于包为民老师的《水文预报》第五版,后续的原理、公式等若不做额外说明则均摘自于该书。

新安江模型介绍

  新安江模型是华东水利学院(现河海大学)赵人俊教授团队提出的一个水文模型,是中国少有的一个具有世界影响力的水文模型。新安江模型是集总式水文模型(划分子流域时成为分散式水文模型),可用于湿润地区与半湿润地区的湿润季节。当流域面积较小时,新安江模型采用集总式模型,当面积较大时,采用半分布式模型。它把全流域分为许多块单元流域,对每个单元流域作产汇流计算,得出单元流域的出口流量过程。再进行出口以下的河道洪水演算,求得流域出口的流量过程。把每个单元流域的出流过程相加,就求得了流域的总出流过程。

蓄满产流

  蓄满产流的基本原理是:土壤所能够容纳的水量是一定的,当土壤蓄水量达到一定程度时,降落到土壤上的水一部分将不会再进行下渗而是产生径流,即“蓄满产流”。

   三层蒸散发蓄满产流的基本流程为(以逐日为例):

   (1)首先根据土壤上层含水量WU、降雨P和流域蒸发能力Ep,进行三层蒸散发推求土壤上中下层的土壤蒸发:

    由于本课程设计蒸发数据为蒸发皿蒸发量E0,因此想要得到流域蒸发能力Ep需要对E0乘上蒸发折算系数Kc

  Ep=Kc·E0

    折算后进行三层蒸散发计算,原理如下:

    计算公式如下:

   (2)根据(1)得到的总蒸发量计算净雨量PE。

PE=P-E

   (3)根据降雨径流关系计算产流量:

   (4)通过上述计算可以得到某一日的三层蒸发量Eu,El,Ed、净雨量PE、产流量R。如果这一日的PE>0,则这一日土壤含水量的变化量为:当日降雨量经过蒸发再经产流所剩余的水量。因此,计算产流后剩余的水量,三层土壤的含水量从上到下三层依次得到补充。但如果这一日的PE<=0,则这一日的土壤含水量变化量为:当日蒸发蒸发完当日降水量后所剩的蒸发量。同样的,剩余土壤的三层土壤的含水量从上到下三层依次进行蒸发。最后得到这一日结束时的土壤含水量作为下一日开始的土壤含水量,再从(1)开始进行计算。

   后续的代码将按照上述四个步骤循环计算,直到完成所有计算,最终对于每一次蓄满产流计算均可以得到该蓄满产流模型产流量计算表:

  对于上述步骤的matlab代码实现:

function [jieguo]=xuman(p,e0,w_chushi,wm,wum,wlm,wdm,b,k,c)
%p,e0请以行向量的形式输入
%w_chushi,请按照wm wu wl的形式以一个1x3的行向量的形式输入
%eg:w_chushi=[0 0 50];
%输如初始值
%wm=120;wum=15;wlm=85;wdm=20;b=0.3;k=0.95;c=0.14;
%读取数据并赋值
ep=e0*k;
w=w_chushi;%初始含水量
%%土壤含水量记录器
w_recoder=w;
%计算最大值a
wmm=wm*(1+b);
%设置各个变量的初始值
[x]=length(p);
eu=zeros(x,1);el=zeros(x,1);ed=zeros(x,1);e=zeros(x,1);r=zeros(x,1);
%计算三层蒸散发
for i=1:length(p)
    if w(1)+p(i)>=ep(i)
        eu(i)=ep(i);
        el(i)=0;
        ed(i)=0;
    elseif w(1)+p(i)<ep(i) 
        if w(2)>=c*wlm
            eu(i)=w(1)+p(i);
            el(i)=(ep(i)-eu(i))*w(2)/wlm;
            ed(i)=0;
        elseif  c*(ep(i)-w(1)+p(i))<=w(2) && w(2)<c*wlm
            eu(i)=w(1)+p(i);
            el(i)=c*(ep(i)-eu(i));
            ed(i)=0;
        elseif w(2)<c*(ep(i)-w(1)+p(i))
            eu(i)=w(1)+p(i);
            el(i)=w(2);
            ed(i)=c*(ep(i)-eu(i))-el(i);
        end
    end
    %计算总蒸散发及pe
    e(i)=eu(i)+el(i)+ed(i);
    pe(i)=p(i)-e(i);
    %径流
    a(i)=wmm*(1-(1-(sum(w)/wm))^(1/(1+b)));
    if pe(i)<=0
        r(i)=0;
    else
        if a(i)+pe(i)<=wmm
            r(i)=pe(i)+sum(w)-wm+wm*(1-(pe(i)+a(i))/wmm)^(b+1);
        else
            r(i)=pe(i)-(wm-sum(w));
        end
    end
    %考虑降水与蒸发对土壤含水量变化
    if w(1)+pe(i)-r(i)>=0
        w(1)=w(1)+pe(i)-r(i);
    else 
        if w(2)+pe(i)-r(i)>=0
            w(2)=w(1)+pe(i)+w(2)-r(i);
            w(1)=0;
        else 
            w(3)=w(1)+w(2)+w(3)+pe(i)-r(i);
            w(1:2)=0;
        end
    end
    %因为每一层土壤含水量都有最大值,保证含水量不会超过最大值
    if w(1)>wum
        w(2)=w(2)+w(1)-wum;
        w(1)=wum;
    end
    if w(2)>wlm
        w(3)=w(3)+w(2)-wlm;
        w(2)=wlm;
    end
    if w(3)>wdm
        w(3)=wdm;
    end
    w_recoder=[w_recoder;w];%记录
end
jieguo(:,1)=p;
jieguo(:,2)=e0;
jieguo(:,3)=ep;
jieguo(:,4)=eu;
jieguo(:,5)=el;
jieguo(:,6)=ed;
jieguo(:,7)=e;
jieguo(:,8)=pe;
jieguo(:,9)=w_recoder(1:length(w_recoder)-1,1);
jieguo(:,10)=w_recoder(1:length(w_recoder)-1,2);
jieguo(:,11)=w_recoder(1:length(w_recoder)-1,3);
jieguo(:,12)=sum(w_recoder(1:(length(w_recoder)-1),:),2);
jieguo(:,13)=r;
end

    

  该函数最终输出的jieguo矩阵以步骤⑤中的表形式保存排列,大家可以自行代入该表的数据进行计算以验证代码计算的正确性。

  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
d2q9模型是求解多孔介质流问题的一种常用模型,使用Lattice Boltzmann Method(LBM)来进行模拟。LBM是一种基于统计物理原理的计算流体力学方法,适用于复杂的流动问题。 在多孔介质流问题中,流体在多孔介质中的流动行为受到多孔介质的物理性质和结构的影响。d2q9模型将流体分为九个速度分量,在每个节点上计算各个速度分量上的分布函数,并通过碰撞和迁移过程更新分布函数,最终得到流场的分布。 模拟多孔介质流的过程包含以下几个步骤: 1. 初始化网格:建立一个包含多个节点的正方形网格,每个节点上包含九个速度分量的分布函数。 2. 设置边界条件:给定边界的速度或压力等条件,将边界节点更新为已知值。 3. 碰撞过程:根据碰撞模型,计算每个节点上各个速度分量的分布函数的新值。这一步骤包括计算宏观量(如密度、速度)和计算局部均衡函数。 4. 迁移过程:通过迁移过程更新每个节点上的分布函数,使信息从当前节点传播到相邻节点。 5. 重复碰撞和迁移步骤:多次重复步骤3和步骤4,直到达到收敛条件(如稳定的流场分布)。 6. 结果分析:根据模拟结果,计算感兴趣的物理量(如速度、压力、流量等)并进行可视化。 在Matlab中进行多孔介质流的模拟,可以根据LBM的算法和d2q9模型的特点,编写相关的数值计算程序。通过编程实现的模拟过程,可以得到多孔介质流的详细分布情况,并能对不同参数和边界条件进行敏感性分析,以获得更深入的理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值