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

📄 fdtd_3d.cpp

📁 fdtd 3D xyzPML MPI OpenMP
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#include "FDTD_3D.h"
#include "run_enviroment.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CFDTD_3D::CFDTD_3D(void)
{
	pi = 180.0*atan(1.0)/45.0;
	//permittivity of free space 
	eps_0 = 8.8541878176203898505365630317107502606083701665994498081024171524053950954599821142852891607182008932e-12; // [F/m]
	//permeability of free space 
    mu_0  = 1.2566370614359172953850573533118011536788677597500423283899778369231265625144835994512139301368468271e-6;  // [H/m]

	Ind = NULL;

	Mat = NULL;
	mu_r = NULL;

	Ex = NULL; Gx = NULL; Fx = NULL;
	Hz_recv_j = NULL; Hy_recv_k = NULL;
	Ex_send_j = NULL; Ex_send_k = NULL;

	Ey = NULL; Gy = NULL; Fy = NULL;
	Hx_recv_k = NULL; Hz_recv_i = NULL;
	Ey_send_i = NULL; Ey_send_k = NULL;
	
	Ez = NULL; Gz = NULL; Fz = NULL;
	Hy_recv_i = NULL; Hx_recv_j = NULL;
	Ez_send_i = NULL; Ez_send_j = NULL;
	
	Hx = NULL; Bx = NULL; 
	Ey_recv_k = NULL; Ez_recv_j = NULL;
	Hx_send_j = NULL; Hx_send_k = NULL;
	
	Hy = NULL; By = NULL;
	Ez_recv_i = NULL; Ex_recv_k = NULL;
	Hy_send_i = NULL; Hy_send_k = NULL;
	
	Hz = NULL; Bz = NULL;
	Ex_recv_j = NULL; Ey_recv_i = NULL;
	Hz_send_i = NULL; Hz_send_j = NULL;
	
	//Coefficients containing the PML boundary parameters
	//Electric field
	//Electric field
	K_Gx_a = NULL; K_Gx_b = NULL;
	K_Ex_a = NULL; K_Ex_b = NULL; K_Ex_c = NULL; K_Ex_d = NULL; 
	K_Gy_a = NULL; K_Gy_b = NULL;
	K_Ey_a = NULL; K_Ey_b = NULL; K_Ey_c = NULL; K_Ey_d = NULL; 
	K_Gz_a = NULL; K_Gz_b = NULL;
	K_Ez_a = NULL; K_Ez_b = NULL; K_Ez_c = NULL; K_Ez_d = NULL; 

	
	//Magnetic field
	K_Bx_a = NULL; K_Bx_b = NULL;
	K_Hx_a = NULL; K_Hx_b = NULL; K_Hx_c = NULL; K_Hx_d = NULL; 
	K_By_a = NULL; K_By_b = NULL;
	K_Hy_a = NULL; K_Hy_b = NULL; K_Hy_c = NULL; K_Hy_d = NULL; 
	K_Bz_a = NULL; K_Bz_b = NULL;
	K_Hz_a = NULL; K_Hz_b = NULL; K_Hz_c = NULL; K_Hz_d = NULL; 

	K_a = NULL; K_b  = NULL;

	jel_TS = 0;

	//the incident field for total field scattered field formulation
	jel_TS_planes = NULL;

	E_1D = NULL; H_1D = NULL; 
	ll_1D_E = NULL; ll_1D_H = NULL;

	//the recuired incident magnetic fields to compute the electric field components
	Hz_i0 = NULL; Hy_i0 = NULL; Hz_i1 = NULL; Hy_i1 = NULL;
	Hz_j0 = NULL; Hx_j0 = NULL; Hz_j1 = NULL; Hx_j1 = NULL;
	Hy_k0 = NULL; Hx_k0 = NULL; Hy_k1 = NULL; Hx_k1 = NULL;
	face_Hz_i0 = NULL; face_Hy_i0 = NULL; face_Hz_i1 = NULL; face_Hy_i1 = NULL;
	face_Hz_j0 = NULL; face_Hx_j0 = NULL; face_Hz_j1 = NULL; face_Hx_j1 = NULL;
	face_Hy_k0 = NULL; face_Hx_k0 = NULL; face_Hy_k1 = NULL; face_Hx_k1 = NULL;

	//the recuired incident electric fields to compute the magnetic field components
	Ey_i0 = NULL; Ez_i0 = NULL; Ey_i1 = NULL; Ez_i1 = NULL;
	Ex_j0 = NULL; Ez_j0 = NULL; Ex_j1 = NULL; Ez_j1 = NULL;
	Ex_k0 = NULL; Ey_k0 = NULL; Ex_k1 = NULL; Ey_k1 = NULL;
	face_Ey_i0 = NULL; face_Ez_i0 = NULL; face_Ey_i1 = NULL; face_Ez_i1 = NULL;
	face_Ex_j0 = NULL; face_Ez_j0 = NULL; face_Ex_j1 = NULL; face_Ez_j1 = NULL;
	face_Ex_k0 = NULL; face_Ey_k0 = NULL; face_Ex_k1 = NULL; face_Ey_k1 = NULL;

	jel_plane_wave = 0;

	pt_source_Ex = 0;
	pt_source_Ey = 0;
	pt_source_Ez = 0;
	pt_source_Hx = 0;
	pt_source_Hy = 0;
	pt_source_Hz = 0;

	Param_ptSource = NULL;
	Coord_ptSource = NULL;

	path_name_Ex = NULL; path_name_Ey = NULL; path_name_Ez = NULL;
	path_name_Hx = NULL; path_name_Hy = NULL; path_name_Hz = NULL;

	nx_yz = -1; ny_xz = -1; nz_xy = -1;

	Ex_Foll = NULL; Ey_Foll = NULL; Ez_Foll = NULL;
	Hx_Foll = NULL; Hy_Foll = NULL; Hz_Foll = NULL; 
}

CFDTD_3D::~CFDTD_3D(void)
{
	Free_Mem();
}

///////////////////////////////////////////////////////////////////////////////////////
//Initialize the number of threads
///////////////////////////////////////////////////////////////////////////////////////
void CFDTD_3D::Init_nr_THR(int nr_Threads)
{
	nr_threads = nr_Threads;
}

///////////////////////////////////////////////////////////////////////////////////////
//Set the time
///////////////////////////////////////////////////////////////////////////////////////
void CFDTD_3D::Set_Time(double Time, long Iter)
{
	time = Time;
	iter = Iter;
}

///////////////////////////////////////////////////////////////////////////////////////
//Initialize the FDTD algorithm
///////////////////////////////////////////////////////////////////////////////////////
int CFDTD_3D::Init(long ***&Index, long iSta, long iEnd, long jSta, long jEnd, long kSta, 
				   long kEnd, long nLx, long nLy, long nLz, long Nx, long Ny, long Nz,
				   int myRank, int myRanki, int myRankj, int myRankk, int iProcs, 
				   int jProcs, int kProcs, double **&Mater, long nMat, long npml_x1, 
				   long npml_x2, long npml_y1, long npml_y2, long npml_z1, 
				   long npml_z2, double d_x, double d_y, double d_z, double d_t)
{
	Ind = Index;  //Dimensions [nlx][nly][nlz]

	Mat = Mater;  //coefficients of the Lorentz materials
	n_Mat = nMat; //number of materials presents in the investigated geometry
	
	//the global indices of the computational subvolume
	ista = iSta;  
	iend = iEnd; 
	jsta = jSta;  
	jend = jEnd; 
	ksta = kSta;  
	kend = kEnd; 
	
	//dimensions of the full computational space
    nx = Nx;
	ny = Ny; 
	nz = Nz;

	//the size of the subvolume
	nlx = nLx; 
	nly = nLy; 
	nlz = nLz; 

	myrank  = myRank;
	myrank_i = myRanki;
	myrank_j = myRankj;
	myrank_k = myRankk;
						    
	iprocs = iProcs;
	jprocs = jProcs;
	kprocs = kProcs;

	iprocsMIN1 = iprocs - 1;
	jprocsMIN1 = jprocs - 1;
	kprocsMIN1 = kprocs - 1;

	//time increment
	dt = d_t;

	//elementary cell sizes
	dx = d_x;
	dy = d_y;
	dz = d_z;

	nPML_x_1 = npml_x1;
	nPML_x_2 = npml_x2;
	nPML_y_1 = npml_y1;
	nPML_y_2 = npml_y2;
	nPML_z_1 = npml_z1;
	nPML_z_2 = npml_z2;

	inv_dx = 1.0/dx;
	inv_dy = 1.0/dy;
	inv_dz = 1.0/dz;

	///////////////////////////////////////////////////////////////////////////////////////
	//memory allocations to compute Ex 
	///////////////////////////////////////////////////////////////////////////////////////
	ista_Ex = ista;	   iend_Ex = iend;    jsta_Ex = jsta;
	jend_Ex = jend;	   ksta_Ex = ksta;	  kend_Ex = kend;
	nlx_Ex = nlx;	   nly_Ex = nly;	  nlz_Ex = nlz;
	if (myrank_i == iprocs-1)
	{
		iend_Ex--;
		nlx_Ex--;
	}
	
	Ex = Init_Matrix_3D<double>(nlx_Ex, nly_Ex, nlz_Ex);
	if (!Ex)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Ex - ");
		return 1;
	}
	
	Gx = Init_Matrix_3D<double>(nlx_Ex, nly_Ex, nlz_Ex);
	if (!Gx)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Gx - ");
		return 1;
	}

	Fx = Init_Matrix_3D<double>(nlx_Ex, nly_Ex, nlz_Ex);
	if (!Fx)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Fx - ");
		return 1;
	}

	Hz_recv_j = Init_Matrix_2D<double>(nlx_Ex, nlz_Ex);
	if (!Hz_recv_j)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Hz_recv_j - ");
		return 1;
	}

	Hy_recv_k = Init_Matrix_2D<double>(nlx_Ex, nly_Ex);
	if (!Hy_recv_k)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Hy_recv_k - ");
		return 1;
	}

	Ex_send_j = Init_Matrix_2D<double>(nlx_Ex, nlz_Ex);
	if (!Ex_send_j)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Ex_send_j - ");
		return 1;
	}

	Ex_send_k = Init_Matrix_2D<double>(nlx_Ex, nly_Ex);
	if (!Ex_send_k)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Ex_send_k - ");
		return 1;
	}

	///////////////////////////////////////////////////////////////////////////////////////
	//memory allocations to compute Ey
	///////////////////////////////////////////////////////////////////////////////////////
	ista_Ey = ista;	   iend_Ey = iend;    jsta_Ey = jsta;
	jend_Ey = jend;	   ksta_Ey = ksta;	  kend_Ey = kend;
	nlx_Ey = nlx;	   nly_Ey = nly;	  nlz_Ey = nlz;
	if (myrank_j == jprocs-1)
	{
		jend_Ey--;
		nly_Ey--;
	}

	Ey = Init_Matrix_3D<double>(nlx_Ey, nly_Ey, nlz_Ey);
	if (!Ey)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Ey - ");
		return 1;
	}

	Gy = Init_Matrix_3D<double>(nlx_Ey, nly_Ey, nlz_Ey);
	if (!Gy)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Gy - ");
		return 1;
	}

	Fy = Init_Matrix_3D<double>(nlx_Ey, nly_Ey, nlz_Ey);
	if (!Fy)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Fy - ");
		return 1;
	}
	
	Hx_recv_k = Init_Matrix_2D<double>(nlx_Ey, nly_Ey);
	if (!Hx_recv_k)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Hx_recv_k - ");
		return 1;
	}

	Hz_recv_i = Init_Matrix_2D<double>(nly_Ey, nlz_Ey);
	if (!Hz_recv_i)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Hz_recv_i - ");
		return 1;
	}

	Ey_send_i = Init_Matrix_2D<double>(nly_Ey, nlz_Ey);
	if (!Ey_send_i)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Ey_send_i - ");
		return 1;
	}

	Ey_send_k = Init_Matrix_2D<double>(nlx_Ey, nly_Ey);
	if (!Ey_send_k)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Ey_send_k - ");
		return 1;
	}

	///////////////////////////////////////////////////////////////////////////////////////
	//memory allocations to compute Ez
	///////////////////////////////////////////////////////////////////////////////////////
	ista_Ez = ista;	   iend_Ez = iend;    jsta_Ez = jsta;
	jend_Ez = jend;	   ksta_Ez = ksta;	  kend_Ez = kend;
	nlx_Ez = nlx;	   nly_Ez = nly;	  nlz_Ez = nlz;
	if (myrank_k == kprocs-1)
	{
		kend_Ez--;
		nlz_Ez--;
	}

	Ez = Init_Matrix_3D<double>(nlx_Ez, nly_Ez, nlz_Ez);
	if (!Ez)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Ez - ");
		return 1;
	}

	Gz = Init_Matrix_3D<double>(nlx_Ez, nly_Ez, nlz_Ez);
	if (!Gz)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Gz - ");
		return 1;
	}

	Fz = Init_Matrix_3D<double>(nlx_Ez, nly_Ez, nlz_Ez);
	if (!Fz)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Fz - ");
		return 1;
	}

	Hy_recv_i = Init_Matrix_2D<double>(nly_Ez, nlz_Ez);
	if (!Hy_recv_i)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Hy_recv_i - ");
		return 1;
	}

	Hx_recv_j = Init_Matrix_2D<double>(nlx_Ez, nlz_Ez);
	if (!Hx_recv_j)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Hx_recv_j - ");
		return 1;
	}

	Ez_send_i = Init_Matrix_2D<double>(nly_Ez, nlz_Ez);
	if (!Ez_send_i)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Ez_send_i - ");
		return 1;
	}

	Ez_send_j = Init_Matrix_2D<double>(nlx_Ez, nlz_Ez);
	if (!Ez_send_j)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Ez_send_j - ");
		return 1;
	}
	
	///////////////////////////////////////////////////////////////////////////////////////
	//memory allocations to compute Hx
	///////////////////////////////////////////////////////////////////////////////////////
	ista_Hx = ista;	   iend_Hx = iend;    jsta_Hx = jsta;
	jend_Hx = jend;	   ksta_Hx = ksta;	  kend_Hx = kend;
	nlx_Hx = nlx;	   nly_Hx = nly;	  nlz_Hx = nlz;
	if (myrank_j == jprocs-1)
	{
		jend_Hx--;
		nly_Hx--;
	}
	if (myrank_k == kprocs-1)
	{
		kend_Hx--;
		nlz_Hx--;
	}

	nly_HxMIN1 = nly_Hx - 1;
	nlz_HxMIN1 = nlz_Hx - 1;

	Hx = Init_Matrix_3D<double>(nlx_Hx, nly_Hx, nlz_Hx);
	if (!Hx)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Hx - ");
		return 1;
	}

	Bx = Init_Matrix_3D<double>(nlx_Hx, nly_Hx, nlz_Hx);
	if (!Bx)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Bx - ");
		return 1;
	}

	Ey_recv_k = Init_Matrix_2D<double>(nlx_Hx, nly_Hx);
	if (!Ey_recv_k)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Ey_recv_k - ");
		return 1;
	}

	Ez_recv_j = Init_Matrix_2D<double>(nlx_Hx, nlz_Hx);
	if (!Ez_recv_j)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Ez_recv_j - ");
		return 1;
	}

	Hx_send_j = Init_Matrix_2D<double>(nlx_Hx, nlz_Hx);
	if (!Hx_send_j)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Hx_send_j - ");
		return 1;
	}

	Hx_send_k = Init_Matrix_2D<double>(nlx_Hx, nly_Hx);
	if (!Hx_send_k)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Hx_send_k - ");
		return 1;
	}
	
	///////////////////////////////////////////////////////////////////////////////////////
	//memory allocations to compute Hy
	///////////////////////////////////////////////////////////////////////////////////////
	ista_Hy = ista;	   iend_Hy = iend;    jsta_Hy = jsta;
	jend_Hy = jend;	   ksta_Hy = ksta;	  kend_Hy = kend;
	nlx_Hy = nlx;	   nly_Hy = nly;	  nlz_Hy = nlz;
	if (myrank_i == iprocs-1)
	{
		iend_Hy--;
		nlx_Hy--;
	}
	if (myrank_k == kprocs-1)
	{
		kend_Hy--;
		nlz_Hy--;
	}

	nlx_HyMIN1 = nlx_Hy - 1;
	nlz_HyMIN1 = nlz_Hy - 1;

	Hy = Init_Matrix_3D<double>(nlx_Hy, nly_Hy, nlz_Hy);
	if (!Hy)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Hy - ");
		return 1;
	}

	By = Init_Matrix_3D<double>(nlx_Hy, nly_Hy, nlz_Hy);
	if (!By)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - By - ");
		return 1;
	}

	Ez_recv_i = Init_Matrix_2D<double>(nly_Hy, nlz_Hy);
	if (!Ez_recv_i)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Ez_recv_i - ");
		return 1;
	}

	Ex_recv_k = Init_Matrix_2D<double>(nlx_Hy, nly_Hy);
	if (!Ex_recv_k)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Ex_recv_k - ");
		return 1;
	}

	Hy_send_i = Init_Matrix_2D<double>(nly_Hy, nlz_Hy);
	if (!Hy_send_i)
	{
		ErrorMessage(1, myrank, " -- Memory allocation problem - Hy_send_i - ");
		return 1;
	}

	Hy_send_k = Init_Matrix_2D<double>(nlx_Hy, nly_Hy);
	if (!Hy_send_k)
	{

⌨️ 快捷键说明

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