/* 銀河の衝突のシミュレーション */ #define N 6 #define NMAX 10000 #include "cpgplot.h" #include #include #include /* void rungen(double t, double x[], double dt); */ void force(double dt, double x, double y, double z) ; double f(double t, double x[N], int i); /* double fx(double t,double x,double y,double z,double vx,double vy,double vz); */ /* double fy(double t,double x,double y,double z,double vx,double vy,double vz); */ /* double fz(double t,double x,double y,double z,double vx,double vy,double vz); */ /* double fvx(double t,double x,double y,double z,double vx,double vy,double vz); */ /* double fvy(double t,double x,double y,double z,double vx,double vy,double vz); */ /* double fvz(double t,double x,double y,double z,double vx,double vy,double vz); */ double fx1, fy1, fz1; double xg1, yg1, zg1; double xg2, yg2, zg2; double vxg2, vyg2, vzg2; double mg1, mg2, eps, eps2; void main() { double star[NMAX][6]; /* 粒子の座標 */ double t, dt; /* 時間, 時間ステップ */ float xplot[NMAX], yplot[NMAX], zplot[NMAX]; /* for plot */ double x1, x2, y1, y2; double xp, yp, zp; double pi; double r, rg, vcirc; double ekin, epot, etot; int npar, nstep, np, i, istep, iseed, j; double t0[N], t1[N], t2[N], t3[N], /* temporary storage */ k1[N], k2[N], k3[N],k4[N]; /* for Runge-Kutta */ double starx,stary,starz; /* mg1, mg2: 銀河の質量 fx1, fy1, fz1: 粒子に働く力 */ char STR[8]; printf("粒子数: npar ?\n"); scanf("%d", &npar); printf("計算ステップ数: nstep ?\n"); scanf("%d", &nstep); printf("時間刻み: dt ?\n"); scanf("%lf", &dt); printf("衝突銀河の質量: mg2 ?\n"); scanf("%lf", &mg2); printf("衝突パラメータ: yg2 ?\n"); scanf("%lf", &yg2); printf("衝突銀河の速度: vxg2 ?\n"); scanf("%lf", &vxg2); pi= 3.1415926; mg1=1.0; /* mg2=1.0; */ eps=0.1; eps2=eps*eps; /* 初期条件の設定 */ x1=-5.0; x2=5.0; y1=-5.0; y2=5.0; /* 銀河1の位置 */ xg1=0.0; yg1=0.0; zg1=0.0; /* 銀河2の位置 */ xg2=-5.0; /* yg2=2.0; */ zg2=0.0; /* 銀河2の速度 */ /* vxg2=1.0; */ vyg2=0.0; vzg2=0.0; rg=1.0; iseed=1; np=-1; srand(iseed); /* 粒子を半径rgの円内にランダムに分布させ、回転の速度を与える */ for(i=0; i