メモリリーク
fortranでも起こるんですね。知りませんでした。。。
fortranでは気にしたことないですね。
deallocateはちゃんと書いた方が良さそうです。
ガベージコレクション
C++では必須でしたが、最近はGCを備えているようです(Cは必須)。
メモリの管理はGCを備えてない言語の一番不便な点です。 ただし、コンパイラ言語でGCを備えていても、 書き手は気にした方がいいですね。あとで大変なことになる場合があります。
先日のアップしたプログラムを書いた際に初めてメモリリークという壁にぶち当たりました。 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
全く原因が不明です。
以前Openfoamのinterfoamの話がでたので、気になって自分でコーディングしてみました。 延べ2週間以上かかりました。苦労しました。
いろんなことがわかったので書いておきます。
このあたりです。
https://www.jstage.jst.go.jp/article/jscejoe/69/2/69_I_748/_pdf
https://www.slideshare.net/takuyayamamoto1800/openfoaminterfoam
コードはDBにfakeInterfoamで。fortranですが、こんなコードをC++で書きたいと思ってます。
2019/5/29追記
いろいろありがとうございます。
私の環境は、VS 2017 communityです。問題なく動いてます。intel compilerも入れてますが、VS 2017上で動きます。全ての日本語化されてます。 特に工夫もせずにクリックだけで環境が構築出来たので、よくわからないです。 VS 2017は、オンラインインストーラーなので、そのあたりでしょうか。
今手元に4台PCがありますが、すべて64bitで32bitはないです。ただ、配布用のプログラムは、64bit、32bit両方でコンパイルして配布してます。このあたりは、intel compilerは便利です。
昨日gistをあげようとしたら、なぜか上手く行かず何度もチャレンジしていたら、アカウントと凍結されてしまい、supprotにメールをしたりと何か大変でした。今朝確認したら解決されてました。
上げようとしたものは、以前書いたキャビテーションのコードをjupyterで書いたのでそれです。VOFのための事前準備ですが遅すぎて使い物になりませんでした。Fortranで再整理してアップする予定です。
CentOSで問題はないと思いますが、Ubuntuでもできるようです。 MPIについては詳しくないので、ここらへんを知っている方が使っている環境に合わせれば、 いろいろ聞けると思いますので、それも手かなと。
なお、IntelCompilerについてはCentOSでしか、 使ったことがありません・・・。
MPIではありませんが、弊社だとCentOSです。
11とか14とかはわかりませんが、 ロベールの評判がよかったです。 私自身は読んでませんが。
オブジェクト指向については、 かなり理解されていると思うので、 ポインタまわりだけでよろしいかと思うのですが。
最近は、
です。厚いので大変です。