⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 init_thread_calc_data.cpp

📁 利用c++语言写的三维FDTD
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		else
		{
			ind = ii - 1;
		}
		
		if (ii != 13)
		{
			Data_Ez_PML[ind].ny_1 = nPML_y_1;  Data_Ez_PML[ind].ny_2 = ny_MIN_nPML_y_2;
			if (ii<12 || ii >15)
			{
				Data_Ez_PML[ind].cnst = inv_TwoOREp0;
			}
		}
		
		ii++;
		jel++;
	}


	//y component III zone - (7 8 9 16 17 18 25 26 27)
	ii = 6;
	jel = 0;
	for (i = 0; i<9; i++)
	{
		if (jel == 3)
		{
			jel = 0;
			ii = ii + 6;
		}
		
		if (ii < 13)
		{
			ind = ii;
		}
		else
		{
			ind = ii - 1;
		}
		
		Data_Ez_PML[ind].K_E_a = K_Ez_a_2;          Data_Ez_PML[ind].K_E_b = K_Ez_b_2;
		Data_Ez_PML[ind].ny_1 = ny_MIN_nPML_y_2;    Data_Ez_PML[ind].ny_2 = ny_MIN_1;
		Data_Ez_PML[ind].c_PML_y = nPML_y_2_MIN_1;
		
		ii++;
		jel++;
	}
	////////////////////////

	//z component I zone - (1 2 3 4 5 6 7 8 9)
	for (i = 0; i<9; i++)
	{
		Data_Ez_PML[i].K_E_c = K_Ez_c_1;     Data_Ez_PML[i].K_E_d = K_Ez_d_1;
		Data_Ez_PML[i].nz_2 = nPML_z_1;
	}

	//z component II zone - (10 11 12 13 15 16 17 18)
	for (i = 9; i<17; i++)
	{
		Data_Ez_PML[i].nz_1 = nPML_z_1;    Data_Ez_PML[i].nz_2 = nz_MIN_1_MIN_nPML_z_2;
	}

	Data_Ez_PML[9].cnst  = TwoOREp0;     Data_Ez_PML[10].cnst = TwoOREp0; 
	Data_Ez_PML[11].cnst = TwoOREp0;     Data_Ez_PML[14].cnst = TwoOREp0;
	Data_Ez_PML[15].cnst = TwoOREp0;     Data_Ez_PML[16].cnst = TwoOREp0;
	
	//z component III zone - (19 20 21 22 23 24 25 26 27)
	for (i = 17; i<26; i++)
	{
		Data_Ez_PML[i].K_E_c = K_Ez_c_2;         Data_Ez_PML[i].K_E_d = K_Ez_d_2;
		Data_Ez_PML[i].nz_1 = nz_MIN_1_MIN_nPML_z_2;  Data_Ez_PML[i].nz_2 = nz_MIN_1;
		Data_Ez_PML[i].c_PML_z = nPML_z_2_MIN_1;
	}
}

////////////////////////////////////////////////////////////////////
//Init threads parameters in the PML zone -- Hx
////////////////////////////////////////////////////////////////////
void Init_Thread_Calc_PML_Hx(Data_H_comp_PML *Data_Hx_PML, 
				double ***Bx_1,   double ***Bx_2,   double ***Bx_3,   double ***Bx_4,  
			    double ***Bx_6,   double ***Bx_7,   double ***Bx_8,   double ***Bx_9, 
				double ***Bx_10,  double ***Bx_12,  double ***Bx_13,  double ***Bx_15, 
				double ***Bx_16,  double ***Bx_18,  double ***Bx_19,  double ***Bx_20,
				double ***Bx_21,  double ***Bx_22,  double ***Bx_24,  double ***Bx_25,
				double ***Bx_26,  double ***Bx_27,  double ***Hx,     double ***Ey,
				double ***Ez,     long ***Index,     double **mu_r,    double *K_Bx_a_1,
				double *K_Bx_b_1, double *K_Hx_a_1, double *K_Hx_b_1, double *K_Hx_c_1,
				double *K_Hx_d_1, double *K_Bx_a_2, double *K_Bx_b_2, double *K_Hx_a_2,
				double *K_Hx_b_2, double *K_Hx_c_2, double *K_Hx_d_2, long nPML_x_1, 
				long nPML_y_1,  long nPML_z_1, long nPML_x_2, long nPML_y_2, long nPML_z_2,
				long nx, long ny, long nz, double dy, double dz, double dt)
{
	//permittivity of free space 
    double eps_0 = 8.8541878176203898505365630317107e-12; // [F/m]
	//permeability of free space 
    double mu_0  = 1.2566370614359172953850573533118e-6;  // [H/m]

	double TwoOREp0 = 2*eps_0;
	double inv_TwoOREp0 = 1/TwoOREp0;
	double TwoOREp0DIVMu0 = TwoOREp0/mu_0;

	double inv_dy = 1.0/dy;
	double inv_dz = 1.0/dz;

	double dtDIVdy = dt/dy;
	double dtDIVdz = dt/dz;

	double TwoOREp0DIVMu0ORdtDIVdy = 2*eps_0/mu_0*dt/dy;
	double TwoOREp0DIVMu0ORdtDIVdz = 2*eps_0/mu_0*dt/dz;

	double inv_dyORmu_0 = 1.0/(dy*mu_0);
	double inv_dzORmu_0 = 1.0/(dz*mu_0);

	long ny_MIN_1 = ny - 1;
	long nz_MIN_1 = nz - 1;

	long nx_MIN_nPML_x_2 = nx - nPML_x_2;

	long nPML_x_2_MIN_1 = nPML_x_2 - 1;
	long nPML_y_2_MIN_1 = nPML_y_2 - 1;
	long nPML_z_2_MIN_1 = nPML_z_2 - 1;

	long ny_MIN_1_MIN_nPML_y_2 = ny - 1 - nPML_y_2;
	long nz_MIN_1_MIN_nPML_z_2 = nz - 1 - nPML_z_2;

	long i;
	//set the same elements for all regions 
	for (i = 0; i<26; i++) 
	{
		Data_Hx_PML[i].H = Hx;           
		Data_Hx_PML[i].E1 = Ey;          Data_Hx_PML[i].E2 = Ez; 
		Data_Hx_PML[i].Ind = Index;      Data_Hx_PML[i].mu_r = mu_r[i];
	}

	//set the particular elements
    Data_Hx_PML[0].B  = Bx_1;   Data_Hx_PML[1].B  = Bx_2;   Data_Hx_PML[2].B  = Bx_3;            
	Data_Hx_PML[3].B  = Bx_4;             	                Data_Hx_PML[5].B  = Bx_6;            
	Data_Hx_PML[6].B  = Bx_7;   Data_Hx_PML[7].B  = Bx_8;   Data_Hx_PML[8].B  = Bx_9;            
	
	Data_Hx_PML[9].B  = Bx_10;                              Data_Hx_PML[11].B = Bx_12;           
	Data_Hx_PML[12].B = Bx_13;                           	Data_Hx_PML[13].B = Bx_15;           
	Data_Hx_PML[14].B = Bx_16;                            	Data_Hx_PML[16].B = Bx_18;           

	Data_Hx_PML[17].B = Bx_19;  Data_Hx_PML[18].B = Bx_20;  Data_Hx_PML[19].B = Bx_21;           
	Data_Hx_PML[20].B = Bx_22;                              Data_Hx_PML[22].B = Bx_24;           
	Data_Hx_PML[23].B = Bx_25;  Data_Hx_PML[24].B = Bx_26;  Data_Hx_PML[25].B = Bx_27;           

	//set coef_1 and coef_2
	for (i=0; i<26; i++) //first set for all:  
	{
		Data_Hx_PML[i].coef_1   = inv_dy;      Data_Hx_PML[i].coef_2   = inv_dz;
	}
	//then modify 
    Data_Hx_PML[3].coef_1   = dtDIVdy;       Data_Hx_PML[3].coef_2   = dtDIVdz;
	Data_Hx_PML[5].coef_1   = dtDIVdy;       Data_Hx_PML[5].coef_2   = dtDIVdz;
	Data_Hx_PML[12].coef_1  = dtDIVdy;       Data_Hx_PML[12].coef_2  = dtDIVdz;
	Data_Hx_PML[13].coef_1  = dtDIVdy;       Data_Hx_PML[13].coef_2  = dtDIVdz;
	Data_Hx_PML[20].coef_1  = dtDIVdy;       Data_Hx_PML[20].coef_2  = dtDIVdz;
	Data_Hx_PML[22].coef_1  = dtDIVdy;       Data_Hx_PML[22].coef_2  = dtDIVdz;
	Data_Hx_PML[4].coef_1   = TwoOREp0DIVMu0ORdtDIVdy;
	Data_Hx_PML[4].coef_2   = TwoOREp0DIVMu0ORdtDIVdz;
	Data_Hx_PML[21].coef_1  = TwoOREp0DIVMu0ORdtDIVdy;
	Data_Hx_PML[21].coef_2  = TwoOREp0DIVMu0ORdtDIVdz;
	Data_Hx_PML[10].coef_1  = inv_dyORmu_0;  Data_Hx_PML[10].coef_2  = inv_dzORmu_0;
	Data_Hx_PML[15].coef_1  = inv_dyORmu_0;  Data_Hx_PML[15].coef_2  = inv_dzORmu_0;
	
	//set cnst
	Data_Hx_PML[1].cnst  = TwoOREp0DIVMu0; Data_Hx_PML[7].cnst  = TwoOREp0DIVMu0;
	Data_Hx_PML[18].cnst = TwoOREp0DIVMu0; Data_Hx_PML[24].cnst = TwoOREp0DIVMu0;

	Data_Hx_PML[9].cnst  = inv_TwoOREp0;  Data_Hx_PML[10].cnst = inv_TwoOREp0;
	Data_Hx_PML[11].cnst = inv_TwoOREp0;  Data_Hx_PML[12].cnst = inv_TwoOREp0;
	Data_Hx_PML[13].cnst = inv_TwoOREp0;  Data_Hx_PML[14].cnst = inv_TwoOREp0;
	Data_Hx_PML[15].cnst = inv_TwoOREp0;  Data_Hx_PML[16].cnst = inv_TwoOREp0;

	long ind;
	//x component I zone - (1 4 7 10 13 16 19 22 25)
	for (i = 0; i<27; i=i+3)
	{
		if (i < 13)
		{
			ind = i;
		}
		else
		{
			ind = i - 1;
		}

		Data_Hx_PML[ind].K_H_c = K_Hx_c_1;     Data_Hx_PML[ind].K_H_d = K_Hx_d_1; 
		Data_Hx_PML[ind].nx_2 = nPML_x_1;
	}

	//x component II zone - (2 5 8 11 14 17 20 23 26)
	for (i = 1; i<27; i=i+3)
	{
		if (i < 13)
		{
			ind = i;
		}
		else
		{
			ind = i - 1;
		}

		if (ind != 12)
		{
			Data_Hx_PML[ind].nx_1 = nPML_x_1;  Data_Hx_PML[ind].nx_2 = nx_MIN_nPML_x_2;
			
		}
	}
	
	//x component III zone - (3 6 9 12 15 18 21 24 27)
	for (i = 2; i<27; i=i+3)
	{
		if (i < 13)
		{
			ind = i;
		}
		else
		{
			ind = i - 1;
		}

		Data_Hx_PML[ind].K_H_c = K_Hx_c_2;         Data_Hx_PML[ind].K_H_d = K_Hx_d_2;
		Data_Hx_PML[ind].nx_1 = nx_MIN_nPML_x_2;   Data_Hx_PML[ind].nx_2 = nx;
		Data_Hx_PML[ind].c_PML_x = nPML_x_2_MIN_1;

	}
	////////////////////////

	//y component I zone - (1 2 3 10 11 12 19 20 21)
	long ii = 0;
	long jel = 0;
	for (i = 0; i<9; i++)
	{
		if (jel == 3)
		{
			jel = 0;
			ii = ii + 6;
		}

		if (ii < 13)
		{
			ind = ii;
		}
		else
		{
			ind = ii - 1;
		}
		
		Data_Hx_PML[ind].K_B_a = K_Bx_a_1;     Data_Hx_PML[ind].K_B_b = K_Bx_b_1;
		Data_Hx_PML[ind].ny_2 = nPML_y_1;
		
		ii++;
		jel++;
	}

	//y component II zone - (4 5 6 13 14 15 22 23 24)
	ii = 3;
	jel = 0;
	for (i = 0; i<9; i++)
	{
		if (jel == 3)
		{
			jel = 0;
			ii = ii + 6;
		}
		
		if (ii < 13)
		{
			ind = ii;
		}
		else
		{
			ind = ii - 1;
		}
		
		if (ii != 13)
		{
			Data_Hx_PML[ind].ny_1 = nPML_y_1;  
			Data_Hx_PML[ind].ny_2 = ny_MIN_1_MIN_nPML_y_2;
		}
		
		ii++;
		jel++;
	}


	//y component III zone - (7 8 9 16 17 18 25 26 27)
	ii = 6;
	jel = 0;
	for (i = 0; i<9; i++)
	{
		if (jel == 3)
		{
			jel = 0;
			ii = ii + 6;
		}
		
		if (ii < 13)
		{
			ind = ii;
		}
		else
		{
			ind = ii - 1;
		}
		
		Data_Hx_PML[ind].K_B_a = K_Bx_a_2;          Data_Hx_PML[ind].K_B_b = K_Bx_b_2;
		Data_Hx_PML[ind].ny_1 = ny_MIN_1_MIN_nPML_y_2; 
		Data_Hx_PML[ind].ny_2 = ny_MIN_1;
		Data_Hx_PML[ind].c_PML_y = nPML_y_2_MIN_1;
		
		ii++;
		jel++;
	}
	////////////////////////

	//z component I zone - (1 2 3 4 5 6 7 8 9)
	for (i = 0; i<9; i++)
	{
		Data_Hx_PML[i].K_H_a = K_Hx_a_1;     Data_Hx_PML[i].K_H_b = K_Hx_b_1;
		Data_Hx_PML[i].nz_2 = nPML_z_1;
	}

	//z component II zone - (10 11 12 13 15 16 17 18)
	for (i = 9; i<17; i++)
	{
		Data_Hx_PML[i].nz_1 = nPML_z_1;    Data_Hx_PML[i].nz_2 = nz_MIN_1_MIN_nPML_z_2;
	}

	//z component III zone - (19 20 21 22 23 24 25 26 27)
	for (i = 17; i<26; i++)
	{
		Data_Hx_PML[i].K_H_a = K_Hx_a_2;              Data_Hx_PML[i].K_H_b = K_Hx_b_2;
		Data_Hx_PML[i].nz_1 = nz_MIN_1_MIN_nPML_z_2;  Data_Hx_PML[i].nz_2 = nz_MIN_1;
		Data_Hx_PML[i].c_PML_z = nPML_z_2_MIN_1;
	}
}


////////////////////////////////////////////////////////////////////
//Init threads parameters in the PML zone -- Hy
////////////////////////////////////////////////////////////////////
void Init_Thread_Calc_PML_Hy(Data_H_comp_PML *Data_Hy_PML, 
				double ***By_1,   double ***By_2,   double ***By_3,   double ***By_4,  
			    double ***By_6,   double ***By_7,   double ***By_8,   double ***By_9, 
				double ***By_10,  double ***By_11,  double ***By_12,  double ***By_16, 
				double ***By_17,  double ***By_18,  double ***By_19,  double ***By_20,
				double ***By_21,  double ***By_22,  double ***By_24,  double ***By_25,
				double ***By_26,  double ***By_27,  double ***Hy,     double ***Ex,
				double ***Ez,     long ***Index,     double **mu_r,    double *K_By_a_1,
				double *K_By_b_1, double *K_Hy_a_1, double *K_Hy_b_1, double *K_Hy_c_1,
				double *K_Hy_d_1, double *K_By_a_2, double *K_By_b_2, double *K_Hy_a_2,
				double *K_Hy_b_2, double *K_Hy_c_2, double *K_Hy_d_2, long nPML_x_1, 
				long nPML_y_1,  long nPML_z_1, long nPML_x_2, long nPML_y_2, long nPML_z_2,
				long nx, long ny, long nz, double dx, double dz, double dt)
{
	//permittivity of free space 
    double eps_0 = 8.8541878176203898505365630317107e-12; // [F/m]
	//permeability of free space 
    double mu_0  = 1.2566370614359172953850573533118e-6;  // [H/m]

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -