趣味で計算流砂水理

趣味で計算流砂水理 Computational Sediment Hydraulics for Fun Learning

数値計算とか河川工学とかプログラミングのことを書いています

MENU

ALB測量を使って水深平均二次元流計算をすると凄い結果がでた

解像度が高過ぎてレンダリングが追いつかない。。。。

f:id:SedimentHydraulics:20210815193511g:plain

この記事のポイント
  • ALB地形を使った超高解像(2.5m間隔、430万メッシュ)の水深平均二次元計算を実施
  • 局所的な流況を再現可能。土砂水理、環境水理の分野では特に重要な知見が得られる
  • オープンデータを整備して頂いた国土交通省に感謝。河川工学の進展に期待。

モチベーション

過去記事(オープンデータのALB測量よりjupyter上で陰影図を作成する - 趣味で計算流砂水理)にも書いたオープンデータのALB(Airborne LiDAR Bathymetry)による測量結果を用いて水深平均二次元流計算をやるとどうなるかのチャレンジです。

計算対象

  • 対象河川は8606070001です。
  • 対象範囲は下図のとおりの領域です。流下距離で約10km程度です。

f:id:SedimentHydraulics:20210815233318p:plain

計算条件

  • デカルト座標系による水深平均二次元流計算
  • 初期条件はドライで定常になるまで5時間流し続ける。
  • 下流端はゼロ勾配
  • 時間刻みは0.025秒
  • 空間刻みはx,yともに2.5m
  • 格子数は約430万個
  • マニングの粗度係数は0.025

計算結果

計算結果として、水深、流速の平面分布を図化しました。なお、流速のベクトル図は見やすくするため、100メッシュに1点のみ図化しています。

計算結果のポイントを簡単にまとめておきます。

5m程度の狭い流路が解像できる。

これまでの計算では難しかった小規模な流路の計算が可能になります。

f:id:SedimentHydraulics:20210815160754p:plain

シュート・プールの再現

流れが速く水深が小さいシュート部、流れが遅く水深が大きいプール部の流況がきれいに再現できます。

f:id:SedimentHydraulics:20210815161132p:plain

根固めブロック周辺の局所流の再現

橋脚周辺の根固めブロック周辺の流れも再現できます。

f:id:SedimentHydraulics:20210815161929p:plain

計算時間

これが今回の問題で、私の計算機(計算機のスペック:BTOパソコン - 趣味で計算流砂水理)でnumbaを使用し、並列化した上で実時間5時間の計算に約31時間かかりました。

numbaの関連記事は以下があります。

まとめ

  • ようやくまともな水深平均二次元計算ができるようになり結構興奮しています。本業でも計算することはありますが、地形データが得られないため、かなりラフな計算にならざる得ないのでずっともやもやしていました。
  • このような地形データが得られることは間違いなく河川工学の進展に繋がります。河川工学2.0。
  • 特に、土砂水理の進展には重要な情報になります。
  • また、環境水理の分野では、小規模流量時の流況が重要になるので高解像度の地形データは重要です。
  • 次のモチベーションとして、計算時間の短縮を考えています。目標は31時間から30分以内。

謝辞

 このようなデータをオープン化して頂いた国土交通省さんに感謝です。間違いなく河川工学が一歩進むきっかけになります。

Github

github.com

参照

gif作成

computational-sediment-hyd.hatenablog.jp

グラフの作成はHoloviewsを使用

computational-sediment-hyd.hatenablog.jp


時間をみて解説記事を書いていきます。

備忘録:wordで急に文字入力ができなくなる原因がGoogle日本語入力っぽい

wordで急に文字入力ができなくなる原因がGoogle日本語入力っぽい。

Microsoft Wordを使用していると文字入力ができなくなるトラブル

WindowsのWord(ワード)で文章が入力ができなくなったときの対処法 | complesso.jp

昨年は何回もこの現象が起こっていて毎回wordを再起動してました。

何とかなんないかな。。。

備忘録:webページ内の動的iframe内のデータをスクレイピングする

webページ内の動的iframe内のデータをスクレイピングする方法のメモです。

サンプルwebサイト

河川屋さんにはお馴染みの水文水質データベースより水質・底質のデータをサンプルとしました。

http://www1.river.go.jp/cgi-bin/DspWquaData.exe?KIND=1&ID=404031284401010&KIJUN=01&BGNDATE=20210101&ENDDATE=20210531&KAWABOU=NO

わかりにくいですが、赤枠内がiframeです。

しかもURLは動的に振られる仕様になっています。

スクレイピング(2022/7/4:より簡単な方法を見つけたので修正します)

モジュール

定番のBeautifulSoupを使います。

import pandas as pd
from bs4 import BeautifulSoup
from urllib import request

手順1:BeautifulSoupで解析

BeautifulSoupでサイトの情報を取得します。

url = 'http://www1.river.go.jp/cgi-bin/DspWquaData.exe?KIND=1&ID=404031284401010&KIJUN=01&BGNDATE=20210101&ENDDATE=20210531&KAWABOU=NO'
response = request.urlopen(url)
soup = BeautifulSoup(response, features="lxml")

手順2:iframeに移動

iframeを検索してそのページに飛びます。

tmp = soup.findAll("iframe")[0]['src']
url2 = 'http://www1.river.go.jp' + tmp
response = request.urlopen(url2)

手順3:スクレイピング

pandasで読み込みます。

dfs = pd.read_html(response.read())
dfs[0]
年月日 時分 採水位置 採水時刻(時分) 採水位置.1 天候 水位(m) 流量(m3/sec) 全水深(m) 採水水深(m) ... 水温(℃) 外観(1) 外観(2) 外観(3) 外観(4) 臭気(冷時) 透視度(cm) 透明度(m) 干潮時刻(時分) 満潮時刻(時分)
0 2021年02月24日 09時00分 流心 09:00 流心 5.02 243.00 2.2 0.44 ... 0.6 淡黄色透 NaN NaN NaN 無臭 34 NaN NaN NaN
1 2021年05月19日 09時10分 流心 09:10 流心 6.17 187.62 3.5 0.70 ... 15.0 無白色濁 NaN 濁り多し NaN 無臭 21 NaN NaN NaN

修正前の記事

モジュール

定番のseleniumとBeautifulSoupを使います。 chromedriver_binaryのインストール方法は以下を参照。

computational-sediment-hyd.hatenablog.jp

from selenium import webdriver
import chromedriver_binary
from bs4 import BeautifulSoup
import pandas as pd

手順1:selenimで解析

いつもどおり、selenimでChromeを使ってサイトに接続します。

driver = webdriver.Chrome()
url = 'http://www1.river.go.jp/cgi-bin/DspWquaData.exe?KIND=1&ID=404031284401010&KIJUN=01&BGNDATE=20210101&ENDDATE=20210531&KAWABOU=NO'
driver.get(url)

手順2:iframeに移動

iframeを検索してそのページに飛びます。今回はcss_selectorを使いましたが何でもいいです。

  • 参考サイト:css_selectorを検索

Python Webスクレイピング テクニック集「取得できない値は無い」JavaScript対応@追記あり6/12 - Qiita

  • 参考サイト:iframeへswitch

Seleniumでiframeに出入りしてみた - Qiita

Seleniumでページ内のiframeを操作できない - Qiita

scss = 'body > center > p > iframe'
iframe = driver.find_element_by_css_selector(scss)
driver.switch_to.frame(iframe)

手順3:スクレイピング

ここからはいつもどおりに解析するだけです。 BeautifulSoupとpandasの2手法をまとめておきます。

方法1:BeautifulSoup
BeautifulSoup(driver.page_source, 'html.parser')
    <html><head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
    <meta content="text/css" http-equiv="Content-Style-Type"/>
    <title>任意期間水質検索結果</title>
    </head>
    <body bgcolor="#ffffff">
    <center>
    <table border="1">
    <tbody>
    <tr>
    <th bgcolor="#ccffff" nowrap="">年月日</th>
    <th bgcolor="#ccffff" nowrap="">時分</th>
    <th bgcolor="#ccffff" nowrap="">採水位置</th>
    <th align="center" bgcolor="#ccffff" nowrap="">採水時刻<br/>(時分)</th>
    <th align="center" bgcolor="#ccffff" nowrap="">採水位置<br/> </th>
    <th align="center" bgcolor="#ccffff" nowrap="">天候<br/> </th>
    <th align="center" bgcolor="#ccffff" nowrap="">水位<br/>(m)</th>
    <th align="center" bgcolor="#ccffff" nowrap="">流量<br/>(m3/sec)</th>
    <th align="center" bgcolor="#ccffff" nowrap="">全水深<br/>(m)</th>
    <th align="center" bgcolor="#ccffff" nowrap="">採水水深<br/>(m)</th>
    <th align="center" bgcolor="#ccffff" nowrap="">気温<br/>(℃)</th>
    <th align="center" bgcolor="#ccffff" nowrap="">水温<br/>(℃)</th>
    <th align="center" bgcolor="#ccffff" nowrap="">外観(1)<br/> </th>
    <th align="center" bgcolor="#ccffff" nowrap="">外観(2)<br/> </th>
    <th align="center" bgcolor="#ccffff" nowrap="">外観(3)<br/> </th>
    <th align="center" bgcolor="#ccffff" nowrap="">外観(4)<br/> </th>
    <th align="center" bgcolor="#ccffff" nowrap="">臭気(冷時)<br/> </th>
    <th align="center" bgcolor="#ccffff" nowrap="">透視度<br/>(cm)</th>
    <th align="center" bgcolor="#ccffff" nowrap="">透明度<br/>(m)</th>
    <th align="center" bgcolor="#ccffff" nowrap="">干潮時刻<br/>(時分)</th>
    <th align="center" bgcolor="#ccffff" nowrap="">満潮時刻<br/>(時分)</th>
    </tr>
    <tr>
    <td align="center" bgcolor="#FFFFCC" nowrap="">2021年02月24日</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">09時00分</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">流心</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">09:00</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">流心</td>
    <td align="center" bgcolor="#FFFFCC" nowrap=""></td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">5.02</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">243</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">2.2</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">0.44</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">2.6</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">0.6</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">淡黄色透</td>
    <td align="center" bgcolor="#FFFFCC" nowrap=""> </td>
    <td align="center" bgcolor="#FFFFCC" nowrap=""> </td>
    <td align="center" bgcolor="#FFFFCC" nowrap=""> </td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">無臭</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">34</td>
    <td align="center" bgcolor="#FFFFCC" nowrap=""> </td>
    <td align="center" bgcolor="#FFFFCC" nowrap=""> </td>
    <td align="center" bgcolor="#FFFFCC" nowrap=""> </td>
    </tr>
    <tr>
    <td align="center" bgcolor="#FFFFCC" nowrap="">2021年05月19日</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">09時10分</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">流心</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">09:10</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">流心</td>
    <td align="center" bgcolor="#FFFFCC" nowrap=""></td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">6.17</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">187.62</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">3.5</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">0.7</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">16.5</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">15</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">無白色濁</td>
    <td align="center" bgcolor="#FFFFCC" nowrap=""> </td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">濁り多し</td>
    <td align="center" bgcolor="#FFFFCC" nowrap=""> </td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">無臭</td>
    <td align="center" bgcolor="#FFFFCC" nowrap="">21</td>
    <td align="center" bgcolor="#FFFFCC" nowrap=""> </td>
    <td align="center" bgcolor="#FFFFCC" nowrap=""> </td>
    <td align="center" bgcolor="#FFFFCC" nowrap=""> </td>
    </tr>
    </tbody>
    </table>
    </center>
    </body></html>
方法2:pandas
dfs = pd.read_html(driver.page_source)
dfs[0]
年月日 時分 採水位置 採水時刻(時分) 採水位置.1 天候 水位(m) 流量(m3/sec) 全水深(m) 採水水深(m) ... 水温(℃) 外観(1) 外観(2) 外観(3) 外観(4) 臭気(冷時) 透視度(cm) 透明度(m) 干潮時刻(時分) 満潮時刻(時分)
0 2021年02月24日 09時00分 流心 09:00 流心 5.02 243.00 2.2 0.44 ... 0.6 淡黄色透 NaN NaN NaN 無臭 34 NaN NaN NaN
1 2021年05月19日 09時10分 流心 09:10 流心 6.17 187.62 3.5 0.70 ... 15.0 無白色濁 NaN 濁り多し NaN 無臭 21 NaN NaN NaN

備忘録:WIFIのドライバーが壊れた時の対応

Hyper-Vの設定をいじりまくっていたらなぜかWIFIドライバーが壊れてしまいました。その時の対応です。

  • WIFIドライバーを削除

NEC LAVIE公式サイト > サービス&サポート > Q&A > Q&A番号 018281

  • WLAN AutoConfigサービスを自動化

【Windows 10】 WLAN AutoConfig サービス起動の必要性 | 個人PCの性能とセキュリティ向上

これで解決しました。


なぜHyper-Vを触ったかというとWSL2でmDNSが使えなかったのでこのページを参考にいじったら壊れました。

備忘録:ubuntu計算メモ

sshでつないで計算を回すときのよく使うコマンドです。日常使いする方なら誰でも知っていることですが私がすぐに忘れるだけので。

  • バックグラウンドでジョブを実行 nohup

nohupを使ってsshログアウト後もシェルスクリプトを動かす - Qiita

  • CPU使用率を確認 topコマンド

Linux - topコマンドでCPU使用率をコア単位で表示する方法 - Qiita

  • CPU使用率を確認 htopコマンド こっちのほうが見やすい

htopコマンドで覚えておきたい使い方11個 | 俺的備忘録 〜なんかいろいろ〜

雑談:モデルナワクチン2回目の経過報告

モデルナワクチンの2回目を摂取したので経過報告です。

この記事の要点
  • 接種日の次に日は結構きつかった
  • でも接種日の次の日のみで回復

8月2日の11時頃に接種したのでその後の経過です。

接種後14時間後:午前1時

若干腕の痛みはあるが特に問題なく、普通に寝る。

接種後17時間後:午前4時

肩、背中、腰あたりに急激な痛みがあり、目が覚める。発熱あり37.5℃。

接種後18.5時間後:午前5時半

痛みが強く寝れない。発熱あり38.1℃。

接種後20時間後:午前7時

引き続き痛みが強く寝れない。発熱あり38.2℃。

接種後20.5時間後:午前7時半

解熱剤を飲む。カロナール系は手に入らなかったのでイブプロフェン系のもの。

接種後22時間後:午前9時

解熱剤のおかげで楽になる。もう大丈夫かなと思い、普通に生活をする。熱は37.3℃。

接種後24.5時間後:午前11時半

再度、肩、背中、腰あたりに痛みがでてきて横になる。

接種後28.5時間後:午後3時半

再び発熱38.4℃。

接種後29.5時間後:午後4時半

2回目の解熱剤

接種後30.5時間後:午後5時半

解熱剤のおかげで楽になる。熱は37.5℃。

その後は、37.0℃くらいの熱でしたが、結構体が痛い感じ。

接種後37時間後:午前0時

発汗ともに体の痛みが消えていくような感覚がある。

次の日(現在)

普通に元気。肩が痛いくらい。

まとめ

  • 一回目のときに何もなかったので、なめていましたが結構キツかったです。
  • 解熱剤は必須です。後は食事がとれないので、ポカリスエットとかウィダーインゼリーとかがあればいいと思います。