// -----------------------------------------------|
// parabora-using-sub2.cpp |
// |
// FDTD法による直交座標系(x,y)における |
// パラボラミラーによる電磁波の反射の数値計算 |
// (動作確認済み) |
// |
// プログラム作成:駒田寛 2010年6月 |
// -----------------------------------------------|
#include <vector>
#include <complex>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
// 2次元配列をフリーストアに作成するサブルーチン
// <実数配列用>
double** makeArray(int row, int col)
{
double** a=new double*[row]; //全体のための配列を作る
for(int i=0; i<row; i++){
a[i]=new double[col]; //各行のための配列を作る
}
return a;
}
// 上で作った実数配列の削除
void deleteArray(double** a, int row){
for (int i=0;i<row; ++i) delete[] a[i];
delete[] a;
}
// 2次元配列をフリーストアに作成するサブルーチン
// <整数配列用>
int** makeArrayInt(int row, int col){
int** a=new int*[row]; //全体のための配列を作る
for(int i=0; i<row; i++){
a[i]=new int[col]; //各行のための配列を作る
}
return a;
}
// 上で作った整数配列の削除
void deleteArrayInt(int** a, int row){
for (int i=0;i<row; ++i) delete[] a[i];
delete[] a;
}
// 電磁界が既知である部分のマップを作成する
void knownMap(char* str, char* str2, int** KNOWN, int NX, int NY){
cout << setw(30) << str << endl;
ofstream fout02(str2); //「やさしいC++」16章
cout << "ファイルをオープンしました。
";
for(int AI=1;AI<=NX;AI++){ //間引きせずに書き込む
for(int J=1;J<=NY;J++){
fout02 << setw(6) << KNOWN[AI][J];
}
fout02 << endl;
}
cout << "ファイルに書き込みました。
";
fout02.close();
cout << "ファイルをクローズしました。
";
cout << "何かキーを押してください";
getchar();
}
// 2次元実数配列の各種出力データを作成する
void kakikomi(char* str, char* str2, double** a, int NX, int NY){
cout << str << endl;
ofstream fout05(str2);
cout << " " << "ファイルをオープンしました。" << endl;
for(int AI=1;AI<=NX;AI++){ //間引きせずに書き込む
for(int J=1;J<=NY;J++){
fout05 << " " << scientific << a[AI][J];
}
fout05 << endl;
}
cout << " " << "ファイルに書き込みました。" << endl;
fout05.close();
cout << " " << "ファイルをクローズしました。" << endl;
}
//その他の出力データ
//一点における時間変化
void onePointMonitor(char* str, char* str2, double* EZ_MON_1, int ITMAX ){
cout << str << endl;
ofstream fout10(str2);
cout << " " << "ファイルをオープンしました。" << endl;
for(int K=1;K<=ITMAX;K++){
fout10 << " " << scientific << EZ_MON_1[K] << endl;
}
cout << "__ファイルに書き込みました。" << endl;
fout10.close();
cout << "__ファイルをクローズしました。" << endl;
}
//定数データ用クラス
struct ConstData{
char* myname;
double myvalue;
void show(); //メソッドの宣言
};
//メソッドの定義 定数データを画面とファイルの両方に出力する
void ConstData::show()
{
ofstream fout01("20100729_01_SET_DATA_CONST.txt",ios_base::app);
cout << setw(30) << myname << ":" << myvalue << endl;
fout01 << setw(30) << myname << ":" << myvalue << endl;
fout01.close();
}
//--- 1-0.配列宣言------------------------------------------
//要素を1行、1列それぞれ余分に宣言しておく。
//そして、添え字0の要素はデータとして使わない。
//(fortranプログラムとの兼ね合いである)
//フリーストアに格納する配列(日経BP 「VisualC++入門」)
double** CEZ = makeArray(1002,3002); //2次元配列の行数、列数を渡す
double** CEZLX = makeArray(1002,3002);
double** CEZLY = makeArray(1002,3002);
double** CHXLY = makeArray(1002,3002);
double** CHYLX = makeArray(1002,3002);
double** MEDIUM = makeArray(1002,3002);
double** C = makeArray(1002,3002); //導電率
double** DA = makeArray(1002,3002);
double** CV = makeArray(1002,3002); //媒質中の光速
int** KNOWN = makeArrayInt(1002,3002);
double** HX = makeArray(1002,3002);
// double** HX1 = makeArray(1002,3002);
double** HY = makeArray(1002,3002);
// double** HY1 = makeArray(1002,3002);
double** EZ = makeArray(1002,3002);
// double** EZ1 = makeArray(1002,3002);
double* EZ_MON_1=new double[8005]; //ここは1次元配列
double** EZX1 = makeArray(5,3002); //4+1行(後ろ参照)
double** EZX2 = makeArray(5,3002); //4+1行(後ろ参照)
double** EZY1 = makeArray(1002,5); //4+1列(後ろ参照)
double** EZY2 = makeArray(1002,5); //4+1列(後ろ参照)
double** AMPEZ= makeArray(1002,3002);
//自動メモリに格納する配列
int NX;
int NY;
double PAI;
double E;
double MU;
double F;
double W;
double DT;
double DX,DY;
double THETA;
double THETA1,THETA2,THETA3,THETA4;
double CV0; //真空中の光速(シーブイゼロ)
int K; //時間ステップ数格納用
int J; //Y方向ステップ数格納用
int AI; //X方向ステップ数格納用
int JDUM,JDUM2; //仮座標用変数
int AIDUM; //仮座標用変数
int IT;
int ITMAX;
double T,Tw;
double C1,C2,C3;
//本のCXD,CXX,CXFYDをそれぞれC1,C2,C3と置いた。
//2次元ではCXFZDはない。
//--- 1-0.配列宣言 ここまで-----------------------------------------------
/* 定数設定 */
void const_set(void){
//--- 1-1.空間、時間に対して定数(物理定数も含む)であるものの設定----------
//全ステップ回数
ITMAX = 12000; //
// x,y方向の分割数+1(EZノードの数)の値
NX=1001; // 吸収境界の座標はXは1,1001とする //いまだけ10分の1
NY=3001; // 吸収境界の座標はYは1,2001とする //いまだけ10分の1
//円周率
PAI = 3.141592654e0;
//真空中の誘電率 [F/m]
E = 8.8541878e-12;
//真空中の透磁率 [H/m]
MU = 4 * PAI * 1.0e-7;
//調べる電磁波の周波数[Hz]
F = 15.0e+9;
//2周期分の時間 [s]
Tw = 2/F;
//電磁波の角周波数 [rad/s]
W = F * 2 * PAI;
//時間ステップ[s]
DT = 1.0e-12;
// 注1 最適時間ステップの計算がEXCELおよびメモ帳にある
//X方向のセルサイズ[m]
DX = 1.0e-3;
//Y方向のセルサイズ [m]
DY = 1.0e-3;
// 注2 最適セルサイズの計算がEXCELおよびメモ帳にある
CV0 = 1/pow((E*MU) , 0.5); //真空中の光速
C1 = (CV0*DT-DX)/(CV0*DT+DX);
C2 = 2*DX/(CV0*DT+DX);
C3 = DX * pow((CV0*DT),2) / ( 2 * pow((DY),2) * (CV0*DT+DX) );
//変数は用意してあるが本プログラムでは常にDX=DYとする。
//画面での確認、ファイルへの出力
cout << "定数設定をSET_DATA_CONSTファイルに出力します。" << endl;
// "20100729_01_SET_DATA_CONST.txt"
ConstData aa0;
aa0.myname = "X方向のセルサイズ [m]=";
aa0.myvalue = DX;
aa0.show();
ConstData aa1;
aa1.myname = "Y方向のセルサイズ [m]=";
aa1.myvalue = DY;
aa1.show();
ConstData aa2;
aa2.myname = "時間ステップ[s]=";
aa2.myvalue = DT;
aa2.show();
ConstData aa3;
aa3.myname = "1秒当たりのステップ回数 =";
aa3.myvalue = 1/DT;
aa3.show();
ConstData aa4;
aa4.myname = "真空中の誘電率 [F/m]=";
aa4.myvalue = E;
aa4.show();
ConstData aa5;
aa5.myname = "調べる電磁波の周波数[Hz]=";
aa5.myvalue = F;
aa5.show();
ConstData aa6;
aa6.myname = "1周期当たりのステップ回数 =";
aa6.myvalue = 1/DT/F;
aa6.show();
ConstData aa7;
aa7.myname = "真空中の透磁率 [H/m]=";
aa7.myvalue = MU;
aa7.show();
ConstData aa8;
aa8.myname = "X方向の分割数+1の値 =";
aa8.myvalue = NX;
aa8.show();
ConstData aa9;
aa9.myname = "Y方向の分割数+1の値 =";
aa9.myvalue = NY;
aa9.show();
ConstData aa10;
aa10.myname = "円周率 =";
aa10.myvalue = PAI;
aa10.show();
ConstData aa11;
aa11.myname = "電磁波の角周波数 [rad/s] =";
aa11.myvalue = W;
aa11.show();
ConstData aa12;
aa12.myname = "真空中の光速[m/s] =";
aa12.myvalue = CV0;
aa12.show();
ConstData aa13;
aa13.myname = "全ステップ回数 =";
aa13.myvalue = ITMAX;
aa13.show();
cout << "何かキーを押してください" << endl;
getchar();
//--- 1-1.空間、時間に対して定数であるものの設定 ここまで-------------------
}
//メイン関数
int main(void)
{
//=== 1. setup ==================================================================
// 宇野先生の本で「 setup 」となっている部分とほぼ同じである
//---1. setup 目次-------------------------------------------------------
// 1-0. 配列宣言
// 1-1.空間、時間に対して定数であるものの設定
// 1-2.空間に対して変数、時間に対して定数であるものの設定
// 1-3.時間に対して変数であるものの初期値設定
// 1-4. メモデータ作成(本にはない)
//---1. setup 目次 ここまで---------------------------------------------
//--- 1-1.空間、時間に対して定数(物理定数も含む)であるものの設定----------
const_set();
//--- 1-2.空間的には変数、時間的には定数であるものの設定 -------------------
// 1-1に該当するものもあるが、揺れ動くものはすべてこちらにした。
//使わない添え字0の要素も念のため初期化する
for(J=0;J<=NY;J++){
for(AI=0;AI<=NX;AI++){
CEZLX[AI][J]=0.0; //EZを求める式に使用する係数
CEZLY[AI][J]=0.0; //EZを求める式に使用する係数
CHXLY[AI][J]=0.0; //HXを求める式に使用する係数
CHYLX[AI][J]=0.0; //HYを求める式に使用する係数
CEZ[AI][J]=0.0; //EZを求める式に使用する係数
C[AI][J]=0.0; //導電率
//金属部分については電界=0として別の場所で表現する。
//電界を隣の値から求めるときにCを使うが
//金属部分についてはそれをやらないので値は関係ない
//(0のままでも良い)。
KNOWN[AI][J]=0;
}
}
for(J=0;J<=NY;J++){
for(AI=0;AI<=NX;AI++){
MEDIUM[AI][J]=0.0;
CV[AI][J]=0.0;
DA[AI][J]=0.0;
CEZ[AI][J]=0.0;
CEZLX[AI][J]=0.0;
CEZLY[AI][J]=0.0;
CHXLY[AI][J]=0.0;
CHYLX[AI][J]=0.0;
}
}
for(J=1;J<=NY;J++){
for(AI=1;AI<=NX;AI++){
MEDIUM[AI][J]=1.0; //比誘電率(今回は誘電体はない)
CV[AI][J] = 1/pow((MEDIUM[AI][J]*E*MU),0.5); //媒質中の光速 [m/s]
DA[AI][J]=C[AI][J]*DT/(2 * E * MEDIUM[AI][J]); // 導電率0の部分では0になる
CEZ[AI][J]=(1 -DA[AI][J])/(1+DA[AI][J]); // 導電率0の部分では1になる
CEZLX[AI][J]=DT/E/MEDIUM[AI][J]/(1+DA[AI][J])/DX;
CEZLY[AI][J]=DT/E/MEDIUM[AI][J]/(1+DA[AI][J])/DY;
CHXLY[AI][J]=DT/MU/DY;
//P13(1.31)にある。磁性体があれば比誘電率を掛けた値をMUとして用いる
CHYLX[AI][J]=DT/MU/DX; //同上
}
}
//波源の設定(既知の部分は1回も微分方程式で解かないにする)
//( KNOWN の値 = 既知で0:1、既知で時間変動がある:2、未知:0)
//図形回転用角度(実際 マイナス ダミー)[degree] の準備
THETA = 126.9e0;
THETA1 = cos(THETA*PAI/180);
THETA2 = -sin(THETA*PAI/180);
THETA3 = sin(THETA*PAI/180);
THETA4 = cos(THETA*PAI/180);
for(AIDUM=433;AIDUM<=475;AIDUM++){ //1次放射器(金属板)
JDUM=467;
//図形の回転操作((500,467)を中心としてTHETA度回転する)
AI = floor( (AIDUM-500)*THETA1 +(JDUM-467)*THETA2 +500 );
J = floor( (AIDUM-500)*THETA3 +(JDUM-467)*THETA4 +467 );
KNOWN[AI][J]=1;
}
for(AIDUM=525;AIDUM<=567;AIDUM++){ //1次放射器(金属板)
JDUM=467;
//図形の回転操作((500,467)を中心としてTHETA度回転する)
AI = floor( (AIDUM-500)*THETA1 +(JDUM-467)*THETA2 +500 );
J = floor( (AIDUM-500)*THETA3 +(JDUM-467)*THETA4 +467 );
KNOWN[AI][J]=1;
}
for(AIDUM=567;AIDUM<=667;AIDUM++){ //遮蔽器(金属板)
JDUM=1034-AIDUM;
//図形の回転操作((500,467)を中心としてTHETA度回転する)
AI = floor( (AIDUM-500)*THETA1 +(JDUM-467)*THETA2 +500 );
J = floor( (AIDUM-500)*THETA3 +(JDUM-467)*THETA4 +467 );
KNOWN[AI][J]=1;
KNOWN[AI][J+1]=1;
}
for(JDUM=1;JDUM<=367;JDUM++){ //遮蔽器(金属板)
AIDUM=667;
JDUM2=JDUM+0;
//図形の回転操作((500,467)を中心としてTHETA度回転する)
AI = floor( (AIDUM-500)*THETA1 +(JDUM2-467)*THETA2 +500 );
J = floor( (AIDUM-500)*THETA3 +(JDUM2-467)*THETA4 +467 );
KNOWN[AI][J]=1;
}
for(AI=772;AI<=996;AI++){ //追加遮蔽器(金属板)
J=880;
KNOWN[AI][J]=1;
}
for(AIDUM=485;AIDUM<=515;AIDUM++){ //1次放射器(余弦波波源部分)
JDUM=400;
//図形の回転操作((500,467)を中心としてTHETA度回転する)
AI = floor( (AIDUM-500)*THETA1 +(JDUM-467)*THETA2 +500 );
J = floor( (AIDUM-500)*THETA3 +(JDUM-467)*THETA4 +467 );
KNOWN[AI][J]=2;
}
//パラボラミラーを設置する
for(AI=201;AI<=401;AI++){
int ss=(int)pow((double)(AI-500),2)/800+267;
KNOWN[AI][ss]=1;
//下に凸の放物線 ( 頂点(500、267)、焦点(500、467)のもの )上にとる
}
// 心配ならこのように書く
// IF(1<=AI .and. AI<=1001 .and. 1<=J .and. J<=1001)then
// KNOWN[AI][J]=1
// ENDIF
//--- 1-2.空間的には変数、時間的には定数であるものの設定
//ここまで----------------------------------------
//--- 1-3.時間に対して変数であるものの初期値設定--------------------------
//--- 1-3-1.電磁場の初期値の設定 --------------------------------------
//現時点での値
for(J=0;J<=NY;J++){
for(AI=0;AI<=NX;AI++){
HX[AI][J]=0.0; //磁場のX成分(0とする、以下同様)
HY[AI][J]=0.0; //磁場のY成分
EZ[AI][J]=0.0; //電場のZ成分
}
}
// //過去の値1
// //1ターン前のEZ,HX,HY
// DO AI=1,NX
// DO J=1,NY
// EZ1[AI][J]=0.0e0
// HX1[AI][J]=0.0e0
// HY1[AI][J]=0.0e0
// ENDDO
// ENDDO
//過去の値2
//AI=1,NXの辺とその隣の辺(計4本の線)の1ターン、2ターン前のEZ
//(添え字0を含めて5本)
for(AI=0;AI<=4;AI++){
for(J=0;J<=NY;J++){
EZX1[AI][J]=0.0;
EZX2[AI][J]=0.0;
}
}
//過去の値3
//J=1,NYの辺とその隣の辺(計4本の線)の1ターン、2ターン前のEZ
for(J=0;J<=4;J++){
for(AI=0;AI<=NX;AI++){
EZY1[AI][J]=0.0;
EZY2[AI][J]=0.0;
}
}
//--- 1-3-1.電磁場の初期値の設定 ここまで------------------------------
// //--- 1-3-2.1ポイントモニタ用配列 EZ_MON の初期化---------------------
//
// DO K=1,10000
// EZ_MON_1(K)=0.0e-0
// ENDDO
//
// //--- 1-3-2.1ポイントモニタ用配列 EZ_MON の初期化 ここまで------------
//--- 1-3-3. 経過時間 T の初期化 --------------------------------------
T=0.0;
//--- 1-3-3. 経過時間 T の初期化 ここまで------------------------------
//--- 1-3.時間に対して変数であるものの初期値設定 ここまで----------------
//--- 1-4. メモデータを作る(本にはない)------------------------------------
knownMap("既知部分KNOWN(AI,J)ファイルを作成します。" ,
"20100729_01_SET_DATA_KNOWN.txt" , KNOWN , NX , NY);
//--- 1-4. メモデータを作る ここまで--------------------------------------
//=== 1. setup ここまで ======================================================
//=== 2. メインループ ========================================================
//--- 2-1. メインループの始まり--------------------------------------------
for(IT=0;IT<=ITMAX;IT++){ // 計算のスタート
// 経過時間=(IT)*DT
//--- 2-1. メインループの始まり ここまで------------------------------------
//--- 2-2. 電磁場のEZの計算(本では 「 CALL E-field 」)---------------------
//(P15にある)
//AI,Jともに内側を全てスキャン
//---2-2-1. 余弦波波源部分-----------------------------------------
for(AIDUM=485;AIDUM<=515;AIDUM++){ //1次放射器(余弦波波源部分)
JDUM=400;
//図形の回転操作((500,467)を中心としてTHETA度回転する)
AI = floor( (AIDUM-500)*THETA1 +(JDUM-467)*THETA2 +500 );
J = floor( (AIDUM-500)*THETA3 +(JDUM-467)*THETA4 +467 );
if(-0.1<=T && T<=Tw){
EZ[AI][J]=1.0/2.0*(1.0-cos(PAI*T/Tw))*sin(W*T);
}else{
EZ[AI][J]=3.0*cos(W*T);
}
}
// //---2-2-1. 余弦波波源部分 ここまで--------------------------------
//---2-2-2. 本体の計算 --------------------------------------------------
for(J=2;J<=NY-1;J++){ //両端以外全部
for(AI=2;AI<=NX-1;AI++){ //同上
if(KNOWN[AI][J]==0){
EZ[AI][J]=CEZ[AI][J]*EZ[AI][J]+CEZLX[AI][J]*(HY[AI][J]-HY[AI-1][J])
-CEZLY[AI][J]*(HX[AI][J]-HX[AI][J-1]);
}
}
}
//---2-2-2. 本体の計算 ここまで------------------------------------------
//--- 2-2. CALL E-field ここまで-------------------------------------------
//--- 2-3. 境界(周辺)の設定(本では「 CALL A.B.C. 」)---------------------
//吸収境界条件(P60)
//4辺のすぐ近くに誘電体はないとして式を立てる
//---2-3-1. AI=1,NXの辺での計算 ----------------------------------------
//本体の計算
J=2;
EZ[1][J]=EZX1[2][J]+C1*(EZ[2][J]-EZX1[1][J]);
EZ[NX][J]=EZX1[3][J]+C1*(EZ[NX-1][J]-EZX1[4][J]);
J=NY-1;
EZ[1][J]=EZX1[2][J]+C1*(EZ[2][J]-EZX1[1][J]);
EZ[NX][J]=EZX1[3][J]+C1*(EZ[NX-1][J]-EZX1[4][J]);
for(J=3;J<=NY-2;J++){
EZ[1][J]=-EZX2[2][J]+C1*(EZ[2][J]+EZX2[1][J])
+C2*(EZX1[1][J]+EZX1[2][J])
+C3*(EZX1[1][J+1]-2.0e-0*EZX1[1][J]+EZX1[1][J-1]
+EZX1[2][J+1]-2.0e-0*EZX1[2][J]+EZX1[2][J-1]);
EZ[NX][J]=-EZX2[3][J]+C1*(EZ[NX-1][J]+EZX2[4][J])
+C2*(EZX1[4][J]+EZX1[3][J])
+C3*(EZX1[4][J+1]-2.0e-0*EZX1[4][J]+EZX1[4][J-1]
+EZX1[3][J+1]-2.0e-0*EZX1[3][J]+EZX1[3][J-1]);
}
//過去の値の更新
for(J=2;J<=NY-1;J++){
EZX2[1][J]=EZX1[1][J];
EZX2[2][J]=EZX1[2][J];
EZX2[3][J]=EZX1[3][J];
EZX2[4][J]=EZX1[4][J];
EZX1[1][J]=EZ[1][J];
EZX1[2][J]=EZ[2][J];
EZX1[3][J]=EZ[NX-1][J];
EZX1[4][J]=EZ[NX][J];
}
//---2-3-1. AI=1,NXの辺での計算 ここまで-------------------------------
//---2-3-2. J=1,NYの辺での計算 ----------------------------------------
//本体の計算
AI=2;
EZ[AI][1]=EZY1[AI][2]+C1*(EZ[AI][2]-EZY1[AI][1]);
EZ[AI][NY]=EZY1[AI][3]+C1*(EZ[AI][NY-1]-EZY1[AI][4]);
AI=NX-1;
EZ[AI][1]=EZY1[AI][2]+C1*(EZ[AI][2]-EZY1[AI][1]);
EZ[AI][NY]=EZY1[AI][3]+C1*(EZ[AI][NY-1]-EZY1[AI][4]);
for(AI=3;AI<=NX-2;AI++){
EZ[AI][1]=-EZY2[AI][2]+C1*(EZ[AI][2]+EZY2[AI][1])
+C2*(EZY1[AI][1]+EZY1[AI][2])
+C3*(EZY1[AI+1][1]-2.0e-0*EZY1[AI][1]+EZY1[AI-1][1]
+EZY1[AI+1][2]-2.0e-0*EZY1[AI][2]+EZY1[AI-1][2]);
EZ[AI][NY]=-EZY2[AI][3]+C1*(EZ[AI][NY-1]+EZY2[AI][4])
+C2*(EZY1[AI][4]+EZY1[AI][3])
+C3*(EZY1[AI+1][4]-2.0e-0*EZY1[AI][4]+EZY1[AI-1][4]
+EZY1[AI+1][3]-2.0e-0*EZY1[AI][3]+EZY1[AI-1][3]);
}
//過去の値の更新
for(AI=2;AI<=NX-1;AI++){
EZY2[AI][1]=EZY1[AI][1];
EZY2[AI][2]=EZY1[AI][2];
EZY2[AI][3]=EZY1[AI][3];
EZY2[AI][4]=EZY1[AI][4];
EZY1[AI][1]=EZ[AI][1];
EZY1[AI][2]=EZ[AI][2];
EZY1[AI][3]=EZ[AI][NY-1];
EZY1[AI][4]=EZ[AI][NY];
}
//--- 2-3. 境界(周辺)の設定(本では「 CALL A.B.C. 」) ここまで------------
//--- 2-4. 半時間ステップだけ時間を進める------------------------------------
T=T+DT/2;
// WRITE(6,'(a,e15.7)')'T=',T //画面での確認
//--- 2-4. 半時間ステップだけ時間を進める ここまで---------------------------
// --- 2-5. 電磁場の磁場成分HX,HYの計算(「 CALL H-field 」)----------------
//HXの計算(P15)
for(J=1;J<=NY-1;J++){
for(AI=2;AI<=NX-1;AI++){
HX[AI][J]=HX[AI][J]-CHXLY[AI][J]*(EZ[AI][J+1]-EZ[AI][J]);
}
}
//HYの計算
for(J=2;J<=NY-1;J++){
for(AI=1;AI<=NX-1;AI++){
HY[AI][J]=HY[AI][J]+CHYLX[AI][J]*(EZ[AI+1][J]-EZ[AI][J]);
}
}
//--- 2-5. 電磁場の磁場成分HX,HYの計算(「 CALL H-field 」) ここまで-------
// //--- 2-6. 過去の値の更新 --------------------------------------------------
//
// for(AI=1;AI<=NX;AI++){
// for(J=1;J<=NY;J++){
// EZ1[AI][J]=EZ[AI][J];
// HX1[AI][J]=HX[AI][J];
// HY1[AI][J]=HY[AI][J];
// }
// }
//
// //--- 2-6. 過去の値の更新 ここまで------------------------------------------
cout << setw(10) << "IT=" << IT <<endl; // ターン数の画面表示
//--- 2-7. 振幅データの作成(本にはない)--------------------------------------
if((ITMAX-IT) <= 100){
for(J=1;J<=NY;J++){
for(AI=1;AI<=NX;AI++){
// ラスト100ターンでの最大値を取る
if(abs(EZ[AI][J]) >= AMPEZ[AI][J]){
AMPEZ[AI][J]=abs(EZ[AI][J]); // AMPEZ[AI][J]=EZの振幅
}
}
}
}
//--- 2-7. 振幅データの作成 ここまで----------------------------------------
//--- 2-8. 半時間ステップだけ時間を進める------------------------------------
T=T+DT/2;
//--- 2-8. 半時間ステップだけ時間を進める ここまで---------------------------
//--- 2-9. 1000ステップ毎終了時のEZ[AI][J]を 各ファイルに出力 ------
if(IT==10){
kakikomi("10ターン目をファイルに出力します。" ,
"20100729_01_10_DATA.txt" , EZ , NX , NY);
}
if(IT==8000){
kakikomi("8000ターン目をファイルに出力します。" ,
"20100729_01_8000_DATA.txt" , EZ , NX , NY);
}
if(IT==10000){
kakikomi("10000ターン目をファイルに出力します。" ,
"20100729_01_10000_DATA.txt" , EZ , NX , NY);
}
//--- 2-9. 100、300、500ステップ終了時のEZ[AI][J]を 各ファイルに出力
// ここまで --------------------------------------
//---2-10. 1ポイントモニター ----------------------------------------------
//1点でのEZ(AI,J)の値をすべての時間ステップで記録する
//適切な全体のステップ数を求めるのが目的
//記録(8,8)でのEZをモニターする
// EZ_MON_1[IT]=EZ[8][8];
//---2-10. 1ポイントモニター ここまで-------------------------------------
//--- 2-11. メインループの終わり-------------------------------------------
}
//--- 2-11. メインループの終わり ここまで----------------------------------
//=== 2. メインループ ここまで ================================================
//=== 3. ファイル出力(本にはない) ==============================================
//--- 3-1. AMPEZ[AI][J]の出力 ---------------
kakikomi("AMPEZ[AI][J]を出力します。" ,
"20100729_01_01_OUTPUT_AMPEZ_DATA.txt" , AMPEZ , NX , NY);
//--- 3-2. 最後のEZ[AI][J]の出力 ------------
kakikomi("EZ[AI][J]を出力します。" ,
"20100729_01_OUTPUT_LAST_EZ_DATA.txt" , EZ , NX , NY);
//--- 3-3. 最後のHX[AI][J]の出力 ------------
kakikomi("HX[AI][J]を出力します。" ,
"20100729_01_OUTPUT_LAST_HX_DATA.txt" , HX , NX , NY);
//--- 3-4. 最後のHY[AI][J]の出力 ------------
kakikomi("HY[AI][J]を出力します。" ,
"20100729_01_OUTPUT_LAST_HY_DATA.txt" , HY , NX , NY);
//--- 3-5. EZ_MON_1の出力 -------------------
onePointMonitor("EZ_MON_1を出力します。" ,
"20100729_01_OUTPUT_EZ_MON_1_DATA.txt" , EZ_MON_1 , ITMAX);
//=== 3. ファイル出力(本にはない) ここまで ======================
//=== 4. フリーストアの配列の削除 ================================
deleteArray(CEZ,NX+1); //配列名以外に行数だけ渡す
deleteArray(CEZLX,NX+1);
deleteArray(CEZLY,NX+1);
deleteArray(CHXLY,NX+1);
deleteArray(CHYLX,NX+1);
deleteArray(MEDIUM,NX+1);
deleteArray(C,NX+1);
deleteArray(DA,NX+1);
deleteArray(CV,NX+1);
deleteArrayInt(KNOWN,NX+1);
deleteArray(HX,NX+1);
// deleteArray(HX1,NX+1);
deleteArray(HY,NX+1);
// deleteArray(HY1,NX+1);
deleteArray(EZ,NX+1);
// deleteArray(EZ1,NX+1);
delete[] EZ_MON_1;
deleteArray(EZX1,5);
deleteArray(EZX2,5);
deleteArray(EZY1,NX+1);
deleteArray(EZY2,NX+1);
deleteArray(AMPEZ,NX+1);
//===4. フリーストアの配列の削除 ここまで =======================
cout << "何かキーを押してください";
getchar();
}
// 全プログラム終了