📄 fdtd_3d_xyzpml_threads_decomp.cpp
字号:
pthread_t thread_FGE_x;
pthread_t thread_FGE_y;
pthread_t thread_FGE_z;
pthread_t thread_BH_x;
pthread_t thread_BH_y;
pthread_t thread_BH_z;
pthread_attr_t attr;
pthread_attr_init(&attr);
Allocate_E_comp *Allocate_FGE_x = NULL;
Allocate_E_comp *Allocate_FGE_y = NULL;
Allocate_E_comp *Allocate_FGE_z = NULL;
Allocate_H_comp *Allocate_BH_x = NULL;
Allocate_H_comp *Allocate_BH_y = NULL;
Allocate_H_comp *Allocate_BH_z = NULL;
Allocate_FGE_x = (Allocate_E_comp*)malloc(sizeof(Allocate_E_comp));
Allocate_FGE_y = (Allocate_E_comp*)malloc(sizeof(Allocate_E_comp));
Allocate_FGE_z = (Allocate_E_comp*)malloc(sizeof(Allocate_E_comp));
Allocate_BH_x = (Allocate_H_comp*)malloc(sizeof(Allocate_H_comp));
Allocate_BH_y = (Allocate_H_comp*)malloc(sizeof(Allocate_H_comp));
Allocate_BH_z = (Allocate_H_comp*)malloc(sizeof(Allocate_H_comp));
if (!Allocate_FGE_x && !Allocate_FGE_y && !Allocate_FGE_z && !Allocate_BH_x &&
!Allocate_BH_y && !Allocate_BH_z)
{
cout << "memory allocation problem - Allocate_FGE_BH" << endl;
exit(-1);
}
//Allocate memory - Fx Gx Ex
Init_Alloc_FxGxEx(Allocate_FGE_x, Fx_1, Gx_1, Fx_2, Gx_2, Fx_3, Gx_3, Fx_4, Fx_5, Fx_6,
Fx_7, Gx_7, Fx_8, Gx_8, Fx_9, Gx_9, Fx_10, Gx_10, Fx_11, Fx_12, Gx_12,
Fx_13, Fx_15, Fx_16, Gx_16, Fx_17, Fx_18, Gx_18, Fx_19, Gx_19, Fx_20,
Gx_20, Fx_21, Gx_21, Fx_22, Fx_23, Fx_24, Fx_25, Gx_25, Fx_26, Gx_26,
Fx_27, Gx_27, Ex, nPML_x_1, nPML_y_1, nPML_z_1, nPML_x_2, nPML_y_2,
nPML_z_2, nx, ny, nz);
rc = pthread_create(&thread_FGE_x, &attr, Thread_Alloc_FGE, (void *)Allocate_FGE_x);
if (rc)
{
cout << "thread creation problem - thread_FGE_x" << endl;
exit(-1);
}
//Allocate memory - Fy, Gy, Ey
Init_Alloc_FyGyEy(Allocate_FGE_y, Fy_1, Gy_1, Fy_2, Gy_2, Fy_3, Gy_3, Fy_4, Gy_4, Fy_5,
Fy_6, Gy_6, Fy_7, Gy_7, Fy_8, Gy_8, Fy_9, Gy_9, Fy_10, Fy_11, Fy_12,
Fy_13, Fy_15, Fy_16, Fy_17, Fy_18, Fy_19, Gy_19, Fy_20, Gy_20, Fy_21,
Gy_21, Fy_22, Gy_22, Fy_23, Fy_24, Gy_24, Fy_25, Gy_25, Fy_26, Gy_26,
Fy_27, Gy_27, Ey, nPML_x_1, nPML_y_1, nPML_z_1, nPML_x_2, nPML_y_2,
nPML_z_2, nx, ny, nz);
rc = pthread_create(&thread_FGE_y, &attr, Thread_Alloc_FGE, (void *)Allocate_FGE_y);
if (rc)
{
cout << "thread creation problem - thread_FGE_y" << endl;
exit(-1);
}
//Allocate memory - Fz, Gz, Ez
Init_Alloc_FzGzEz(Allocate_FGE_z, Fz_1, Gz_1, Fz_2, Fz_3, Gz_3, Fz_4, Gz_4, Fz_5, Fz_6,
Gz_6, Fz_7, Gz_7, Fz_8, Fz_9, Gz_9, Fz_10, Gz_10, Fz_11, Fz_12, Gz_12,
Fz_13, Fz_15, Fz_16, Gz_16, Fz_17, Fz_18, Gz_18, Fz_19, Gz_19, Fz_20,
Fz_21, Gz_21, Fz_22, Gz_22, Fz_23, Fz_24, Gz_24, Fz_25, Gz_25, Fz_26,
Fz_27, Gz_27, Ez, nPML_x_1, nPML_y_1, nPML_z_1, nPML_x_2, nPML_y_2,
nPML_z_2, nx, ny, nz);
rc = pthread_create(&thread_FGE_z, &attr, Thread_Alloc_FGE, (void *)Allocate_FGE_z);
if (rc)
{
cout << "thread creation problem - thread_FGE_z" << endl;
exit(-1);
}
//Allocate memory - Bx, Hx
Init_Alloc_BxHx(Allocate_BH_x, Bx_1, Bx_2, Bx_3, Bx_4, Bx_6, Bx_7, Bx_8, Bx_9, Bx_10,
Bx_12, Bx_13, Bx_15, Bx_16, Bx_18, Bx_19, Bx_20, Bx_21, Bx_22, Bx_24,
Bx_25, Bx_26, Bx_27, Hx, nPML_x_1, nPML_y_1, nPML_z_1, nPML_x_2,
nPML_y_2, nPML_z_2, nx, ny, nz);
rc = pthread_create(&thread_BH_x, &attr, Thread_Alloc_BH, (void *)Allocate_BH_x);
if (rc)
{
cout << "thread creation problem - thread_BH_x" << endl;
exit(-1);
}
//Allocate memory - By, Hy
Init_Alloc_ByHy(Allocate_BH_y, By_1, By_2, By_3, By_4, By_6, By_7, By_8, By_9, By_10,
By_11, By_12, By_16, By_17, By_18, By_19, By_20, By_21, By_22, By_24,
By_25, By_26, By_27, Hy, nPML_x_1, nPML_y_1, nPML_z_1, nPML_x_2,
nPML_y_2, nPML_z_2, nx, ny, nz);
rc = pthread_create(&thread_BH_y, &attr, Thread_Alloc_BH, (void *)Allocate_BH_y);
if (rc)
{
cout << "thread creation problem - thread_BH_y" << endl;
exit(-1);
}
//Allocate memory - Bz, Hz
Init_Alloc_BzHz(Allocate_BH_z, Bz_1, Bz_2, Bz_3, Bz_4, Bz_5, Bz_6, Bz_7, Bz_8, Bz_9,
Bz_10, Bz_12, Bz_16, Bz_18, Bz_19, Bz_20, Bz_21, Bz_22, Bz_23, Bz_24,
Bz_25, Bz_26, Bz_27, Hz, nPML_x_1, nPML_y_1, nPML_z_1, nPML_x_2,
nPML_y_2, nPML_z_2, nx, ny, nz);
rc = pthread_create(&thread_BH_z, &attr, Thread_Alloc_BH, (void *)Allocate_BH_z);
if (rc)
{
cout << "thread creation problem - thread_BH_z" << endl;
exit(-1);
}
///////////////////////////////////////////////////////////////////////////////////////
//end parallel memory allocation region
///////////////////////////////////////////////////////////////////////////////////////
//allocates memory for coefficients containing the PML parameters in Ex
er_PML_Ex = Alloc_PML_Ex(&K_Gx_a_1, &K_Gx_b_1, &K_Ex_a_1, &K_Ex_b_1, &K_Ex_c_1,
&K_Ex_d_1, &K_Gx_a_2, &K_Gx_b_2, &K_Ex_a_2, &K_Ex_b_2,
&K_Ex_c_2, &K_Ex_d_2, nPML_x_1, nPML_y_1, nPML_z_1,
nPML_x_2, nPML_y_2, nPML_z_2);
//allocates memory for coefficients containing the PML parameters in Ey
er_PML_Ey = Alloc_PML_Ey(&K_Gy_a_1, &K_Gy_b_1, &K_Ey_a_1, &K_Ey_b_1, &K_Ey_c_1,
&K_Ey_d_1, &K_Gy_a_2, &K_Gy_b_2, &K_Ey_a_2, &K_Ey_b_2,
&K_Ey_c_2, &K_Ey_d_2, nPML_x_1, nPML_y_1, nPML_z_1,
nPML_x_2, nPML_y_2, nPML_z_2);
//allocates memory for coefficients containing the PML parameters in Ez
er_PML_Ez = Alloc_PML_Ez(&K_Gz_a_1, &K_Gz_b_1, &K_Ez_a_1, &K_Ez_b_1, &K_Ez_c_1,
&K_Ez_d_1, &K_Gz_a_2, &K_Gz_b_2, &K_Ez_a_2, &K_Ez_b_2,
&K_Ez_c_2, &K_Ez_d_2, nPML_x_1, nPML_y_1, nPML_z_1,
nPML_x_2, nPML_y_2, nPML_z_2);
//allocates memory for coefficients containing the PML parameters in Hx
er_PML_Hx = Alloc_PML_Hx(&K_Bx_a_1, &K_Bx_b_1, &K_Hx_a_1, &K_Hx_b_1, &K_Hx_c_1,
&K_Hx_d_1, &K_Bx_a_2, &K_Bx_b_2, &K_Hx_a_2, &K_Hx_b_2,
&K_Hx_c_2, &K_Hx_d_2, nPML_x_1, nPML_y_1, nPML_z_1,
nPML_x_2, nPML_y_2, nPML_z_2);
//allocates memory for coefficients containing the PML parameters in Hy
er_PML_Hy = Alloc_PML_Hy(&K_By_a_1, &K_By_b_1, &K_Hy_a_1, &K_Hy_b_1, &K_Hy_c_1,
&K_Hy_d_1, &K_By_a_2, &K_By_b_2, &K_Hy_a_2, &K_Hy_b_2,
&K_Hy_c_2, &K_Hy_d_2, nPML_x_1, nPML_y_1, nPML_z_1,
nPML_x_2, nPML_y_2, nPML_z_2);
//allocates memory for coefficients containing the PML parameters in Hz
er_PML_Hz = Alloc_PML_Hz(&K_Bz_a_1, &K_Bz_b_1, &K_Hz_a_1, &K_Hz_b_1, &K_Hz_c_1,
&K_Hz_d_1, &K_Bz_a_2, &K_Bz_b_2, &K_Hz_a_2, &K_Hz_b_2,
&K_Hz_c_2, &K_Hz_d_2, nPML_x_1, nPML_y_1, nPML_z_1,
nPML_x_2, nPML_y_2, nPML_z_2);
//allocates memory for coefficients containing the material parameters
K_a = (double *)calloc(n_Mat,sizeof(double));
K_b = (double *)calloc(n_Mat,sizeof(double));
K_a_thread = Init_Matrix_2D<double>(nr_Threads,n_Mat);
K_b_thread = Init_Matrix_2D<double>(nr_Threads,n_Mat);
mu_thread = Init_Matrix_2D<double>(nr_Threads,n_Mat);
Path =(char *) calloc(256,sizeof(char));
Path_Data =(char *) calloc(256,sizeof(char));
path_name_E_1D = (char *) calloc(256,sizeof(char));
path_name_Ex = (char *) calloc(256,sizeof(char));
path_name_Ey = (char *) calloc(256,sizeof(char));
path_name_Ez = (char *) calloc(256,sizeof(char));
path_name_Hx = (char *) calloc(256,sizeof(char));
path_name_Hy = (char *) calloc(256,sizeof(char));
path_name_Hz = (char *) calloc(256,sizeof(char));
Ex_Foll = Init_Matrix_2D<double>(n_Ind_F,num_iter);
Ey_Foll = Init_Matrix_2D<double>(n_Ind_F,num_iter);
Ez_Foll = Init_Matrix_2D<double>(n_Ind_F,num_iter);
Hx_Foll = Init_Matrix_2D<double>(n_Ind_F,num_iter);
Hy_Foll = Init_Matrix_2D<double>(n_Ind_F,num_iter);
Hz_Foll = Init_Matrix_2D<double>(n_Ind_F,num_iter);
if (Inp_D->aver_field_volume == 1)
{
//E_Foll_av = (double *)calloc(num_iter,sizeof(double));
Ex_Foll_av = (double *)calloc(num_iter,sizeof(double));
Ey_Foll_av = (double *)calloc(num_iter,sizeof(double));
Ez_Foll_av = (double *)calloc(num_iter,sizeof(double));
Hx_Foll_av = (double *)calloc(num_iter,sizeof(double));
Hy_Foll_av = (double *)calloc(num_iter,sizeof(double));
Hz_Foll_av = (double *)calloc(num_iter,sizeof(double));
}
if (Inp_D->aver_field_volume_WignerUC == 1)
{
Ex_Foll_av_WignerC = (double *)calloc(num_iter,sizeof(double));
Ey_Foll_av_WignerC = (double *)calloc(num_iter,sizeof(double));
Ez_Foll_av_WignerC = (double *)calloc(num_iter,sizeof(double));
Hx_Foll_av_WignerC = (double *)calloc(num_iter,sizeof(double));
Hy_Foll_av_WignerC = (double *)calloc(num_iter,sizeof(double));
Hz_Foll_av_WignerC = (double *)calloc(num_iter,sizeof(double));
}
if(Inp_D->aver_Bragg_WignerUC)
{
Ex_Br_av_re = Init_Matrix_2D<double>(n_Gxyz,num_iter);
Ex_Br_av_im = Init_Matrix_2D<double>(n_Gxyz,num_iter);
Ey_Br_av_re = Init_Matrix_2D<double>(n_Gxyz,num_iter);
Ey_Br_av_im = Init_Matrix_2D<double>(n_Gxyz,num_iter);
Ez_Br_av_re = Init_Matrix_2D<double>(n_Gxyz,num_iter);
Ez_Br_av_im = Init_Matrix_2D<double>(n_Gxyz,num_iter);
Hx_Br_av_re = Init_Matrix_2D<double>(n_Gxyz,num_iter);
Hx_Br_av_im = Init_Matrix_2D<double>(n_Gxyz,num_iter);
Hy_Br_av_re = Init_Matrix_2D<double>(n_Gxyz,num_iter);
Hy_Br_av_im = Init_Matrix_2D<double>(n_Gxyz,num_iter);
Hz_Br_av_re = Init_Matrix_2D<double>(n_Gxyz,num_iter);
Hz_Br_av_im = Init_Matrix_2D<double>(n_Gxyz,num_iter);
}
if(Inp_D->fourier_transf_vol == 1)
{
Ex_fourier_TR_re = Init_Matrix_2D<double>(n_f_Points,n_frec);
Ex_fourier_TR_im = Init_Matrix_2D<double>(n_f_Points,n_frec);
Ey_fourier_TR_re = Init_Matrix_2D<double>(n_f_Points,n_frec);
Ey_fourier_TR_im = Init_Matrix_2D<double>(n_f_Points,n_frec);
Ez_fourier_TR_re = Init_Matrix_2D<double>(n_f_Points,n_frec);
Ez_fourier_TR_im = Init_Matrix_2D<double>(n_f_Points,n_frec);
Hx_fourier_TR_re = Init_Matrix_2D<double>(n_f_Points,n_frec);
Hx_fourier_TR_im = Init_Matrix_2D<double>(n_f_Points,n_frec);
Hy_fourier_TR_re = Init_Matrix_2D<double>(n_f_Points,n_frec);
Hy_fourier_TR_im = Init_Matrix_2D<double>(n_f_Points,n_frec);
Hz_fourier_TR_re = Init_Matrix_2D<double>(n_f_Points,n_frec);
Hz_fourier_TR_im = Init_Matrix_2D<double>(n_f_Points,n_frec);
fourier_omega = (double *) calloc(n_frec,sizeof(double));
}
//Contains the id of the created threads
//for field calculation
field_threads = (pthread_t *)calloc(nr_Threads,sizeof(pthread_t));
//pass the data to threads
Data_Ex_PML = (Data_E_comp_PML *)calloc( 26,sizeof(Data_E_comp_PML) );
Data_Ex = (Data_E_comp *)calloc( nr_DIV_xORyORz,sizeof(Data_E_comp));
Data_Ey_PML = (Data_E_comp_PML *)calloc( 26,sizeof(Data_E_comp_PML) );
Data_Ey = (Data_E_comp *)calloc( nr_DIV_xORyORz,sizeof(Data_E_comp));
Data_Ez_PML = (Data_E_comp_PML *)calloc( 26,sizeof(Data_E_comp_PML) );
Data_Ez = (Data_E_comp *)calloc( nr_DIV_xORyORz,sizeof(Data_E_comp));
Data_Hx_PML = (Data_H_comp_PML *)calloc( 26,sizeof(Data_H_comp_PML) );
Data_Hx = (Data_H_comp *)calloc( nr_DIV_xORyORz,sizeof(Data_H_comp));
Data_Hy_PML = (Data_H_comp_PML *)calloc( 26,sizeof(Data_H_comp_PML) );
Data_Hy = (Data_H_comp *)calloc( nr_DIV_xORyORz,sizeof(Data_H_comp));
Data_Hz_PML = (Data_H_comp_PML *)calloc( 26,sizeof(Data_H_comp_PML) );
Data_Hz = (Data_H_comp *)calloc( nr_DIV_xORyORz,sizeof(Data_H_comp));
bool jel_alloc_W = true;
#ifdef eval_W
W = (double ***)Init_Matrix_3D<double>(nx_W,ny_W,nz_W);
W_aver = (double *)calloc(n_W_atl,sizeof(double));
W_aver_xz = (double *)calloc(ny_W,sizeof(double));
W_aver_xzt = (double *)calloc(ny_W,sizeof(double));
eval_W_thread = (pthread_t *)calloc(nr_Threads_W,sizeof(pthread_t));
Data_W = (Data_En *)calloc( nr_Threads_W,sizeof(Data_En));
local_W_aver = (double *)calloc(nr_Threads_W,sizeof(double));
path_name_W = (char *) calloc(256,sizeof(char));
if (save_W)
{
data_save_threads_W_xy = (pthread_t *)calloc(Save_nr_W_DIV_xORy,sizeof(pthread_t));
data_save_threads_W_yz = (pthread_t *)calloc(Save_nr_W_DIV_yORz,sizeof(pthread_t));
data_save_threads_W_xz = (pthread_t *)calloc(Save_nr_W_DIV_xORz,sizeof(pthread_t));
//xy - slice
Save_W_xy = (Data_Save_Slice *)calloc(Save_nr_W_DIV_xORy, sizeof(Data_Save_Slice) );
//xy - slice
Save_W_yz = (Data_Save_Slice *)calloc(Save_nr_W_DIV_yORz, sizeof(Data_Save_Slice) );
//xz - slice
Save_W_xz = (Data_Save_Slice *)calloc(Save_nr_W_DIV_xORz, sizeof(Data_Save_Slice) );
}
if (!W && !W_aver && !eval_W_thread && !Data_W && !local_W_aver && !path_name_W &&
!W_aver_xz && !W_aver_xzt &&
(!save_W || (!data_save_threads_W_xy && !data_save_threads_W_yz &&
!data_save_threads_W_xz && !Save_W_xy && !Save_W_yz && !Save_W_xz)))
{
jel_alloc_W = false;
}
#endif
//for data save
if (save_field)
{
//xy - slice
data_save_threads_Ex_xy = (pthread_t *)calloc(Save_nr_DIV_xORy,sizeof(pthread_t));
data_save_threads_Ey_xy = (pthread_t *)calloc(Save_nr_DIV_xORy,sizeof(pthread_t));
data_save_threads_Ez_xy = (pthread_t *)calloc(Save_nr_DIV_xORy,sizeof(pthread_t));
data_save_threads_Hx_xy = (pthread_t *)calloc(Save_nr_DIV_xORy,sizeof(pthread_t));
data_save_threads_Hy_xy = (pthread_t *)calloc(Save_nr_DIV_xORy,sizeof(pthread_t));
data_save_threads_Hz_xy = (pthread_t *)calloc(Save_nr_DIV_xORy,sizeof(pthread_t));
//yz - slice
data_save_threads_Ex_yz = (pthread_t *)calloc(Save_nr_DIV_xORy,sizeof(pthread_t));
data_save_threads_Ey_yz = (pthread_t *)calloc(Save_nr_DIV_xORy,sizeof(pthread_t));
data_save_threads_Ez_yz = (pthread_t *)calloc(Save_nr_DIV_xORy,sizeof(pthread_t));
data_save_threads_Hx_yz = (pthread_t *)calloc(Save_nr_DIV_xORy,sizeof(pthread_t));
data_save_threads_Hy_yz = (pthread_t *)calloc(Save_nr_DIV_xORy,sizeof(pthread_t));
data_save_threads_Hz_yz = (pthread_t *)calloc(Save_nr_DIV_xORy,sizeof(pthread_t));
//xz - slice
data_save_threads_Ex_xz = (pthread_t *)calloc(Save_nr_DIV_xORy,sizeof(pthread_t));
data_save_threads_Ey_xz = (pthread_t *)calloc(Save_nr_DIV_xORy,sizeof(pthread_t));
data_save_threads_Ez_xz = (pthread_t *)calloc(Save_nr_DIV_xORy,sizeof(pthread_t));
data_save_threads_Hx_xz = (pthread_t *)calloc(Save_nr_DIV_xORy,sizeof(pthread_t));
data_save_threads_Hy_xz = (pthread_t *)calloc(Save_nr_DIV_xORy,sizeof(pthread_t));
data_save_threads_Hz_xz = (pthread_t *)calloc(Save_nr_DIV_xORy,sizeof(pthread_t));
//used to pass parameters to Data save threads
//xy - slice
Save_Ex_xy = (Data_Save_Slice *)calloc(Save_nr_DIV_xORy, sizeof(Data_Save_Slice) );
Save_Ey_xy = (Data_Save_Slice *)calloc(Save_nr_DIV_xORy, sizeof(Data_Save_Slice) );
Save_Ez_xy = (Data_Save_Slice *)calloc(Save_nr_DIV_xORy, sizeof(Data_Save_Slice) );
Save_Hx_xy = (Data_Save_Slice *)calloc(Save_nr_DIV_xORy, sizeof(Data_Save_Slice) );
Save_Hy_xy = (Data_Save_Slice *)calloc(Save_nr_DIV_xORy, sizeof(Data_Save_Slice) );
Save_Hz_xy = (Data_Save_Slice *)calloc(Save_nr_DIV_xORy, sizeof(Data_Save_Slice) );
//xy - slice
Save_Ex_yz = (Data_Save_Slice *)calloc(Save_nr_DIV_yORz, sizeof(Data_Save_Slice) );
Save_Ey_yz = (Data_Save_Slice *)calloc(Save_nr_DIV_yORz, sizeof(Data_Save_Slice) );
Save_Ez_yz = (Data_Save_Slice *)calloc(Save_nr_DIV_yORz, sizeof(Data_Save_Slice) );
Save_Hx_yz = (Data_Save_Slice *)calloc(Save_nr_DIV_yORz, sizeof(Data_Save_Slice) );
Save_Hy_yz = (Data_Save_Slice *)calloc(Save_nr_DIV_yORz, sizeof(Data_Save_Slice) );
Save_Hz_yz = (Data_Save_Slice *)calloc(Save_nr_DIV_yORz, sizeof(Data_Save_Slice) );
//xz - slice
Save_Ex_xz = (Data_Save_Slice *)calloc(Save_nr_DIV_xORz, sizeof(Data_Save_Slice) );
Save_Ey_xz = (Data_Save_Slice *)calloc(Save_nr_DIV_xORz, sizeof(Data_Save_Slice) );
Save_Ez_xz = (Data_Save_Slice *)calloc(Save_nr_DIV_xORz, sizeof(Data_Save_Slice) );
Save_Hx_xz = (Data_Save_Slice *)calloc(Save_nr_DIV_xORz, sizeof(Data_Save_Slice) );
Save_Hy_xz = (Data_Save_Slice *)calloc(Save_nr_DIV_xORz, sizeof(Data_Save_Slice) );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -