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

📄 fdtd_3d.cpp

📁 fdtd 3D xyzPML MPI OpenMP
💻 CPP
📖 第 1 页 / 共 5 页
字号:
								  K_Bx_b[j]*( (Ey_recv_k[i][j] - Ey[i][j][k])*inv_dz -
											  (Ez[i][j+1][k] - Ez[i][j][k])*inv_dy);

					Hx[i][j][k] = K_Hx_a[k]*Hx[i][j][k] + 
								  K_Hx_b[k]*( K_Hx_c[i]*Bx[i][j][k] + 
											  K_Hx_d[i]*Bx_r )/mu_r[Ind[i][j][k]];
				}
			}
		}

		j = nlyMIN1;
		if ( nly > 0 )
		{
			#pragma omp for schedule(dynamic,nr_threads) nowait
			for (i = 0; i < nlx; i++)
			{	
				for (k = 0; k < nlzMIN1; k++)
				{
					Bx_r = Bx[i][j][k];

					Bx[i][j][k] = K_Bx_a[j]*Bx[i][j][k] + 
								  K_Bx_b[j]*( (Ey[i][j][k+1] - Ey[i][j][k])*inv_dz -
											  (Ez_recv_j[i][k] - Ez[i][j][k])*inv_dy);

					Hx[i][j][k] = K_Hx_a[k]*Hx[i][j][k] + 
								  K_Hx_b[k]*( K_Hx_c[i]*Bx[i][j][k] + 
											  K_Hx_d[i]*Bx_r )/mu_r[Ind[i][j][k]];
				}
			}
		}

		#pragma omp for schedule(dynamic,nr_threads)
		for (i = 0; i < nlx; i++)
		{	
			for (j = 0; j < nlyMIN1; j++)
			{	
				for (k = 0; k < nlzMIN1; k++)
				{
					Bx_r = Bx[i][j][k];

					Bx[i][j][k] = K_Bx_a[j]*Bx[i][j][k] + 
								  K_Bx_b[j]*( (Ey[i][j][k+1] - Ey[i][j][k])*inv_dz -
											  (Ez[i][j+1][k] - Ez[i][j][k])*inv_dy);

					Hx[i][j][k] = K_Hx_a[k]*Hx[i][j][k] + 
								  K_Hx_b[k]*( K_Hx_c[i]*Bx[i][j][k] + 
											  K_Hx_d[i]*Bx_r )/mu_r[Ind[i][j][k]];
				}
			}
		}
	}

	////////////////////////////////////////////////////////////////////
	//Point source
	////////////////////////////////////////////////////////////////////
	if (jel_plane_wave == 0 && pt_source_Hx == 1 && n_Coord_ptSource>0 && iter <= switch_off_time)
	{
		PtSource_J(Hx, time);
	}

	////////////////////////////////////////////////////////////////////
	//Total field scattered field formulation
	////////////////////////////////////////////////////////////////////
	if (jel_plane_wave == 1 && jel_TS == 1) 
	{
		//the parallelization can be done this way because in case of 
		//magnetic field there aro no overlapping elements on the interface
		#pragma omp parallel sections default(shared)
		{
			#pragma omp section
			{
				//face j0
				if (jel_TS_planes[2] == 1)
					TS_Hx_j0();
			}
			#pragma omp section
			{
				//face j1
				if (jel_TS_planes[3] == 1)
					TS_Hx_j1();
			}
			#pragma omp section
			{
				//face k0
				if (jel_TS_planes[4] == 1)
					TS_Hx_k0();
			}
			#pragma omp section
			{
				//face k1
				if (jel_TS_planes[5] == 1)
					TS_Hx_k1();
			}
		}
	}
}

///////////////////////////////////////////////////////////////////////////////
//Update the Hx field components which will be send to other processes
///////////////////////////////////////////////////////////////////////////////
void CFDTD_3D::Update_Hx_send()
{
	long i, j, k;

	//update Hx_send_j
	if ( nly_Hx > 0 )
	{
		for (i = 0; i < nlx_Hx; i++)
		{
			for (k = 0; k < nlz_Hx; k++)
			{
				Hx_send_j[i][k] = Hx[i][nly_HxMIN1][k];
			}
		}
	}
	//update Hx_send_k
	if ( nlz_Hx > 0 )
	{
		for (i = 0; i < nlx_Hx; i++)
		{
			for (j = 0; j < nly_Hx; j++)
			{
				Hx_send_k[i][j] = Hx[i][j][nlz_HxMIN1];
			}
		}
	}
}

///////////////////////////////////////////////////////////////////////////////////////
//Calculate the Hy field
///////////////////////////////////////////////////////////////////////////////////////
void CFDTD_3D::Calc_Hy(long  nlx, long  nly, long  nlz)
{
	long  i, j, k;
	double By_r;

	long nlxMIN1 = nlx - 1;
	long nlzMIN1 = nlz - 1;

 	#pragma omp parallel default(shared) private(i,j,k,By_r)
	{
		i = nlxMIN1;
		k = nlzMIN1;
		if ( nlx > 0 && nlz > 0 )
		{
			#pragma omp for schedule(dynamic,nr_threads) nowait
			for (j = 0; j < nly; j++)
			{	
				By_r = By[i][j][k];

				By[i][j][k] = K_By_a[k]*By[i][j][k] +
							  K_By_b[k]*( (Ez_recv_i[j][k] - Ez[i][j][k])*inv_dx -
										  (Ex_recv_k[i][j] - Ex[i][j][k])*inv_dz );
				
				Hy[i][j][k] = K_Hy_a[i]*Hy[i][j][k] + 
							  K_Hy_b[i]*( K_Hy_c[j]*By[i][j][k] + 
										  K_Hy_d[j]*By_r )/mu_r[Ind[i][j][k]];
			}
		}

		i = nlxMIN1;
		if ( nlx > 0 )
		{
			#pragma omp for schedule(dynamic,nr_threads) nowait
			for (j = 0; j < nly; j++)
			{	
				for (k = 0; k < nlzMIN1; k++)
				{
					By_r = By[i][j][k];

					By[i][j][k] = K_By_a[k]*By[i][j][k] +
								  K_By_b[k]*( (Ez_recv_i[j][k] - Ez[i][j][k])*inv_dx -
											  (Ex[i][j][k+1] - Ex[i][j][k])*inv_dz );
					
					Hy[i][j][k] = K_Hy_a[i]*Hy[i][j][k] + 
								  K_Hy_b[i]*( K_Hy_c[j]*By[i][j][k] + 
											  K_Hy_d[j]*By_r )/mu_r[Ind[i][j][k]];
				}
			}
		}

		k = nlzMIN1;
		if ( nlz > 0 )
		{
			#pragma omp for schedule(dynamic,nr_threads) nowait
			for (i = 0; i < nlxMIN1; i++)
			{	
				for (j = 0; j < nly; j++)
				{	
					By_r = By[i][j][k];

					By[i][j][k] = K_By_a[k]*By[i][j][k] +
								  K_By_b[k]*( (Ez[i+1][j][k] - Ez[i][j][k])*inv_dx -
											  (Ex_recv_k[i][j] - Ex[i][j][k])*inv_dz );
					
					Hy[i][j][k] = K_Hy_a[i]*Hy[i][j][k] + 
								  K_Hy_b[i]*( K_Hy_c[j]*By[i][j][k] + 
											  K_Hy_d[j]*By_r )/mu_r[Ind[i][j][k]];
				}
			}
		}

		#pragma omp for schedule(dynamic,nr_threads)
		for (i = 0; i < nlxMIN1; i++)
		{	
			for (j = 0; j < nly; j++)
			{	
				for (k = 0; k < nlzMIN1; k++)
				{
					By_r = By[i][j][k];

					By[i][j][k] = K_By_a[k]*By[i][j][k] +
								  K_By_b[k]*( (Ez[i+1][j][k] - Ez[i][j][k])*inv_dx -
											  (Ex[i][j][k+1] - Ex[i][j][k])*inv_dz );
					
					Hy[i][j][k] = K_Hy_a[i]*Hy[i][j][k] + 
								  K_Hy_b[i]*( K_Hy_c[j]*By[i][j][k] + 
											  K_Hy_d[j]*By_r )/mu_r[Ind[i][j][k]];
				}
			}
		}
	}

	////////////////////////////////////////////////////////////////////
	//Point source
	////////////////////////////////////////////////////////////////////
	if (jel_plane_wave == 0 && pt_source_Hy == 1 && n_Coord_ptSource>0 && iter <= switch_off_time)
	{
		PtSource_J(Hy, time);
	}

	////////////////////////////////////////////////////////////////////
	//Total field scattered field formulation
	////////////////////////////////////////////////////////////////////
	if (jel_plane_wave == 1 && jel_TS == 1) 
	{
		//the parallelization can be done this way because in case of 
		//magnetic field there aro no overlapping elements on the interface
		#pragma omp parallel sections default(shared)
		{
			#pragma omp section
			{
				//i0 face
				if(jel_TS_planes[0] == 1)
					TS_Hy_i0();
			}
			#pragma omp section
			{
				//i1 face
				if(jel_TS_planes[1] == 1)
					TS_Hy_i1();
			}
			#pragma omp section
			{
				//k0 face
				if(jel_TS_planes[4] == 1)
 					TS_Hy_k0();
			}
			#pragma omp section
			{
				//k1 face
				if(jel_TS_planes[5] == 1)
					TS_Hy_k1();
			}
		}
	}
}

///////////////////////////////////////////////////////////////////////////////
//Update the Hy field components which will be send to other processes
///////////////////////////////////////////////////////////////////////////////
void CFDTD_3D::Update_Hy_send()
{
	long i, j, k;

	//update Hy_send_i
	if ( nlx_Hy > 0 )
	{
		for (j = 0; j < nly_Hy; j++)
		{
			for (k = 0; k < nlz_Hy; k++)
			{
				Hy_send_i[j][k] = Hy[nlx_HyMIN1][j][k];
			}
		}
	}
	//update Hy_send_k
	if ( nlz_Hy > 0 )
	{
		for (i = 0; i < nlx_Hy; i++)
		{
			for (j = 0; j < nly_Hy; j++)
			{
				Hy_send_k[i][j] = Hy[i][j][nlz_HyMIN1];
			}
		}
	}	
}

///////////////////////////////////////////////////////////////////////////////////////
//Calculate the Hz field
///////////////////////////////////////////////////////////////////////////////////////
void CFDTD_3D::Calc_Hz(long  nlx, long  nly, long  nlz)
{
	long  i, j, k;
	double Bz_r;
	
	long nlxMIN1 = nlx - 1;
	long nlyMIN1 = nly - 1;

	#pragma omp parallel default(shared) private(i,j,k,Bz_r)
	{
		i = nlxMIN1;
		j = nlyMIN1;
		if( nlx > 0 && nly > 0 )
		{
			#pragma omp for schedule(dynamic,nr_threads) nowait
			for (k = 0; k < nlz; k++)
			{
				Bz_r = Bz[i][j][k];

				Bz[i][j][k] = K_Bz_a[i]*Bz[i][j][k] +  
							  K_Bz_b[i]*( (Ex_recv_j[i][k] - Ex[i][j][k])*inv_dy - 
										  (Ey_recv_i[j][k] - Ey[i][j][k])*inv_dx );

				Hz[i][j][k] = K_Hz_a[j]*Hz[i][j][k] + 
							  K_Hz_b[j]*( K_Hz_c[k]*Bz[i][j][k] + 
										  K_Hz_d[k]*Bz_r )/mu_r[Ind[i][j][k]];
			}
		}

		j = nlyMIN1;
		if ( nly > 0 )
		{
			#pragma omp for schedule(dynamic,nr_threads) nowait
			for (i = 0; i < nlxMIN1; i++)
			{	
				for (k = 0; k < nlz; k++)
				{
					Bz_r = Bz[i][j][k];

					Bz[i][j][k] = K_Bz_a[i]*Bz[i][j][k] +  
								  K_Bz_b[i]*( (Ex_recv_j[i][k] - Ex[i][j][k])*inv_dy - 
											(  Ey[i+1][j][k] - Ey[i][j][k])*inv_dx );

					Hz[i][j][k] = K_Hz_a[j]*Hz[i][j][k] + 
								  K_Hz_b[j]*( K_Hz_c[k]*Bz[i][j][k] + 
											  K_Hz_d[k]*Bz_r )/mu_r[Ind[i][j][k]];
				}
			}
		}

		i = nlxMIN1;
		if ( nlx > 0 )
		{
			#pragma omp for schedule(dynamic,nr_threads) nowait
			for (j = 0; j < nlyMIN1; j++)
			{	
				for (k = 0; k < nlz; k++)
				{
					Bz_r = Bz[i][j][k];

					Bz[i][j][k] = K_Bz_a[i]*Bz[i][j][k] +  
								  K_Bz_b[i]*( (Ex[i][j+1][k] - Ex[i][j][k])*inv_dy - 
											  (Ey_recv_i[j][k] - Ey[i][j][k])*inv_dx );

					Hz[i][j][k] = K_Hz_a[j]*Hz[i][j][k] + 
								  K_Hz_b[j]*( K_Hz_c[k]*Bz[i][j][k] + 
											  K_Hz_d[k]*Bz_r )/mu_r[Ind[i][j][k]];
				}
			}
		}

		#pragma omp for schedule(dynamic,nr_threads)
		for (i = 0; i < nlxMIN1; i++)
		{	
			for (j = 0; j < nlyMIN1; j++)
			{	
				for (k = 0; k < nlz; k++)
				{
					Bz_r = Bz[i][j][k];

					Bz[i][j][k] = K_Bz_a[i]*Bz[i][j][k] +  
								  K_Bz_b[i]*( (Ex[i][j+1][k] - Ex[i][j][k])*inv_dy - 
											  (Ey[i+1][j][k] - Ey[i][j][k])*inv_dx );

					Hz[i][j][k] = K_Hz_a[j]*Hz[i][j][k] + 
								  K_Hz_b[j]*( K_Hz_c[k]*Bz[i][j][k] + 
											  K_Hz_d[k]*Bz_r )/mu_r[Ind[i][j][k]];
				}
			}
		}
	}

	////////////////////////////////////////////////////////////////////
	//Point source
	////////////////////////////////////////////////////////////////////
	if (jel_plane_wave == 0 && pt_source_Hz == 1 && n_Coord_ptSource > 0 && iter <= switch_off_time)
	{
		PtSource_J(Hz, time);
	}

	////////////////////////////////////////////////////////////////////
	//Total field scattered field formulation
	////////////////////////////////////////////////////////////////////
	if (jel_plane_wave == 1 && jel_TS == 1) 
	{
		//the parallelization can be done this way because in case of 
		//magnetic field there aro no overlapping elements on the interface
		#pragma omp parallel sections default(shared)
		{
			#pragma omp section
			{
				//face i0
				if(jel_TS_planes[0] == 1)
					TS_Hz_i0();
			}
			#pragma omp section
			{
				//face i1
				if(jel_TS_planes[1] == 1)
					TS_Hz_i1();
			}
			#pragma omp section
			{
				//face j0
				if(jel_TS_planes[2] == 1)
					TS_Hz_j0();
			}
			#pragma omp section
			{
				//face j1
				if(jel_TS_planes[3] == 1)
					TS_Hz_j1();
			}
		}
	}
}

///////////////////////////////////////////////////////////////////////////////
//Update the Hz field components which will be send to other processes
///////////////////////////////////////////////////////////////////////////////
void CFDTD_3D::Update_Hz_send()
{
	long i, j, k;

	long nlx_HzMIN1 = nlx_Hz - 1;
	long nly_HzMIN1 = nly_Hz - 1;

	//update Hz_send_i
	if ( nlx_Hz > 0 )
	{
		for (j = 0; j < nly_Hz; j++)
		{
			for (k = 0; k < nlz_Hz; k++)
			{
				Hz_send_i[j][k] = Hz[nlx_HzMIN1][j][k];
			}
		}
	}
	//update Hz_send_j
	if ( nly_Hz > 0 )
	{
		for (i = 0; i < nlx_Hz; i++)
		{
			for (k = 0; k < nlz_Hz; k++)
			{
				Hz_send_j[i][k] = Hz[i][nly_HzMIN1][k];
			}
		}
	}
}

void CFDTD_3D::Get_SendRecv(double **&hz_recv_j, double **&hy_recv_k, 
							double **&ex_send_j, double **&ex_send_k,
							double **&hx_recv_k, double **&hz_recv_i, 
							double **&ey_send_i, double **&ey_send_k,
							double **&hy_recv_i, double **&hx_recv_j,
							double **&ez_send_i, double **&ez_send_j,
							double **&ey_recv_k, double **&ez_recv_j,
							double **&hx_send_j, double **&hx_send_k,
							double **&ez_recv_i, double **&ex_recv_k, 
							double **&hy_send_i, double **&hy_send_k,
							double **&ex_recv_j, double **&ey_recv_i, 
							double **&hz_send_i, double **&hz_send_j)
{
	//Ex
	hz_recv_j = Hz_recv_j;   hy_recv_k = Hy_recv_k; 
	ex_send_j = Ex_send_j;   ex_send_k = Ex_send_k;
	//Ey
	hx_recv_k = Hx_recv_k;   hz_recv_i = Hz_recv_i; 
	ey_send_i = Ey_send_i;   ey_send_k = Ey_send_k;
	//Ez
	hy_recv_i = Hy_recv_i;   hx_recv_j = Hx_recv_j;
	ez_send_i = Ez_send_i;   ez_send_j = Ez_s

⌨️ 快捷键说明

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