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

📄 fdtd_1d_exhy.cpp

📁 利用c++语言写的三维FDTD
💻 CPP
字号:
#include "stdafx.h"
#include "FDTD_1D_ExHy.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CFDTD_1D_ExHy::CFDTD_1D_ExHy(void)
{
	Ex = NULL; 
	Hy = NULL;
	
	Hy_n_1[0] = 0.0;   Hy_n_1[1] = 0.0;
	Hy_n[0]   = 0.0;   Hy_n[1]   = 0.0;

	nr_threads = 1;
}

CFDTD_1D_ExHy::~CFDTD_1D_ExHy(void)
{
	if (Ex)
	{
		free(Ex);
		Ex = NULL;
	}

	if (Hy)
	{
		free(Hy);
		Hy = NULL;
	}
}

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

///////////////////////////////////////////////////////////////////////////////////////
//Initialize the class parameters
///////////////////////////////////////////////////////////////////////////////////////
int CFDTD_1D_ExHy::Init(long n_z, double dt, double dz, double eps_r, double mu_r)
{
	nz = n_z;
	nzMIN1 = nz -1;

	Ex = (double *)calloc(nz,sizeof(double));
	if (!Ex)
	{
		return 1;
	}

	Hy = (double *)calloc(nz,sizeof(double));
	if (!Hy)
	{
		free(Ex);
		Ex = NULL;
		return 1;
	}

	double pi = 180.0*atan(1.0)/45.0;
	//permittivity of free space 
	double eps_0 = 8.8541878176203898505365630317107502606083701665994498081024171524053950954599821142852891607182008932e-12; // [F/m]
	//permeability of free space 
    double mu_0  = 1.2566370614359172953850573533118011536788677597500423283899778369231265625144835994512139301368468271e-6;  // [H/m]
	
	K_E = dt/(eps_0*eps_r*dz);
	K_H = dt/(mu_0*mu_r*dz);

	double speed = 1.0/sqrt(eps_0*eps_r*mu_0*mu_r); //the speed of the light in the vacuum

	K_MUR_1 = ( speed*dt - dz )/( speed*dt + dz );
	K_MUR_2 =  2.0*dz/( speed*dt + dz );

	return 0;
}

///////////////////////////////////////////////////////////////////////////////////////
//Initialize a sinusoidal source
///////////////////////////////////////////////////////////////////////////////////////
void CFDTD_1D_ExHy::Init_Sin_Source(double E_0, double om, double Phi)
{
	double pi = 180.0*atan(1.0)/45.0;

	E0 = E_0;
	omega = om;
	phi = Phi;

	alfa = 3.0*omega/(2.0*pi);

	Source_Type = 1;
}

///////////////////////////////////////////////////////////////////////////////////////
//Initialize  a Gaussian source
///////////////////////////////////////////////////////////////////////////////////////
void CFDTD_1D_ExHy::Init_Gauss_Source(double E_0, double t_0, double t_w)
{
	E0 = E_0;
	t0 = t_0;
	tw = t_w;
	
	Source_Type = 2;
}

///////////////////////////////////////////////////////////////////////////////////////
//Initialize a sinusoidal modulated Gaussian pulse
///////////////////////////////////////////////////////////////////////////////////////
void CFDTD_1D_ExHy::Init_GaussSin(double E_0, double om, double Phi, double t_0, double t_w)
{
	E0 = E_0;
	omega = om;
	phi = Phi;
	t0 = t_0;
	tw = t_w;

	Source_Type = 3;
}

///////////////////////////////////////////////////////////////////////////////////////
//Calculate Ex field
///////////////////////////////////////////////////////////////////////////////////////
void CFDTD_1D_ExHy::calc_Ex(double time)
{
	long k;

	#pragma omp parallel for default(shared) private(k) schedule(dynamic,nr_threads)
	for (k = 1; k < nz; k++)
	{
		Ex[k] += K_E*( Hy[k-1] - Hy[k] );
	}

	switch (Source_Type)
	{
		case 1:
			Ex[0] = (1.0-exp(-alfa*time))*E0*cos(omega*time + phi);
			break;
		case 2:
			Ex[0] = E0*exp( - (time - t0)*(time - t0)/(tw*tw) );
			break;
		case 3:
			Ex[0] = E0*cos(omega*(time-t0) + phi)*exp( - (time - t0)*(time - t0)/(tw*tw) );
			break;
	}
	
	
}

///////////////////////////////////////////////////////////////////////////////////////
//Calculate Hy field
///////////////////////////////////////////////////////////////////////////////////////
void CFDTD_1D_ExHy::calc_Hy()
{
	long k;

	#pragma omp parallel for default(shared) private(k) schedule(dynamic,nr_threads)
	for (k = 0; k < nzMIN1; k++)
	{
		Hy[k] += K_H*( Ex[k] - Ex[k+1] );
	}

	Hy[nz-1] = -Hy_n_1[1] + K_MUR_1*(Hy_n_1[0] + Hy[nz-2]) + K_MUR_2*(Hy_n[0] + Hy_n[1]);
	
	Hy_n_1[0] = Hy_n[0]; 
	Hy_n_1[1] = Hy_n[1];
	Hy_n[0]   = Hy[nz-1]; 
	Hy_n[1]   = Hy[nz-2];
}

///////////////////////////////////////////////////////////////////////////////////////
//Reinitialize with zero all the field components
///////////////////////////////////////////////////////////////////////////////////////
void CFDTD_1D_ExHy::Reset_Field_Comp(void)
{
	long k;
	for (k = 0; k < nz; k++)
	{
		Ex[k] = 0.0;
		Hy[k] = 0.0;
	}

	Hy_n_1[0] = 0.0; 
	Hy_n_1[1] = 0.0;
	Hy_n[0]   = 0.0;
	Hy_n[1]   = 0.0;
}

///////////////////////////////////////////////////////////////////////////////////////
//Get the address of Ex and Hy
///////////////////////////////////////////////////////////////////////////////////////
void CFDTD_1D_ExHy::Get_Data(double *&X, double *&Y)
{
	X = Ex;
	Y = Hy;
}

///////////////////////////////////////////////////////////////////////////////////////
//Save out the workspace data - the possibility to continue computations
///////////////////////////////////////////////////////////////////////////////////////
int CFDTD_1D_ExHy::Save_FDTD_1D_Workspace(char *path_name)
{	
	char *file_name = NULL;
	file_name =(char *) calloc(256,sizeof(char));
	if (!file_name)
	{
		if (file_name)
			free(file_name);
		return 1;
	}
	//save Ex_1D
	strcpy(file_name,path_name);
	strcat(file_name,"/Ex_1D");
	if (save_1D_binary(Ex, nz, 0, file_name))
	{
		free(path_name);
		free(file_name);
		return 2; //faild to save data
	}

	//save Hy_1D
	strcpy(file_name,path_name);
	strcat(file_name,"/Hy_1D");
	if(save_1D_binary(Hy, nz, 0, file_name))
	{
		free(path_name);
		free(file_name);
		return 2; //faild to save data
	}

	//save Hy_n
	strcpy(file_name,path_name);
	strcat(file_name,"/Hy_n_1D");
	if(save_1D_binary(Hy_n, 2, 0, file_name))
	{
		free(path_name);
		free(file_name);
		return 2; //faild to save data
	}

	//save Hy_n_1
	strcpy(file_name,path_name);
	strcat(file_name,"/Hy_n_1_1D");
	if(save_1D_binary(Hy_n_1, 2, 0, file_name))
	{
		free(path_name);
		free(file_name);
		return 2; //faild to save data
	}

	free(path_name);
	free(file_name);

	return 0;
}

int CFDTD_1D_ExHy::Load_FDTD_1D_Workspace(char *path)
{
	char *file_name = NULL;
	file_name =(char *) calloc(256,sizeof(char));
	if (!file_name)
	{
		return 1;
	}
	
	//load Ex_1D
	strcpy(file_name,path);
	strcat(file_name,"/Ex_1D_0.dat");
	if (load_1D_binary(Ex, nz, file_name))
	{
		free(file_name);
		return 2; //faild to load data
	}

	//load Hy_1D
	strcpy(file_name,path);
	strcat(file_name,"/Hy_1D_0.dat");
	if (load_1D_binary(Hy, nz, file_name))
	{
		free(file_name);
		return 2; //faild to load data
	}

	//load Hy_n
	strcpy(file_name,path);
	strcat(file_name,"/Hy_n_1D_0.dat");
	if (load_1D_binary(Hy_n, 2, file_name))
	{
		free(file_name);
		return 2; //faild to load data
	}

	//load Hy_n_1
	strcpy(file_name,path);
	strcat(file_name,"/Hy_n_1_1D_0.dat");
	if (load_1D_binary(Hy_n_1, 2, file_name))
	{
		free(file_name);
		return 2; //faild to load data
	}

	free(file_name);

	return 0;
}

⌨️ 快捷键说明

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