iRICの格子生成アルゴリズム 多機能格子生成ツール "Multifunction Grid Genarator"について 

:::note
本テキストは公開されている資料や開発者様から提供頂いたソースコードを基に@starfieldKtが作成しています。
そのため開発者様が意図していることと異なる部分がある可能性があることをご注意ください。
また、本テキストに関することを開発者様へお問い合わせ頂かないようお願い申し上げます。
:::

その他格子生成ツールについては[こちら](https://qiita.com/starfieldKt/items/fcc0d0261bdfc169696c)

# 多機能格子生成ツール *"Multifunction Grid Genarator"*

|項目|内容|
|:- |:- |
|名称|*Multifunction Grid Genarator*<br>多機能格子生成ツール|
|開発者|清水康行|

:::note warn
注意
本投稿ではiRIC ver4版の多機能格子生成ツール(ver 1.1.23012501)について紹介します。
iRIC ver3のインストーラーに含まれる多機能格子生成ツール(ver 1.0.1)とは異なる部分があります。
:::

# 概要
この格子生成ツールでは、直線水路および、サイン・ジェネレーテッド・カーブ蛇行水路、蛇行水路に歪度と平坦度を設定した木下蛇行水路の作成ができる。
また、それぞれの水路形状において、複断面の設定、上下流への直線水路追加、縦断方向で変化する水路幅設定ができる。



# 格子生成条件

## 水路形状

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/dc7910db-34e0-3632-65f7-d048daf47867.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/c46cecb7-5d0b-003d-f0a9-e756cdec6c35.png)


### 水路形状
水路形状の項目では、`水路形状`の項目で、水路主要部の形状として`直線`、`サインジェネレーテッドカーブ`、`木下迂曲蛇行河道`が選択できる。

各格子形状は以下のようになる。蛇行波数を増やした場合、以下に示した形状が蛇行波数分繰り返される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/24983721-2b66-2c8d-c146-9bf490cf8b82.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/373c255b-36f0-6524-7dbe-75aa310c0a3b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/8d94d248-5b04-a6ed-d393-e96cec87b6da.png)

### 断面形状
`断面形状`では`単断面`か`複断面`を選択可能、各横断形状の例を以下に示す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/d5606574-86fb-dc66-83b9-7453fc533031.png)

### 複断面のパターン
`複断面のパターン`では低水路と堤防の関係を3種類から選ぶことができる。
* `堤防と低水路が平行`の場合、そのままの意味で低水路と堤防は平行に作成される。
* `堤防は直線`の場合、低水路の形状に関わらず堤防は直線で作成される。
* `堤防も蛇行`の場合、水路形状に関わらず堤防を蛇行させることが出来る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/2932d918-225b-fbad-fa42-a4554c86c73f.png)


## 断面形に関するパラメーター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/1af2651b-e8ea-f7f9-83f8-7b22d49f10e0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/843d8e1e-1a85-d10c-5725-25ad9ccea7b4.png)


断面形状に関するパラメーターグループでは水路の横断面に関する設定を行う。

横断面の形状毎に入力が必要なパラメーターについて整理する。
### 単断面

`横断形状`を単断面に設定した場合、入力するパラメータと作成される格子は以下のようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/24018534-f3c5-9214-93f2-64b9c9ff7433.png)

### 複断面（堤防と低水路が平行）

`横断形状`を複断面、`複断面のパターン`を堤防と低水路が平行に設定した場合、入力するパラメータと作成される格子は以下のようになる。
低水路河岸の幅は`低水路河岸法勾配(1:n)`と`低水路河岸深さ(m)`から求められる。（以後複断面のものは同様）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/042a21d0-16c9-3ac1-6474-67dcb3699d1a.png)

### 複断面（堤防は直線）
`横断形状`を複断面、`複断面のパターン`を堤防は直線に設定した場合、入力するパラメータと作成される格子は以下のようになる。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/70226c84-4a27-a895-8815-86818b614755.png)


この時の低水路、と高水敷の端（堤防）の位置関係は以下のように、低水路の中心線のY軸方向が中央となる位置が堤々間の中心になるようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/5cdf0c4f-0fb0-c065-5e82-f29ba1fe72e1.png)

### 複断面（堤防も蛇行）
`横断形状`を複断面、`複断面のパターン`を堤防も蛇行に設定した場合、入力するパラメータと作成される格子は以下のようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/d7de562e-4a86-9f42-6b75-d7080cbe7494.png)

### 堤防と低水路が平行以外のパターンの際の横断面について

上記の3パターンを見比べてお気づきかもしれないが、`堤防と低水路が平行`と`堤防は直線`、`堤防も蛇行`では高水敷の横断面のとりかたが異なっている。

`堤防と低水路が平行`において、横断面は高水敷でも低水路中心線に対し垂直のままも生成されているのに対して、`堤防は直線`、`堤防も蛇行`に関しては低水路河岸の法肩からX軸方向に垂直に堤防に向かって横断面が伸びている。
これに関しては高水敷の格子点の座標の求め方が異なっているためである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/5da82550-d492-4db6-7d0d-6d74837ee5b9.png)

## 水路形状に関するパラメーター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/62980e06-fb01-8b1c-464a-bd6310801f4f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/7ebda4c1-536b-bd72-58fa-2361409efbbc.png)

ここでは水路形状（主に流下方向）に関するパラメータの設定をする。

枠で囲まれていない`蛇行波長(m)`、`蛇行波数`、`蛇行角`、`一波長当たりの縦断方向格子数`が主要水路のパラメータである。
`堤防の平面形状パラメータ`の枠で囲まれた項目は`複断面のパターン`で堤防も蛇行を選択した場合のみに設定する項目で堤防の蛇行を水路の蛇行とは別途設定することが出来る。なお、堤防の蛇行に関しては蛇行波数の設定項目が存在しないが、堤防の蛇行波数は主要水路の蛇行波数と同じ値になる。
また、以下の図のように堤防の蛇行波長が主要水路の蛇行波長より短い場合は蛇行終了後、直線堤防となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/0c98d348-b5da-78e4-bbc2-c31c01f9f8da.png)

### サインジェネレーテッドカーブ、木下迂曲蛇行河道について

`河道形状`を`サインジェネレーテッドカーブ`、`木下迂曲蛇行河道`にした場合の低水路の中心線および、`複断面のパターン`で`堤防も蛇行`を選択した場合の堤防のラインはサインジェネレーテッドカーブまたは木下蛇行曲線から作成される。
この低水路の中心線および堤防のラインの座標を計算する際に上記のパラメーターが使用される。

サインジェネレーテッドカーブおよび木下蛇行曲線については以下のページを参考にしています。

https://i-ric.org/yasu/nbook2/08_Chapt08.html#sin-generated-curve

はじめに、`河道形状`を`サインジェネレーテッドカーブ`に設定した際の低水路中心線について、曲線の進行方向を$s$軸、蛇行波長を$L$、蛇行角を$\theta_0$としたとき曲線の進行方向と水平方向の角度$\theta$は以下の$s$に関する式で表される。

```math
\theta=\theta_0\sin\biggl(2\pi\frac{s}{L}\biggr) \tag{1} 
```

この曲線を$x-y$座標に変換するには微小要素$\Delta s$を$s$軸に沿って逐次加算していき、その都度$\theta$を求め、$\Delta s$と$\theta$から$\Delta x$、$\Delta y$を求め、累加していきます。
微小要素$\Delta s$の$x,y$成分は以下の式で表せます。

```math
\begin{align}
\Delta x=\Delta s \cos \theta\tag{2} \\
\Delta y=\Delta s \sin \theta\tag{3}
\end{align}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/d65ff5dd-5ca8-8640-401d-32a47f2039bf.png)

これらの式より、サインジェネレーテッド曲線の$s,x,y$は以下の式で表すことができました。

```math
\begin{align}
s= s_0 + \int_{s_0}^{s}ds\tag{4}\\
x= x_0 + \int_{s_0}^{s}\cos\theta ds\tag{5}\\
y= y_0 + \int_{s_0}^{s}\sin\theta ds\tag{6}
\end{align}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/3836318a-f46a-2686-428c-f27cab85ce98.png)

次に`河道形状`を`木下迂曲蛇行河道`に設定した場合、低水路中心線は木下蛇行曲線が作成されます。
木下蛇行曲線はサインジェネレーテッドカーブの$(1)$式が次式のようになったものです。
上記のパラメータにおいて、`付加項の蛇行角(度)`が$\theta_1$、`付加項の波数`が$n_w$になります。

```math
\theta = \theta_0\sin\Biggl( \frac{2\pi s}{L}\Biggr)+\theta_1\cos \Biggl( n_w\frac{2\pi s}{L}\Biggr)
```

木下蛇行曲線については、先ほどのページに記載されている式（簡易直線・蛇行水路生成ツールで使用されているのはこちら）とは異なりますが、上式は開発者より提供頂いたソースコード上で記載されているものです。

最後に`複断面のパターン`を`堤防も蛇行`に設定した際に作成されるサインジェネレーテッドカーブですが、ここでは`低水路との位相差`を設定することができます。
位相差$s_d$を考慮する場合、$(1)$式が以下のようになります。

```math
\theta=\theta_0\sin\biggl(2\pi\frac{s-s_d}{L}\biggr)
```

なお、低水路の中心線及び左右岸の堤防のラインの始点$[x_0,y_0]$について、低水路の中心線は$[0,0]$,左岸の堤防ラインは$[0,低水路中心から左岸堤防までの距離]$と$[0,-低水路中心から右岸堤防までの距離]$になります。

## 河床形状と河道形状

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/4e87f951-c836-cd43-2839-11948157d9a9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/97a92039-8fb9-326b-459f-46ea4f2a90d3.png)

ここでは水路の勾配および河床の形状の設定を行います。
河床形状の設定は複断面の設定と併用できますが、この項目を設定することによる変位が高水敷を含めた水路幅全範囲に対して適用されるため、併用は想定されていないものと思われます。

### 河床形状
河床形状は`平坦(砂州無し)`、`交互砂州`、`放物線状`の3つから選択できます。
3種類の横断形のイメージと平面図の例を以下に示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/410fd7f4-27a3-7ac2-45fa-0b9b1b3750ff.png)

#### 平坦
`平坦(砂州無し)`を選択した場合、横断方向の河床高の変化はありません。

#### 交互砂州
`交互砂州`を選択した場合、水路の中央を中心とした点対象の河床となります。
また、流下方向における横断形の変化もあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/5a5427b3-4d7e-8e65-a08f-4353477ef1db.png)


断面$i$での地盤高$y$を考える。
主要水路上流端断面から断面$i$までの流下方向の距離を$s$、右岸端から左岸方向への距離を$x$、水路中央の地盤高を$y_0$、水路幅を$B$、砂州波高を$h$、平面形と河床地形の位相差を$d$、波長を$L$とすると$y$は以下の式で表すことができる。

```math
y=y_0-h\cos\biggl(2\pi\frac{s-d}{L}\biggr)\cos\biggl(\pi\frac{x}{B}\biggr)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/f1dd7cc8-a7c4-6f29-b265-04c798453554.png)

#### 放物線
`放物線`を選択した場合、水路の中央を中心に左右対称の放物線状の河床となります。
縦断方向での横断形の変化はありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/fb32a9a3-6798-cc5c-7006-4bbaaa1b884f.png)


断面$i$での地盤高$y$を考える。
水路中央からの距離を右岸側を正として$x$とし、水路中央の地盤高を$y_0$、水路幅を$B$、砂州波高を$h$とすると$y$は以下の式で表すことができる。

```math
y=y_0+\frac{4h}{B^2}x^2-h
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/721dc456-98db-4f57-3414-2ab551616804.png)

#### 水路勾配
`水路勾配`を指定すると、主要水路の上流端を基準に指定した勾配で縦断方向の距離に応じて河床の変化を与えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/1efe0b5a-a8a8-dac4-4f4d-2c89af9f5811.png)


## 上下流の条件

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/6f260eee-081a-910f-892f-9250cd79a0ec.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/16735c1e-50b7-6202-193a-771fc0273623.png)

ここでは主要水路の上下流に追加する直線水路の設定ができる。
`水路を付加する`を選択した場合、`上流に追加する断面(格子)数`、`上流に追加する断面(格子)数`で指定した数だけ上下流に断面が追加される。
この時の追加断面は非常に単純に、主要水路の上下流端断面の格子点からX軸方向に$\frac{蛇行波長}{一波あたりの縦断方向格子数}$の間隔で格子点を指定した断面数分だけ追加するものである。そのため、上下流端断面のY軸方向に対する傾きに関係なく同じ断面の傾きのまま水平方向（X軸方向）へ直線水路が作成されるので流心線(水路中心線)と横断面が直交しないことがある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/040e9e3f-f065-fdc8-054c-82b35a180717.png)

また、勾配は上の図のように主要水路と同じ勾配が適用されるが、`河床形状`で`交互砂州`を選択した場合は河床形が縦断方向で変化するのは主要水路だけであるので注意が必要となる。
上の図の水路の勾配を0、河床形状を交互砂州に設定した場合の水路を以下に示すが、追加水路の河床形状は主要水路上下流端と同じになっていることが確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/6d63b79b-b8a4-3fb8-2516-109c608ff79e.png)

:::note
[簡易直線・蛇行水路生成ツール](https://qiita.com/starfieldKt/items/62f440074cdbce59a023)では複断面を設定できませんが、上下流追加水路の勾配を別途設定できるほか、上下流追加水路にも交互砂州が適用されます。
:::

## 川幅の水路方向変化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/e9dad56b-7db7-da2a-a7f6-44b348ad13cc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/a05bdee2-58b3-0193-0506-bdf910f79ba4.png)

ここでは`川幅変化の方法`の選択内容で左右岸両方、またはどちらかの低水路の川幅を流下方向距離に応じて`川幅変化量(m)`で指定した値を最大値として変化させることが出来る。特徴として以下があげられる。

* 川幅が変化するのは主要水路部の低水路のみである。
* `川幅変化量(m)`の値が正の場合は川幅が拡幅され、負の場合川幅を縮小させる。
* `両岸`を設定した場合、指定した`川幅変化量(m)`分だけ左右岸それぞれ拡幅or縮小される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/b5ab5451-a59c-bf46-6224-d92be016d3a1.png)

拡幅方向の変化量を正とした時、左右岸それぞれにおける変化量$y$は、主要水路部上流端からの距離を$s$、指定した`川幅変化量(m)`を$b$、波長を$L$とすると以下の式で表すことができる。

```math
y=b\frac{1-\cos\biggl(2\pi\frac{s}{L}\biggr)}{2}
```

## 河床の状況
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/3f781745-48d9-2b9a-d425-f08f4553841a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/90d6171b-ac57-3ac1-510f-bff649ec3411.png)

ここでは格子作成の際にセル属性として`河床の状況`と`粗度`を与えることができる。
属性を与えるセルの範囲は低水路と高水敷に分かれておりそれぞれに異なるセル属性を与えることが可能です。

なお、高水敷の範囲には低水路の河岸法面部分のセルも含みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/b833daa9-2c00-ee9f-c1db-c30ae4f47d0c.png)

# 格子が作成されるまでの流れ
サインジェネレーテッドカーブ、単断面、水路幅変動あり、交互砂州、追加水路ありの条件で格子が作成される例をもとに格子作成までのプログラム的な流れを整理します。

1. 水路中心線に沿って各断面の中心の座標が計算される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/c241d516-449f-8da4-942e-46dcd8524581.png)
2. 各断面の水路幅に応じて断面が水路中心線に直交するような各断面の両端の座標(複断面の場合は高水敷、河岸法面、低水路それぞれの両端の座標)を求める。この時すでに川幅の変化は適用されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/bc97fc5e-c4dd-0a14-6023-646213339957.png)
3. 各断面で両端の座標から按分して横断方向の格子点の座標を求める。この時、勾配と上流端から各断面までの距離に応じた標高を一律で各断面の格子点に与える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/7bcdf6d0-9ba2-80ce-8e06-125e4be11fa0.png)
4. 各横断面において、指定した`河床形状`になるよう上流端から各断面までの距離に応じた各断面の格子点の変位量を計算し、各格子点に変位量を加算する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/bf89d5c7-b738-10c8-9dfc-cc43152f5a1a.png)
5. 上下流に水路を追加する場合、上下流端の断面の座標から追加の水路を作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/c7108f92-b353-a372-4da1-ae021e542c1e.png)

複断面の場合、複断面のパターンによって2～3での高水敷の端の座標の設定方法が異なりますが全体の流れとしては大体同じになります。長くなるため解説はしませんが、要望があれば追記するかもしれません。

# 格子作成例
低水路と平行な堤防に囲まれた幅が変化する蛇行水路
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/c366c692-f389-3e2d-056d-1bd4ea6a1dd9.png)

直線堤防に囲まれた幅が変化する蛇行水路
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/de9f8e26-3cf6-f68d-afbb-39d31834a543.png)