趣味で計算流砂水理

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

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

MENU

numba.jitの衝撃:5分 ⇒ 3秒

先日お話させて頂きましたnumba.jitの件です.私の手続きが間違ってました. 前回の河床変動の計算時間ですが,タイトルのとおり,超高速化します.100倍です. github更新しておきました.

github.com

numba.jitの使い方

でも,実問題はそんなわけにはいきません.

以下のサイトを参考にしました.

http://yutori-datascience.hatenablog.com/entry/2014/12/10/123157

http://www7a.biglobe.ne.jp/~thor/novel/column/14.html

ポイントは,公式 http://numba.pydata.org/ にもあるように,

@numba.jit(nopython=True)
or
@numba.njit

と書くことです.nopythonオプションは,最適化できないものはエラーとして返すというものです.これがないと最適化できるものはするけど,できないものはしないのでほんとに最適化できているかわからないということです.

特に,後述の高速化できないものがループに含まれるとそのループ自体が最適化されないので,ほとんど早くなりません.

一応並列化もやってみましたが,一次元なので,逆に遅くなりましたが,大規模だと早くなるようです.

@numba.jit(nopython=True, parallel=True)
# 並列化loopをrange(imax)から,
numba.prange(imax)
# に変更

まだ,やってないですがclassの最適化もあるようです.ちょっと面倒です.

https://stackoverflow.com/questions/38682260/how-to-nest-numba-jitclass

numba.jitで使えないもの

文字列型

一切駄目です.例えば,print(str(i))も駄目でした. 引数は駄目です。printは使えます。

lambda式

駄目です.ちょっと不便 使えます。

pandas

これも駄目です.

dictionary型

駄目です.

通常のリスト型およびその処理

すべて,numpyにしましょう.例えば,通常sumも使えません.np.sumならO.K.です

感想

  • もとのpythonのコードをほとんど手を加えずに,超高速化出来るので便利です.野望が広がります.
  • pythonらしいコードは書けないので,必要なdefだけ最適化すれば良いと思います.それでも,リスト内包表記や配列の演算などは普通に使えると十分です.
  • なので,静的な言語の知識は若干必要かも.我々のように高級言語から入った人間にはそんなに苦労する話じゃないですが.
  • numbaのエラー文がめちゃくちゃわかりにくい.エラー箇所が特定できないので,ちょっとコーディングが大変.

2020/3/7追記

より詳しい解説を下記事にしました.

computational-sediment-hyd.hatenablog.jp

computational-sediment-hyd.hatenablog.jp


2020/06追記

computational-sediment-hyd.hatenablog.jp

rigid-lid近似

連投になります.

直交格子でLES + 河床変動計算をやりたいと考えており, iricにあるNabiさんのLESモデルについて調べていると,河床変動は出来ないのですが,関連する論文を調べているとすでに河床変動計算も完成しているようです.

この辺りです.

https://agupubs.onlinelibrary.wiley.com/doi/epdf/10.1029/2012WR011911 https://agupubs.onlinelibrary.wiley.com/doi/epdf/10.1002/wrcr.20303 https://agupubs.onlinelibrary.wiley.com/doi/epdf/10.1002/wrcr.20457

水面の処理の話が殆ど書いていないので,よくよく読んでいるとrigid-lid近似としていると書いてありました.

これって,海の計算でよく使う「海面の鉛直変位は認めない」という条件です.要するに,水位は一定ということです.

河床変動って,河床面の摩擦力なので,垂直抗力(重力)が重要なので,このような近似を設けても良いのかなと疑問に思います.

一次元混合粒径掃流砂河床変動計算の更新

いろいろ修正しました.

だいぶ計算も安定してきました.

今度はgithubに上げました.

ちょっとおしゃれな図化にしました.

nbviewerのリンクは以下です.

http://nbviewer.jupyter.org/github/computational-sediment-hyd/1DBedVariationMixed/blob/master/make_graph_case01.ipynb

計算時間は5分くらいだと思います.

github.com

札幌市清田区里塚の航空写真,古地図,地質図を並べてみた

2018/9/24追記

清田区里塚で液状化した場所と住所は?被災前後で画像を比較 | わしろぐtwitter画像の位置の住所がまとめられていたのでポップアップを作ってみました.

Leaflet Sync Demo


またまたLeaflet.syncです.ブログへの埋め込み方がわかりました.

今回の北海道の地震液状化が生じた清田区里塚の地形を分析してました.

北海道札幌市清田区里塚の地震の影響の被害画像がヤバい!液状化で里塚ヤバすぎ,清田区おわった便りTwitterから届く,,, | What a story!in my Book

こう見ると谷底で人が住むところじゃないですね.

大きい版はこちら

github.com

Leaflet.Syncで真備町の写真を並べてみました

地理院真備町の被災直後の写真を公開していたいので,Leaflet.Syncで被災前,被災後,地形分類図を並べてみました.

いつもどおり,ブログに埋め込みたかったのですが,駄目だったので,githubに上げました.

Leaflet Sync Demo - with three maps listening

github.com

  • 被災箇所には旧川があったようです.
  • 破堤箇所は,特別水位が上がる箇所というよりも,越水で危険な状態にたまたまその箇所が切れた感じです.支川合流部で若干の弱部であったかもしれないですが,どこが切れてもおかしくない感じです.

小田川は,合流点付替えという大事業が今年度より行われる予定でした.確かに,高梁川の背水影響を受けづらくなりますが,抜本的な対策とは言えません.

今回の災害から,高い堤防は破堤時の浸水深が大きくなり,人的被害のリスクが高まることが理解できます.

あまり誰も言わないですが,築堤によるリスクは大きいな思いました.

私の改修案は,引き堤および旧川の復元です.これしかサスティナブルな開発はないと思います.


CDN(Content delivery network)を初めて使いました

私が知識不足なだけですが,CDNを初めて知りました. かなり便利ですね.

本番環境では禁止されているようですが,テスト環境だとサーバを立てずにnpmを使えるは非常に役立ちます.

2種類使ったので書いておきます.

UNPKG

npmのCDN化用です.jsやcssを使うためにコードに埋め込んでます.

RawGit

githubCDN化するのに使ってます.今回はhtmlですが,textやjsonCDN化に使えそうです.

はてブロでbokeh

bokehWelcome to Bokeh — Bokeh 0.13.0 documentationというD3.jsのpythonラッパーで遊んでみました.

D3.jsよりは楽で,pythonで書いたものをhtmlで吐き出す形式です. Web上で解析結果をインタラクティブに表示するのに使えそうです.

これとは別にplotlyPython Graphing Library, Plotlyというのが並んで有名らしいです.

一次元河床変動計算,掃流砂のみ混合粒径:コードは世界最短?

やっとできました.

計算条件

  • 境界条件:周期境界条件
  • 平均河床勾配:1/500
  • 水深1.4m
  • 粒径:7粒径区分,うち2粒径が動かない粒径(コード参照)
  • dx:200m,dt:1sec
  • 初期条件:一部区間に最大粒径の2倍程度のマウンドを設ける

計算結果と考察

 計算があってると仮定します.

f:id:SedimentHydraulics:20180719190217g:plain

  • マウンド部分が粗粒化が進んで,動かなくなります.単一粒径では起こらない現象です.
  • マウンド以外は分級が生じないです.ほとんど初期材料と構成が変わりません.分級は流れを制限する要因(河床勾配の変化等)がないと生じないと言えます.
  • 粒径によって伝搬速度が異なる.

コード

  • こんなにスッキリ書けるとは思いませんでした.まだまだ短く書けますが,可読性を考えてこんなところにしておきました.
  • あまり自信がないです.チェックしてください.

1D-bed-variation-model-of-sediment-mixtures

gistにもライセンスを

以前何かで読んだので書いてみました.beautifulsoupでおしゃれに.