計算と同時にグラフを描いて,波をアニメーションにすることができる.gnuplotを使う
場合,次のようにすればよい.必要な部分を書けばプログラムができあがる.
#include <stdio.h>
#include <unistd.h>
#define NT 800 // 時間の計算ステップ数 0--800
#define NX 200 // xの計算ステップ数 0--200
#define SLEEP_TIME 20000 // usleep()関数で処理が止まる時間[micro sec]
void set_xt (int nx, int nt, double x[], double t[]);
void initial_condition(int nx, int nt, double alpha, double u[][NT+1]);
/*=====================================================================*/
/* main */
/*=====================================================================*/
int main(){
double u[NX+1][NT+1];
double x[NX+1], t[NT+1];
double xmin, xmax, tmin, tmax;
double delta_x, delta_t, alpha;
int i, j;
FILE *gp;
//-----------------------------------------------
// x座標の最小と最大を決める. xmin, xmax
// 時刻の最小と代々をきめる. tmin, tmax
// 計算ステップをきめる. delta_x, delta_t
//-----------------------------------------------
//-------------------------------------------------------
// alphaを計算して,1以上ならば,警告を発して,プログラムを止める
//-------------------------------------------------------
set_xt(NX, NT, x, t); // あらかじめ,x[]とt[]を配列へ
initial_condition(NX, NT, alpha, u); // 初期条件の設定
gp = popen("gnuplot -persist","w");
fprintf(gp, "set xrange [-0.1:1.1]\n");
fprintf(gp, "set yrange [-0.6:0.6]\n");
for(j=0; j<=1; j++){
printf("t=%f\n",t[j]);
fprintf(gp, "plot '-' with lines linetype 1\n");
for(i=0; i<=NX; i++){
fprintf(gp,"%f\t%f\n", x[i], u[i][j]);
}
fprintf(gp, "e\n");
usleep(SLEEP_TIME);
}
for(j=2; j<=NT; j++){
printf("%d\tt=%f\n",j,t[j]);
for(i=1; i<NX ; i++){
// --------------------------------------
// 差分化された波動方程式の計算.u[i][j]
// --------------------------------------
}
fprintf(gp, "plot '-' with lines linetype 1\n");
for(i=0; i<=NX; i++){
fprintf(gp,"%f\t%f\n", x[i], u[i][j]);
}
fprintf(gp,"e\n");
usleep(SLEEP_TIME);
}
pclose(gp);
return 0;
}
/*=====================================================================*/
/* set x-coordinate and time */
/*=====================================================================*/
void set_xt (int nx, int nt, double x[], double t[])
{
//-------------------------------
//ここで,x[i],t[j]で設定する
//-------------------------------
}
/*=====================================================================*/
/* set initial condition */
/*=====================================================================*/
void initial_condition(int nx, int nt, double alpha, double u[][NT+1])
{
//-------------------------------
//境界条件と初期条件の設定
//-------------------------------
}
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成19年1月29日