📄 fdtd_2d_tm_pml_planewave.m
字号:
clc
clear
N=100;
L=2000;
c=3*10^8;
f=1.5*10^9;
lamda=c/f;
ddx=lamda/20;
dt=ddx/(2*c);
epsz=1/(4*pi*9*10^9);
epsilon=1;
sigma=0;
spread=12;
t0=40;
i_source=N/2;
j_source=N/2;
ez_inc=zeros(1,N+1);
hx_inc=zeros(1,N);
low1=0;
low2=0;
high1=0;
high2=0;
% 总场边界
ia=N/4;
ib=3*N/4;
ja=ia;
jb=ib;
npml=15;
halfgrid=20;
dz=zeros(N+1,N+1);
ez=zeros(N+1,N+1);
iz=zeros(N+1,N+1);
hx=zeros(N+1,N);
hy=zeros(N,N+1);
ihx=zeros(N+1,N);
ihy=zeros(N,N+1);
% PML 初始设置
for i=1:N+1
gi2(i)=1;
gi3(i)=1;
fi1(i)=0;
end
for i=1:N
fi2(i)=1;
fi3(i)=1;
end
for j=1:N+1
gj2(j)=1;
gj3(j)=1;
fj1(j)=0;
end
for j=1:N
fj2(j)=1;
fj3(j)=1;
end
for i=1:N
for j=1:N;
ga(i,j)=1/(epsilon+sigma*dt/epsz);
gb(i,j)=sigma*dt/epsz;
end;
end;
% PML 阻抗渐变设置
for i=1:npml+1
xnum=npml+1-i;
xxn=xnum/npml;
xn=0.33*(xxn^3);
gi2(i)=1/(1+xn);
gi2(N+2-i)=1/(1+xn);
gi3(i)=(1-xn)/(1+xn);
gi3(N+2-i)=(1-xn)/(1+xn);
xxn=(xnum-0.5)/npml;
xn=0.25*(xxn^3);
fi1(i)=xn;
fi1(N+2-i)=xn;
end
for i=1:npml
xnum=npml+1-i;
xxn=(xnum-0.5)/npml;
xn=0.25*(xxn^3);
fi2(i)=1/(1+xn);
fi2(N+1-i)=1/(1+xn);
fi3(i)=(1-xn)/(1+xn);
fi3(N+1-i)=(1-xn)/(1+xn);
end
for j=1:npml+1
xnum=npml+1-j;
xxn=xnum/npml;
xn=0.33*(xxn^3);
gj2(j)=1/(1+xn);
gj2(N+2-j)=1/(1+xn);
gj3(j)=(1-xn)/(1+xn);
gj3(N+2-j)=(1-xn)/(1+xn);
xxn=(xnum-0.5)/npml;
xn=0.25*(xxn^3);
fj1(j)=xn;
fj1(N+2-j)=xn;
end
for j=1:npml
xnum=npml+1-j;
xxn=(xnum-0.5)/npml;
xn=0.25*(xxn^3);
fj2(j)=1/(1+xn);
fj2(N+1-j)=1/(1+xn);
fj3(j)=(1-xn)/(1+xn);
fj3(N+1-j)=(1-xn)/(1+xn);
end
% 程序主体
for t=1:L
% TM波Y方向传播
for j=2:N
ez_inc(j)=ez_inc(j)+0.5*(hx_inc(j-1)-hx_inc(j));
end
ez_inc(1)=low2;
low2=low1;
low1=ez_inc(2);
ez_inc(N+1)=high2;
high2=high1;
high1=ez_inc(N);
for i=2:N
for j=2:N
dz(i,j)=gi3(i)*gj3(j)*dz(i,j)+gi2(i)*gj2(j)*0.5*( hy(i,j)-hy(i-1,j)-hx(i,j)+hx(i,j-1) );
end
end
% 源的设置
pulse=exp((-0.5)*( (t0-t)/spread ).^2);
% pulse=sin(2*pi*f*t*dt);
%dz(i_source,j_source)=dz(i_source,j_source)+pulse;
ez_inc(5)=pulse;
for i=ia:ib
dz(i,ja)=dz(i,ja)+0.5*hx_inc(ja-1);
dz(i,jb)=dz(i,jb)-0.5*hx_inc(jb);
end
% Ez的迭代
for i=2:N
for j=2:N
ez(i,j)=ga(i,j)*( dz(i,j)-iz(i,j) );
iz(i,j)=iz(i,j)+gb(i,j)*ez(i,j) ;
end
end
% 截断边界
for j=1:N+1
ez(1,j)=0;
ez(N+1,j)=0;
end
for i=1:N+1
ez(i,1)=0;
ez(i,N+1)=0;
end
% 金属边界条件
for i=N/2-halfgrid:N/2+halfgrid-1;
for j=N/2-halfgrid:N/2+halfgrid-1;
ez(i,j)=0;
end
end
for j=1:N
hx_inc(j)=hx_inc(j)+0.5*(ez_inc(j)-ez_inc(j+1));
end
% Hx的迭代
for i=1:N+1
for j=1:N
curl_e=ez(i,j)-ez(i,j+1);
ihx(i,j)=ihx(i,j)+fi1(i)*curl_e;
hx(i,j)=fj3(j)*hx(i,j)+fj2(j)*0.5*(curl_e+ihx(i,j));
end
end
for i=ia:ib
hx(i,ja-1)=hx(i,ja-1)+0.5*ez_inc(ja);
hx(i,jb)=hx(i,jb)-0.5*ez_inc(jb);
end
% Hy的迭代
for i=1:N
for j=1:N+1
curl_e=ez(i+1,j)-ez(i,j);
ihy(i,j)=ihy(i,j)+fj1(j)*curl_e;
hy(i,j)=fi3(i)*hy(i,j)+fi2(i)*0.5*(curl_e+ihy(i,j));
end
end
for j=ja:jb
hy(ia-1,j)=hy(ia-1,j)-0.5*ez_inc(j);
hy(ib,j)=hy(ib,j)+0.5*ez_inc(j);
end
% 结果显示
mesh(ez)
%view(90,90)
tm=['T=',num2str(t)]
text(10,100,0.5,tm)
axis([1 101 1 101 -1 1]);
drawnow;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -