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

📄 fdtd_3d_complex.h

📁 采用UMPL边界的FDTD编程
💻 H
字号:
#pragma once

#include "run_enviroment.h"
#include "FDTD_3D_PML.h"

#ifndef NULL
	#define NULL 0
#endif

class CFDTD_3D_COMPLEX
{
private:
	double pi;

	CFDTD_3D_PML FDTD_3D_re, FDTD_3D_im;

	double **Param_Source_re, **Param_Source_im;

	//the electric fields to apply the Bolch boundary conditions
	double ***Ex_re, ***Ey_re, ***Ez_re;
	double ***Ex_im, ***Ey_im, ***Ez_im;
	
	//dimensions of the computational space
    long nx, ny, nz;
	double dx, dy, dz;

	//dimensions of the PML region
	long nPML_x_1, nPML_y_1, nPML_z_1;
	long nPML_x_2, nPML_y_2, nPML_z_2;

	double dt, dtDIV2;
	double sin_kxORa, sin_kyORb, sin_kzORc, cos_kxORa, cos_kyORb, cos_kzORc; // -pi:pi

	#ifndef run_enviroment //IBM AIX
		char *Path_Load_Workspace_Data, *Path_Save_Workspace_Data;
	
		//to measure the ellapsed time UNIX IBM_AIX
		double time_start, el_time, limit_time;
		struct timeval tv;
		struct timezone tz;
		int load_workspace_data, myrank;
	#endif

public:
	CFDTD_3D_COMPLEX(void);
	~CFDTD_3D_COMPLEX(void);

	int Init(long ***&Index, long n_x, long n_y, long n_z, double **&Materials, long n_Mat, 
		     long n_PML_x_1, long n_PML_x_2, long n_PML_y_1, long n_PML_y_2, long n_PML_z_1,
		     long n_PML_z_2, double dt, double d_x, double d_y, double d_z,
		     double PML_eps_r_x1, double PML_mu_r_x1, double PML_eps_r_x2, 
		     double PML_mu_r_x2, double PML_eps_r_y1, double PML_mu_r_y1, 
		     double PML_eps_r_y2, double PML_mu_r_y2, double PML_eps_r_z1, 
		     double PML_mu_r_z1, double PML_eps_r_z2, double PML_mu_r_z2);

	int Init_ptSource(long **Coord_ptSource, long n_Coord, double **Param_Source, int source_Type,
					  int Pt_Source_Ex, int Pt_Source_Ey, int Pt_Source_Ez,
					  int Pt_Source_Hx, int Pt_Source_Hy, int Pt_Source_Hz);

	int Init_TS(double Teta, double Phi, double Gamma, long N_TS,
				long nPML_1D, int source_type, double X0, double t0,
				double tw, double omega, double phase, double PML_eps_r_1D,
				double PML_mu_r_1D, int *Jel_TS_planes);

	int Init_Save_FieldSlices(long nxa, long nxb, long nya, long nyb, long nza, long nzb, 
		                      long nz_xy, long ny_xz, long nx_yz, long nr_Save, long saveFROMinst,
							  long saveTOinst, char *path);
	
	int Init_Followed(long **Ind_Followed, long n_Ind_F, long num_iter);

	void Init_Symmetries(int jel_Sym_ia,  int jel_Sym_ib,  int jel_Sym_ja,
	                     int jel_Sym_jb,  int jel_Sym_ka,  int jel_Sym_kb,
						 int jel_ASym_ia, int jel_ASym_ib, int jel_ASym_ja,
	                     int jel_ASym_jb, int jel_ASym_ka, int jel_ASym_kb);

	void Get_Data_Followed(double **&hx_foll_re, double **&hy_foll_re, double **&hz_foll_re, 
						   double **&ex_foll_re, double **&ey_foll_re, double **&ez_foll_re,
	                       double **&hx_foll_im, double **&hy_foll_im, double **&hz_foll_im, 
						   double **&ex_foll_im, double **&ey_foll_im, double **&ez_foll_im);

	int fdtd_marching(long n_max_steep);

	void Reset_Field_Comp();

	void Init_KxORa_KyORb_KzORc(double kx, double ky, double kz);

	#ifndef run_enviroment //IBM AIX
		int Init_Mesure_Ellapsed_Time(double TimeStart, double LimitTime, int MyRank,
									  int LoadWorkspaceData, char *path_load, char *path_save);
	#endif
private:
	//Bloch type Boundary conditions
	void bc_Bloch_Ex_jDir(double ***&Ex_re, double ***Ex_im, 
						  double cos_kyORb, double sin_kyORb);

	void bc_Bloch_Ex_kDir(double ***&Ex_re, double ***Ex_im, 
						  double cos_kzORc, double sin_kzORc);

	void bc_Bloch_Ey_iDir(double ***&Ey_re, double ***&Ey_im,
						  double cos_kxORa, double sin_kxORa);

	void bc_Bloch_Ey_kDir(double ***&Ey_re, double ***&Ey_im,
						  double cos_kzORc, double sin_kzORc);

	void bc_Bloch_Ez_iDir(double ***&Ez_re, double ***&Ez_im,
						  double cos_kxORa, double sin_kxORa);

	void bc_Bloch_Ez_jDir(double ***&Ez_re, double ***&Ez_im,
						  double cos_kyORb, double sin_kyORb);

};

⌨️ 快捷键说明

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