N体問題パッケージ

基本的な計算の流れは以下になります。serial プログラムを参考に利用してください。
ちなみに、加速度算出のための式は以下

ma = GmM/|r|^2 * r
m  :点1質量
M  :点2質量
G  :万有引力定数
a  :点1の加速度ベクトル
r  :点1と2を結んだ方向ベクトル
|r|:二点間の距離 
  1. 点データを読み込む
  2. 加速度計算をする(各点の位置情報が必要)
  3. 速度計算をする(各点の加速度情報が必要)
  4. 位置計算をする(各店の速度情報が必要)
  5. 2に戻る
  6. 規定ステップ繰り返したらデータを書き出して終了する

与えられる問題は以下の情報で構成されます

state_t st
問題の情報を収めた構造体
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;
point_t plot
点の情報
typedef struct point{
	float x;     // 点の x 座標
	float y;     // 点の y 座標
	float vx;    // 点の x 方向速度
	float vy;    // 点の y 方向速度
	float m;     // 点の質量
} point_t;

パッケージ構成(2007/01/10現在)

- nbody
  +- nbody
  |  +- nbody-api.c
  |  +- mt19937ar.c
  |  +- nbody.h
  |  +- mt19937ar.h
  |  +- Makefile
  |
  +- problem
  |  +- problem.c
  |  +- Makefile
  |
  +- serial
  |  +- nbody.c
  |  +- Makefile
  |
  +- mpi_poor
  |  +- nbody.c
  |  +- Makefile
  |
  +- spe_poor
     +- nbody.c
     +- Makefile
  • どんどん追加されていく予定

準備

  • 好きな場所で解凍する
    tar xzf nbody.tar.gz 
  • 一括コンパイルする
    cd nbody
    ./make.sh

使い方

libnbody.a (nbody 内)

  • 問題読み込み等のAPIを持つライブラリ
  • 各自のPPEプログラムに必ずリンクすること
  • 利用するときはプログラムの最初に以下の行を書くこと
    #include "nbody.h"
  • たとえば、パッケージ内のディレクトリ serial に mynbody.c 等を作った場合
    cd serial // serial の中に入る
    gcc mynbody.c ../libnbody.a -o mynbody -I../nbody
  • APIについて
init_plots_map(char* filename, state_t *st, point_t **plots)
ファイルからデータをplots に読み込む
point_t *plots;
state_t st;
init_plots_map("filename", &st, &plots);
(plots[i].x とか plots[i].y とかでつかえる)
write_plots_map(char* filename, state_t *st, point_t *plots)
ファイルにデータを書き込む
point_t *plots;
state_t st;
(plots のデータ読みこみと計算後)
write_plots_map("filename", &st, plots);
print_plols_map(point_t *plots, state_t st, int px, int py)
plots のデータを縮小して視覚的に見せてくれる(っぽい)
point_t *plots;
state_t st;
(plots のデータ読みこみと計算後)
print_plots_map(plots, st, 64, 32); //(横, 縦) = (64文字*32文字) のマップを表示
dump_plots_map(point_t *plots, state_t st)
plots のデータをすべて並べて出力
point_t *plots;
state_t st;
(plots のデータ読みこみと計算後)
dump_plots_map(plots, st);
fini_plots_map(point_t *plots)
plots に割り当てたメモリ領域を開放したりする。init_plots_map を使ったときはプログラムの最後に必ず呼ぶこと
point_t *plots;
state_t st;
(plots のデータ読みこみと計算後)
fini_plots_map(plots);

problem (problem 内)

  • 問題の作成、閲覧を行うプログラム
  • 1024*1024空間の問題が作成される。閲覧はソレを 64*32 に縮小した”何か”が見える。
  • 点数を大きくしすぎるとSPEのローカルストア上に乗らなくなるかも… 20000点くらいを最大に?
  • 作成(点数1000の問題をファイル a.dat に書き込むとき)
    ./problem -n 1000 -w a.dat
  • 閲覧(ファイル a.dat を見るとき)
    ./problem -r a.dat

serial (serial 内)

  • 逐次版 N体問題プログラム
  • 実行(../problem/a.dat を使い 10 ステップ計算して b.dat に出力する。)
    ./serial ../problem/a.dat b.dat 10

添付ファイル: filenbody.tar.gz 481件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-10-05 (月) 11:00:05 (779d)