⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xaj.txt

📁 新安江模型是分散型性的水文流域模型
💻 TXT
📖 第 1 页 / 共 2 页
字号:
Tfrm_XinAnJiangModel = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
    {--------------------------一些常用计算公式----------------------------}
    function RunoffToFlow(F,Hour ouble) ouble;
    function NetPre(K,P,EM ouble) :Double;     //NetPrecipitationEvaporation
    function MaxWSCap(WM,B,IMP :Double) :Double;//maximum water storage capacity
    function MaxFWSCap(SM,EX :Double) :Double;//maximum free water storage capacity
    function QRGroundWater(KKG,QRG0,RG,U :Double) :Double; //GroundWater地下水的计算
    function AveRainFall(StationRF,Weight :array of double) :Double;
    {------------------------蓄满产流函数---------------------------------}
    procedure xmcl(K,WM,B,IMP :Double; P,EM,W :Double; var R :Double); //蓄满产流
    procedure zsf(K,WM,WUM,WLM,C :Double; P,EM,WU0,WL0,WD0,R :Double;var WU1,WL1,WD1,E :Double);//蒸散发模型
    procedure syhf(K,IMP,WM,B,KSS,KG,SM,EX :Double; P,EM,W,R,S0 :Double; SDCount :Integer;
      var RS,RSS,RG,S1 :Double);//水源划分
    procedure UnitLine(n,K,Hour :Double; var U :array of double);//时段单位线
    procedure Confluence(I,U :array of Double; var Q :array of double);  //Confluence----汇流计算
    procedure SoilHumidity(rq :array of TDateTime; K,K4,K5,K6,K7,K8,WM,B,IMP,WUM,WLM,C,SM,EX,KSS,KG :Double;
      P,EM :array of double;SDCount :Integer; U0 :Double; var WU,WL,WD,S :array of double;
      var E,R,RS,RSS,RG :array of double); //计算土壤蓄水量及净雨量
    procedure XinAnJiang(rq :array of TDateTime; K,K4,K5,K6,K7,K8,WM,B,IMP,WUM,WLM,C,SM,EX,KSS,KG,KKG,NN,NK :Double; N:Integer;
        P,EM :array of double; SDCount :Integer; U0 :Double; var QRG0,FR,S,WU,WL,WD :Double; var Q :array of double);//新安江模型
    procedure XinAnJiang1(rq :array of TDateTime; K,K4,K5,K6,K7,K8,WM,B,IMP,WUM,WLM,C,SM,EX,KSS,KG,KKG,NN,NK :Double; N:Integer;
        P,EM :array of double; SDCount :Integer; U0 :Double; var QRG0,FR :Double; var S,WU,WL,WD,E,R,RS,RSS,RG,Q :array of double);//新安江模型
    procedure XinAnJiang2(rq :array of TDateTime; K,K4,K5,K6,K7,K8,WM,B,IMP,WUM,WLM,C,SM,EX,KSS,KG,KKG :Double; UH :array of double;
        N:Integer,EM :array of double; SDCount :Integer; U0,QJL :Double; var QRG0,FR,S,WU,WL,WD :Double; var Q :array of double);//新安江模型
    {-------------------------计算Γ(X)函数------------------------------}
    function Gamma(XX :Double) :Double; //计算Γ(X)
    function GammaLn(XX :Double) :Double; //计算lnΓ(X)
    procedure GammaSeries(var GammaSer :Double; A,X :Double; var GamLN :Double);  //Series级数   Γ分布函数的级数展式解
    procedure GammaConFrac(var GammaCF :Double; A,X :Double; var GamLN :Double);  //ConFrac-ContinuedFraction连分式 //Γ分布函数的连分式展式解
    function GammaP(A,X :Double) :Double;  //Γ分布函数P(a,x) a--n  x--t/K
    function GammaQ(A,X :Double) :Double;  //Γ分布函数余函数Q(a,x)    
  end;

var
  frm_XinAnJiangModel: Tfrm_XinAnJiangModel;

implementation
uses unt_csld;
{$R *.dfm}

{ TForm4 }

function Tfrm_XinAnJiangModel.AveRainFall(StationRF, Weight: array of double): Double;
var
  I :Integer;
  Total :Double;
begin
  Total :=0;
  for I :=1 to High(StationRF) do
    Total :=Total+StationRF*Weight;
  Result :=Total;
end;

//-------------流域最大自由蓄量
function Tfrm_XinAnJiangModel.MaxFWSCap(SM, EX: Double): Double;
begin
  Result :=SM*(1+EX);
end;

//-------------流域最大蓄量
function Tfrm_XinAnJiangModel.MaxWSCap(WM, B, IMP: Double): Double;
begin
  Result :=WM*(1+B)/(1-IMP);
end;

//-----------有效降雨
function Tfrm_XinAnJiangModel.NetPre(K, P, EM: Double): Double;
begin
  Result :=P-K*EM
end;

//--------------地下水汇流公式
function Tfrm_XinAnJiangModel.QRGroundWater(KKG, QRG0, RG, U: Double): Double;
begin
  Result :=QRG0*KKG+RG*(1-KKG)*U;
end;

//-------------单位转换系数,将径流深转化成流量
function Tfrm_XinAnJiangModel.RunoffToFlow(F, Hour: Double): Double; //F流域面积,单位为平方公里
begin
  Result :=F/(3.6*Hour);
end;

procedure Tfrm_XinAnJiangModel.syhf(K, IMP, WM, B, KSS, KG, SM, EX, P, EM,
  W, R, S0: Double; SDCount: Integer; var RS, RSS, RG, S1: Double);
var
  i,D,G :integer;
  KSSD,KGD,SMM,FR,AU :Double;
  X,PE,PE0 :Double;
  SS :array of Double;
  //S,Z1 :Double;
begin
  RS:=0; RSS:=0; RG:=0; S1:=0;
  PE :=NetPre(K,P,EM);
  if PE>0 then begin
    FR :=R/PE-IMP; //当有效降雨大于0时,产流面积的计算应是净雨深/有效降雨
    if Frac(PE/5.0)<>0 then D :=Trunc(PE/5.0)+1
    else D :=Trunc(PE/5.0);
    PE0 :=PE/D;  G :=D;
    KSSD :=(1-Power(1-(KG+KSS),1.0/G))/(1+KG/KSS);     //差分计算时,KSSD的计算公式?
    KGD :=KSSD*KG/KSS;
    SMM :=MaxFWSCap(SM,EX);
    SetLength(SS,D+1);
    SS[0] :=S0;
    //S :=S0;
    for i :=1 to D do begin
      //AU :=SMM*(1-Power(1-S0/SM,1.0/(1+EX)));
      AU :=SMM*(1-Power(1-SS[i-1]/SM,1.0/(1+EX)));
      if PE0+AU>=SMM then begin
        //RS :=(PE0+S0-SM)*FR+RS;
        RS :=(PE0+SS[i-1]-SM)*FR+RS;
        RSS :=SM*KSSD*FR+RSS;
        RG :=SM*KGD*FR+RG;
        //S0 :=(1-KSSD-KGD)*SM;
        SS :=(1-KSSD-KGD)*SM;
      end else begin
        X :=SM*Power(1-(PE0+AU)/SMM,1+EX);
        //RS :=(PE0-SM+S0+X)*FR+RS;
        RS :=(PE0-SM+SS[i-1]+X)*FR+RS;
        RSS :=(SM-X)*KSSD*FR+RSS;
        RG :=(SM-X)*KGD*FR+RG;
        //S0 :=(1-KSSD-KGD)*(SM-X);
        SS :=(1-KSSD-KGD)*(SM-X);
      end;
    end;//end for
    RS :=RS+IMP*PE; //地面径流包括透水面积上直接径流和不透水面积上直接径流
    //S1 :=S0;
    S1 :=SS[D];
    //Z1 :=RS+RSS+RG+S1*FR-S*FR;
    //Z1 :=RS+RSS+RG+S1*FR-S0*FR;
  end
  else begin   //PE<=0
    if (W>WM) and (W<WM+0.00001) then W :=WM;
    FR :=(1-IMP)*(1-Power(1-W/WM,B/(1+B)));
    G :=1;
    KSSD :=(1-Power(1-(KG+KSS),1.0/G))/(1+KG/KSS);     //差分计算时,KSSD的计算公式?
    KGD :=KSSD*KG/KSS;
    RS :=0;
    RSS :=S0*KSSD*FR;
    RG :=S0*KGD*FR;
    S1 :=(1-KSSD-KGD)*S0;
    //Z1 :=RS+RSS+RG+S1*FR-S0*FR;
  end;
  SS :=nil;
end;

procedure Tfrm_XinAnJiangModel.xmcl(K, WM, B, IMP, P, EM, W: Double;
  var R: Double);
var
  WMM,A,PE :Double;
begin
  //FR :=(1-IMP)*(1-Power(1-W/WM,B/(1+B))); //某时段透水面积的产流面积
  PE :=NetPre(K,P,EM);
  if PE>0 then
  begin
    WMM :=MaxWSCap(WM,B,IMP);
    if (W>WM) and (W<WM+0.00001) then W :=WM;
    A :=WMM*(1-Power(1-W/WM,1.0/(1+B)));    //防止由于计算机的精度问题使W可能微微大于120
    if (A+PE)<WMM then R :=PE-WM+W+WM*Power(1-(PE+A)/WMM,1+B)
      else R :=PE-(WM-W);
   //FR1 :=R/PE;   //表示平均净雨深面积
   // Memo1.Lines.Add('FR1='+floattostr(FR1));
  end else
  begin
    R :=0;
  end;
end;

procedure Tfrm_XinAnJiangModel.zsf(K, WM, WUM, WLM, C, P, EM, WU0, WL0,
  WD0, R: Double; var WU1, WL1, WD1, E: Double);
var
  //W0 :Double;
  EU,EL,ED,PE :Double;
begin
  //W0 :=WU0+WL0+WD0;
  if (WU0>WUM+0.00001) or (WL0>WLM+0.00001) or (WD0>WM-WUM-WLM+0.00001) then begin
    showmessage('WU0='+Floattostr(WU0)+' WL0='+floattostr(WL0)+' WD0='+floattostr(WD0));
    showmessage('WUM='+Floattostr(WUM)+' WLM='+floattostr(WLM)+' WDM='+floattostr(WM-WUM-WLM));
    showmessage('各层土壤蓄水量超过其容量,请核实');
    exit;
  end;
  if R> then begin
    showmessage('净雨深计算错误,其值应小于P');
    exit;
  end;
  PE :=NetPre(K,P,EM);
  if PE>0 then begin
  {PE>0}
    EU :=K*EM;
    EL :=0;
    ED :=0;//各层蒸散发值
    //E :=EU+EL+ED;
    //计算各层土壤蓄水量
    if WU0+PE-R>WUM then
      if WU0+WL0+PE-R-WUM>WLM then
      begin
        WU1 :=WUM;
        WL1 :=WLM;
        WD1 :=WU0+WL0+WD0+PE-R-WUM-WLM;
        if WD1<0 then //------------------------------------土壤蓄水量小于0,不可能发生------------------------------------
      end
      else begin
        WU1 :=WUM;
        WL1 :=WU0+WL0+PE-R-WUM;
        WD1 :=WD0;
      end
    else begin
      WU1 :=WU0+PE-R;
      WL1 :=WL0;
      WD1 :=WD0;
    end;  //PE>0蒸散发计算完毕
  {PE>0}
  end else begin
  {PE<0}
    if R>0 then begin showmessage('PE<0,这时R应该等于0,退出');exit;end;
    if WU0>ABS(PE) then begin
      EU :=K*EM;
      EL :=0;
      ED :=0;
      WU1 :=WU0+PE;
      WL1 :=WL0;
      WD1 :=WD0;
    end else begin
      EU :=WU0+P;
      WU1 :=0;
      if WL0>C*WLM then begin //WL0>C*WLM并不代表EL将小于WL0,当EM很大时,EL将大于WL0,所得WL1将为负值
        EL :=(K*EM-EU)*WL0/WLM;   //只有当(K*EM-EU)>WLM才会出现WL0<EL,此种情况几乎不可能发生
        ED :=0;
        WL1 :=WL0-EL;
        if WL1<0 then showmessage('WL1<0');
        WD1 :=WD0;
      end else begin
        if WL0 >C*(K*EM-EU) then begin//由于EM通常在20以内,故C*(K*EM-EU)值很小,通常不大于4
          EL :=C*(K*EM-EU);
          ED :=0;
          WL1 :=WL0-EL;
          WD1 :=WD0;
        end else begin //此种情况很难发生,除非EM(10-20)很大,WU0,WL0很小(5mm以下)
          EL :=WL0;
          ED :=C*(K*EM-EU)-EL;
          WL1 :=0;
          WD1 :=WD0-ED;
          if WD1<0 then WD1:=0;  //------------------------------------土壤蓄水量小于0,不可能发生--------------------------------------------------------------
        end;//end WL0>C*(K*EM-EU)
      end;//end WL0>C*WLM
    end;//end WU0>ABS(PE)
  {PE<0}
  end; //蒸散发模型计算完毕 返回EU,EL,ED,WU1,WL1,WD1
  E :=EU+EL+ED;
end;

//----------------计算土壤蓄水量及净雨量
//P、EM-N个时段降雨和蒸发能力值,U0-将净雨深转化为流量,S-初期自由蓄水量  SDCount-将一天分为几个时段
//WU、WL、WD-初始值为初期土壤各层蓄水量、返回末期土壤各层蓄水量,QRG0-起始时刻流量,返回末时段流量
procedure Tfrm_XinAnJiangModel.SoilHumidity(rq :array of TDateTime; K,K4,K5,K6,K7,K8, WM, B, IMP, WUM, WLM, C, SM,
  EX, KSS, KG: Double; P, EM: array of double; SDCount: Integer; U0: Double;
  var WU, WL, WD, S, E, R, RS, RSS, RG: array of double);
var
  Year,Month,Day :Word;
  i :Integer;
  //RS,RSS,RG :array of double;
  S1,K1 :Double;
begin
  //SetLength(RS,High(P)+1);    SetLength(RSS,High(P)+1);   SetLength(RG,High(P)+1);
  for i :=Low(P)+1 to High(P) do begin
    DecodeDate(rq,Year,Month,Day);
    case Month of
      4 :K1:=K4;
      5 :K1 :=K5;
      6 :K1:=K6;
      7 :K1:=K7;
      8 :K1:=K8;
      else K1:=K;
    end;
    xmcl(K1,WM,B,IMP,P,EM,WU[i-1]+WL[i-1]+WD[i-1],R);
    zsf(K1,WM,WUM,WLM,C,P,EM,WU[i-1],WL[i-1],WD[i-1],R,WU,WL,WD,E);
    syhf(K1,IMP,WM,B,KSS,KG,SM,EX,P,EM,WU[i-1]+WL[i-1]+WD[i-1],R,S[i-1],SDCount,RS,RSS,RG,S1);
    S :=S1;
  end; //end if
end;

procedure Tfrm_XinAnJiangModel.XinAnJiang(rq :array of TDateTime; K,K4,K5,K6,K7,K8, WM, B, IMP, WUM, WLM, C, SM,
  EX, KSS, KG, KKG, NN, NK: Double; N: Integer; P, EM: array of double;
  SDCount: Integer; U0: Double; var QRG0, FR, S, WU, WL, WD: Double;
  var Q: array of double);
var
  Year,Month,Day :Word;
  i,m :Integer;
  R,RS,RSS,RG :array of double;
  WU0,WL0,WD0,E :array of double;
  IU,QRS,QRG :array of double; //IU=RS+RSS--净雨
  Hour,S0,S1,QJL,K1 :Double; //QJL-基流
  UH :array of double;
begin
  //----计算各时段的RS、RSS、RG
  SetLength(R,N+1);     SetLength(RS,N+1);    SetLength(RSS,N+1);   SetLength(RG,N+1);
  SetLength(WU0,N+2);   SetLength(WL0,N+2);   SetLength(WD0,N+2);   SetLength(E,N+1);
  SetLength(IU,N+1);    SetLength(QRS,N+1);   SetLength(QRG,N+1);
  S0:=S; WU0[1]:=WU; WL0[1]:=WL; WD0[1]:=WD;
  for i :=1 to N do begin
    DecodeDate(rq,Year,Month,Day);
    case Month of
      4 :K1:=K4;
      5 :K1 :=K5;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -