LoginSignup
0
0

More than 5 years have passed since last update.

FDPSで使われるC++

Posted at

更新履歴?

  • 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(金額)$倍の速度向上を示すという観測結果が報告されています。
試されてみては?

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0