www.pudn.com > 2D-TM.rar > 2dpml_tm.cpp
#define source scp0(t) //d_Guess pulse 第一步:加入激励源:微分高斯脉冲源
//#define source scp(t) //Guess pulse 高斯脉冲源
//#define source sch(t) // cos 升余弦脉冲源
#include"parameters.h"
#include"Myarray.h"
#include"vector.h"
#include"math.h"
#include"2d_farfield.h"
double phi=0; //Incidence diretion 入射方向
double *EXi=new double[dia+1];//Exi数组大小为124
double *HYi=new double[dia];//Hyi数组为123
double inwave(int which,int i,int j);
double hxi(int ix,int jx) { return inwave(1,ix,jx); } //TM波
double hyi(int ix,int jx) { return inwave(2,ix,jx); }
double ezi(int ix,int jx) { return inwave(3,ix,jx); }
void main(){//第三步
int i,j,t,T,flag;
ofstream fp;
fp.open("ez.dat",ios::trunc);
clock_t start, finish;
unsigned long int duration;
double coef1[PML_Thickness+1],coef2[PML_Thickness+1],mcoef1[PML_Thickness+1],mcoef2[PML_Thickness+1];//PML层四个sigma参数
for(i=0;i<=PML_Thickness;i++){
coef1[i]=(1.0-0.5*dte*conduct(double(i)))/(1.0+0.5*dte*conduct(double(i)));
coef2[i]=dte/(1.0+0.5*dte*conduct(double(i)));
mcoef1[i]=(1.0-0.5*dtm*mconduct(double(i)))/(1.0+0.5*dtm*mconduct(double(i)));
mcoef2[i]=dtm/(1.0+0.5*dtm*mconduct(double(i)));
}
cout<<"Size="<>phi; //之前已经定义过phi,即入射波的方向固定
cout<<"Input calculate time (N):";
cin>>T;
double **ez=D2dmatrix(MX+1,MY+1);
double **psi=D2dmatrix(MX+1,MY+1);
double **hx=D2dmatrix(MX+1,MY);
double **hy=D2dmatrix(MX,MY+1);
PML_2D_Arr_ez ezy(MX,PML_Thickness,PML_Thickness,MY,PML_Thickness,PML_Thickness);
for(i=0;i=ii0)&&(i<=ii1)) flag=0;
if((j==jj1)&&(i>=ii0)&&(i<=ii1)) flag=0;
if(flag==1)
hx[i][j]+=-(dtm/dy)*(ez[i][j+1]-ez[i][j]);
};
//boundary between PML zone and nonPML zone
for(i=I1+1;i=jj0)&&(j<=jj1)) flag=0;
if((i==ii1)&&(j>=jj0)&&(j<=jj1)) flag=0;
if(flag==1)
hy[i][j]+=(dtm/dx)*(ez[i+1][j]-ez[i][j]);
};
//boundary between PML zone and nonPML zone
for(j=J1+1;j=jj0)&&(j<=jj1)) flag=0;
if((i==ii1)&&(j>=jj0)&&(j<=jj1)) flag=0;
if((j==jj0)&&(i>=ii0)&&(i<=ii1)) flag=0;
if((j==jj1)&&(i>=ii0)&&(i<=ii1)) flag=0;
if(flag==1)
ez[i][j]+=(dte/dx)*(hy[i][j]-hy[i-1][j])-(dte/dy)*(hx[i][j]-hx[i][j-1]);
};
///target Ez:
for(i=MX/2-Target_X;i<=MX/2+Target_X;i++)
for(j=MY/2-Target_Y;j<=MY/2+Target_Y;j++)
if(sqrt((i-MX/2)*(i-MX/2)+(j-MY/2)*(j-MY/2))<=Target_X) //圆柱
// if((abs(i-MX/2)<=(Target_X))&&(abs(j-MY/2)<=(Target_X))) //方柱
ez[i][j]=0.0;
//PML zone
for(j=1;j=0&&phi<=90)//0<=phi<=90
rc=vector(ic-ii0,jc-jj0,0);
else
if(phi>90&&phi<=180)//90180&&phi<=270)//180270&&phi<360)//270