📄 fdtd_3d_pml.cpp
字号:
#include "FDTD_3D_PML.h"
#include "FDTD_3D_PML_Ex.h"
#include "FDTD_3D_PML_Ey.h"
#include "FDTD_3D_PML_Ez.h"
#include "FDTD_3D_PML_Hx.h"
#include "FDTD_3D_PML_Hy.h"
#include "FDTD_3D_PML_Hz.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CFDTD_3D_PML::CFDTD_3D_PML(void)
{
Allocate_FGE_x = NULL; Allocate_FGE_y = NULL; Allocate_FGE_z = NULL;
Allocate_BH_x = NULL; Allocate_BH_y = NULL; Allocate_BH_z = NULL;
//The field components
Ex = NULL;
Fx_1 = NULL; Fx_2 = NULL; Fx_3 = NULL;
Fx_4 = NULL; Fx_5 = NULL; Fx_6 = NULL;
Fx_7 = NULL; Fx_8 = NULL; Fx_9 = NULL;
Fx_10 = NULL; Fx_11 = NULL; Fx_12 = NULL;
Fx_13 = NULL; Fx_15 = NULL;
Fx_16 = NULL; Fx_17 = NULL; Fx_18 = NULL;
Fx_19 = NULL; Fx_20 = NULL; Fx_21 = NULL;
Fx_22 = NULL; Fx_23 = NULL; Fx_24 = NULL;
Fx_25 = NULL; Fx_26 = NULL; Fx_27 = NULL;
Gx_1 = NULL; Gx_2 = NULL; Gx_3 = NULL;
Gx_7 = NULL; Gx_8 = NULL; Gx_9 = NULL;
Gx_10 = NULL; Gx_12 = NULL; Gx_16 = NULL; Gx_18 = NULL;
Gx_19 = NULL; Gx_20 = NULL; Gx_21 = NULL;
Gx_25 = NULL; Gx_26 = NULL; Gx_27 = NULL;
Ey = NULL;
Fy_1 = NULL; Fy_2 = NULL; Fy_3 = NULL;
Fy_4 = NULL; Fy_5 = NULL; Fy_6 = NULL;
Fy_7 = NULL; Fy_8 = NULL; Fy_9 = NULL;
Fy_10 = NULL; Fy_11 = NULL; Fy_12 = NULL;
Fy_13 = NULL; Fy_15 = NULL;
Fy_16 = NULL; Fy_17 = NULL; Fy_18 = NULL;
Fy_19 = NULL; Fy_20 = NULL; Fy_21 = NULL;
Fy_22 = NULL; Fy_23 = NULL; Fy_24 = NULL;
Fy_25 = NULL; Fy_26 = NULL; Fy_27 = NULL;
Gy_1 = NULL; Gy_2 = NULL; Gy_3 = NULL;
Gy_4 = NULL; Gy_6 = NULL; Gy_7 = NULL;
Gy_8 = NULL; Gy_9 = NULL;
Gy_19 = NULL; Gy_20 = NULL; Gy_21 = NULL;
Gy_22 = NULL; Gy_24 = NULL; Gy_25 = NULL;
Gy_26 = NULL; Gy_27 = NULL;
Ez = NULL;
Fz_1 = NULL; Fz_2 = NULL; Fz_3 = NULL;
Fz_4 = NULL; Fz_5 = NULL; Fz_6 = NULL;
Fz_7 = NULL; Fz_8 = NULL; Fz_9 = NULL;
Fz_10 = NULL; Fz_11 = NULL; Fz_12 = NULL;
Fz_13 = NULL; Fz_15 = NULL;
Fz_16 = NULL; Fz_17 = NULL; Fz_18 = NULL;
Fz_19 = NULL; Fz_20 = NULL; Fz_21 = NULL;
Fz_22 = NULL; Fz_23 = NULL; Fz_24 = NULL;
Fz_25 = NULL; Fz_26 = NULL; Fz_27 = NULL;
Gz_1 = NULL; Gz_3 = NULL; Gz_4 = NULL;
Gz_6 = NULL; Gz_7 = NULL; Gz_9 = NULL;
Gz_10 = NULL; Gz_12 = NULL; Gz_16 = NULL;
Gz_18 = NULL; Gz_19 = NULL; Gz_21 = NULL;
Gz_22 = NULL; Gz_24 = NULL; Gz_25 = NULL;
Gz_27 = NULL;
Hx = NULL;
Bx_1 = NULL; Bx_2 = NULL; Bx_3 = NULL;
Bx_4 = NULL; Bx_6 = NULL;
Bx_7 = NULL; Bx_8 = NULL; Bx_9 = NULL;
Bx_10 = NULL; Bx_12 = NULL;
Bx_13 = NULL; Bx_15 = NULL;
Bx_16 = NULL; Bx_18 = NULL;
Bx_19 = NULL; Bx_20 = NULL; Bx_21 = NULL;
Bx_22 = NULL; Bx_24 = NULL;
Bx_25 = NULL; Bx_26 = NULL; Bx_27 = NULL;
Hy = NULL;
By_1 = NULL; By_2 = NULL; By_3 = NULL;
By_4 = NULL; By_6 = NULL;
By_7 = NULL; By_8 = NULL; By_9 = NULL;
By_10 = NULL; By_11 = NULL; By_12 = NULL;
By_16 = NULL; By_17 = NULL; By_18 = NULL;
By_19 = NULL; By_20 = NULL; By_21 = NULL;
By_22 = NULL; By_24 = NULL;
By_25 = NULL; By_26 = NULL; By_27 = NULL;
Hz = NULL;
Bz_1 = NULL; Bz_2 = NULL; Bz_3 = NULL;
Bz_4 = NULL; Bz_5 = NULL; Bz_6 = NULL;
Bz_7 = NULL; Bz_8 = NULL; Bz_9 = NULL;
Bz_10 = NULL; Bz_12 = NULL;
Bz_16 = NULL; Bz_18 = NULL;
Bz_19 = NULL; Bz_20 = NULL; Bz_21 = NULL;
Bz_22 = NULL; Bz_23 = NULL; Bz_24 = NULL;
Bz_25 = NULL; Bz_26 = NULL; Bz_27 = NULL;
//Coefficients containing the PML boundary parameters
K_Gx_a_1 = NULL; K_Gx_b_1 = NULL;
K_Ex_a_1 = NULL; K_Ex_b_1 = NULL; K_Ex_c_1 = NULL; K_Ex_d_1 = NULL;
K_Gx_a_2 = NULL; K_Gx_b_2 = NULL;
K_Ex_a_2 = NULL; K_Ex_b_2 = NULL; K_Ex_c_2 = NULL; K_Ex_d_2 = NULL;
K_Gy_a_1 = NULL; K_Gy_b_1 = NULL;
K_Ey_a_1 = NULL; K_Ey_b_1 = NULL; K_Ey_c_1 = NULL; K_Ey_d_1 = NULL;
K_Gy_a_2 = NULL; K_Gy_b_2 = NULL;
K_Ey_a_2 = NULL; K_Ey_b_2 = NULL; K_Ey_c_2 = NULL; K_Ey_d_2 = NULL;
K_Gz_a_1 = NULL; K_Gz_b_1 = NULL;
K_Ez_a_1 = NULL; K_Ez_b_1 = NULL; K_Ez_c_1 = NULL; K_Ez_d_1 = NULL;
K_Gz_a_2 = NULL; K_Gz_b_2 = NULL;
K_Ez_a_2 = NULL; K_Ez_b_2 = NULL; K_Ez_c_2 = NULL; K_Ez_d_2 = NULL;
K_Bx_a_1 = NULL; K_Bx_b_1 = NULL;
K_Hx_a_1 = NULL; K_Hx_b_1 = NULL; K_Hx_c_1 = NULL; K_Hx_d_1 = NULL;
K_Bx_a_2 = NULL; K_Bx_b_2 = NULL;
K_Hx_a_2 = NULL; K_Hx_b_2 = NULL; K_Hx_c_2 = NULL; K_Hx_d_2 = NULL;
K_By_a_1 = NULL; K_By_b_1 = NULL;
K_Hy_a_1 = NULL; K_Hy_b_1 = NULL; K_Hy_c_1 = NULL; K_Hy_d_1 = NULL;
K_By_a_2 = NULL; K_By_b_2 = NULL;
K_Hy_a_2 = NULL; K_Hy_b_2 = NULL; K_Hy_c_2 = NULL; K_Hy_d_2 = NULL;
K_Bz_a_1 = NULL; K_Bz_b_1 = NULL;
K_Hz_a_1 = NULL; K_Hz_b_1 = NULL; K_Hz_c_1 = NULL; K_Hz_d_1 = NULL;
K_Bz_a_2 = NULL; K_Bz_b_2 = NULL;
K_Hz_a_2 = NULL; K_Hz_b_2 = NULL; K_Hz_c_2 = NULL; K_Hz_d_2 = NULL;
K_a = NULL; K_b = NULL;
//Contains the followed field components
Ex_Foll = NULL; Ey_Foll = NULL; Ez_Foll = NULL;
Hx_Foll = NULL; Hy_Foll = NULL; Hz_Foll = NULL;
//to save the field components
path_name_Ex = NULL;
path_name_Ey = NULL;
path_name_Ez = NULL;
path_name_Hx = NULL;
path_name_Hy = NULL;
path_name_Hz = NULL;
//by default there are no Symmetric boundaries
jel_Symmetric_ia = 0; jel_Symmetric_ib = 0; jel_Symmetric_ja = 0;
jel_Symmetric_jb = 0; jel_Symmetric_ka = 0; jel_Symmetric_kb = 0;
//by default there are no Anti-Symmetric boundaries
jel_Anti_Symmetric_ia = 0; jel_Anti_Symmetric_ib = 0; jel_Anti_Symmetric_ja = 0;
jel_Anti_Symmetric_jb = 0; jel_Anti_Symmetric_ka = 0; jel_Anti_Symmetric_kb = 0;
jel_TS = 0;
//the incident field for total field scattered field formulation
jel_TS_planes = NULL;
E_1D = NULL; H_1D = NULL;
ll_1D_E = NULL; ll_1D_H = NULL;
//the recuired incident magnetic fields to compute the electric field components
Hz_i0 = NULL; Hy_i0 = NULL; Hz_i1 = NULL; Hy_i1 = NULL;
Hz_j0 = NULL; Hx_j0 = NULL; Hz_j1 = NULL; Hx_j1 = NULL;
Hy_k0 = NULL; Hx_k0 = NULL; Hy_k1 = NULL; Hx_k1 = NULL;
face_Hz_i0 = NULL; face_Hy_i0 = NULL; face_Hz_i1 = NULL; face_Hy_i1 = NULL;
face_Hz_j0 = NULL; face_Hx_j0 = NULL; face_Hz_j1 = NULL; face_Hx_j1 = NULL;
face_Hy_k0 = NULL; face_Hx_k0 = NULL; face_Hy_k1 = NULL; face_Hx_k1 = NULL;
//the recuired incident electric fields to compute the magnetic field components
Ey_i0 = NULL; Ez_i0 = NULL; Ey_i1 = NULL; Ez_i1 = NULL;
Ex_j0 = NULL; Ez_j0 = NULL; Ex_j1 = NULL; Ez_j1 = NULL;
Ex_k0 = NULL; Ey_k0 = NULL; Ex_k1 = NULL; Ey_k1 = NULL;
face_Ey_i0 = NULL; face_Ez_i0 = NULL; face_Ey_i1 = NULL; face_Ez_i1 = NULL;
face_Ex_j0 = NULL; face_Ez_j0 = NULL; face_Ex_j1 = NULL; face_Ez_j1 = NULL;
face_Ex_k0 = NULL; face_Ey_k0 = NULL; face_Ex_k1 = NULL; face_Ey_k1 = NULL;
}
CFDTD_3D_PML::~CFDTD_3D_PML(void)
{
Free_Mem();
//Free the containers
free(Allocate_FGE_x);
free(Allocate_FGE_y);
free(Allocate_FGE_z);
free(Allocate_BH_x);
free(Allocate_BH_y);
free(Allocate_BH_z);
}
////////////////////////////////////////////////////////////////////
//Collect the information - Ex field
////////////////////////////////////////////////////////////////////
void CFDTD_3D_PML::Init_Alloc_FxGxEx()
{
long nx_MIN_1_MIN_nPML_x_1_MIN_nPML_x_2 = nx - 1 - nPML_x_1 - nPML_x_2;
long ny_MIN_nPML_y_1_MIN_nPML_y_2 = ny - nPML_y_1 - nPML_y_2;
long nz_MIN_nPML_z_1_MIN_nPML_z_2 = nz - nPML_z_1 - nPML_z_2;
Allocate_FGE_x->A[0] = &Fx_1; Allocate_FGE_x->A[1] = &Gx_1; Allocate_FGE_x->A[2] = &Fx_2;
Allocate_FGE_x->A[3] = &Gx_2; Allocate_FGE_x->A[4] = &Fx_3; Allocate_FGE_x->A[5] = &Gx_3;
Allocate_FGE_x->A[6] = &Fx_4; Allocate_FGE_x->A[7] = &Fx_5; Allocate_FGE_x->A[8] = &Fx_6;
Allocate_FGE_x->A[9] = &Fx_7; Allocate_FGE_x->A[10] = &Gx_7; Allocate_FGE_x->A[11] = &Fx_8;
Allocate_FGE_x->A[12] = &Gx_8; Allocate_FGE_x->A[13] = &Fx_9; Allocate_FGE_x->A[14] = &Gx_9;
Allocate_FGE_x->A[15] = &Fx_10; Allocate_FGE_x->A[16] = &Gx_10; Allocate_FGE_x->A[17] = &Fx_11;
Allocate_FGE_x->A[18] = &Fx_12; Allocate_FGE_x->A[19] = &Gx_12; Allocate_FGE_x->A[20] = &Fx_13;
Allocate_FGE_x->A[21] = &Fx_15; Allocate_FGE_x->A[22] = &Fx_16; Allocate_FGE_x->A[23] = &Gx_16;
Allocate_FGE_x->A[24] = &Fx_17; Allocate_FGE_x->A[25] = &Fx_18; Allocate_FGE_x->A[26] = &Gx_18;
Allocate_FGE_x->A[27] = &Fx_19; Allocate_FGE_x->A[28] = &Gx_19; Allocate_FGE_x->A[29] = &Fx_20;
Allocate_FGE_x->A[30] = &Gx_20; Allocate_FGE_x->A[31] = &Fx_21; Allocate_FGE_x->A[32] = &Gx_21;
Allocate_FGE_x->A[33] = &Fx_22; Allocate_FGE_x->A[34] = &Fx_23; Allocate_FGE_x->A[35] = &Fx_24;
Allocate_FGE_x->A[36] = &Fx_25; Allocate_FGE_x->A[37] = &Gx_25; Allocate_FGE_x->A[38] = &Fx_26;
Allocate_FGE_x->A[39] = &Gx_26; Allocate_FGE_x->A[40] = &Fx_27; Allocate_FGE_x->A[41] = &Gx_27;
Allocate_FGE_x->A[42] = &Ex;
Allocate_FGE_x->er = 0;
strcpy(&Allocate_FGE_x->name[0][0],"Fx_1"); strcpy(&Allocate_FGE_x->name[1][0],"Gx_1");
strcpy(&Allocate_FGE_x->name[2][0],"Fx_2"); strcpy(&Allocate_FGE_x->name[3][0],"Gx_2");
strcpy(&Allocate_FGE_x->name[4][0],"Fx_3"); strcpy(&Allocate_FGE_x->name[5][0],"Gx_3");
strcpy(&Allocate_FGE_x->name[6][0],"Fx_4"); strcpy(&Allocate_FGE_x->name[7][0],"Fx_5");
strcpy(&Allocate_FGE_x->name[8][0],"Fx_6"); strcpy(&Allocate_FGE_x->name[9][0],"Fx_7");
strcpy(&Allocate_FGE_x->name[10][0],"Gx_7"); strcpy(&Allocate_FGE_x->name[11][0],"Fx_8");
strcpy(&Allocate_FGE_x->name[12][0],"Gx_8"); strcpy(&Allocate_FGE_x->name[13][0],"Fx_9");
strcpy(&Allocate_FGE_x->name[14][0],"Gx_9"); strcpy(&Allocate_FGE_x->name[15][0],"Fx_10");
strcpy(&Allocate_FGE_x->name[16][0],"Gx_10"); strcpy(&Allocate_FGE_x->name[17][0],"Fx_11");
strcpy(&Allocate_FGE_x->name[18][0],"Fx_12"); strcpy(&Allocate_FGE_x->name[19][0],"Gx_12");
strcpy(&Allocate_FGE_x->name[20][0],"Fx_13"); strcpy(&Allocate_FGE_x->name[21][0],"Fx_15");
strcpy(&Allocate_FGE_x->name[22][0],"Fx_16"); strcpy(&Allocate_FGE_x->name[23][0],"Gx_16");
strcpy(&Allocate_FGE_x->name[24][0],"Fx_17"); strcpy(&Allocate_FGE_x->name[25][0],"Fx_18");
strcpy(&Allocate_FGE_x->name[26][0],"Gx_18"); strcpy(&Allocate_FGE_x->name[27][0],"Fx_19");
strcpy(&Allocate_FGE_x->name[28][0],"Gx_19"); strcpy(&Allocate_FGE_x->name[29][0],"Fx_20");
strcpy(&Allocate_FGE_x->name[30][0],"Gx_20"); strcpy(&Allocate_FGE_x->name[31][0],"Fx_21");
strcpy(&Allocate_FGE_x->name[32][0],"Gx_21"); strcpy(&Allocate_FGE_x->name[33][0],"Fx_22");
strcpy(&Allocate_FGE_x->name[34][0],"Fx_23"); strcpy(&Allocate_FGE_x->name[35][0],"Fx_24");
strcpy(&Allocate_FGE_x->name[36][0],"Fx_25"); strcpy(&Allocate_FGE_x->name[37][0],"Gx_25");
strcpy(&Allocate_FGE_x->name[38][0],"Fx_26"); strcpy(&Allocate_FGE_x->name[39][0],"Gx_26");
strcpy(&Allocate_FGE_x->name[40][0],"Fx_27"); strcpy(&Allocate_FGE_x->name[41][0],"Gx_27");
strcpy(&Allocate_FGE_x->name[42][0],"Ex");
//Fx_1
Allocate_FGE_x->size[0][0] = nPML_x_1;
Allocate_FGE_x->size[0][1] = nPML_y_1;
Allocate_FGE_x->size[0][2] = nPML_z_1;
//Gx_1
Allocate_FGE_x->size[1][0] = nPML_x_1;
Allocate_FGE_x->size[1][1] = nPML_y_1;
Allocate_FGE_x->size[1][2] = nPML_z_1;
//Fx_2
Allocate_FGE_x->size[2][0] = nx_MIN_1_MIN_nPML_x_1_MIN_nPML_x_2;
Allocate_FGE_x->size[2][1] = nPML_y_1;
Allocate_FGE_x->size[2][2] = nPML_z_1;
//Gx_2
Allocate_FGE_x->size[3][0] = nx_MIN_1_MIN_nPML_x_1_MIN_nPML_x_2;
Allocate_FGE_x->size[3][1] = nPML_y_1;
Allocate_FGE_x->size[3][2] = nPML_z_1;
//Fx_3
Allocate_FGE_x->size[4][0] = nPML_x_2;
Allocate_FGE_x->size[4][1] = nPML_y_1;
Allocate_FGE_x->size[4][2] = nPML_z_1;
//Gx_3
Allocate_FGE_x->size[5][0] = nPML_x_2;
Allocate_FGE_x->size[5][1] = nPML_y_1;
Allocate_FGE_x->size[5][2] = nPML_z_1;
//Fx_4
Allocate_FGE_x->size[6][0] = nPML_x_1;
Allocate_FGE_x->size[6][1] = ny_MIN_nPML_y_1_MIN_nPML_y_2;
Allocate_FGE_x->size[6][2] = nPML_z_1;
//Fx_5
Allocate_FGE_x->size[7][0] = nx_MIN_1_MIN_nPML_x_1_MIN_nPML_x_2;
Allocate_FGE_x->size[7][1] = ny_MIN_nPML_y_1_MIN_nPML_y_2;
Allocate_FGE_x->size[7][2] = nPML_z_1;
//Fx_6
Allocate_FGE_x->size[8][0] = nPML_x_2;
Allocate_FGE_x->size[8][1] = ny_MIN_nPML_y_1_MIN_nPML_y_2;
Allocate_FGE_x->size[8][2] = nPML_z_1;
//Fx_7
Allocate_FGE_x->size[9][0] = nPML_x_1;
Allocate_FGE_x->size[9][1] = nPML_y_2;
Allocate_FGE_x->size[9][2] = nPML_z_1;
//Gx_7
Allocate_FGE_x->size[10][0] = nPML_x_1;
Allocate_FGE_x->size[10][1] = nPML_y_2;
Allocate_FGE_x->size[10][2] = nPML_z_1;
//Fx_8
Allocate_FGE_x->size[11][0] = nx_MIN_1_MIN_nPML_x_1_MIN_nPML_x_2;
Allocate_FGE_x->size[11][1] = nPML_y_2;
Allocate_FGE_x->size[11][2] = nPML_z_1;
//Gx_8
Allocate_FGE_x->size[12][0] = nx_MIN_1_MIN_nPML_x_1_MIN_nPML_x_2;
Allocate_FGE_x->size[12][1] = nPML_y_2;
Allocate_FGE_x->size[12][2] = nPML_z_1;
//Fx_9
Allocate_FGE_x->size[13][0] = nPML_x_2;
Allocate_FGE_x->size[13][1] = nPML_y_2;
Allocate_FGE_x->size[13][2] = nPML_z_1;
//Gx_9
Allocate_FGE_x->size[14][0] = nPML_x_2;
Allocate_FGE_x->size[14][1] = nPML_y_2;
Allocate_FGE_x->size[14][2] = nPML_z_1;
//Fx_10
Allocate_FGE_x->size[15][0] = nPML_x_1;
Allocate_FGE_x->size[15][1] = nPML_y_1;
Allocate_FGE_x->size[15][2] = nz_MIN_nPML_z_1_MIN_nPML_z_2;
//Gx_10
Allocate_FGE_x->size[16][0] = nPML_x_1;
Allocate_FGE_x->size[16][1] = nPML_y_1;
Allocate_FGE_x->size[16][2] = nz_MIN_nPML_z_1_MIN_nPML_z_2;
//Fx_11
Allocate_FGE_x->size[17][0] = nx_MIN_1_MIN_nPML_x_1_MIN_nPML_x_2;
Allocate_FGE_x->size[17][1] = nPML_y_1;
Allocate_FGE_x->size[17][2] = nz_MIN_nPML_z_1_MIN_nPML_z_2;
//Fx_12
Allocate_FGE_x->size[18][0] = nPML_x_2;
Allocate_FGE_x->size[18][1] = nPML_y_1;
Allocate_FGE_x->size[18][2] = nz_MIN_nPML_z_1_MIN_nPML_z_2;
//Gx_12
Allocate_FGE_x->size[19][0] = nPML_x_2;
Allocate_FGE_x->size[19][1] = nPML_y_1;
Allocate_FGE_x->size[19][2] = nz_MIN_nPML_z_1_MIN_nPML_z_2;
//Fx_13
Allocate_FGE_x->size[20][0] = nPML_x_1;
Allocate_FGE_x->size[20][1] = ny_MIN_nPML_y_1_MIN_nPML_y_2;
Allocate_FGE_x->size[20][2] = nz_MIN_nPML_z_1_MIN_nPML_z_2;
//Fx_15
Allocate_FGE_x->size[21][0] = nPML_x_2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -