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

📄 init_thread_calc_data.cpp

📁 利用c++语言写的三维FDTD
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	double TwoOREp0 = 2*eps_0;
	double inv_TwoOREp0 = 1/TwoOREp0;
	double TwoOREp0DIVMu0 = TwoOREp0/mu_0;

	double inv_dx = 1.0/dx;
	double inv_dz = 1.0/dz;

	double dtDIVdx = dt/dx;
	double dtDIVdz = dt/dz;

	double TwoOREp0DIVMu0ORdtDIVdx = 2*eps_0/mu_0*dt/dx;
	double TwoOREp0DIVMu0ORdtDIVdz = 2*eps_0/mu_0*dt/dz;

	double inv_dxORmu_0 = 1.0/(dx*mu_0);
	double inv_dzORmu_0 = 1.0/(dz*mu_0);

	long nx_MIN_1 = nx - 1;
	long nz_MIN_1 = nz - 1;

	long ny_MIN_nPML_y_2 = ny - nPML_y_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 nx_MIN_1_MIN_nPML_x_2 = nx - 1 - nPML_x_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_Hy_PML[i].H = Hy;           
		Data_Hy_PML[i].E1 = Ex;          Data_Hy_PML[i].E2 = Ez; 
		Data_Hy_PML[i].Ind = Index;      Data_Hy_PML[i].mu_r = mu_r[i];
	}

	//set the particular elements
    Data_Hy_PML[0].B  = By_1;   Data_Hy_PML[1].B  = By_2;   Data_Hy_PML[2].B  = By_3;            
	Data_Hy_PML[3].B  = By_4;             	                Data_Hy_PML[5].B  = By_6;            
	Data_Hy_PML[6].B  = By_7;   Data_Hy_PML[7].B  = By_8;   Data_Hy_PML[8].B  = By_9;            
	
	Data_Hy_PML[9].B  = By_10;  Data_Hy_PML[10].B = By_11;  Data_Hy_PML[11].B = By_12;           
	Data_Hy_PML[14].B = By_16;  Data_Hy_PML[15].B = By_17; 	Data_Hy_PML[16].B = By_18;           

	Data_Hy_PML[17].B = By_19;  Data_Hy_PML[18].B = By_20;  Data_Hy_PML[19].B = By_21;           
	Data_Hy_PML[20].B = By_22;                              Data_Hy_PML[22].B = By_24;           
	Data_Hy_PML[23].B = By_25;  Data_Hy_PML[24].B = By_26;  Data_Hy_PML[25].B = By_27;           

	 //set coef_1 and coef_2
	for (i=0; i<26; i++) //first set for all:  
	{
		Data_Hy_PML[i].coef_1   = inv_dx;      Data_Hy_PML[i].coef_2   = inv_dz;
	}
	//then modify 
    Data_Hy_PML[9].coef_1   = dtDIVdx;       Data_Hy_PML[9].coef_2   = dtDIVdz;
	Data_Hy_PML[10].coef_1  = dtDIVdx;       Data_Hy_PML[10].coef_2  = dtDIVdz;
	Data_Hy_PML[11].coef_1  = dtDIVdx;       Data_Hy_PML[11].coef_2  = dtDIVdz;
	Data_Hy_PML[14].coef_1  = dtDIVdx;       Data_Hy_PML[14].coef_2  = dtDIVdz;
	Data_Hy_PML[15].coef_1  = dtDIVdx;       Data_Hy_PML[15].coef_2  = dtDIVdz;
	Data_Hy_PML[16].coef_1  = dtDIVdx;       Data_Hy_PML[16].coef_2  = dtDIVdz;
	Data_Hy_PML[12].coef_1  = TwoOREp0DIVMu0ORdtDIVdx;
	Data_Hy_PML[12].coef_2  = TwoOREp0DIVMu0ORdtDIVdz;
	Data_Hy_PML[13].coef_1  = TwoOREp0DIVMu0ORdtDIVdx;
	Data_Hy_PML[13].coef_2  = TwoOREp0DIVMu0ORdtDIVdz;
	Data_Hy_PML[4].coef_1   = inv_dxORmu_0;  Data_Hy_PML[4].coef_2   = inv_dzORmu_0;
	Data_Hy_PML[21].coef_1  = inv_dxORmu_0;  Data_Hy_PML[21].coef_2  = inv_dzORmu_0;
	
	//set cnst
	Data_Hy_PML[3].cnst  = TwoOREp0DIVMu0; Data_Hy_PML[5].cnst  = TwoOREp0DIVMu0;
	Data_Hy_PML[20].cnst = TwoOREp0DIVMu0; Data_Hy_PML[22].cnst = TwoOREp0DIVMu0;

	Data_Hy_PML[1].cnst  = inv_TwoOREp0;  Data_Hy_PML[7].cnst  = inv_TwoOREp0;
	Data_Hy_PML[10].cnst = inv_TwoOREp0;  Data_Hy_PML[15].cnst = inv_TwoOREp0;
	Data_Hy_PML[18].cnst = inv_TwoOREp0;  Data_Hy_PML[24].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_Hy_PML[ind].K_H_a = K_Hy_a_1;     Data_Hy_PML[ind].K_H_b = K_Hy_b_1; 
		Data_Hy_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_Hy_PML[ind].nx_1 = nPML_x_1;  
			Data_Hy_PML[ind].nx_2 = nx_MIN_1_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_Hy_PML[ind].K_H_a = K_Hy_a_2;               Data_Hy_PML[ind].K_H_b = K_Hy_b_2;
		Data_Hy_PML[ind].nx_1 = nx_MIN_1_MIN_nPML_x_2;   Data_Hy_PML[ind].nx_2 = nx_MIN_1;
		Data_Hy_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_Hy_PML[ind].K_H_c = K_Hy_c_1;     Data_Hy_PML[ind].K_H_d = K_Hy_d_1;
		Data_Hy_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_Hy_PML[ind].ny_1 = nPML_y_1;  
			Data_Hy_PML[ind].ny_2 = ny_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_Hy_PML[ind].K_H_c = K_Hy_c_2;     Data_Hy_PML[ind].K_H_d = K_Hy_d_2;
		Data_Hy_PML[ind].ny_1 = ny_MIN_nPML_y_2; 
		Data_Hy_PML[ind].ny_2 = ny;
		Data_Hy_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_Hy_PML[i].K_B_a = K_By_a_1;     Data_Hy_PML[i].K_B_b = K_By_b_1;
		Data_Hy_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_Hy_PML[i].nz_1 = nPML_z_1;    Data_Hy_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_Hy_PML[i].K_B_a = K_By_a_2;              Data_Hy_PML[i].K_B_b = K_By_b_2;
		Data_Hy_PML[i].nz_1 = nz_MIN_1_MIN_nPML_z_2;  Data_Hy_PML[i].nz_2 = nz_MIN_1;
		Data_Hy_PML[i].c_PML_z = nPML_z_2_MIN_1;
	}
}

////////////////////////////////////////////////////////////////////
//Init threads parameters in the PML zone -- Hz
////////////////////////////////////////////////////////////////////
void Init_Thread_Calc_PML_Hz(Data_H_comp_PML *Data_Hz_PML, 
				double ***Bz_1,   double ***Bz_2,   double ***Bz_3,   double ***Bz_4,  
			    double ***Bz_5,   double ***Bz_6,   double ***Bz_7,   double ***Bz_8, 
				double ***Bz_9,   double ***Bz_10,  double ***Bz_12,  double ***Bz_16, 
				double ***Bz_18,  double ***Bz_19,  double ***Bz_20,  double ***Bz_21,
				double ***Bz_22,  double ***Bz_23,  double ***Bz_24,  double ***Bz_25,
				double ***Bz_26,  double ***Bz_27,  double ***Hz,     double ***Ex,
				double ***Ey,     long ***Index,     double **mu_r,    double *K_Bz_a_1,
				double *K_Bz_b_1, double *K_Hz_a_1, double *K_Hz_b_1, double *K_Hz_c_1,
				double *K_Hz_d_1, double *K_Bz_a_2, double *K_Bz_b_2, double *K_Hz_a_2,
				double *K_Hz_b_2, double *K_Hz_c_2, double *K_Hz_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 dy, 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_dx = 1.0/dx;
	double inv_dy = 1.0/dy;

	double dtDIVdx = dt/dx;
	double dtDIVdy = dt/dy;

	double TwoOREp0DIVMu0ORdtDIVdx = 2*eps_0/mu_0*dt/dx;
	double TwoOREp0DIVMu0ORdtDIVdy = 2*eps_0/mu_0*dt/dy;

	double inv_dxORmu_0 = 1.0/(dx*mu_0);
	double inv_dyORmu_0 = 1.0/(dy*mu_0);

	long nx_MIN_1 = nx - 1;
	long ny_MIN_1 = ny - 1;

	long nz_MIN_nPML_z_2 = nz - nPML_z_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 nx_MIN_1_MIN_nPML_x_2 = nx - 1 - nPML_x_2;
	long ny_MIN_1_MIN_nPML_y_2 = ny - 1 - nPML_y_2;

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

	//set the particular elements
    Data_Hz_PML[0].B  = Bz_1;   Data_Hz_PML[1].B  = Bz_2;   Data_Hz_PML[2].B  = Bz_3;            
	Data_Hz_PML[3].B  = Bz_4;   Data_Hz_PML[4].B  = Bz_5;   Data_Hz_PML[5].B  = Bz_6;            
	Data_Hz_PML[6].B  = Bz_7;   Data_Hz_PML[7].B  = Bz_8;   Data_Hz_PML[8].B  = Bz_9;            
	
	Data_Hz_PML[9].B  = Bz_10;                              Data_Hz_PML[11].B = Bz_12;           
	Data_Hz_PML[14].B = Bz_16;                              Data_Hz_PML[16].B = Bz_18;           

	Data_Hz_PML[17].B = Bz_19;  Data_Hz_PML[18].B = Bz_20;  Data_Hz_PML[19].B = Bz_21;           
	Data_Hz_PML[20].B = Bz_22;  Data_Hz_PML[21].B = Bz_23;  Data_Hz_PML[22].B = Bz_24;           
	Data_Hz_PML[23].B = Bz_25;  Data_Hz_PML[24].B = Bz_26;  Data_Hz_PML[25].B = Bz_27;           

    //set coef_1 and coef_2
	for (i=0; i<26; i++) //first set for all:  
	{
		Data_Hz_PML[i].coef_1   = inv_dx;      Data_Hz_PML[i].coef_2   = inv_dy;
	}
	//then modify 
    Data_Hz_PML[1].coef_1   = dtDIVdx;       Data_Hz_PML[1].coef_2   = dtDIVdy;
	Data_Hz_PML[4].coef_1   = dtDIVdx;       Data_Hz_PML[4].coef_2   = dtDIVdy;
	Data_Hz_PML[7].coef_1   = dtDIVdx;       Data_Hz_PML[7].coef_2   = dtDIVdy;
	Data_Hz_PML[18].coef_1  = dtDIVdx;       Data_Hz_PML[18].coef_2  = dtDIVdy;
	Data_Hz_PML[21].coef_1  = dtDIVdx;       Data_Hz_PML[21].coef_2  = dtDIVdy;
	Data_Hz_PML[24].coef_1  = dtDIVdx;       Data_Hz_PML[24].coef_2  = dtDIVdy;
	Data_Hz_PML[10].coef_1  = TwoOREp0DIVMu0ORdtDIVdx;
	Data_Hz_PML[10].coef_2  = TwoOREp0DIVMu0ORdtDIVdy;
	Data_Hz_PML[15].coef_1  = TwoOREp0DIVMu0ORdtDIVdx;
	Data_Hz_PML[15].coef_2  = TwoOREp0DIVMu0ORdtDIVdy;
	Data_Hz_PML[12].coef_1  = inv_dxORmu_0;  Data_Hz_PML[12].coef_2  = inv_dyORmu_0;
	Data_Hz_PML[13].coef_1  = inv_dxORmu_0;  Data_Hz_PML[13].coef_2  = inv_dyORmu_0;
	
	//set cnst
	Data_Hz_PML[9].cnst  = TwoOREp0DIVMu0; Data_Hz_PML[11].cnst = TwoOREp0DIVMu0;
	Data_Hz_PML[14].cnst = TwoOREp0DIVMu0; Data_Hz_PML[16].cnst = TwoOREp0DIVMu0;

	Data_Hz_PML[3].cnst  = inv_TwoOREp0;  Data_Hz_PML[4].cnst  = inv_TwoOREp0;
	Data_Hz_PML[5].cnst  = inv_TwoOREp0;  Data_Hz_PML[20].cnst = inv_TwoOREp0;
	Data_Hz_PML[21].cnst = inv_TwoOREp0;  Data_Hz_PML[22].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_Hz_PML[ind].K_B_a = K_Bz_a_1;     Data_Hz_PML[ind].K_B_b = K_Bz_b_1; 
		Data_Hz_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)
		{

⌨️ 快捷键说明

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