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

📄 fdtd_3d_xyzpml_threads_decomp.cpp

📁 利用c++语言写的三维FDTD
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		Save_Hz_xz = (Data_Save_Slice *)calloc(Save_nr_DIV_xORz, sizeof(Data_Save_Slice) );
	}

	if (jel_plane_wave == 1)
	{
		n_1D = (int) (l_x*abs(sin_teta)*abs(cos_phi) + 
		              l_y*abs(sin_teta)*abs(sin_phi) + l_z*abs(cos_teta) ) +
				      10 + 2*n_PML_1D;
		n_1D_MIN_1 = n_1D - 1;
	
	    d_1D = dx*sin_teta*sin_teta*cos_phi*cos_phi + dy*sin_teta*sin_teta*sin_phi*sin_phi +
	           dz*cos_teta*cos_teta;

		er_TS = Init_TS_Param(&ll_1D_E, &ll_1D_H, 
			                  &Hz_i0, &Hy_i0, &Hz_i1, &Hy_i1, &Hz_j0, &Hx_j0, &Hz_j1, 
							  &Hx_j1, &Hy_k0, &Hx_k0, &Hy_k1, &Hx_k1, 
							  &face_Hz_i0, &face_Hy_i0, &face_Hz_i1, &face_Hy_i1, 
							  &face_Hz_j0, &face_Hx_j0, &face_Hz_j1, &face_Hx_j1,
							  &face_Hy_k0, &face_Hx_k0, &face_Hy_k1, &face_Hx_k1,
				              &Ey_i0, &Ez_i0, &Ey_i1, &Ez_i1, &Ex_j0, &Ez_j0, &Ex_j1,
							  &Ez_j1, &Ex_k0, &Ey_k0, &Ex_k1, &Ey_k1,
				              &face_Ey_i0, &face_Ez_i0, &face_Ey_i1, &face_Ez_i1,
				              &face_Ex_j0, &face_Ez_j0, &face_Ex_j1, &face_Ez_j1,
				              &face_Ex_k0, &face_Ey_k0, &face_Ex_k1, &face_Ey_k1,
				              n_1D, l_x, l_y, l_z, n_PML_1D, teta, phi, gamma, 
							  dx, dy, dz, d_1D, dt, 
				              ct_Ex_1, ct_Ex_2, ct_Ey_1, ct_Ey_2, ct_Ez_1, ct_Ez_2, 
							  ct_Hx_1, ct_Hx_2, ct_Hy_1, ct_Hy_2, ct_Hz_1, ct_Hz_2);
	}

	//Join the memory allocation threads
	pthread_join(thread_FGE_x,NULL);
	pthread_join(thread_FGE_y,NULL);
	pthread_join(thread_FGE_z,NULL);
	pthread_join(thread_BH_x,NULL);
	pthread_join(thread_BH_y,NULL);
	pthread_join(thread_BH_z,NULL);
	
	//clear up the memory and exit if the memory allocation is unsuccesfull
	if ( !(Allocate_FGE_x->er && Allocate_FGE_y->er && Allocate_FGE_z->er && 
		   Allocate_BH_x->er && Allocate_BH_y->er && Allocate_BH_z->er && er_PML_Ex 
		   && er_PML_Ey && er_PML_Ez && er_PML_Hx && er_PML_Hy && er_PML_Hz) 
		   && !K_a && !K_b && !Path && !Path_Data && !path_name_E_1D && 
		   !path_name_Ex && !path_name_Ey && !path_name_Ez && !path_name_Hx && 
		   !path_name_Hy && !path_name_Hz && !Ex_Foll && !Ey_Foll && !Ez_Foll && 
		   !Hx_Foll && !Hy_Foll && !Hz_Foll && !field_threads && !Data_Ex_PML &&
		   !Data_Ex && !Data_Ey_PML && !Data_Ey && !Data_Ez_PML && !Data_Ez &&
		   !K_a_thread && !K_b_thread && !mu_thread && (!data_save_threads_Ex_xy &&
		   !data_save_threads_Ey_xy && !data_save_threads_Ez_xy && 
		   !data_save_threads_Hx_xy && !data_save_threads_Hy_xy && 
		   !data_save_threads_Hz_xy && !data_save_threads_Ex_yz &&
		   !data_save_threads_Ey_yz && !data_save_threads_Ez_yz && 
		   !data_save_threads_Hx_yz && !data_save_threads_Hy_yz && 
		   !data_save_threads_Hz_yz && !data_save_threads_Ex_xz &&
		   !data_save_threads_Ey_xz && !data_save_threads_Ez_xz && 
		   !data_save_threads_Hx_xz && !data_save_threads_Hy_xz && 
		   !data_save_threads_Hz_xz && !Save_Ex_xy && !Save_Ey_xy && 
		   !Save_Ez_xy && !Save_Hx_xy && !Save_Hy_xy && !Save_Hz_xy &&
		   !Save_Ex_yz && !Save_Ey_yz && !Save_Ez_yz && !Save_Hx_yz && 
		   !Save_Hy_yz && !Save_Hz_yz && !Save_Ex_xz && !Save_Ey_xz && 
		   !Save_Ez_xz && !Save_Hx_xz && !Save_Hy_xz && !Save_Hz_xz ||
		   !save_field) && jel_alloc_W || er_TS)
	{
		Free_FxGxEx(&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_x_2, nx);
	
		Free_FyGyEy(&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_x_2, nx);

		Free_FzGzEz(&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_x_2, nx);

		Free_BxHx(&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_x_2, nx);

		Free_ByHy(&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_x_2, nx);

		Free_BzHz(&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_x_2, nx);

		Free_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_x_2);

		Free_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_x_2);

		Free_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_x_2);

		Free_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_x_2);

		Free_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_x_2);

		Free_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_x_2);

		Free_K_a_K_b(&K_a, &K_b);

        Free_path_name(&Path, &Path_Data, &path_name_E_1D, &path_name_Ex, 
			           &path_name_Ey, &path_name_Ez, &path_name_Hx, &path_name_Hy, 
					   &path_name_Hz);

        Free_Foll(&Ex_Foll, &Ey_Foll, &Ez_Foll, &Hx_Foll, &Hy_Foll, &Hz_Foll);

		Free_Threads_Param(&field_threads, &Data_Ex_PML, &Data_Ex, &Data_Ey_PML,
						   &Data_Ey, &Data_Ez_PML, &Data_Ez, &Data_Hx_PML, &Data_Hx, 
						   &Data_Hy_PML, &Data_Hy, &Data_Hz_PML, &Data_Hz, &K_a_thread, 
						   &K_b_thread, &mu_thread);

		Free_Data_SaveThreads_Param(&data_save_threads_Ex_xy, &data_save_threads_Ey_xy,
	                                &data_save_threads_Ez_xy, &data_save_threads_Hx_xy,
									&data_save_threads_Hy_xy, &data_save_threads_Hz_xy,
									&data_save_threads_Ex_yz, &data_save_threads_Ey_yz,
									&data_save_threads_Ez_yz, &data_save_threads_Hx_yz,
									&data_save_threads_Hy_yz, &data_save_threads_Hz_yz,
									&data_save_threads_Ex_xz, &data_save_threads_Ey_xz,
									&data_save_threads_Ez_xz, &data_save_threads_Hx_xz,
									&data_save_threads_Hy_xz, &data_save_threads_Hz_xz,
									&Save_Ex_xy, &Save_Ey_xy, &Save_Ez_xy, 
									&Save_Hx_xy, &Save_Hy_xy, &Save_Hz_xy,
									&Save_Ex_yz, &Save_Ey_yz, &Save_Ez_yz, 
									&Save_Hx_yz, &Save_Hy_yz, &Save_Hz_yz,
									&Save_Ex_xz, &Save_Ey_xz, &Save_Ez_xz, 
									&Save_Hx_xz, &Save_Hy_xz, &Save_Hz_xz);


		#ifdef eval_W
			Free_W_Param(&W, &W_aver, &W_aver_xz, &W_aver_xzt, &eval_W_thread, &Data_W,
				         &local_W_aver, &path_name_W,nx_W);
		#endif

		Free_TS_Param(&ll_1D_E, &ll_1D_H, 
		              &Hz_i0, &Hy_i0, &Hz_i1, &Hy_i1, &Hz_j0, &Hx_j0, &Hz_j1, 
					  &Hx_j1, &Hy_k0, &Hx_k0, &Hy_k1, &Hx_k1, 
					  &face_Hz_i0, &face_Hy_i0, &face_Hz_i1, &face_Hy_i1, 
					  &face_Hz_j0, &face_Hx_j0, &face_Hz_j1, &face_Hx_j1,
					  &face_Hy_k0, &face_Hx_k0, &face_Hy_k1, &face_Hx_k1,
				      &Ey_i0, &Ez_i0, &Ey_i1, &Ez_i1, &Ex_j0, &Ez_j0, &Ex_j1,
					  &Ez_j1, &Ex_k0, &Ey_k0, &Ex_k1, &Ey_k1,
				      &face_Ey_i0, &face_Ez_i0, &face_Ey_i1, &face_Ez_i1,
				      &face_Ex_j0, &face_Ez_j0, &face_Ex_j1, &face_Ez_j1,
				      &face_Ex_k0, &face_Ey_k0, &face_Ex_k1, &face_Ey_k1);

		cout << "Memory allocation problem FDTD parameters." << endl;
		return -1;
	}
	///////////////////////////////////////////////////////////////////////////////////////
	//End main memory allocatin region
	///////////////////////////////////////////////////////////////////////////////////////
	
	///////////////////////////////////////////////////////////////////////////////////////
	//Initialize K_a and K_b - the contribution of materials
	///////////////////////////////////////////////////////////////////////////////////////
	double eps_r, mu_r, sigma;
	for (i =0; i<n_Mat; i++)
	{
		eps_r = Mat[i][0];
		sigma = Mat[i][2];
		K_a[i] = ( 2.0*eps_0*eps_r - sigma*dt )/( 2.0*eps_0*eps_r + sigma*dt );
		K_b[i] = 2.0*dt/( 2.0*eps_0*eps_r + sigma*dt );
	}

	long j;
	//reproduce the K_a, K_b and mu_r to avoid concurent memory reads by threads
	for (i = 0; i<nr_Threads; i++)
	{
		for (j = 0; j<n_Mat; j++)
		{
			K_a_thread[i][j] = K_a[j];
			K_b_thread[i][j] = K_b[j];
			mu_thread[i][j]  = Mat[j][1]; //mu_r
		}
	}

	///////////////////////////////////////////////////////////////////////////////////////
	//Initialize the Fourier transform
	///////////////////////////////////////////////////////////////////////////////////////
	if(Inp_D->fourier_transf_vol == 1)
	{
		double delta_omega = TwoORpi*(frec_2 - frec_1)/(n_frec-1);
		fourier_omega[0] = TwoORpi*frec_1;
		for (i = 1; i< n_frec; i++)
		{
			fourier_omega[i] = fourier_omega[i-1] + delta_omega;
		}
	}

	///////////////////////////////////////////////////////////////////////////////////////
	//Initialize the PML parameters
	///////////////////////////////////////////////////////////////////////////////////////
	//in x direction
	double PML_eps_r_x_1 = Inp_D->PML_eps_r_x_1;
	double PML_mu_r_x_1  = Inp_D->PML_mu_r_x_1;
	double PML_eps_r_x_2 = Inp_D->PML_eps_r_x_2;
	double PML_mu_r_x_2  = Inp_D->PML_mu_r_x_2;
	//in y direction
	double PML_eps_r_y_1 = Inp_D->PML_eps_r_y_1;
	double PML_mu_r_y_1  = Inp_D->PML_mu_r_y_1;
	double PML_eps_r_y_2 = Inp_D->PML_eps_r_y_2;
	double PML_mu_r_y_2  = Inp_D->PML_mu_r_y_2;
	//in z direction
	double PML_eps_r_z_1 = Inp_D->PML_eps_r_z_1;
	double PML_mu_r_z_1  = Inp_D->PML_mu_r_z_1;
	double PML_eps_r_z_2 = Inp_D->PML_eps_r_z_2;
	double PML_mu_r_z_2  = Inp_D->PML_mu_r_z_2;
	
	//in x direction
	//1
	Init_PML_Par_x(K_Ey_a_1, K_Ey_b_1, K_Gz_a_1, K_Gz_b_1, K_Hx_c_1, K_Hx_d_1, 
				   K_Ex_c_1, K_Ex_d_1, K_Hy_a_1, K_Hy_b_1, K_Bz_a_1, K_Bz_b_1,
				   PML_eps_r_x_1, PML_mu_r_x_1, nPML_x_1, dx, dt);

	//2
	Init_PML_Par_x(K_Ey_a_2, K_Ey_b_2, K_Gz_a_2, K_Gz_b_2, K_Hx_c_2, K_Hx_d_2, 
				   K_Ex_c_2, K_Ex_d_2, K_Hy_a_2, K_Hy_b_2, K_Bz_a_2, K_Bz_b_2,
				   PML_eps_r_x_2, PML_mu_r_x_2, nPML_x_2, dx, dt);

	//in y direction
	//1
	Init_PML_Par_y(K_Gx_a_1, K_Gx_b_1, K_Ez_a_1, K_Ez_b_1, K_Hy_c_1, K_Hy_d_1, 
		           K_Ey_c_1, K_Ey_d_1, K_Bx_a_1, K_Bx_b_1, K_Hz_a_1, K_Hz_b_1,
				   PML_eps_r_y_1, PML_mu_r_y_1, nPML_y_1, dy, dt);

	//2
	Init_PML_Par_y(K_Gx_a_2, K_Gx_b_2, K_Ez_a_2, K_Ez_b_2, K_Hy_c_2, K_Hy_d_2, 
		           K_Ey_c_2, K_Ey_d_2, K_Bx_a_2, K_Bx_b_2, K_Hz_a_2, K_Hz_b_2,
				   PML_eps_r_y_2, PML_mu_r_y_2, nPML_y_2, dy, dt);

	//in z direction
	//1
	Init_PML_Par_z(K_Ex_a_1, K_Ex_b_1, K_Gy_a_1, K_Gy_b_1, K_Hz_c_1, K_Hz_d_1, 
		           K_Ez_c_1, K_Ez_d_1, K_Hx_a_1, K_Hx_b_1, K_By_a_1, K_By_b_1,
				   PML_eps_r_z_1, PML_mu_r_z_1, nPML_z_1, dz, dt);

	//2
	Init_PML_Par_z(K_Ex_a_2, K_Ex_b_2, K_Gy_a_2, K_Gy_b_2, K_Hz_c_2, K_Hz_d_2, 
		           K_Ez_c_2, K_Ez_d_2, K_Hx_a_2, K_Hx_b_2, K_By_a_2, K_By_b_2,
				   PML_eps_r_z_2, PML_mu_r_z_2, nPML_z_2, dz, dt);
	

	///////////////////////////////////////////////////////////////////////////////////////
	//Initializations in case of plane wave excitation
	///////////////////////////////////////////////////////////////////////////////////////
	double phase_vel, phase_vel_ref, corr_term;	
	
	if (jel_plane_wave == 1)
	{
		eps_r = Mat[0][0];
		mu_r  = Mat[0][1];
		sigma = Mat[0][2];

		if (source_type > 1) //Sin or SinGauss
		{
			//correction term to shyncronize the 1D and 2D wave propagations
			phase_velocity(dx, dy, dz, dt, Mat[0][0], Mat[0][1], omega, teta, phi, &phase_vel);
			
			if (abs(sin_teta*cos_phi) >= abs(sin_teta*sin_phi) && 
				abs(sin_teta*cos_phi) >= abs(cos_teta) )
			{
				phase_velocity(dx, dy, dz, dt, Mat[0][0], Mat[0][1], omega, pi/2.0, 0.0, &phase_vel_ref);
			}
			if (abs(sin_teta*sin_phi) >= abs(sin_teta*cos_phi) && 
				abs(sin_teta*sin_phi) >= abs(cos_teta) )
			{
				phase_velocity(dx, dy, dz, dt, Mat[0][0], Mat[0][1], omega, pi/2.0, pi/2.0, &phase_vel_ref);
			}
			if (abs(cos_teta) >= abs(sin_teta*cos_phi) && 
				abs(cos_teta) >= abs(sin_teta*sin_phi) )
			{
				phase_velocity(dx, dy, dz, dt, Mat[0][0], Mat[0][1], omega, 0, pi/2.0, &phase_vel_ref);
			}
			corr_term = phase_vel_ref/phase_vel;
		}

		switch (source_type)
		{
			case 1: //Gauss
				fdtd_1D.Init(n_1D, n_PML_1D, dt, d_1D, eps_r, mu_r, sigma);
				fdtd_1D.Init_Gauss_Source(X0, t0, tw);
				break;
			case 2://Sin
				fdtd_1D.Init(n_1D, n_PML_1D, dt, d_1D, corr_term*eps_r, corr_term*mu_r, sigma);
				fdtd_1D.Init_Sin_Source(X0, omega, phase);
				break;
			case 3://SinGauss
				fdtd_1D.Init(n_1D, n_PML_1D, dt, d_1D, corr_term*eps_r, corr_term*mu_r, sigma);
				fdtd_1D.Init_GaussSin_Source(X0, omega, phase, t0, tw);
				break;
		}

		fdtd_1D.Init_PML_Param();
		fdtd_1D.Get_Data(E_1D,H_1D);
	}

	/////////////////////////////////////////////////////////////////////////////
	//Initializations for data save
	/

⌨️ 快捷键说明

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