====== tys-sfm_v10 ======
tys-sfm_v10.lzhをダウンロードして解凍すると、「**貯留関数マクロ.xls**」ができます。
この「**貯留関数マクロ.xls**」の使用方法を説明します。
ダウンロードについては、[[http://www.disaster-software.net|水理水文ソフトウェア]]のHPを参照してください。
===== マクロの説明 =====
本マクロは、各条件シートに条件を入力するだけで、**1流域についての貯留関数による流域流出解析計算**が行えます。
- 実績流量より、貯留関数係数の回帰を行う。
- 任意の貯留関数係数を用いて流出解析を行う。
の2種類の計算を行うことができます。
==== 計算条件とデータの入力 ====
=== 計算条件 ===
「計算条件」シートで貯留関数係数の回帰を行うかどうかをチェックしてください。
{{ :流域流出計算:image01.jpg?650|計算条件シート}}
;#;
計算条件シート
;#;
再度計算実行した場合は、計算結果シート(複数)の値がすべて上書きされます。
=== 雨量・流量データ ===
{{ :流域流出計算:image03.jpg?650|雨量・流量データシート}}
;#;
雨量・流量データシート
;#;
\\
- **実績流量より、貯留関数係数の回帰を行う場合** 「計算条件」シートの流域面積・基底流量・流路長さ・遅滞時間計算ピッチを入力してください。 「雨量・流量データ」シートの流域平均雨量・実績流量・計算対象範囲指定のデータを入力してください。__計算対象範囲指定は入力した実績流量のうち、係数決定に用いるデータの範囲を指定します。開始点を「1」、終了点を「2」と入力してください。__
- **任意の貯留関数係数を用いて流出解析を行う場合** 「計算条件」シートの流域面積・基底流量・貯留関数係数(K・P値、遅滞時間、流出係数)を入力してください。「雨量・流量データ」シートの流域平均雨量を入力してください。実績流量は、計算には使用しませんが、雨量・流量結果図で計算結果の評価を行うために入力する方が望ましいでしょう。
==== 計算結果 ====
- 実績流量より、貯留関数係数の回帰を行う場合
- 「計算結果」シートに遅滞時間の設定値ごとの貯留量と流出量の関係の計算結果を書き込みます。この中で、貯留量と流出量のループの積算値の最小値を遅滞時間として採用します。尚、遅滞時間の繰り返し計算は、0時間~最大値(流路長を木村の式に適用した場合の遅滞時間+1)を遅滞時間の計算ピッチ分です。ここで求めた遅滞時間より実績流量を用いた最小自乗法による回帰を行い、K・Pを算出します。
- 「雨量・流量データ」シートの計算流量の列に上記で求めた貯留関数係数を用いて計算した流量を書き込みます。計算結果は「雨量・流量結果図」に反映されます。
- 「貯留量と流出量の関係」シートに決定した貯留関数係数を用いた貯留量と流出量の関係を出力します。その結果は「貯留量と流出量の関係図」シートに反映されます。
-任意の貯留関数係数を用いて流出解析を行う場合
- 「雨量・流量データ」シートの計算流量の列に入力した貯留関数係数を用いて計算した流量を書き込みます。計算結果は「雨量・流量結果図」シートに反映されます。
- 「貯留量と流出量の関係」シートに貯留量と流出量の関係を出力します。その結果は「貯留量と流出量の関係図」シートに反映されます。
\\
{{ :流域流出計算:image02.jpg?650|計算結果}}
;#;
計算結果
;#;
{{ :流域流出計算:image04.jpg?650|雨量・流量結果図}}
;#;
雨量・流量結果図
;#;
{{ :流域流出計算:image05.jpg?650|貯留量と流出量の関係図}}
;#;
貯留量と流出量の関係図
;#;
==== 注意事項 ====
本マクロは、通常の貯留関数法についての計算用であり、総合貯留関数法には適用していません。通常の貯留関数法と総合貯留関数法では、K・P値はそれぞれ全く異なりますので注意してください。
ここで、通常の貯留関数法とは、貯留関数を貯留量(m3)と流出量(m3/s)の関係で表現したもの、総合貯留関数法とは貯留関数を貯留高(mm)と流出高(mm/hr)の関係で表現したものです。総合貯留関数法は貯留関数法を単位流域面積で表現したものと言い換えることができます。
本や論文によっては、__総合貯留関数法を単に「貯留関数法」__と表記されている場合がありますので、基礎式による確認が必要です。
===== VBAソースファイル =====
本マクロのソースを公開しますので、参考にしてください。
Option Explicit
Public m As Integer 'ハイドロデータ数
Public m1 As Integer 'ハイドロ区間1
Public m2 As Long 'ハイドロ区間2
Public l As Double '流域の流路延長(km)
Public a As Double '流域面積(km2)
Public qi As Double '基底流量(m3/s)
'
Public Const mnum As Integer = 1000 '配列数
Public r(0 To mnum) As Double '雨量(mm/h)
Public q(0 To mnum) As Double '実測流量(m3/s)
Public fr(0 To mnum) As Double '雨量を流量に換算した値
Public fi(0 To mnum) As Double '雨量を流量に換算した値の積算値
Public ql(0 To mnum) As Double '遅滞時間を考慮した流量(基底流量を差し引いたもの)
Public qs(0 To mnum) As Double '遅滞時間を考慮した流量の積分値(基底流量を差し引いたもの)
Public s(0 To mnum) As Double
Public sa(0 To 10000) As Double 'ループの積算値(時計回りか反時計回りかを判定)
'
Public rt As Double '対象範囲の累積雨量(mm)
Public f As Double '流出係数
Public tlk As Double '遅滞時間(設定値)
Public qlm As Double '流量の最大値(基底流量を差し引いたもの)
Public tpl As Double '流量が最大の時間(遅滞時間分差し引いたもの)
Public qtm As Double '流量の積算(遅滞時間分差し引いたもの)
Public qsm As Double 'Qsの積算
Public fim As Double 'Fiの最大値
Public sam As Double 'ループの最大
Public sas As Double 'ループの最小
Public tld As Double '遅滞時間(決定分)
Public tl0 As Integer '遅滞時間(切り上げ)
Public tl1 As Integer '遅滞時間(整数部)
Public tl2 As Double '遅滞時間小数部
Public t_Step As Double '遅滞時間の計算ステップ
Public num_Cal As Integer '遅滞時間計算回数
'
Public e As Double '最小自乗法の対象となるデータの個数
Public sm As Double '貯留高さの最大値
Public sar As Double '上昇ループの積算値
Public sad As Double '下降ループの積算値
'
Public k As Double 'K値
Public p As Double 'P値
Public Sub Main()
'貯留関数法1流域のみ、係数を回帰で決定
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim ws3 As Worksheet
Dim ws4 As Worksheet
Dim i As Integer
Dim tl As Integer
Dim t As Integer
Set ws1 = Sheets("計算条件")
Set ws2 = Sheets("雨量・流量データ")
Set ws3 = Sheets("計算結果")
Set ws4 = Sheets("貯留量と流出量の関係")
'データ読み込み
DataRead1 ws1
DataRead2 ws2
If Sheet1.CheckBox1.Value = False Then GoTo CalSkip '係数回帰をするかどうかのチェック
'遅滞時間の初期定義(木村の式)
If l < 11.9 Then
tl = 0
Else
tl = Int(0.5 + 0.047 * l - 0.56) '切り上げ
End If
'適当な遅滞時間の判別
'**********************
num_Cal = CInt(CDbl(tl + 1) / t_Step)
'**********************
For t = 0 To num_Cal
tlk = t_Step * CDbl(t) '遅滞時間設定値
tl1 = Int(tlk) '遅滞時間整数部
tl2 = tlk - tl1 '遅滞時間少数部
If tl2 = 0 Then
tl0 = tl1
Else
tl0 = tl1 + 1
End If
CalQl
'DataWrite0 T 'デバック
CalQtm
f = qtm / ((a / 3.6) * rt)
CalFr
CalSa t
'
DataWrite1 ws3, t '計算経過出力
'
Next t
'ループの最大・最小判定
sam = 0
For t = 0 To num_Cal
If Abs(sa(t)) >= sam Then sam = Abs(sa(t))
Next t
sas = sam
For t = 0 To num_Cal
If Abs(sa(t)) <= sas Then
sas = Abs(sa(t))
tld = t_Step * CDbl(t) '遅滞時間設定値
End If
Next t
tl1 = Int(tld) '遅滞時間整数部
tl2 = tld - tl1 '遅滞時間少数部
If tl2 = 0 Then
tl0 = tl1
Else
tl0 = tl1 + 1
End If
CalQl
CalQtm
f = qtm / ((a / 3.6) * rt) '流出係数
fim = 0
For t = 1 To m
fr(t) = a * f * r(t) / 3.6
fim = fim + fr(t)
fi(t) = fim
Next t
qsm = 0#
For t = 2 To m - tl0
qsm = qsm + (ql(t - 1) + ql(t)) / 2#
qs(t) = qsm
If fi(t) - qs(t) >= 0 Then s(t) = fi(t) - qs(t)
Next t
sm = 0
For t = 2 To m - tl0 - 1
If s(t) >= sm Then sm = s(t)
Next t
Cal_KP '最小自乗法によるK・Pの計算
DataWrite2 ws1 '貯留関数式書き込み
DataWrite3 ws4 '貯留量と流出高書き込み
Graph_Refresh 'グラフ修正
CalSkip: '流量計算
DataRead3 ws1
Cal_Qt ws2 '求めた係数で流量を計算
Graph_Refresh2 'グラフ修正
End Sub
Private Sub DataRead1(ws As Worksheet)
'データ読み込み1(流域諸元)
ws.Select
a = ws.Cells(3, "D") '流域面積(km2)
qi = ws.Cells(4, "D") '基底流量(m3/s)
l = ws.Cells(5, "D") '流路長(km)
t_Step = ws.Cells(6, "D") '遅滞時間計算ピッチ(hr)
If t_Step = 0 Then t_Step = 1
End Sub
Private Sub DataRead2(ws As Worksheet)
'データ読み込み1(ハイドロ・ハイエトデータ)
Dim row_num As Integer
Dim i As Integer
'①ハイドロ・ハイエト読み込み
row_num = 3
i = 0
Do Until ws.Cells(row_num, "C") = "" 'データがあるまでループ
i = i + 1
r(i) = ws.Cells(row_num, "C")
q(i) = ws.Cells(row_num, "D")
row_num = row_num + 1
Loop
m = i 'ハイドロ・ハイエトデータ数定義
'計算対象範囲指定
For i = 1 To m
If ws.Cells(i + 2, "E") = 1 Then m1 = i '開始点
If ws.Cells(i + 2, "E") = 2 Then m2 = i '終了点
Next i
'期間の累積雨量
rt = 0
For i = m1 To m2
rt = rt + r(i)
Next i
End Sub
Private Sub CalFr()
Dim t As Integer
fim = 0
For t = m1 To m2
fr(t) = a * f * r(t) / 3.6
fim = fim + fr(t)
fi(t) = fim
Next t
End Sub
Private Sub CalQl()
'遅滞時間分戻した流量の定義(基底流量含まず)
Dim t As Integer
qlm = 0
For t = 1 To m2
If t - tl1 >= 0 Then
ql(t - tl1) = q(t) + (q(t + 1) - q(t)) * tl2 - qi '遅滞時間を考慮した流量(基底流量を差し引いたもの)
If ql(t - tl1) >= qlm Then
qlm = ql(t - tl1) '最大流量
tpl = t - tlk '最大流量の発生時間
End If
End If
Next t
End Sub
Private Sub CalQtm()
'遅滞時間を考慮した流量の積算(計算区間内)
Dim t As Integer
qtm = 0
For t = m1 To m2 - tl0
qtm = qtm + ql(t)
Next t
End Sub
Private Sub CalSa(tl As Integer)
'貯留高さと流出高をプロットした場合のループ形状
Dim t As Integer
qsm = 0: sar = 0: sad = 0
For t = m1 To m2 - tl0 - 1
qsm = qsm + (ql(t - 1) + ql(t)) / 2#
qs(t) = qsm
If fi(t) - qs(t) < 0 Then
s(t) = 0#
Else
s(t) = fi(t) - qs(t)
End If
Next t
'上昇ループの積算値計算
For t = m1 To tpl - 1
sar = sar + (s(t) + s(t + 1)) * Abs(ql(t + 1) - ql(t)) / 2#
Next t
'下降ループの積算値計算
For t = tpl To m2 - tl0 - 1
sad = sad - (s(t) + s(t + 1)) * Abs(ql(t) - ql(t + 1)) / 2#
Next t
'ループ全体の積算値計算
sa(tl) = sar + sad
End Sub
Private Sub Cal_KP()
'最小自乗法による貯留関数係数の計算
Dim M3 As Integer
Dim t As Integer
Dim Xi As Double
Dim Xx As Double
Dim Yi As Double
Dim XY As Double
Dim P0 As Double
Dim K0 As Double
Dim K1 As Double
'M3 = Int(0.8 * M)
M3 = m2 - tl0
e = 0
'For T = 2 To M3
For t = m1 To M3
If s(t) <> 0 Then e = e + 1
Next t
Xi = 0: Xx = 0: Yi = 0: XY = 0
'For T = 2 To M3
For t = m1 To M3
Xi = Xi + Log(ql(t))
Xx = Xx + Log(ql(t)) * Log(ql(t))
Yi = Yi + Log(s(t))
XY = XY + Log(ql(t)) * Log(s(t))
Next t
P0 = (Xi * Yi - e * XY) / (Xi * Xi - e * Xx)
K0 = (Yi - P0 * Xi) / e
K1 = Exp(K0)
k = K1
p = P0
k = Int(0.5 + K1 * 100#) / 100# '桁合わせ
p = Int(0.5 + P0 * 1000#) / 1000# '桁合わせ
End Sub
Private Sub DataWrite1(ws As Worksheet, t As Integer)
'結果書き込み1(遅滞時間計算経過)
Dim Sa_State As String
If t = 0 Then
ws.Cells(2, "A") = "遅滞時間(hr)"
ws.Cells(2, "B") = "最大流量(m3/s)"
ws.Cells(2, "C") = "最大流量時間(hr)"
ws.Cells(2, "D") = "流量積算値(m3/s)"
ws.Cells(2, "E") = "流出係数"
ws.Cells(2, "F") = "上昇ループの積算値"
ws.Cells(2, "G") = "下降ループの積算値"
ws.Cells(2, "H") = "ループ全体の積算値"
ws.Cells(2, "I") = "ループの状態"
End If
'
Sa_State = ""
If sa(t) > 0 Then Sa_State = "時計回り"
If sa(t) < 0 Then Sa_State = "反時計回り"
If sa(t) = 0 Then Sa_State = "ぴったりOK"
'
ws.Cells(t + 3, "A") = tlk
ws.Cells(t + 3, "B") = qlm
ws.Cells(t + 3, "C") = tpl
ws.Cells(t + 3, "D") = qtm
ws.Cells(t + 3, "E") = f
ws.Cells(t + 3, "F") = sar
ws.Cells(t + 3, "G") = sad
ws.Cells(t + 3, "H") = sa(t)
ws.Cells(t + 3, "I") = Sa_State
End Sub
Private Sub DataWrite2(ws As Worksheet)
'結果書き込み2(貯留関数式出力)
ws.Select
ws.Cells(10, "B") = k
ws.Cells(11, "B") = p
ws.Cells(12, "B") = tld
ws.Cells(13, "B") = f
End Sub
Private Sub DataWrite3(ws As Worksheet)
'貯留量と流出高書き込み
Dim t As Integer
ws.Select
ws.Cells(3, "D") = tld
For t = 1 To m - tl0
ws.Cells(t + 2, "A") = ql(t)
ws.Cells(t + 2, "B") = s(t)
Next t
End Sub
Private Sub DataRead3(ws As Worksheet)
'データ読み込み3(貯留関数式元)
ws.Select
k = ws.Cells(10, "B")
p = ws.Cells(11, "B")
tld = ws.Cells(12, "B")
f = ws.Cells(13, "B")
End Sub
Private Sub Cal_Qt(ws As Worksheet)
'求めた貯留関数を用いて流量を再度計算
Dim t As Integer
Dim tm As Integer
Dim mr As Integer '雨量・流量データ数
Dim qql(0 To mnum) As Double
Dim qqt(0 To mnum) As Double
Dim j As Integer
Dim c As Double
Dim d As Double
Dim x As Double
Dim x2 As Double
Dim y As Double
mr = m
tl1 = Int(tld) '遅滞時間整数部
tl2 = tld - tl1 '遅滞時間少数部
'If Tl2 <> 0 Then Tl1 = Tl1 + 1
'ニュートン法による流量計算
qql(1) = 0
For t = 1 To mr
c = 2# * f * a * r(t) / 3.6 - qql(t) + 2# * k * qql(t) ^ p
x = 1
j = j + 1
Step1: y = x + (2# * k * x ^ p) - c
d = 1# + 2# * p * k * x ^ (p - 1#)
x2 = x - y / d
If Abs(x2 - x) <= 0.0001 Then GoTo Step2
x = x2
GoTo Step1
Step2: qql(t + 1) = x
If t <= tl1 Then qqt(t) = qi
qqt(t + tl1) = qi + qql(t + 1) + (qql(t + 1) - qql(t)) * tl2
If j <= 100 Then GoTo Step3
If qqt(t) < 1.1 * qqt(99) Then GoTo Skip1
Step3:
Next t
Skip1:
For t = 1 To mr
ws.Cells(t + 2, "G") = qqt(t)
Next t
End Sub
Private Sub Graph_Refresh()
'グラフの修正
Dim g_range As String
Sheets("貯留量と流出量の関係図").Select
g_range = "A3:B" & CStr(m - tl0 + 2)
'
ActiveChart.PlotArea.Select
ActiveChart.SetSourceData Source:=Sheets("貯留量と流出量の関係").Range(g_range), PlotBy:=xlColumns
End Sub
Private Sub Graph_Refresh2()
'グラフの修正
Dim g_range As String
Sheets("雨量・流量結果図").Select
g_range = "B2:D" & CStr(m + 2) & ",F2:G" & CStr(m + 2)
'
ActiveChart.PlotArea.Select
ActiveChart.SetSourceData Source:=Sheets("雨量・流量データ").Range(g_range), PlotBy:=xlColumns
End Sub
Private Sub DataWrite0(t As Integer)
'結果書き込み(デバック)
Dim ws As Worksheet
Dim i As Integer
Set ws = Sheets("Ql")
ws.Cells(2, t + 2) = t
ws.Cells(3, t + 2) = tld
ws.Cells(4, t + 2) = tl1
ws.Cells(5, t + 2) = tl2
For i = 1 To m2 - tl0
'If I - Tl1 >= 0 Then
' ws.Cells(I + 5, T + 2) = Ql(I - Tl1)
'End If
ws.Cells(i + 5, t + 2) = ql(i)
Next i
End Sub
====== tys-sfm_v_2_0_1 ======
tys-sfm_v_2_0_1.lzhをダウンロードして解凍すると、「**tys-sfm_v_2_0_1.xls**」ができます。
この「**tys-sfm_v_2_0_1.xls**」の使用方法を説明します。
ダウンロードについては、[[http://www.disaster-software.net|水理水文ソフトウェア]]のHPを参照してください。
===== マクロの説明 =====
本マクロは、各条件シートに条件を入力するだけで、**1流域についての総合貯留関数法と貯留関数法の2種類の流域流出解析計算**が行えます。
- 実績流量より、貯留関数係数の回帰を行う。
- 任意の貯留関数係数を用いて流出解析を行う。
の2種類の計算を行うことができます。
==== 計算条件とデータの入力 ====
=== 計算条件 ===
「計算条件」シートで貯留関数係数の回帰を行うかどうかをチェックしてください。
{{ :流域流出計算:image06.jpg?650|計算条件シート}}
;#;
計算条件シート
;#;
=== 雨量・流量データ ===
{{ :流域流出計算:image08.jpg?650|雨量・流量データシート}}
;#;
雨量・流量データシート
;#;
\\
- **実績流量より、貯留関数係数の回帰を行う場合** 「計算条件」シートの流域面積・基底流量・流路長さ・遅滞時間計算ピッチを入力してください。 「雨量・流量データ」シートの流域平均雨量・実績流量・計算対象範囲指定のデータを入力してください。__計算対象範囲指定は入力した実績流量のうち、係数決定に用いるデータの範囲を指定します。開始点を「1」、終了点を「2」と入力してください。__
- **任意の貯留関数係数を用いて流出解析を行う場合** 「計算条件」シートの流域面積・基底流量・貯留関数係数(K・P値、遅滞時間、流出係数)を入力してください。「雨量・流量データ」シートの流域平均雨量を入力してください。実績流量は、計算には使用しませんが、雨量・流量結果図で計算結果の評価を行うために入力する方が望ましいでしょう。
==== 計算結果 ====
- 実績流量より、貯留関数係数の回帰を行う場合
- 「計算結果」シートに遅滞時間の設定値ごとの貯留量と流出量の関係の計算結果を書き込みます。この中で、貯留量と流出量のループの積算値の最小値を遅滞時間として採用します。尚、遅滞時間の繰り返し計算は、0時間~最大値(流路長を木村の式に適用した場合の遅滞時間+1)を遅滞時間の計算ピッチ分です。ここで求めた遅滞時間より実績流量を用いた最小自乗法による回帰を行い、K・Pを算出します。
- 「雨量・流量データ」シートの計算流量の列に上記で求めた貯留関数係数を用いて計算した流量を書き込みます。計算結果は「雨量・流量結果図」に反映されます。
- 「貯留量と流出量の関係」シートに決定した貯留関数係数を用いた貯留量と流出量の関係を出力します。その結果は「貯留量と流出量の関係図」シートに反映されます。
-任意の貯留関数係数を用いて流出解析を行う場合
- 「雨量・流量データ」シートの計算流量の列に入力した貯留関数係数を用いて計算した流量を書き込みます。計算結果は「雨量・流量結果図」シートに反映されます。
- 「貯留量と流出量の関係」シートに貯留量と流出量の関係を出力します。その結果は「貯留量と流出量の関係図」シートに反映されます。
\\
{{ :流域流出計算:image07.jpg?650|計算結果}}
;#;
計算結果
;#;
{{ :流域流出計算:image09.jpg?650|雨量・流量結果図}}
;#;
雨量・流量結果図
;#;
{{ :流域流出計算:image10.jpg?650|貯留量と流出量の関係図}}
;#;
貯留量と流出量の関係
;#;
{{ :流域流出計算:image11.jpg?650|貯留量と流出量の関係図}}
;#;
貯留量と流出量の関係図
;#;
==== 注意事項 ====
本プログラムは、総合貯留関数法と通常の貯留関数法の両方が行えますが、総合貯留関数法と通常の貯留関数法では、K・P値はそれぞれ全く異なりますので注意してください。
ここで、総合貯留関数法とは貯留関数を貯留高(mm)と流出高(mm/hr)の関係で表現したもの、通常の貯留関数法とは、貯留関数を貯留量(m3)と流出量(m3/s)の関係で表現したものです。総合貯留関数法は貯留関数法を単位流域面積で表現したものと言い換えることができます。
本や論文によっては、総合貯留関数法を単に「貯留関数法」と表記されている場合があり、特殊な手法ではなく、かなり一般的に利用されていますので、基礎式による確認が必要です。
===== VBAソースファイル =====
本マクロのソースを公開しますので、参考にしてください。
Option Explicit
Public m As Integer 'ハイドロデータ数
Public m1 As Integer 'ハイドロ区間1
Public m2 As Long 'ハイドロ区間2
Public l As Double '流域の流路延長(km)
Public a As Double '流域面積(km2)
Public qi As Double '基底流量(m3/s)
'
Public Const mnum As Integer = 1000 '配列数
Public r(0 To mnum) As Double '雨量(mm/h)
Public q(0 To mnum) As Double '実測流量(m3/s)
Public fr(0 To mnum) As Double '雨量を流量に換算した値
Public fi(0 To mnum) As Double '雨量を流量に換算した値の積算値
Public ql(0 To mnum) As Double '遅滞時間を考慮した流量(基底流量を差し引いたもの)
Public qs(0 To mnum) As Double '遅滞時間を考慮した流量の積分値(基底流量を差し引いたもの)
Public s(0 To mnum) As Double
Public sa(0 To 10000) As Double 'ループの積算値(時計回りか反時計回りかを判定)
'
Public rt As Double '対象範囲の累積雨量(mm)
Public f As Double '流出係数
Public tlk As Double '遅滞時間(設定値)
Public qlm As Double '流量の最大値(基底流量を差し引いたもの)
Public tpl As Double '流量が最大の時間(遅滞時間分差し引いたもの)
Public qtm As Double '流量の積算(遅滞時間分差し引いたもの)
Public qsm As Double 'Qsの積算
Public fim As Double 'Fiの最大値
Public sam As Double 'ループの最大
Public sas As Double 'ループの最小
Public tld As Double '遅滞時間(決定分)
Public tl0 As Integer '遅滞時間(切り上げ)
Public tl1 As Integer '遅滞時間(整数部)
Public tl2 As Double '遅滞時間小数部
Public t_step As Double '遅滞時間の計算ステップ
Public num_cal As Integer '遅滞時間計算回数
'
Public e As Double '最小自乗法の対象となるデータの個数
Public sm As Double '貯留高さの最大値
Public sar As Double '上昇ループの積算値
Public sad As Double '下降ループの積算値
Public k As Double 'K値
Public p As Double 'P値
'
Public cal_flag As Boolean 'Trueであれば総合貯留関数法
Public Sub Main()
'貯留関数法1流域のみ、係数を回帰で決定
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim ws3 As Worksheet
Dim i As Integer
Dim tl As Integer
Dim t As Integer
'シートのセット
Set ws1 = Sheets("計算条件")
Set ws2 = Sheets("雨量・流量データ")
Set ws3 = Sheets("計算結果")
'データ読み込み
data_read1 ws1
data_read2 ws2
If Sheet1.CheckBox1.Value = True Then
'係数回帰をするかどうかのチェック
If Sheet1.OptionButton1.Value = True Then
'総合貯留関数法
cal_flag = True
Else
'貯留関数法
cal_flag = False
End If
'遅滞時間の初期定義(木村の式)
If l < 11.9 Then
tl = 0
Else
tl = Int(0.5 + 0.047 * l - 0.56) '切り上げ
End If
'適当な遅滞時間の判別
'**********************
num_cal = CInt(CDbl(tl + 1) / t_step)
'**********************
For t = 0 To num_cal
tlk = t_step * CDbl(t) '遅滞時間設定値
tl1 = Int(tlk) '遅滞時間整数部
tl2 = tlk - tl1 '遅滞時間少数部
If tl2 = 0 Then
tl0 = tl1
Else
tl0 = tl1 + 1
End If
cal_ql
cal_qtm
'data_write0 t 'デバック
If cal_flag = True Then
'総合貯留関数法
f = qtm / rt
Else
'貯留関数法
f = qtm / ((a / 3.6) * rt)
End If
cal_fr
cal_sa t
data_write1 ws3, t '計算経過出力
'
Next t
'ループの最大・最小判定
sam = 0
For t = 0 To num_cal
If Abs(sa(t)) >= sam Then sam = Abs(sa(t))
Next t
sas = sam
For t = 0 To num_cal
If Abs(sa(t)) <= sas Then
sas = Abs(sa(t))
tld = t_step * CDbl(t) '遅滞時間設定値
End If
Next t
tl1 = Int(tld) '遅滞時間整数部
tl2 = tld - tl1 '遅滞時間少数部
If tl2 = 0 Then
tl0 = tl1
Else
tl0 = tl1 + 1
End If
cal_ql
cal_qtm
If cal_flag = True Then
'総合貯留関数法
f = qtm / rt '流出係数
Else
'貯留関数法
f = qtm / ((a / 3.6) * rt) '流出係数
End If
fim = 0
For t = 1 To m
If cal_flag = True Then
'総合貯留関数法
fr(t) = f * r(t)
Else
'貯留関数法
fr(t) = a * f * r(t) / 3.6
End If
fim = fim + fr(t)
fi(t) = fim
Next t
qsm = 0#
For t = 2 To m - tl0
qsm = qsm + (ql(t - 1) + ql(t)) / 2#
qs(t) = qsm
If fi(t) - qs(t) >= 0 Then s(t) = fi(t) - qs(t)
Next t
sm = 0
For t = 2 To m - tl0 - 1
If s(t) >= sm Then sm = s(t)
Next t
cal_kp '最小自乗法によるK・Pの計算
data_write2 ws1 '貯留関数式書き込み
data_write3 '貯留高と流出高書き込み
graph_refresh 'グラフ修正
End If
'流量計算
data_read3 ws1
cal_qt ws2 '求めた係数で流量を計算
graph_refresh2 'グラフ修正
End Sub
Private Sub data_read1(ws As Worksheet)
'データ読み込み1(流域諸元)
ws.Select
a = ws.Cells(3, "D") '流域面積(km2)
qi = ws.Cells(4, "D") '基底流量(m3/s)
l = ws.Cells(5, "D") '流路長(km)
t_step = ws.Cells(6, "D") '遅滞時間計算ピッチ(hr)
If t_step = 0 Then t_step = 1
End Sub
Private Sub data_read2(ws As Worksheet)
'データ読み込み1(雨量・流量データ)
Dim row_num As Integer
Dim i As Integer
'雨量・流量読み込み
row_num = 3
i = 0
Do Until ws.Cells(row_num, "C") = "" 'データがあるまでループ
i = i + 1
r(i) = ws.Cells(row_num, "C")
q(i) = ws.Cells(row_num, "D")
row_num = row_num + 1
Loop
m = i '雨量・流量データ数定義
'計算対象範囲指定
For i = 1 To m
If ws.Cells(i + 2, "E") = 1 Then m1 = i '開始点
If ws.Cells(i + 2, "E") = 2 Then m2 = i '終了点
Next i
'期間の累積雨量
rt = 0
For i = m1 To m2
rt = rt + r(i)
Next i
End Sub
Private Sub cal_fr()
'frの決定
Dim t As Integer
fim = 0
For t = m1 To m2
If cal_flag = True Then
'総合貯留関数法
fr(t) = f * r(t)
Else
'貯留関数法
fr(t) = a * f * r(t) / 3.6
End If
'
fim = fim + fr(t)
fi(t) = fim
Next t
End Sub
Private Sub cal_ql()
'遅滞時間分戻した流出高の定義(基底流量含まず)
Dim t As Integer
qlm = 0
For t = 1 To m2
If t - tl1 >= 0 Then
ql(t - tl1) = q(t) + (q(t + 1) - q(t)) * tl2 - qi '遅滞時間を考慮した流量(基底流量を差し引いたもの)
'総合貯留関数法
If cal_flag = True Then
ql(t - tl1) = ql(t - tl1) / a * 3.6 '流量を流出高へ変換
End If
If ql(t - tl1) >= qlm Then
qlm = ql(t - tl1) '最大流量
tpl = t - tlk '最大流量の発生時間
End If
End If
Next t
End Sub
Private Sub cal_qtm()
'遅滞時間を考慮した流量の積算(計算区間内)
Dim t As Integer
qtm = 0
For t = m1 To m2 - tl0
qtm = qtm + ql(t)
Next t
End Sub
Private Sub cal_sa(tl As Integer)
'貯留高さと流出高をプロットした場合のループ形状
Dim t As Integer
qsm = 0: sar = 0: sad = 0
For t = m1 To m2 - tl0 - 1
qsm = qsm + (ql(t - 1) + ql(t)) / 2#
qs(t) = qsm
If fi(t) - qs(t) < 0 Then
s(t) = 0#
Else
s(t) = fi(t) - qs(t)
End If
Next t
'上昇ループの積算値計算
For t = m1 To tpl - 1
sar = sar + (s(t) + s(t + 1)) * Abs(ql(t + 1) - ql(t)) / 2#
Next t
'下降ループの積算値計算
For t = tpl To m2 - tl0 - 1
sad = sad - (s(t) + s(t + 1)) * Abs(ql(t) - ql(t + 1)) / 2#
Next t
'ループ全体の積算値計算
sa(tl) = sar + sad
End Sub
Private Sub cal_kp()
'最小自乗法による貯留関数係数の計算
Dim m3 As Integer
Dim t As Integer
Dim xi As Double
Dim xx As Double
Dim yi As Double
Dim xy As Double
Dim p0 As Double
Dim k0 As Double
Dim k1 As Double
m3 = m2 - tl0
e = 0
For t = m1 To m3
If s(t) <> 0 Then e = e + 1
Next t
xi = 0: xx = 0: yi = 0: xy = 0
For t = m1 To m3
xi = xi + Log(ql(t))
xx = xx + Log(ql(t)) * Log(ql(t))
yi = yi + Log(s(t))
xy = xy + Log(ql(t)) * Log(s(t))
Next t
p0 = (xi * yi - e * xy) / (xi * xi - e * xx)
k0 = (yi - p0 * xi) / e
k1 = Exp(k0)
k = k1
p = p0
k = Int(0.5 + k1 * 100#) / 100# '桁合わせ
p = Int(0.5 + p0 * 1000#) / 1000# '桁合わせ
End Sub
Private Sub data_write1(ws As Worksheet, t As Integer)
'結果書き込み1(遅滞時間計算経過)
Dim sa_state As String
If t = 0 Then
ws.Select
Cells.Select
Selection.ClearContents 'セルの値をクリア
ws.Cells(2, "A") = "遅滞時間(hr)"
ws.Cells(2, "B") = "最大流量(m3/s)"
ws.Cells(2, "C") = "最大流量時間(hr)"
ws.Cells(2, "D") = "流量積算値(m3/s)"
ws.Cells(2, "E") = "流出係数"
ws.Cells(2, "F") = "上昇ループの積算値"
ws.Cells(2, "G") = "下降ループの積算値"
ws.Cells(2, "H") = "ループ全体の積算値"
ws.Cells(2, "I") = "ループの状態"
End If
'
sa_state = ""
If sa(t) > 0 Then sa_state = "時計回り"
If sa(t) < 0 Then sa_state = "反時計回り"
If sa(t) = 0 Then sa_state = "ぴったりOK"
'
ws.Cells(t + 3, "A") = tlk
ws.Cells(t + 3, "B") = qlm
ws.Cells(t + 3, "C") = tpl
ws.Cells(t + 3, "D") = qtm
ws.Cells(t + 3, "E") = f
ws.Cells(t + 3, "F") = sar
ws.Cells(t + 3, "G") = sad
ws.Cells(t + 3, "H") = sa(t)
ws.Cells(t + 3, "I") = sa_state
End Sub
Private Sub data_write2(ws As Worksheet)
'結果書き込み2(貯留関数式出力)
ws.Select
ws.Cells(10, "B") = k
ws.Cells(11, "B") = p
ws.Cells(12, "B") = tld
ws.Cells(13, "B") = f
End Sub
Private Sub data_write3()
'貯留高と流出高書き込み
Dim t As Integer
Sheet8.Select
If cal_flag = True Then
'総合貯留関数法
Sheet8.NAME = "貯留高と流出高の関係"
Sheet8.Cells(1, "A") = "流出高と貯留高の関係"
Sheet8.Cells(2, "A") = "流出高(mm/hr)"
Sheet8.Cells(2, "B") = "貯留高(mm)"
Else
'貯留関数法
Sheet8.NAME = "貯留量と流出量の関係"
Sheet8.Cells(1, "A") = "流出量と貯留量の関係"
Sheet8.Cells(2, "A") = "流出高(m3/s)"
Sheet8.Cells(2, "B") = "貯留高(m3)"
End If
Sheet8.Cells(3, "D") = tld
For t = 1 To m - tl0
Sheet8.Cells(t + 2, "A") = ql(t)
Sheet8.Cells(t + 2, "B") = s(t)
Next t
End Sub
Private Sub data_read3(ws As Worksheet)
'データ読み込み3(貯留関数式元)
ws.Select
k = ws.Cells(10, "B")
p = ws.Cells(11, "B")
tld = ws.Cells(12, "B")
f = ws.Cells(13, "B")
End Sub
Private Sub cal_qt(ws As Worksheet)
'求めた貯留関数を用いて流量を再度計算
Dim t As Integer
Dim tm As Integer
Dim mr As Integer '雨量・流量数
Dim qql(0 To mnum) As Double
Dim qqt(0 To mnum) As Double
Dim qi2 As Double
Dim j As Integer
Dim c As Double
Dim d As Double
Dim x As Double
Dim x2 As Double
Dim y As Double
mr = m
tl1 = Int(tld) '遅滞時間整数部
tl2 = tld - tl1 '遅滞時間少数部
If cal_flag = True Then
'総合貯留関数法
qi2 = qi / a * 3.6
Else
'貯留関数法
qi2 = qi
End If
'ニュートン法による流量計算
qql(1) = 0
For t = 1 To mr
If cal_flag = True Then
'総合貯留関数法
c = 2# * f * r(t) - qql(t) + 2# * (k * qql(t) ^ p)
Else
'貯留関数法
c = 2# * f * a * r(t) / 3.6 - qql(t) + 2# * k * qql(t) ^ p
End If
'
x = 0.0001
j = j + 1
Step1: y = x + (2# * k * x ^ p) - c
d = 1# + 2# * p * k * x ^ (p - 1#)
x2 = x - y / d
If Abs(x2 - x) <= 0.0001 Then GoTo Step2
x = x2
GoTo Step1
Step2: qql(t + 1) = x
If t <= tl1 Then qqt(t) = qi2
qqt(t + tl1) = qi2 + qql(t + 1) + (qql(t + 1) - qql(t)) * tl2
If j <= 100 Then GoTo Step3
If qqt(t) < 1.1 * qqt(99) Then GoTo Skip1
Step3:
Next t
Skip1:
For t = 1 To mr
'総合貯留関数法
If cal_flag = True Then
qqt(t) = qqt(t) * a / 3.6
End If
ws.Cells(t + 2, "G") = qqt(t)
Next t
End Sub
Private Sub graph_refresh()
'グラフの修正
Dim g_range As String
グラフ1.Select
If cal_flag = True Then
'総合貯留関数法
グラフ1.NAME = "貯留高と流出高の関係図"
ActiveChart.ChartTitle.Select
Selection.Characters.Text = "貯留高と流出高の関係図"
ActiveChart.Axes(xlCategory).AxisTitle.Select
Selection.Characters.Text = "流出高(mm/hr)"
ActiveChart.Axes(xlValue).AxisTitle.Select
Selection.Characters.Text = "貯留高(mm)"
Else
'貯留関数法
グラフ1.NAME = "貯留量と流出量の関係図"
ActiveChart.ChartTitle.Select
Selection.Characters.Text = "貯留量と流出量の関係図"
ActiveChart.Axes(xlCategory).AxisTitle.Select
Selection.Characters.Text = "流出量(m3/s)"
ActiveChart.Axes(xlValue).AxisTitle.Select
Selection.Characters.Text = "貯留量(m3)"
End If
g_range = "A3:B" & CStr(m - tl0 + 2)
'
ActiveChart.PlotArea.Select
ActiveChart.SetSourceData Source:=Sheet8.Range(g_range), PlotBy:=xlColumns
End Sub
Private Sub graph_refresh2()
'グラフの修正
Dim g_range As String
Sheets("雨量・流量図").Select
g_range = "B2:D" & CStr(m + 2) & ",F2:G" & CStr(m + 2)
'
ActiveChart.PlotArea.Select
ActiveChart.SetSourceData Source:=Sheets("雨量・流量データ").Range(g_range), PlotBy:=xlColumns
End Sub
Private Sub data_write0(t As Integer)
'結果書き込み(デバック)
Dim ws As Worksheet
Dim i As Integer
Set ws = Sheets("デバッグQl")
ws.Cells(2, t + 2) = t
ws.Cells(3, t + 2) = tld
ws.Cells(4, t + 2) = tl1
ws.Cells(5, t + 2) = tl2
For i = 1 To m2 - tl0
'If i - tl1 >= 0 Then
' ws.Cells(i + 5, t + 2) = ql(i - tl1)
'End If
ws.Cells(i + 5, t + 2) = ql(i)
Next i
End Sub
====== tys-sfb_v1_0_0 ======
tys-sfb_v1_0_0.lzhをダウンロードして解凍すると、「**tys-sfb_v1_0_0.xls**」ができます。
この「**tys-sfb_v1_0_0.xls**」の使用方法を説明します。
ダウンロードについては、[[http://www.disaster-software.net|水理水文ソフトウェア]]のHPを参照してください。
===== マクロの説明 =====
本マクロは、各条件シートに条件を入力するだけで、**複数流域の総合貯留関数による流出解析計算**が行えます。
- 複数流域を一括して流出解析を行う。
==== 計算条件とデータの入力 ====
=== 計算条件 ===
「計算条件」シートで貯留関数係数の回帰を行うかどうかをチェックしてください。
{{ :流域流出計算:image31.jpg?650|計算条件シート}}
;#;
計算条件シート
;#;
=== 河道諸元 ===
{{ :流域流出計算:image32.jpg?650|河道諸元シート}}
;#;
河道諸元シート
;#;
=== 流域諸元 ===
{{ :流域流出計算:image33.jpg?650|流域諸元シート}}
;#;
流域諸元シート
;#;
=== 雨量データ ===
{{ :流域流出計算:image34.jpg?650|雨量データシート}}
;#;
雨量データシート
;#;
\\
==== 計算結果 ====
{{ :流域流出計算:image35.jpg?650|流域計算結果}}
;#;
流域計算結果
;#;
{{ :流域流出計算:image36.jpg?650|河道計算結果}}
;#;
河道計算結果図
;#;
{{ :流域流出計算:image37.jpg?650|作図データ}}
;#;
作図データ
;#;
{{ :流域流出計算:image38.jpg?650|計算結果図}}
;#;
計算結果図
;#;
==== 注意事項 ====
本プログラムは、総合貯留関数法と通常の貯留関数法の両方が行えますが、総合貯留関数法と通常の貯留関数法では、K・P値はそれぞれ全く異なりますので注意してください。
ここで、総合貯留関数法とは貯留関数を貯留高(mm)と流出高(mm/hr)の関係で表現したもの、通常の貯留関数法とは、貯留関数を貯留量(m3)と流出量(m3/s)の関係で表現したものです。総合貯留関数法は貯留関数法を単位流域面積で表現したものと言い換えることができます。
本や論文によっては、総合貯留関数法を単に「貯留関数法」と表記されている場合があり、特殊な手法ではなく、かなり一般的に利用されていますので、基礎式による確認が必要です。
===== VBAソースファイル =====
本マクロのソースを公開しますので、参考にしてください。
Option Explicit
Option Base 1
'貯留関数による洪水流量計算
Sub main()
Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet, ws4 As Worksheet
Dim ws5 As Worksheet, ws6 As Worksheet, ws7 As Worksheet
Set ws1 = Sheets("計算条件")
Set ws2 = Sheets("流域諸元")
Set ws3 = Sheets("河道諸元")
Set ws4 = Sheets("雨量データ")
Set ws5 = Sheets("流域計算結果")
Set ws6 = Sheets("河道計算結果")
Set ws7 = Sheets("作図データ")
Application.StatusBar = "データ読み込み中"
data_read ws1, ws2, ws3, ws4
inital_set ws5, ws6
For m = 1 To m1 '流域数のループ
Application.StatusBar = "流域計算中" & Str(m) & "/" & m1
cal_basin m, ws5
Next m
For n = 1 To n1 '河道数のループ
Application.StatusBar = "河道計算中" & Str(n) & "/" & n1
cal_river n, ws6, ws7
Next n
Graph_Refresh2
Application.StatusBar = False
End Sub
Sub inital_set(ws5 As Worksheet, ws6 As Worksheet)
Dim i As Integer, j As Integer, l As Integer
For i = 1 To 50
qb(i) = 0#
qi(i) = 0#
For n = 1 To 500
q8sum(i, n) = 0#
Next n
Next i
' 降雨量の計算 ---------------------------------------------------
dn = d3 / d2
For i = 1 To nt
For l = 1 To dn
i2 = (i - 1) * dn + l
For j = 1 To nhyeto
r1(j, i2) = r(j, i) / d3 * d2
Next j
Next l
Next i
i1 = Int(nt * dn)
'結果書き込み用のシートのクリア
ws5.Select
Cells.Select
Selection.ClearContents 'セルの値をクリア
ws6.Select
Cells.Select
Selection.ClearContents 'セルの値をクリア
End Sub
Sub cal_basin(m As Integer, ws5 As Worksheet)
Dim i As Integer, l As Integer
'流域の計算
'初期値の消去
For i = 1 To 500
r2(i) = 0#
r3(i) = 0#
qr(i) = 0#
qs(i) = 0#
q1(i) = 0#
q2(i) = 0#
q3(i) = 0#
q4(i) = 0#
q5(i) = 0#
q6(i) = 0#
q7(i) = 0#
q8(i) = 0#
Next i
'流域降雨 , 流出域降雨の計算
r3(1) = r1(norain(m), 1)
r2(1) = r1(norain(m), 1)
For i = 2 To i1
r3(i) = r3(i - 1) + r1(norain(m), i)
r2(i) = r1(norain(m), i)
Next i
'浸透域有効降雨の計算
rs(1) = 0#
For i = 2 To i1
rs(i) = 0#
If r3(i) > sr(m) Then GoTo S1
Next i
S1: For i = i To i1
rs(i) = 0#
If r3(i) > sr(m) Then rs(i) = r3(i) - r3(i - 1)
If r3(i - 1) < sr(m) Then rs(i) = r3(i) - sr(m)
Next i
'流出域 流出高さの計算
i = 0
S2: i = i + 1
d5 = d1
S3: i2 = Int(d2 / d5) + 1
qt = 0#
If i > 1 Then qt = qr(i - 1)
rt = r2(i) / d2
tq(1) = qt
t1(i2) = rt
t1(1) = 0#
If i > 1 Then t1(1) = r2(i) / d2
dt = d5
qk = qt
t1(1) = t1(i2)
l = 1
S4: l = l + 1
t1(l) = (t1(i2) - t1(1)) * CDbl(l - 1) / CDbl(i2 - 1) + t1(1)
qt = tq(l - 1)
qk = qt
t1(1) = t1(i2)
rt = t1(l)
k_p_cal 0#, kr(m), pr(m)
If tq(1) = 0# Then GoTo S5
If dt > 2# * kr(m) * pr(m) / tq(1) ^ (1# - pr(m)) Then GoTo S6
If dt > 2# * kr(m) / tq(1) ^ (1# - pr(m)) Then GoTo S6
S5: If qk = 0# Then GoTo S7
If dt < 2# * kr(m) * pr(m) / qk ^ (1# - pr(m)) Then GoTo S7
If dt < 2# * kr(m) / qk ^ (1# - pr(m)) Then GoTo S7
S6: d5 = d5 / 2#
GoTo S3
S7: tq(l) = qk
If l < i2 Then GoTo S4
qr(i) = tq(i2)
If i < i1 Then GoTo S2
'浸透域流出データの計算
i = 0
S8: i = i + 1
d5 = d1
S9: i2 = Int(d2 / d5) + 1
qt = 0#
If i > 1 Then qt = qs(i - 1)
rt = rs(i) / d2
dt = d5
tq(1) = qt
t1(i2) = rt
t1(1) = 0#
If i > 1 Then t1(1) = rs(i - 1) / d2
qk = qt
t1(1) = t1(i2)
l = 1
S10: l = l + 1
t1(l) = (t1(i2) - t1(1)) * CDbl(l - 1) / CDbl(i2 - 1) + t1(1)
qt = tq(l - 1)
qk = qt
rt = t1(l)
t1(1) = t1(i2)
k_p_cal 0#, kr(m), pr(m)
If tq(1) = 0 Then GoTo S11
If dt > 2# * kr(m) * pr(m) / tq(1) ^ (1# - pr(m)) Then GoTo S12
If dt > 2# * kr(m) / tq(1) ^ (1# - pr(m)) Then GoTo S12
S11: If qk = 0# Then GoTo S13
If dt < 2# * kr(m) * pr(m) / qk ^ (1# - pr(m)) Then GoTo S13
If dt < 2# * kr(m) / qk ^ (1# - pr(m)) Then GoTo S13
S12: d5 = d5 / 2#
GoTo S9
S13: tq(l) = qk
If l < i2 Then GoTo S10
qs(i) = tq(i2)
If i < i1 Then GoTo S8
'遅滞時間降雨量
tl = tr(m) / d2
For i = 1 To i1
z1 = Int(tl)
z2 = tl - z1
q1(i + z1) = qr(i)
q2(i + z1) = qs(i)
q3(i + z1) = q1(i + z1)
q4(i + z1) = q2(i + z1)
If (i + z1 - 1) > 0 Then q3(i + z1) = q1(i + z1 - 1) + (q1(i + z1) - q1(i + z1 - 1)) * (1# - z2)
If (i + z1 - 1) > 0 Then q4(i + z1) = q2(i + z1 - 1) + (q2(i + z1) - q2(i + z1 - 1)) * (1# - z2)
Next i
'流域 流出高データ
For i = 1 To i1
q5(i) = q3(i) * f(m) + q4(i) * (1# - f(m)) + 3.6 * bq(m) / aa(m)
q6(i) = q5(i) * aa(m) / 3.6
Next i
'流入する河道への流量の受け渡し
For i = 1 To i1
q8sum(er(m), i) = q8sum(er(m), i) + q6(i)
Next i
qb(er(m)) = qb(er(m)) + bq(m)
print_basin m '計算結果出力(ファイル)
print_basin2 m, ws5 '計算結果出力(ワークシート)
End Sub
Sub cal_river(n As Integer, ws6 As Worksheet, ws7 As Worksheet)
Dim i As Integer, l As Integer
'河道の計算
For i = 1 To i1
q7(i) = q8sum(n, i)
Next i
'河道の上流に連結する河道の基底流量を足し合わせてその河道の基底流量を定義
For i = 1 To n1
If ek(i) = n Then qi(n) = qi(n) + qi(i)
Next i
qi(n) = qi(n) + qb(n)
q7(1) = qi(n)
q8(1) = qi(n)
q2(1) = qi(n)
For i = 2 To i1
q7(i) = q7(i)
q2(i) = q7(i - 1) + (q7(i) - q7(i - 1)) * (d2 - tk(n)) / d2
Next i
'繰り返し時間数のループ
For i = 2 To i1
d5 = d1
S1: i2 = Int(d2 / d5) + 1
tq(1) = q8(1)
If i > 1 Then tq(1) = q8(i - 1)
t1(i2) = q2(i)
t1(1) = qi(n)
If i > 1 Then t1(1) = q2(i - 1)
dt = d5
l = 1
l = l + 1
For l = 2 To i2
t1(l) = (t1(i2) - t1(1)) * CDbl(l - 1) / CDbl(i2 - 1) + t1(1)
qt = tq(l - 1)
rt = (t1(l) + t1(l - 1)) / 2#
qk = qt
k_p_cal qi(n), kk(n), pk(n)
If tq(1) = 0# Then GoTo S2
If dt > 2# * kk(n) * pk(n) / tq(1) ^ (1# - pk(n)) Then GoTo S3
If dt > 2# * kk(n) / tq(1) ^ (1# - pk(n)) Then GoTo S3
S2: If qk = 0# Then GoTo S4
If dt < 2# * kk(n) * pk(n) / qk ^ (1# - pk(n)) Then GoTo S4
If dt < 2# * kk(n) / qk ^ (1# - pk(n)) Then GoTo S4
S3: d5 = d5 / 2#
GoTo S1
S4: tq(l) = qk
Next l
q8(i) = tq(i2)
If q8(i) < qi(n) Then q8(i) = qi(n)
Next i
For i = 1 To i1
q8sum(ek(n), i) = q8sum(ek(n), i) + q8(i)
Next i
'計算結果出力(ファイル)
print_river n
'計算結果出力(ワークシート)
print_river2 n, ws6
If n = numgraph Then print_plot ws7 '作図データの書き込み
End Sub
'************************* K-Pの計算 ********************************************
Sub k_p_cal(qi1 As Double, k As Double, p As Double)
Dim rq1 As Double, qb1 As Double
Dim i As Integer
qp1 = 0#
qq1 = 0#
qm1 = 0#
qn1 = 0#
qk1 = qk
qb1 = 0#
rq1 = 0#
For i = 1 To 750
qe1 = 2# * rt - qt - 2# * (k * (qk1 ^ p) - k * (qt ^ p)) / dt
qg1 = qk1 - qe1
If Abs(qg1) < 0.0001 Then GoTo S1
rq1 = qk1
If qg1 > 0# Then qp1 = qg1
If qg1 > 0# Then qq1 = rq1
If qg1 < 0# Then qm1 = qg1
If qg1 < 0# Then qn1 = rq1
qa = qk1
qk1 = qe1
If i = 1 Then GoTo S2
qk1 = qq1 - qp1 * (qq1 - qn1) / (qp1 - qm1)
qb1 = qk1
If qa = qb1 Then GoTo S1
S2: If qk1 < 0# Then qk1 = 0#
Next i
S1: qk = qk1
If qk < qi1 Then qk = qi1
End Sub
'*********************** データの読み込み *******************************
Sub data_read(ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet, ws4 As Worksheet)
Dim i As Integer, j As Integer
'計算条件の読み込み
d1 = ws1.Cells(2, 3)
d2 = ws1.Cells(3, 3)
d3 = ws1.Cells(4, 3)
nt = ws1.Cells(5, 3)
m1 = ws1.Cells(6, 3)
n1 = ws1.Cells(7, 3)
nhyeto = ws1.Cells(8, 3)
'グラフ描画河道の読み込み
numgraph = ws1.Cells(9, 3)
'流域諸元の読み込み
For i = 1 To m1
kr(i) = ws2.Cells(i + 2, 2)
pr(i) = ws2.Cells(i + 2, 3)
tr(i) = ws2.Cells(i + 2, 4)
f(i) = ws2.Cells(i + 2, 5)
sr(i) = ws2.Cells(i + 2, 6)
aa(i) = ws2.Cells(i + 2, 7)
bq(i) = ws2.Cells(i + 2, 8)
er(i) = ws2.Cells(i + 2, 9)
norain(i) = ws2.Cells(i + 2, 10)
Next i
'河道諸元の読み込み
For i = 1 To n1
kk(i) = ws3.Cells(i + 2, 2)
pk(i) = ws3.Cells(i + 2, 3)
tk(i) = ws3.Cells(i + 2, 4)
ek(i) = ws3.Cells(i + 2, 5)
Next i
'雨量データの読み込み
For i = 1 To nt
For j = 1 To nhyeto
r(j, i) = ws4.Cells(i + 2, j + 1)
Next j
Next i
End Sub
'******************** 計算結果のファイルへの出力 ******************************
Sub print_basin(m As Integer)
Dim NAME As String, OUFL1 As String
Dim i As Integer
Dim D2z As String, R1z As String, R3z As String, RSz As String, QRz As String, QSz As String
Dim Q5z As String, Q6z As String
NAME = ActiveWorkbook.Path
OUFL1 = "RUN-R.OUT"
' 流域計算出力 ------------------------------------------------
If m = 1 Then Open NAME + "\" + OUFL1 For Output As #2
Print #2, "流域 ("; m; ")"
Print #2, "流域の諸元 "
Print #2, "K 値 = "; Format(Format(kr(m), "##0.00"), "@@@@@@")
Print #2, "P 値 = "; Format(Format(pr(m), "##0.00"), "@@@@@@")
Print #2, "遅滞時間(hr) TR = "; Format(Format(tr(m), "##0.00"), "@@@@@@")
Print #2, "流出率 F = "; Format(Format(f(m), "##0.00"), "@@@@@@")
Print #2, "飽和雨量(mm/hr) RS = "; Format(Format(sr(m), "##0.00"), "@@@@@@")
Print #2, "流域面積(km2) A = "; Format(Format(aa(m), "##0.00"), "@@@@@@")
Print #2, "基底流量(m3/s) BQ = "; Format(Format(bq(m), "##0.00"), "@@@@@@")
Print #2, "連立する河道 NO = "; Format(er(m), "@@@@@")
Print #2, " 時間 降雨量 累加雨量 浸透 R 流出 Q 浸透 Q 総合 Q 流出量 "
Print #2, " (時) (㎜) (㎜) (㎜) (㎜) (㎜) (㎜) (m3/s)"
For i = 1 To i1
D2z = Format(Format(i * d2, "#####0.00"), "@@@@@@@@@")
R1z = Format(Format(r1(norain(m), i), "#####0.00"), "@@@@@@@@@")
R3z = Format(Format(r3(i), "#####0.00"), "@@@@@@@@@")
RSz = Format(Format(rs(i), "#####0.00"), "@@@@@@@@@")
QRz = Format(Format(qr(i), "#####0.00"), "@@@@@@@@@")
QSz = Format(Format(qs(i), "#####0.00"), "@@@@@@@@@")
Q5z = Format(Format(q5(i), "#####0.00"), "@@@@@@@@@")
Q6z = Format(Format(q6(i), "######0.00"), "@@@@@@@@@@")
Print #2, D2z; R1z; R3z; RSz; QRz; QSz; Q5z; Q6z
Next i
If m = m1 Then Close #2
End Sub
'******************** 計算結果のファイルへの出力 ******************************
Sub print_river(n As Integer)
Dim NAME As String, OUFL2 As String
Dim i As Integer
Dim D2z As String, Q7z As String, Q2z As String, Q8z As String
NAME = ActiveWorkbook.Path
OUFL2 = "RUN-K.OUT"
If n = 1 Then Open NAME + "\" + OUFL2 For Output As #3
' 河道計算結果の出力 -----------------------------------------------
Print #3, "河道 ("; n; ")"
Print #3, "河道の諸元 "
Print #3, "K 値 = "; Format(Format(kk(n), "##0.00"), "@@@@@@")
Print #3, "P 値 = "; Format(Format(pk(n), "##0.00"), "@@@@@@")
Print #3, "遅滞時間(hr)TK = "; Format(Format(tk(n), "##0.00"), "@@@@@@")
Print #3, " 時間 流入量 流入量 流出量 "
Print #3, " (遅滞時間)"
Print #3, " (時) (m3/s) (m3/s) (m3/s)"
For i = 1 To i1
D2z = Format(Format(i * d2, "#####0.00"), "@@@@@@@@@")
Q7z = Format(Format(q7(i), "######0.00"), "@@@@@@@@@@")
Q2z = Format(Format(q2(i), "######0.00"), "@@@@@@@@@@")
Q8z = Format(Format(q8(i), "######0.00"), "@@@@@@@@@@")
Print #3, D2z; Q7z; Q2z; Q8z
Next i
If n = n1 Then Close #3
End Sub
'******************** 計算結果のワークシートへの出力 ******************************
Sub print_basin2(m As Integer, ws5 As Worksheet)
Dim i As Integer, j As Integer
ws5.Select
' 流域計算出力 ------------------------------------------------
If m = 1 Then
ws5.Cells(2, 1) = "時間(hr)"
For i = 1 To i1
ws5.Cells(i + 2, 1) = i * d2
Next i
For j = 1 To nhyeto
ws5.Cells(2, (j - 1) * 2 + 2) = "降雨量(" & j & ") (mm)"
ws5.Cells(2, (j - 1) * 2 + 3) = "累積降雨量(" & j & ") (mm)"
For i = 1 To i1
ws5.Cells(i + 2, (j - 1) * 2 + 2) = r1(norain(m), i)
ws5.Cells(i + 2, (j - 1) * 2 + 3) = r3(i)
Next i
Next j
End If
ws5.Cells(1, nhyeto * 2 + 2 + (m - 1)) = "流域 (" + CStr(m) + ")"
ws5.Cells(2, nhyeto * 2 + 2 + (m - 1)) = "流域流出量(m3/s)"
For i = 1 To i1
ws5.Cells(i + 2, nhyeto * 2 + 2 + (m - 1)) = q6(i)
Next i
If m = m1 Then
For i = 1 To (nhyeto * 2 + 1)
Columns(i).AutoFit '列幅を整える
If i = 1 Then
Columns(i).NumberFormatLocal = "0.0_ " '桁数を揃える
Else
Columns(i).NumberFormatLocal = "0.00_ " '桁数を揃える
End If
Next i
For i = (nhyeto * 2 + 1) To m1 + (nhyeto * 2 + 1)
Columns(i).NumberFormatLocal = "0.000_ " '桁数を揃える
Columns(i).AutoFit '列幅を整える
Next i
End If
End Sub
'******************** 計算結果のワークシートへの出力 ******************************
Sub print_river2(n As Integer, ws6 As Worksheet)
Dim i As Integer
ws6.Select
If n = 1 Then
ws6.Cells(2, 1) = "時間(hr)"
For i = 1 To i1
ws6.Cells(i + 2, 1) = i * d2
Next i
End If
ws6.Cells(1, (n - 1) * 2 + 2) = "河道 (" + CStr(n) + ")"
ws6.Cells(2, (n - 1) * 2 + 2) = "河道流入量(m3/s)"
ws6.Cells(2, (n - 1) * 2 + 3) = "河道流出量(m3/s)"
For i = 1 To i1
ws6.Cells(i + 2, (n - 1) * 2 + 2) = q7(i)
ws6.Cells(i + 2, (n - 1) * 2 + 3) = q8(i)
Next i
If n = n1 Then
Columns(1).NumberFormatLocal = "0.0_ " '桁数を揃える
Columns(1).AutoFit '列幅を整える
For i = 2 To n1 * 2 + 1
Columns(i).NumberFormatLocal = "0.000_ " '桁数を揃える
Columns(i).AutoFit '列幅を整える
Next i
End If
End Sub
'******************** 計算結果のワークシートへの出力(グラフ用) *************************
Sub print_plot(ws7 As Worksheet)
Dim i As Integer
ws7.Cells(1, 3) = "NO." & numgraph
ws7.Select
For i = 1 To i1
ws7.Cells(i + 1, 4) = q8(i)
Next i
End Sub
'******************** 計算結果図の修正 *************************
Private Sub Graph_Refresh2()
'グラフの修正
Dim g_range As String
Sheets("計算結果図").Select
ActiveChart.SeriesCollection(2).Select
Selection.Delete
ActiveChart.SeriesCollection(1).Select
Selection.Delete
g_range = "B1:C" & CStr(nt + 1) & ",D1:D" & CStr(nt + 1)
'
Sheets("作図データ").Select
Range(g_range).Select
Selection.Copy
Sheets("計算結果図").Select
ActiveChart.SeriesCollection.Paste Rowcol:=xlColumns, SeriesLabels:=True, _
CategoryLabels:=True, Replace:=True
' ActiveChart.SeriesCollection.Paste Rowcol:=xlColumns, SeriesLabels:=True, _
CategoryLabels:=True, Replace:=False, NewSeries:=True
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "計算結果 " & "河道" & "NO." & numgraph
End With
End Sub