*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


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS