趣味で計算流砂水理

Computational Sediment Hydraulics for Fun

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で再整理してアップする予定です。

雑多な事

Visual Studio

非常に安いWindowsのノートPCを購入したのですが、 後にSSD512GBへの換装とメモリ32GBにしたら、本体よりも高くなってしまいました…。

取り急ぎVisual Studio 2015 Expressを入れたのですが、 英語しかないようです。 2017 Community は途中でコケる始末・・・

環境を合わせたいのですが、何をお使いでしょうか?

64bit

やはり、32bitと64bitは大きいようですね。

会社だと32bitがベースなので、個人PCに入れるのは気にしないですし、 Macだと64bitなので、そもそもその違いをきにする必要がありません。

Bash on Windowsも入れてみましたが、調べが足りずに仕組みがわかってません。 今度教えて頂ければ幸いです。

OpenFoarm

あれはVirtual Box でエミュレートしてます。

DEXCS2016 for OpenFOAM で調べていただくと、環境構築もそれほどかからずに簡単にできる事がわかります。 OSはLinuxディストリビューションはMintのようでした。

OpenFoamは弊社でも使える人が多いようです。

Re:基本的な計算機の作り方について

OSについて

CentOSで問題はないと思いますが、Ubuntuでもできるようです。 MPIについては詳しくないので、御社でここらへんを知っている方が使っている環境に合わせれば、 いろいろ聞けると思いますので、それも手かなと。

なお、IntelCompilerについてはCentOSでしか、 使ったことがありません・・・。

MPIではありませんが、弊社だとCentOSです。

C++

11とか14とかはわかりませんが、 前職ではロベールの評判がよかったです。 私自身は読んでませんが。

ロベールのC++入門講座 | ロベール |本 | 通販 | Amazon

オブジェクト指向については、 かなり理解されていると思うので、 ポインタまわりだけでよろしいかと思うのですが。

最近は、

www.amazon.co.jp

です。厚いので大変です。