2014年8月18日月曜日

粒子法入門 その2

昨日読み終わってしまい、時間があったのでソースファイルを動かしてみました。

土砂移動のTESTとしてソースを触るにしても、オリジナルを動かせないと始まりません。
C++初心者ですが、ま、この程度は簡単でしょう、と簡単に考えていました。が、半日かかりました。

主な原因は、コンパイラーの違い。Linux + gcc で動くように書かれていたのですが、私の環境はWin8.1 + VS_Express の VC++2013。そのままでは走らないことに、手を動かしてはじめて気づきました。といっても、押さえどころは2箇所です。


1 fopen などは 2013 でそのままでは使えません。今回はセキュリティー上お奨めの fopen_s などに書き換えました。

//fp = fopen(filename, "r");
//fscanf(fp,"%d",&np);

errno_t err;
err = fopen_s(&fp, filename, "r");
if (err == 0)
{
fscanf_s(fp, "%d", &np);

このあたりは多くのブログに載っていますね。戸惑いやすい点だったのでしょう。


2 時間計測。そのままでは動かなかったので、ヘルプを見ながら書き換えてみました。間違っているかもしれませんが、時間計測は個人的に使わないので(いつもの計算は数日かかるので出力ファイルのタイムスタンプで見ています)、動けば良い程度に。

/*#include <sys/time.h>
double get_dtime(void){
struct timeval tv;
gettimeofday(&tv, NULL);
return ((double)(tv.tv_sec) + (double)(tv.tv_usec) * 0.000001);
}*/
#include <sys/timeb.h>
#include <sys/types.h>
double get_dtime(){
struct _timeb tv;
_ftime64_s(&tv);
return ((double)(tv.time) + (double)(tv.millitm) / 1000.0);
}


ここを超えると、あとは簡単。

粒子配置版を実行し、できたファイルをOpenMP 版で計算し、、ParaView 用に変換、可視化する流れです。以前と同じ、ダムブレイクです。SPHysics の時は粒子数いくつだったでしょうか?今回は同じ環境ですが、粒子数1.9万、計算時間は数秒でした。
http://phreeqc.blogspot.jp/2014/01/paraview.html





とりあえずは、動きました。入門できたでしょうか?

0 件のコメント:

コメントを投稿