基本的な計算の流れは以下になります。serial プログラムを参考に利用してください。
ちなみに、加速度算出のための式は以下
ma = GmM/|r|^2 * r m :点1質量 M :点2質量 G :万有引力定数 a :点1の加速度ベクトル r :点1と2を結んだ方向ベクトル |r|:二点間の距離
与えられる問題は以下の情報で構成されます
typedef struct state{ int nplots; // 点の総数 int delta_t; // 1ステップで経過する時間 int xmax; // すべての点の横方向の最大値、右端 int ymax; // すべての点の縦方向の最大値、下端 int xmin; // すべての点の横方向の最小値、左端 int ymin; // すべての点の縦方向の最小値、上端 float gc; // この問題で利用する万有引力定数 int cutoff; // カットオフ距離 (第4回までは使わない) float msum; // 点の質量の総和 (普通は使わない) } state_t;
typedef struct point{ float x; // 点の x 座標 float y; // 点の y 座標 float vx; // 点の x 方向速度 float vy; // 点の y 方向速度 float m; // 点の質量 } point_t;
- nbody +- nbody | +- nbody-api.c | +- mt19937ar.c | +- nbody.h | +- mt19937ar.h | +- Makefile | +- problem | +- problem.c | +- Makefile | +- serial +- nbody.c +- Makefile
tar czf nbody.tar.gz ./
cd nbody ./make.sh
#include "nbody.h"
cd serial // serial の中に入る gcc mynbody.c ../libnbody.a -o mynbody -I../nbody
point_t *plots; state_t st; init_plots_map("filename", &st, &plots); (plots[i].x とか plots[i].y とかでつかえる)
point_t *plots; state_t st; (plots のデータ読みこみと計算後) write_plots_map("filename", &st, plots);
point_t *plots; state_t st; (plots のデータ読みこみと計算後) print_plots_map(plots, st, 64, 32); //(横, 縦) = (64文字*32文字) のマップを表示
point_t *plots; state_t st; (plots のデータ読みこみと計算後) dump_plots_map(plots, st);
point_t *plots; state_t st; (plots のデータ読みこみと計算後) fini_plots_map(plots);
./problem -n 1000 -w a.dat
./problem -r a.dat
./serial ../problem/a.dat b.dat 10