*N体問題パッケージ [#t241a10f] 基本的な計算の流れは以下になります。serial プログラムを参考に利用してください。~ ちなみに、加速度算出のための式は以下~ ma = GmM/|r|^2 * r m :点1質量 M :点2質量 G :万有引力定数 a :点1の加速度ベクトル r :点1と2を結んだ方向ベクトル |r|:二点間の距離 +点データを読み込む +加速度計算をする(各点の位置情報が必要) +速度計算をする(各点の加速度情報が必要) +位置計算をする(各店の速度情報が必要) +2に戻る +規定ステップ繰り返したらデータを書き出して終了する 与えられる問題は以下の情報で構成されます :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現在) [#g92f7af3] -&ref(nbody.tar.gz,, N体問題パッケージ 1/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 -どんどん追加されていく予定 **準備 [#yfef734c] -好きな場所で解凍する tar xzf nbody.tar.gz -一括コンパイルする cd nbody ./make.sh **使い方 [#n234404f] *** libnbody.a (nbody 内) [#p9787ffc] -問題読み込み等の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 内) [#l92db6de] -問題の作成、閲覧を行うプログラム -1024*1024空間の問題が作成される。閲覧はソレを 64*32 に縮小した”何か”が見える。 -点数を大きくしすぎるとSPEのローカルストア上に乗らなくなるかも… 20000点くらいを最大に? -作成(点数1000の問題をファイル a.dat に書き込むとき) ./problem -n 1000 -w a.dat -閲覧(ファイル a.dat を見るとき) ./problem -r a.dat *** serial (serial 内) [#l484e8ad] -逐次版 N体問題プログラム -実行(../problem/a.dat を使い 10 ステップ計算して b.dat に出力する。) ./serial ../problem/a.dat b.dat 10 基本的な計算の流れは以下になります。serial プログラムを参考に利用してください。~ ちなみに、加速度算出のための式は以下~ ma = GmM/|r|^2 * r m :点1質量 M :点2質量 G :万有引力定数 a :点1の加速度ベクトル r :点1と2を結んだ方向ベクトル |r|:二点間の距離 +点データを読み込む +加速度計算をする(各点の位置情報が必要) +速度計算をする(各点の加速度情報が必要) +位置計算をする(各店の速度情報が必要) +2に戻る +規定ステップ繰り返したらデータを書き出して終了する 与えられる問題は以下の情報で構成されます :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現在) [#g92f7af3] -&ref(nbody.tar.gz,, N体問題パッケージ 1/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 -どんどん追加されていく予定 **準備 [#yfef734c] -好きな場所で解凍する tar xzf nbody.tar.gz -一括コンパイルする cd nbody ./make.sh **使い方 [#n234404f] *** libnbody.a (nbody 内) [#p9787ffc] -問題読み込み等の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 内) [#l92db6de] -問題の作成、閲覧を行うプログラム -1024*1024空間の問題が作成される。閲覧はソレを 64*32 に縮小した”何か”が見える。 -点数を大きくしすぎるとSPEのローカルストア上に乗らなくなるかも… 20000点くらいを最大に? -作成(点数1000の問題をファイル a.dat に書き込むとき) ./problem -n 1000 -w a.dat -閲覧(ファイル a.dat を見るとき) ./problem -r a.dat *** serial (serial 内) [#l484e8ad] -逐次版 N体問題プログラム -実行(../problem/a.dat を使い 10 ステップ計算して b.dat に出力する。) ./serial ../problem/a.dat b.dat 10