Step1:x方向の分割幅
3つのファイルを用意します。
- main.cpp:メインファイル
- Mesh.h:x座標の定義のヘッダーファイル
- Mesh.cpp:Mesh.hで定義した変数や関数処理
main.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <iostream> #include <vector> #include "Mesh.h" using namespace std; using std::vector; int main() { std::cout << "Hello World" << std::endl; int Nx =10; double totallength = 2.0; Mesh mesh_(Nx, totallength);//Meshクラスのインスタンス化 cout << "mesh_.NumberOfNode = " << mesh_.NumberOfNode << endl; cout << "mesh_.lengthx = " << mesh_.lengthx << endl; cout << "mesh_.dx1d = " << mesh_.dx1d << endl; for (int i = 0; i < mesh_.xpts.size();i++) { cout << "xpts[" << i << "] = " << mesh_.xpts[i] << endl; } return 0; } |
ヘッダーファイルと関数処理ようのcppファイルを同時に作成したい場合は以下のようにします。
Mesh.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#ifndef MESH_H #define MESH_H #include "Mesh.h" #include <vector> using std::vector; class Mesh { public: Mesh(); //constructor Mesh(int&, double&); //引数ありconstructor virtual ~Mesh();//deconstructor int NumberOfNode;//x分割数 double lengthx;//x方向長さ double dx1d;//分割幅 vector<double> xpts;//x座標 }; #endif //MESH_H |
Mesh.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include "Mesh.h" #include <iostream> Mesh::Mesh() { std::cout << "Mesh::Mesh() constructor" << std::endl; } Mesh::Mesh(int& n, double& txlengthx): NumberOfNode(n),//x分割数 lengthx(txlengthx),//x方向長さ xpts(NumberOfNode, 0.0)//vector(要素数, 値) { std::cout << "Mesh::Mesh" << std::endl; dx1d = lengthx / (NumberOfNode-1); } Mesh::~Mesh() { std::cout << "Mesh::~Mesh() deconstructor" << std::endl; } |
【結果】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Hello World Mesh::Mesh mesh_.NumberOfNode = 10 mesh_.lengthx = 2 mesh_.dx1d = 0.222222 xpts[0] = 0 xpts[1] = 0 xpts[2] = 0 xpts[3] = 0 xpts[4] = 0 xpts[5] = 0 xpts[6] = 0 xpts[7] = 0 xpts[8] = 0 xpts[9] = 0 Mesh::~Mesh() deconstructor |
初期値としてxpts[i]の全てのiに対して値が0になっています。
Mesh作成のためのクラスを用意しています。
Mesh.h(ヘッダーファイル)は基本的に変数や関数の定義を書くようにします。
1 2 3 4 |
//Mesh.hのMeshクラス Mesh(); //constructor Mesh(int&, double&); //引数ありconstructor virtual ~Mesh();//deconstructor |
は、Meshクラスのコンストラクタで以下のようにmain.cppでクラスのインスタンス化が実行された時点で関数が実行されます。
1 2 |
//main.cpp Mesh mesh_(Nx, totallength);//Meshクラスのインスタンス化 |
Mesh.hには引数無しの「Mesh()」と引数ありの「Mesh(int&, double&)」があり、クラスのインスタンス化を行う際の引数や変数の型に応じて実行される関数が変わります。
今回は「Mesh mesh_(Nx, totallength);」として引数ありでインスタンス化を行っているため、Mesh.cppの
1 2 3 4 5 6 7 8 |
Mesh::Mesh(int& n, double& txlengthx): NumberOfNode(n),//x分割数 lengthx(txlengthx),//x方向長さ xpts(NumberOfNode, 0.0)//vector(要素数, 値) { std::cout << "Mesh::Mesh" << std::endl; dx1d = lengthx / (NumberOfNode-1); } |
が実行されることになります。
「xpts(NumberOfNode, 0.0)//vector(要素数, 値)」はxptsがvectorコンテナによって、要素数と値を入れることで配列要素を作ることができます。
今は全ての要素の値を0にしています。
Step2:x方向座標の離散化
xptsがx座標の分割座標になるのですが、初期値として全ての要素の値を0にしていました。
x[i]=x[i-1]+dx\tag{8}
\end{align*}
としてx座標の離散化を行いたいと思います。
Mesh.hに以下の記述を追加します。
1 2 3 |
//add void discritized1dgrid(vector<double>&); //x[i]の作成 //add end |
これは「vector<double>」型を参照渡しで引数に設定して、x座標の分割座標を設定する関数です。関数の処理内容なMesh.cppに記述します。
1 2 3 4 5 6 7 8 9 |
//add void Mesh::discritized1dgrid(vector<double>& vec) { for (int i = 1; i < vec.size(); i++) //vec[0]=0なのでi=1からループする { vec[i] = vec[i - 1] + dx1d; } } //add end |
さらに以下で「discritized1dgrid(xpts); //add」とします。
xptsを参照渡してとている点に注意です。
1 2 3 4 5 6 7 8 9 |
Mesh::Mesh(int& n, double& txlengthx): NumberOfNode(n),//x分割数 lengthx(txlengthx),//x方向長さ xpts(NumberOfNode, 0.0)//vector(要素数, 値) { std::cout << "Mesh::Mesh" << std::endl; dx1d = lengthx / (NumberOfNode-1); discritized1dgrid(xpts); //add } |
ここまでの記述がない場合は、step1で見たようにxptsの要素の値は全て0でしたが、xptsの参照渡しにより同じアドレスの値を書き換えているため、xptsの指す値が上書きされています。main.cppでxptsを出力した値がstep1で出力した値と違っていることを確認しましょう。
では、ここまでの全体のコードを見ておきます。
Mesh.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#ifndef MESH_H #define MESH_H #include "Mesh.h" #include <vector> using std::vector; class Mesh { public: Mesh(); //constructor Mesh(int&, double&); //引数ありconstructor virtual ~Mesh();//deconstructor int NumberOfNode;//x分割数 double lengthx;//x方向長さ double dx1d;//分割幅 vector<double> xpts;//x座標 //add void discritized1dgrid(vector<double>&); //x[i]の作成 //add end }; #endif //MESH_H |
Mesh.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#include "Mesh.h" #include <iostream> Mesh::Mesh() { std::cout << "Mesh::Mesh() constructor" << std::endl; } Mesh::Mesh(int& n, double& txlengthx): NumberOfNode(n),//x分割数 lengthx(txlengthx),//x方向長さ xpts(NumberOfNode, 0.0)//vector(要素数, 値) { std::cout << "Mesh::Mesh" << std::endl; dx1d = lengthx / (NumberOfNode-1); discritized1dgrid(xpts); //add } //add void Mesh::discritized1dgrid(vector<double>& vec) { for (int i = 1; i < vec.size(); i++) //vec[0]=0なのでi=1からループする { vec[i] = vec[i - 1] + dx1d; } } //add end Mesh::~Mesh() { std::cout << "Mesh::~Mesh() deconstructor" << std::endl; } |
main.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <iostream> #include <vector> #include "Mesh.h" using namespace std; using std::vector; int main() { std::cout << "Hello World" << std::endl; int Nx =10; double totallength = 2.0; Mesh mesh_(Nx, totallength);//Meshクラスのインスタンス化 cout << "mesh_.NumberOfNode = " << mesh_.NumberOfNode << endl; cout << "mesh_.lengthx = " << mesh_.lengthx << endl; cout << "mesh_.dx1d = " << mesh_.dx1d << endl; for (int i = 0; i < mesh_.xpts.size();i++) { cout << "xpts[" << i << "] = " << mesh_.xpts[i] << endl; } return 0; } |
【結果】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Hello World Mesh::Mesh mesh_.NumberOfNode = 10 mesh_.lengthx = 2 mesh_.dx1d = 0.222222 xpts[0] = 0 xpts[1] = 0.222222 xpts[2] = 0.444444 xpts[3] = 0.666667 xpts[4] = 0.888889 xpts[5] = 1.11111 xpts[6] = 1.33333 xpts[7] = 1.55556 xpts[8] = 1.77778 xpts[9] = 2 Mesh::~Mesh() deconstructor |
xpts[i]がiに応じて値が設定されています。
これにてx座標の離散化を行うことができました。