趣味で計算流砂水理

Computational Sediment Hydraulics for Fun

いろいろ

地理院地図とdeep learnning

http://ccpn.gsi.go.jp/meeting_partners/data/20170608/4.pdf

この前話そうと思っており、忘れてました。 deep learnningの部分を抜きにすると、公開データを一括処理でやっちゃうあたりは、我々がやりたいことと少し近いような気がしてます。 物理モデルと公開データを組み合わせて何かやりたいですね。

環境構築

c++の開発環境で、VC++って話をしていましたが、あえてのBash on windowsはどうでしょうか。もうすぐ、Fedora版がでるので、それで開発するとcentOSとの相性も良いのかなと。gccになるけど科学技術計算+αを書くだけなら十分でしょう。cmakeとか使いたいです。

例のもの

http://www.pref.shizuoka.jp/kensetsu/ke-830/numagawa/gaiyo/

まだ作ってないみたいです。ほんとにこんなにうまく流れるのかな。

twitter連携

始めて見ました。情報は共有してます。基本的には、ブログで書くほどもないことを上げようかなと。

勉強会での話

並列化

大きなプログラムを書きたいため、並列化の勉強をしているですが、気になる内容がありましたので、列挙しておきます。

ハイブリッド並列化

最近の主流っぽいですね。MPI+openmpが基本で。MPIで分割したものに、openmpで並列化をかけるようです。情報はお持ちでしょうか。

ポインタ配列の並列化

ポインタ配列って並列化できないのかなって思ってましたが、openmp3.0からサポートしているようです。

以下のp.36参照。ただし、Cだけっぽいですね。

http://jp.xlsoft.com/documents/intel/seminar/openmp20161202/OpenMP45_2016_Dec_JA_Final.pdf

openmpはMPIと比較して、いろいろと小回りがきくので、ハイブリッド並列化は良いような気がします。

意思決定の自動化

http://jpn.teradata.jp/library/ma/ins_17.html

最近検索に引っ掛かり、気になってます。 いづれは、私のような仕事もこうゆう世界になるのかなと思ってます。 問題解決のために必要な物理モデルの決定から、得られた解より対策を決定する過程が自動化されると仕事がなくなっちゃいますね。 でも、物理モデルを書ければ仕事はあるのかなと。

関係ない話

ちょっとしたことからPCを初期化しました。 インストールに気になったことを忘れないように書いておきます。

Windows 10 Creators Update

結構大幅に変わりましたね。まだ、使いこなせてないです。

vscodeのextensionが入らない

http://qiita.com/KuwabataK/items/f044b037bde50afbbca6#_reference-26d5b85ec3d8b2eafc11

proxy環境下でのバグっぽいです。とりあえずコマンドラインから対応。

visual studio comminityを入れると

勝手にanacondaがインストールされてました。node.jsも入るので、こっちのほうが楽かもしれないですね。ただし、15GBくらいありますが。

GC

メモリリーク

fortranでも起こるんですね。知りませんでした。。。

fortranでは気にしたことないですね。

deallocateはちゃんと書いた方が良さそうです。

ガベージコレクション

C++では必須でしたが、最近はGCを備えているようです(Cは必須)。

メモリの管理はGCを備えてない言語の一番不便な点です。 ただし、コンパイラ言語でGCを備えていても、 書き手は気にした方がいいですね。あとで大変なことになる場合があります。

σ座標系に手を出そうかと

連投になってすいません。

VOFを書いたところで、自由表面流れにおけるデカルト座標系の限界を感じてしまいました。河川流には向いてないような気がします。周期境界条件も作りにくいし。

そこで、今まで敬遠していたσ座標系に手を出そうかと思ってます。

Wuさんの本を読んでいると、水面の更新と座標変換について、Wuさんなり考え方で、ざっくり扱っても問題無いよ的なことが、7.1.3.2 SIMPLE algorithmの後半のWater level calculationとGrid adjustmentに書いてありました。

どうでしょうか。ご意見を頂きたいです。

ポインタとメモリリークについて

先日のアップしたプログラムを書いた際に初めてメモリリークという壁にぶち当たりました。 fortranメモリリークって無いだろと思ってましたが、結構あるみたいです。

例えば、

http://jjoo.sakura.ne.jp/tips/f90/memory_leak.html

ただし、今回陥ったものは、ifortだと問題なかったので、gfortranのバグっぽいですが、メモが代わりにまとめておきます。 下記のようにsubroutine内でポインタの配列を複製を作ると解放出来なくってしまいました。

subroutine test(pA)
    type(c), pointer :: pA(:)  !引数:構造体cの配列
    type(c), pointer :: p(:) => null() !ローカル変数

    allocate(p, source = pA) !pAのコピーをアロケート

!処理を実行

    deallocate(p) !pが開放されない。

end subroutine

全く原因が不明です。

今後c++で書くことを考えると、メモリリークは十分に注意しないといけないと思いました。

似非VOF:like interfoam

以前Openfoamのinterfoamの話がでたので、気になって自分でコーディングしてみました。 延べ2週間以上かかりました。苦労しました。

いろんなことがわかったので書いておきます。

参考資料

このあたりです。

https://www.jstage.jst.go.jp/article/jscejoe/69/2/69_I_748/_pdf

https://www.researchgate.net/publication/235679014_Influence_of_surface_tension_implementation_in_Volume_of_Fluid_and_coupled_Volume_of_Fluid_with_Level_Set_methods_for_bubble_growth_and_detachment

https://www.slideshare.net/takuyayamamoto1800/openfoaminterfoam

特徴

  • interfoamはVOFですが、SOLA-VOFのようにドナーアクセプタとか考えるのが煩わしいので、そこを簡易的に扱ってます。言葉で説明できないですが、支配方程式をみれば多分わかります。
  • あくまでも、二相流のソルバーです。密度の異なる2相を同一の方程式で解いてます。
  • 今回は省きましたが、運動方程式の表面張力項や占有率の保存則の付加項により、界面がきれいに表現できるらしい。

モデルと結果

  • とりあえず鉛直二次元です。
  • 空間解像度は、0.1m、dtを0.0001secです。fortran2008で書いており、gfortranでコンパイルしてます。
  • ノートパソコンですが、10secの計算に30分程度かかります。
  • dtを大きくしても回りますが、結果がおかしくなります。
  • スキームはHSMACを使ってます。openfoamは、PISOなので、計算時間に関係しているのかもしれないです。
  • PISOって、SIMPLEを非定常場に適用できるように拡張したものらしいですが、線形化を行ってる点は同じですね。openfoamの公式をみると、PISO+SIMPLEでPIMPLEという名前になってましたが、独自の名前っぽいです。以下を参照しました。

http://zzchina2010.blog.shinobi.jp/%E3%82%BD%E3%83%AB%E3%83%90%E3%83%BC%EF%BC%9Aopenfoam/openfoam%E3%82%BD%E3%83%AB%E3%83%90%E3%83%BC%E9%96%8B%E7%99%BA%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E7%9F%A5%E8%AD%98

  • 上記の川崎先生の論文の条件と合わせてましたが、計算時間短縮のため、メッシュサイズは5倍です。
  • なんとなく雰囲気はでてますよね。

f:id:SedimentHydraulics:20170715124150g:plain

結論

  • 界面の表現に注力しすぎてて、流れの内部構造に関する議論がない。ほんとに大丈夫?
  • 精度を上げるためには、四分木(八分木)は必須じゃないかと。
  • 密度や動粘性係数の評価方法に物理的根拠はない。
  • こんなの物理じゃない。なので、VOFはもう辞めます。

コードはDBにfakeInterfoamで。fortranですが、こんなコードをC++で書きたいと思ってます。

windows環境

いろいろありがとうございます。

私の環境は、VS 2017 communityです。問題なく動いてます。intel compilerも入れてますが、VS 2017上で動きます。全ての日本語化されてます。 特に工夫もせずにクリックだけで環境が構築出来たので、よくわからないです。 VS 2017は、オンラインインストーラーなので、そのあたりでしょうか。

今手元に4台PCがありますが、すべて64bitで32bitはないです。ただ、配布用のプログラムは、64bit、32bit両方でコンパイルして配布してます。このあたりは、intel compilerは便利です。

昨日gistをあげようとしたら、なぜか上手く行かず何度もチャレンジしていたら、アカウントと凍結されてしまい、supprotにメールをしたりと何か大変でした。今朝確認したら解決されてました。

上げようとしたものは、以前書いたキャビテーションのコードをjupyterで書いたのでそれです。VOFのための事前準備ですが遅すぎて使い物になりませんでした。Fortranで再整理してアップする予定です。