更新履歴?
- 18/06/20 初あっぷ。誤植とかあるかも。
前置き(駄文かも)
この記事はFDPS講習会で開催されるチュートリアルセクションのひとつ、
「FDPSを使うのに必要な知識はCとほんの少しのC++って言うけどほんの少しってどれくらい?」
のWeb版です。
探せばYouTubeにこのチュートリアルの動画が上がっていると思うんですが、
自分の不細工な顔をYouTubeで見られるのが嫌なのでこれを作りました。
(バーチャルユーチュバーシステムでやりたいんだけどだめですかねぇ?)
本稿では、以下の2つに関しては知っているものと仮定し、解説はいたしませぬのでご留意ください。
- FDPSとはなにか
- Cの文法
FDPSを使う際に必要とされるC++
FDPSを使う際、必要とされるC++の知識は以下の3つである。
- クラス
- メンバ関数
- テンプレート
以下では、この3つそれぞれに対して、
- それはなにか?
- それを使う事によるメリットはなにか?
- それはFDPS内でどのように使われているか?
に関して説明する。
クラス
クラスとはなにか?
C++においてクラスとは、複数のデータを一つにまとめたものを示す。
このものは、C++において、型として振る舞うことが可能である。
C言語における構造体/structという概念を理解している場合、それとほぼ変わらないものであると思って構わない。
例
二次元平面上で定義される点$(x, y)$を、複数作る場合を考える。
例えば倍精度(double
)で64個の点を作る場合、クラス無しでは、こうである。
int main(void){
double x[64], y[64];
/**********\
| なにか処理 |
\**********/
return 0;
}
クラスを使うと、この様になる。
class vec{
public:
double x, y;
};
int main(void){
vec point[64];
/**********\
| なにか処理 |
\**********/
return 0;
}
見慣れないpublic:
というなにかに関しては、今は一旦無視しておいてよい。
クラスの構成要素へのアクセスは、.
を用いる。
例えば、配列point
の0番目の要素のx座標を書き込みたいないしは読み込みたい場合、
class vec{
public:
double x, y;
};
int main(void){
vec point[64];
point[0].x = 1.0;
return 0;
}
とすればよい。
また、クラスはクラスを内包できるため、例えば何かの粒子というクラスがあったとして、
粒子クラスが座標と速度という2つのvec
クラスを持つ場合、
class vec{
public:
double x, y;
};
class particle{
public:
vec position, velocity;
};
と書くことが許される。
もちろん、質量や加速度をもたせることも可能である。
クラスのメリット
サブルーチンに値を送る際に楽
クラスを用いると、サブルーチンに値を送る際に楽である。
例えば、座標を引数にとって何かしらを計算するサブルーチンが存在する場合、
クラス無しで書くと
void calcSomething(double x[], double y[]){
//calculate something
}
であるが、クラスを用いると
void calcSomething(vec position[]){
//calculate something
}
と書くことができる。
当然、クラスを内包するクラスも引数に持たせることが可能なため、粒子構造体を送って、
void calcSomething(particle ptcl[]){
//calculate something
}
と書くことが可能である。
あとからデータの付け足しが楽
クラスを用いると、サブルーチンに送る値をあとから付け足す際に便利である。
例えば、
void calcSomething(double x[], double y[]){
//calculate something
}
を3次元に拡張したくなった際には、
void calcSomething(double x[], double y[], double z[]){
//calculate something
}
とすればよい。
しかしながら、このようなサブルーチンが多数存在している場合、すべてのサブルーチンを書き換えなくてはならない。
一方で、クラスを使う場合は、元のクラスにデータを書き足せば良い。
class vec{
public:
double x, y, z;
};
こうすれば、サブルーチンcalcSomething
の引数は一切変える必要がない。
クラスはFDPS内でどのように使われているか?
FDPSには、ベクトルクラスが用意されている。
これは、PS::F64vec
などといった名前で定義されている。
故に、質量、位置ベクトル、速度ベクトル、加速度ベクトルを持つような粒子クラスを定義する場合、
class particle{
public:
PS::F64 mass;
PS::F64vec pos, vel, acc;
};
などと書くことが可能である。
メンバ関数
これから書く
テンプレート
これから書く
Q&A
「これから書く」がやたら多いんですけどいつまで「これから書く」のままなんですか?
俗に言う日本銀行券を渡すと執筆速度が$\log(金額)$倍の速度向上を示すという観測結果が報告されています。
試されてみては?