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

📄 cpmlfdtd3d.c

📁 FDTD
💻 C
📖 第 1 页 / 共 4 页
字号:

	/*******************************************************************
	//     3-D FDTD code with CPML absorbing boundary conditions - Dipole
	//******************************************************************
	//
	//     This C code implements the finite-difference time-domain
	//     solution of Maxwell's curl equations over a three-dimensional
	//     Cartesian space lattice.  The grid is terminated by CPML ABCs.
	//     The thickness of the PML in each Cartesian direction can be 
	//     varied independently.
	//
	//******************************************************************/
	//Header files (Libraries to be included)
	#include<stdio.h>
	#include<math.h>
	#include<string.h>
	#include<stdlib.h>

	//  Fundamental Constants (MKS units)
    double pi = 3.14159265358979;
    double C = 2.99792458E8;
    double muO;
    double epsO;

	//  Specify Material Relative Permittivity and Conductivity
    double epsR = 1.0;//free space

	//  Specify Number of Time Steps and Grid Size Parameters
    int nMax = 500;  // total number of time steps
    
	// grid size corresponding to the number of Ez field components
    int Imax = 51;
    int Jmax = 126;
    int Kmax = 26;

	//  Specify Grid Cell Size in Each Direction and Calculate the
  	//  Resulting Courant-Stable Time Step
    double dx = 1.0E-3;
    double dy = 1.0E-3;
    double dz = 1.0E-3; // cell size in each direction
    // time step increment
    double dt;

	//  Specify the Impulsive Source (Differentiated Gaussian) parameters
    double tw = 53.0E-12;//pulse width
    double tO;//delay
    double source;//Differentiated Gaussian source
	double amp = 1000;// Amplitude

    //Specify the Time Step at which the data has to be saved for Visualization
    int save_modulus = 10;

	//  Specify the dipole Boundaries(A cuboidal rode- NOT as a cylinder)
    int istart, iend, jstart;
    int  jend, kstart, kend;

	//Output recording point
    int ksource = 12;

	//  Specify the CPML Thickness in Each Direction (Value of Zero
	//  Corresponds to No PML, and the Grid is Terminated with a PEC)
    // PML thickness in each direction
    int nxPML_1, nxPML_2, nyPML_1;
    int nyPML_2, nzPML_1, nzPML_2;

	//  Specify the CPML Order and Other Parameters:
    int m = 3, ma = 1;

    double sig_x_max;
    double sig_y_max;
    double sig_z_max;
    double alpha_x_max;
    double alpha_y_max;
    double alpha_z_max;
    double kappa_x_max;
    double kappa_y_max;
    double kappa_z_max;
	
	//Loop indices
    int i,j,ii,jj,k,kk,n;


	// H & E Field components
    float ***Hx;
    float ***Hy;
    float ***Hz;
    float ***Ex;
    float ***Ey;
    float ***Ez;

	short ***ID1;//medium definition array for Ex
	short ***ID2;//medium definition array for Ey
	short ***ID3;//medium definition array for Ez

	//  CPML components (Taflove 3rd Edition, Chapter 7)
    float ***psi_Ezx_1;
    float ***psi_Ezx_2;
    float ***psi_Hyx_1;
    float ***psi_Hyx_2;
    float ***psi_Ezy_1;
    float ***psi_Ezy_2;
    float ***psi_Hxy_1;
    float ***psi_Hxy_2;
    float ***psi_Hxz_1;
    float ***psi_Hxz_2;
    float ***psi_Hyz_1;
    float ***psi_Hyz_2;
    float ***psi_Exz_1;
    float ***psi_Exz_2;
    float ***psi_Eyz_1;
    float ***psi_Eyz_2;
    float ***psi_Hzx_1;
    float ***psi_Eyx_1;
    float ***psi_Hzx_2;
    float ***psi_Eyx_2;
    float ***psi_Hzy_1;
    float ***psi_Exy_1;
    float ***psi_Hzy_2;
    float ***psi_Exy_2;

    float *be_x_1, *ce_x_1, *alphae_x_PML_1, *sige_x_PML_1, *kappae_x_PML_1;
    float *bh_x_1, *ch_x_1, *alphah_x_PML_1, *sigh_x_PML_1, *kappah_x_PML_1;
    float *be_x_2, *ce_x_2, *alphae_x_PML_2, *sige_x_PML_2, *kappae_x_PML_2;
    float *bh_x_2, *ch_x_2, *alphah_x_PML_2, *sigh_x_PML_2, *kappah_x_PML_2;
    float *be_y_1, *ce_y_1, *alphae_y_PML_1, *sige_y_PML_1, *kappae_y_PML_1;
    float *bh_y_1, *ch_y_1, *alphah_y_PML_1, *sigh_y_PML_1, *kappah_y_PML_1;
    float *be_y_2, *ce_y_2, *alphae_y_PML_2, *sige_y_PML_2, *kappae_y_PML_2;
    float *bh_y_2, *ch_y_2, *alphah_y_PML_2, *sigh_y_PML_2, *kappah_y_PML_2;
    float *be_z_1, *ce_z_1, *alphae_z_PML_1, *sige_z_PML_1, *kappae_z_PML_1;
    float *bh_z_1, *ch_z_1, *alphah_z_PML_1, *sigh_z_PML_1, *kappah_z_PML_1;
    float *be_z_2, *ce_z_2, *alphae_z_PML_2, *sige_z_PML_2, *kappae_z_PML_2;
    float *bh_z_2, *ch_z_2, *alphah_z_PML_2, *sigh_z_PML_2, *kappah_z_PML_2;

	// denominators for the update equations
    float *den_ex;
    float *den_hx;
    float *den_ey;
    float *den_hy;
    float *den_ez;
    float *den_hz;

	//Max number of materials allowed
	int numMaterials = 50;

    //permittivity, permeability and conductivity of diffrent materials
	double *epsilon;
	double *mu;
	double *sigma;

	//E field update coefficients
	float *CA;
	float *CB;

	//H field update coefficients
    float DA;
    float DB;
	
	//Function prototype definitions
	void initialize();//Memeory initialization
	void setUp();//Coefficients, parameters etc will get computed
	void initializeCPML();//CPML coefficient computation
	void compute();//E & H Field update equation
	void buildObject();//Creates the object geometry
	void yeeCube (int, int,int, short);//Sets material properties to a cell
	void writeField(int);//Writes output
	void buildSphere();//Builds a spherical object
	void buildDipole();//Builds a dipole

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	void main() {

		initialize();
		setUp();
		buildObject();
		initializeCPML();
		compute();

	}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	void initialize() {

		muO = 4.0 * pi * 1.0E-7;
		epsO = 1.0 / (C * C * muO);
		 
		//PML Layers (10 layers)
		nxPML_1 = 11;
		nxPML_2 = 11;
		nyPML_1 = 11;
		nyPML_2 = 11;
		nzPML_1 = 11;
		nzPML_2 = 11;

		//Dynamic memory allocation
	    epsilon = (double *)malloc((numMaterials) * sizeof(double));

		for(i = 0; i < numMaterials; i++) {

			epsilon[i] = epsO;
		}

	    mu = (double *)malloc((numMaterials) * sizeof(double));

		for(i = 0; i < numMaterials; i++) {

			mu[i] = muO;
		}

	    sigma = (double *)malloc((numMaterials) * sizeof(double));

		for(i = 0; i < numMaterials; i++) {

			sigma[i] = 0.0;
		}

	    CA = (float *)malloc((numMaterials) * sizeof(float));

		for(i = 0; i < numMaterials; i++) {

			CA[i] = 0.0;
		}

	    CB = (float *)malloc((numMaterials) * sizeof(float));

		for(i = 0; i < numMaterials; i++) {

			CB[i] = 0.0;
		}

	    Ez = (float ***)malloc(Imax * sizeof(float **));

	    for(i = 0; i < Imax; i++) {

		    Ez[i] = (float **)malloc(Jmax * sizeof(float *));

		    for(j = 0; j < Jmax; j++) {

				Ez[i][j] = (float *)malloc(Kmax * sizeof(float));

				for(k = 0; k < Kmax; k++) {

					Ez[i][j][k] = 0.0;
				}
			}
		}

	    Ey = (float ***)malloc((Imax) * sizeof(float **));

	    for(i = 0; i < Imax; i++) {

		    Ey[i] = (float **)malloc((Jmax-1) * sizeof(float *));

		    for(j = 0; j < Jmax -1; j++) {

				Ey[i][j] = (float *)malloc((Kmax-1) * sizeof(float));

				for(k = 0; k < Kmax-1; k++) {

					Ey[i][j][k] = 0.0;
				}
			}
		}

	    Ex = (float ***)malloc((Imax-1) * sizeof(float **));

	    for(i = 0; i < Imax-1; i++) {

		    Ex[i] = (float **)malloc(Jmax * sizeof(float *));

		    for(j = 0; j < Jmax; j++) {

				Ex[i][j] = (float *)malloc((Kmax-1) * sizeof(float));

				for(k = 0; k < Kmax-1; k++) {

					Ex[i][j][k] = 0.0;
				}
			}
		}

	    Hx = (float ***)malloc(Imax * sizeof(float **));

	    for(i = 0; i < Imax; i++) {

		    Hx[i] = (float **)malloc((Jmax-1) * sizeof(float *));

		    for(j = 0; j < Jmax-1; j++) {

				Hx[i][j] = (float *)malloc(Kmax * sizeof(float));

				for(k = 0; k < Kmax; k++) {

					Hx[i][j][k] = 0.0;
				}
			}
		}

	    Hy = (float ***)malloc((Imax-1) * sizeof(float **));

	    for(i = 0; i < Imax-1; i++) {

		    Hy[i] = (float **)malloc(Jmax * sizeof(float *));

		    for(j = 0; j < Jmax; j++) {

				Hy[i][j] = (float *)malloc(Kmax * sizeof(float));

				for(k = 0; k < Kmax; k++) {

					Hy[i][j][k] = 0.0;
				}
			}
		}

	    Hz = (float ***)malloc((Imax-1) * sizeof(float **));

	    for(i = 0; i < Imax-1; i++) {

		    Hz[i] = (float **)malloc((Jmax-1) * sizeof(float *));

		    for(j = 0; j < Jmax-1; j++) {

				Hz[i][j] = (float *)malloc((Kmax-1) * sizeof(float));

				for(k = 0; k < Kmax-1; k++) {

					Hz[i][j][k] = 0.0;
				}
			}
		}

	    ID1 = (short ***)malloc(Imax * sizeof(short **));

	    for(i = 0; i < Imax; i++) {

		    ID1[i] = (short **)malloc(Jmax * sizeof(short *));

		    for(j = 0; j < Jmax; j++) {

				ID1[i][j] = (short *)malloc(Kmax * sizeof(short));

				for(k = 0; k < Kmax; k++) {

					ID1[i][j][k] = 0;
				}
			}
		}

	    ID2 = (short ***)malloc(Imax * sizeof(short **));

	    for(i = 0; i < Imax; i++) {

		    ID2[i] = (short **)malloc(Jmax * sizeof(short *));

		    for(j = 0; j < Jmax; j++) {

				ID2[i][j] = (short *)malloc(Kmax * sizeof(short));

				for(k = 0; k < Kmax; k++) {

					ID2[i][j][k] = 0;
				}
			}
		}

	    ID3 = (short ***)malloc(Imax * sizeof(short **));

	    for(i = 0; i < Imax; i++) {

		    ID3[i] = (short **)malloc(Jmax * sizeof(short *));

		    for(j = 0; j < Jmax; j++) {

				ID3[i][j] = (short *)malloc(Kmax * sizeof(short));

				for(k = 0; k < Kmax; k++) {

					ID3[i][j][k] = 0;
				}
			}
		}

	    psi_Ezx_1 = (float ***)malloc(nxPML_1 * sizeof(float **));

	    for(i = 0; i < nxPML_1; i++) {

		    psi_Ezx_1[i] = (float **)malloc(Jmax * sizeof(float *));

		    for(j = 0; j < Jmax; j++) {

				psi_Ezx_1[i][j] = (float *)malloc(Kmax * sizeof(float));

				for(k = 0; k < Kmax; k++) {

					psi_Ezx_1[i][j][k] = 0.0;
				}
			}
		}

	    psi_Ezx_2 = (float ***)malloc(nxPML_2 * sizeof(float **));

	    for(i = 0; i < nxPML_2; i++) {

		    psi_Ezx_2[i] = (float **)malloc(Jmax * sizeof(float *));

		    for(j = 0; j < Jmax; j++) {

				psi_Ezx_2[i][j] = (float *)malloc(Kmax * sizeof(float));

				for(k = 0; k < Kmax; k++) {

					psi_Ezx_2[i][j][k] = 0.0;
				}
			}
		}

	    psi_Hyx_1 = (float ***)malloc((nxPML_1-1) * sizeof(float **));

	    for(i = 0; i < nxPML_1-1; i++) {

		    psi_Hyx_1[i] = (float **)malloc(Jmax * sizeof(float *));

		    for(j = 0; j < Jmax; j++) {

				psi_Hyx_1[i][j] = (float *)malloc(Kmax * sizeof(float));

				for(k = 0; k < Kmax; k++) {

					psi_Hyx_1[i][j][k] = 0.0;
				}
			}
		}

	    psi_Hyx_2 = (float ***)malloc((nxPML_2-1) * sizeof(float **));

	    for(i = 0; i < nxPML_1-1; i++) {

		    psi_Hyx_2[i] = (float **)malloc(Jmax * sizeof(float *));

		    for(j = 0; j < Jmax; j++) {

				psi_Hyx_2[i][j] = (float *)malloc(Kmax * sizeof(float));

				for(k = 0; k < Kmax; k++) {

					psi_Hyx_2[i][j][k] = 0.0;
				}
			}
		}

	    psi_Ezy_1 = (float ***)malloc(Imax * sizeof(float **));

	    for(i = 0; i < Imax; i++) {

		    psi_Ezy_1[i] = (float **)malloc(nyPML_1 * sizeof(float *));

		    for(j = 0; j < nyPML_1; j++) {

				psi_Ezy_1[i][j] = (float *)malloc(Kmax * sizeof(float));

				for(k = 0; k < Kmax; k++) {

					psi_Ezy_1[i][j][k] = 0.0;
				}
			}
		}

	    psi_Ezy_2 = (float ***)malloc(Imax * sizeof(float **));

	    for(i = 0; i < Imax; i++) {

		    psi_Ezy_2[i] = (float **)malloc(nyPML_2 * sizeof(float *));

		    for(j = 0; j < nyPML_2; j++) {

				psi_Ezy_2[i][j] = (float *)malloc(Kmax * sizeof(float));

				for(k = 0; k < Kmax; k++) {

					psi_Ezy_2[i][j][k] = 0.0;
				}
			}
		}

	    psi_Hxy_1 = (float ***)malloc(Imax * sizeof(float **));

	    for(i = 0; i < Imax; i++) {

		    psi_Hxy_1[i] = (float **)malloc((nyPML_1-1) * sizeof(float *));

		    for(j = 0; j < nyPML_1-1; j++) {

				psi_Hxy_1[i][j] = (float *)malloc(Kmax * sizeof(float));

				for(k = 0; k < Kmax; k++) {

					psi_Hxy_1[i][j][k] = 0.0;
				}
			}
		}

	    psi_Hxy_2 = (float ***)malloc(Imax * sizeof(float **));

	    for(i = 0; i < Imax; i++) {

		    psi_Hxy_2[i] = (float **)malloc((nyPML_2-1) * sizeof(float *));

		    for(j = 0; j < nyPML_2-1; j++) {

				psi_Hxy_2[i][j] = (float *)malloc(Kmax * sizeof(float));

				for(k = 0; k < Kmax; k++) {

					psi_Hxy_2[i][j][k] = 0.0;
				}
			}
		}

	    psi_Hxz_1 = (float ***)malloc(Imax * sizeof(float **));

	    for(i = 0; i < Imax; i++) {

		    psi_Hxz_1[i] = (float **)malloc((Jmax-1) * sizeof(float *));

		    for(j = 0; j < Jmax; j++) {

				psi_Hxz_1[i][j] = (float *)malloc((nzPML_1-1) * sizeof(float));

				for(k = 0; k < nzPML_1-1; k++) {

					psi_Hxz_1[i][j][k] = 0.0;
				}
			}
		}

	    psi_Hxz_2 = (float ***)malloc(Imax * sizeof(float **));

	    for(i = 0; i < Imax; i++) {

		    psi_Hxz_2[i] = (float **)malloc((Jmax-1) * sizeof(float *));

		    for(j = 0; j < Jmax; j++) {

				psi_Hxz_2[i][j] = (float *)malloc((nzPML_2-1) * sizeof(float));

				for(k = 0; k < nzPML_2-1; k++) {

					psi_Hxz_2[i][j][k] = 0.0;
				}
			}

⌨️ 快捷键说明

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