具有完美匹配层 (PML) 边界条件的区域的二维 FDTD研究(Matlab代码实现)

 👨‍🎓个人主页:研学社的博客   

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现


💥1 概述

包含具有Hy和Hx分量的xy平面极化磁场以及z极化电场Ez的2D TM波。字段在每个时间步长更新,在一个空间中,其中自由空间的所有物理参数未规范化为 1,而是给定实值和已知值。更新是使用从麦克斯韦卷曲方程的差分形式获得的标准更新方程完成的,其中包含非常低的 4x10^(-4) 单位的电导率和磁导率。场点在Yee算法描述的网格中定义。H 字段在空间步的每个半坐标处定义。更准确地说,Hx 部分在每个半 y 坐标和完整 x 坐标处定义,Hy 部分在每半 x 坐标和完整 y 坐标和 E 场处定义,即 Ez 部分在每个完整的 x 和完整的 y 坐标点上定义。同样在这里,空间步长被取为1微米,而不是以前程序中假设的无单位域中的1个单位。此外,时间更新是使用跨越时间步长完成的。在这里,H 字段(即 Hx 和 Hy)每半个时间步更新一次,E 字段(即 Ez)每半个时间步更新一次。这表现为两个交替的矢量更新,仅跨越空间网格的一部分,其中波从源开始,已到达该特定时间时刻,避免了网格中所有点的场更新,这在当时是不必要的。这些空间更新位于时间更新的主 for 循环内,跨越整个时间网格。此外,在这里,用作更新方程乘法因子的矩阵在循环开始之前初始化,以避免在每次循环迭代中重复计算相同的矩阵,这是优化的小尝试。这里的边界条件是完全匹配层 (PML) 边界条件,其中边界附近的场在到达边界宽度的预定长度上衰减到边界处的零值,使用多项式递增的电导率值在边界宽度上,在边界宽度处最大值,并在边界宽度的每个点选择一个磁导率值以避免在该点反射。此外,这里使用Berenger的PML条件,其中在场中Ez被分成两个分量Ezx和Ezy,并且分量在两个方向上使用单独的电导率和磁导率衰减(x方向的sigmax和sigma_starx以及y方向的sigmay和sigma_stary)。

📚2 运行结果

 

 部分代码:

%Total no of time steps
time_tot=350;

%Position of the source (center of the domain)
xsource=100;
ysource=100;

%Courant stability factor
S=1/(2^0.5);

% Parameters of free space (permittivity and permeability and speed of
% light) are all not 1 and are given real values
epsilon0=(1/(36*pi))*1e-9;
mu0=4*pi*1e-7;
c=3e+8;

% Spatial grid step length (spatial grid step= 1 micron and can be changed)
delta=1e-6;
% Temporal grid step obtained using Courant condition
deltat=S*delta/c;

% Initialization of field matrices
Ez=zeros(xdim,ydim);
Ezx=zeros(xdim,ydim);
Ezy=zeros(xdim,ydim);
Hy=zeros(xdim,ydim);
Hx=zeros(xdim,ydim);

% Initialization of permittivity and permeability matrices
epsilon=epsilon0*ones(xdim,ydim);
mu=mu0*ones(xdim,ydim);

% Initializing electric conductivity matrices in x and y directions
sigmax=zeros(xdim,ydim);
sigmay=zeros(xdim,ydim);


%Perfectly matched layer boundary design
%Reference:-http://dougneubauer.com/wp-content/uploads/wdata/yee2dpml1/yee2d_c.txt
%(An adaptation of 2-D FDTD TE code of Dr. Susan Hagness)

%Boundary width of PML in all directions
bound_width=25;

%Order of polynomial on which sigma is modeled
gradingorder=6;

%Required reflection co-efficient
refl_coeff=1e-6;

%Polynomial model for sigma
sigmamax=(-log10(refl_coeff)*(gradingorder+1)*epsilon0*c)/(2*bound_width*delta);
boundfact1=((epsilon(xdim/2,bound_width)/epsilon0)*sigmamax)/((bound_width^gradingorder)*(gradingorder+1));
boundfact2=((epsilon(xdim/2,ydim-bound_width)/epsilon0)*sigmamax)/((bound_width^gradingorder)*(gradingorder+1));
boundfact3=((epsilon(bound_width,ydim/2)/epsilon0)*sigmamax)/((bound_width^gradingorder)*(gradingorder+1));
boundfact4=((epsilon(xdim-bound_width,ydim/2)/epsilon0)*sigmamax)/((bound_width^gradingorder)*(gradingorder+1));
x=0:1:bound_width;
for i=1:1:xdim
    sigmax(i,bound_width+1:-1:1)=boundfact1*((x+0.5*ones(1,bound_width+1)).^(gradingorder+1)-(x-0.5*[0 ones(1,bound_width)]).^(gradingorder+1));
    sigmax(i,ydim-bound_width:1:ydim)=boundfact2*((x+0.5*ones(1,bound_width+1)).^(gradingorder+1)-(x-0.5*[0 ones(1,bound_width)]).^(gradingorder+1));
end
for i=1:1:ydim
    sigmay(bound_width+1:-1:1,i)=boundfact3*((x+0.5*ones(1,bound_width+1)).^(gradingorder+1)-(x-0.5*[0 ones(1,bound_width)]).^(gradingorder+1))';
    sigmay(xdim-bound_width:1:xdim,i)=boundfact4*((x+0.5*ones(1,bound_width+1)).^(gradingorder+1)-(x-0.5*[0 ones(1,bound_width)]).^(gradingorder+1))';
end

%Magnetic conductivity matrix obtained by Perfectly Matched Layer condition
%This is also split into x and y directions in Berenger's model
sigma_starx=(sigmax.*mu)./epsilon;
sigma_stary=(sigmay.*mu)./epsilon;

%Choice of nature of source
gaussian=0;
sine=0;
% The user can give a frequency of his choice for sinusoidal (if sine=1 above) waves in Hz 

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]李志. 基于FDTD的高阶PML算法及其在集成电路仿真中的应用[D].天津工业大学,2021.DOI:10.27357/d.cnki.gtgyu.2021.000394.

[2]Computational Electromagnetics At IIT Madras (2023). 2D FDTD of a region with Perfectly Matched Layer boundary.

🌈4 Matlab代码实现

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个二维PML边界,TEz模式的FDTDMatlab程序示例: ```matlab % 二维PML边界,TEz模式的FDTD % 定义计算区域和网格步长 Lx = 1; % 计算区域长度 Ly = 1; % 计算区域宽度 dx = 0.01; % x方向网格步长 dy = 0.01; % y方向网格步长 Nx = round(Lx/dx); % x方向网格数 Ny = round(Ly/dy); % y方向网格数 % 定义时间步长和总计算时间 dt = 0.5*dx/3e8; % 时间步长 T = 2e-9; % 总计算时间 Nt = round(T/dt); % 总时间步数 % 定义介质参数 epsz = 8.85e-12; % 真空中的介电常数 mu0 = pi*4e-7; % 真空中的磁导率 epsr = ones(Nx,Ny); % 相对介电常数 mur = ones(Nx,Ny); % 相对磁导率 % 定义PML参数 npml = 10; % PML数 sigmax = 3.7*(1:npml)/Lx/dt; % x方向PML吸收系数 sigmay = 3.7*(1:npml)/Ly/dt; % y方向PML吸收系数 kappamax = 1; % PML反射系数 kappamay = 1; % PML反射系数 % 初始化场 Hx = zeros(Nx,Ny); Hy = zeros(Nx,Ny); Ez = zeros(Nx,Ny); % 初始化PML边界场 Hx_pml_xpos = zeros(npml,Ny); Hy_pml_xpos = zeros(npml,Ny); Ez_pml_xpos = zeros(npml,Ny); Hx_pml_xneg = zeros(npml,Ny); Hy_pml_xneg = zeros(npml,Ny); Ez_pml_xneg = zeros(npml,Ny); Hx_pml_ypos = zeros(Nx,npml); Hy_pml_ypos = zeros(Nx,npml); Ez_pml_ypos = zeros(Nx,npml); Hx_pml_yneg = zeros(Nx,npml); Hy_pml_yneg = zeros(Nx,npml); Ez_pml_yneg = zeros(Nx,npml); % 进行时域计算 for n = 1:Nt % 更新Hx场 for i = 1:Nx-1 for j = 1:Ny Hx(i,j) = Hx(i,j) - (dt/mu0/dy)*(Ez(i,j+1) - Ez(i,j)); end end for i = 1:Nx-1 for j = 1:Ny-1 Hx(i,j) = Hx(i,j) + (dt/mu0/dx)*(Ez(i+1,j) - Ez(i,j)); end end % 更新Hy场 for i = 1:Nx for j = 1:Ny-1 Hy(i,j) = Hy(i,j) + (dt/mu0/dx)*(Ez(i,j+1) - Ez(i,j)); end end for i = 1:Nx-1 for j = 1:Ny-1 Hy(i,j) = Hy(i,j) - (dt/mu0/dy)*(Ez(i+1,j) - Ez(i,j)); end end % 更新Ez场 for i = 2:Nx-1 for j = 2:Ny-1 Ez(i,j) = (1-0.5*dt*sigmax(i)*epsz/epsr(i,j))... /(1+0.5*dt*sigmax(i)*epsz/epsr(i,j))*Ez(i,j)... +(dt/epsr(i,j)/dx)*(Hy(i,j) - Hy(i-1,j))... -(dt/epsr(i,j)/dy)*(Hx(i,j) - Hx(i,j-1)); end end % 在PML处理边界 for i = 1:npml % 处理x正方向PML边界 Ez_pml_xpos(i,:) = (1-kappamax*dt*sigmax(Nx-i+1))... /(1+kappamax*dt*sigmax(Nx-i+1))*Ez_pml_xpos(i,:)... +(dt/epsz/dx)*(Hy_pml_xpos(i,:) - Hy(Nx-i+1,:)); Hx_pml_xpos(i,:) = Hx_pml_xpos(i,:)... - (dt/mu0/dy)*(Ez_pml_xpos(i,2:Ny) - Ez_pml_xpos(i,1:Ny-1)); Hy_pml_xpos(i,:) = Hy_pml_xpos(i,:)... + (dt/mu0/dx)*(Ez_pml_xpos(i+1,:) - Ez_pml_xpos(i,:)); % 处理x负方向PML边界 Ez_pml_xneg(i,:) = (1-kappamax*dt*sigmax(i))... /(1+kappamax*dt*sigmax(i))*Ez_pml_xneg(i,:)... +(dt/epsz/dx)*(Hy_pml_xneg(i,:) - Hy(i,:)); Hx_pml_xneg(i,:) = Hx_pml_xneg(i,:)... + (dt/mu0/dy)*(Ez_pml_xneg(i,2:Ny) - Ez_pml_xneg(i,1:Ny-1)); Hy_pml_xneg(i,:) = Hy_pml_xneg(i,:)... - (dt/mu0/dx)*(Ez_pml_xneg(i+1,:) - Ez_pml_xneg(i,:)); % 处理y正方向PML边界 Ez_pml_ypos(:,i) = (1-kappamay*dt*sigmay(Ny-i+1))... /(1+kappamay*dt*sigmay(Ny-i+1))*Ez_pml_ypos(:,i)... +(dt/epsz/dy)*(Hx_pml_ypos(:,i) - Hx(:,Ny-i+1)); Hx_pml_ypos(:,i) = Hx_pml_ypos(:,i)... + (dt/mu0/dy)*(Ez_pml_ypos(2:Nx,i) - Ez_pml_ypos(1:Nx-1,i)); Hy_pml_ypos(:,i) = Hy_pml_ypos(:,i)... - (dt/mu0/dx)*(Ez_pml_ypos(2:Nx,i+1) - Ez_pml_ypos(1:Nx-1,i)); % 处理y负方向PML边界 Ez_pml_yneg(:,i) = (1-kappamay*dt*sigmay(i))... /(1+kappamay*dt*sigmay(i))*Ez_pml_yneg(:,i)... +(dt/epsz/dy)*(Hx_pml_yneg(:,i) - Hx(:,i)); Hx_pml_yneg(:,i) = Hx_pml_yneg(:,i)... - (dt/mu0/dy)*(Ez_pml_yneg(2:Nx,i) - Ez_pml_yneg(1:Nx-1,i)); Hy_pml_yneg(:,i) = Hy_pml_yneg(:,i)... + (dt/mu0/dx)*(Ez_pml_yneg(2:Nx,i+1) - Ez_pml_yneg(1:Nx-1,i)); end % 将场值从PML边界拷贝到计算区域 Ez(Nx-npml+1:Nx,:) = Ez_pml_xpos(npml:-1:1,:); Ez(1:npml,:) = Ez_pml_xneg(npml:-1:1,:); Ez(:,Ny-npml+1:Ny) = Ez_pml_ypos(:,npml:-1:1); Ez(:,1:npml) = Ez_pml_yneg(:,npml:-1:1); Hy(Nx-npml+1:Nx,:) = Hy_pml_xpos(npml:-1:1,:); Hy(1:npml,:) = Hy_pml_xneg(npml:-1:1,:); Hy(:,Ny-npml+1:Ny) = Hy_pml_ypos(:,npml:-1:1); Hy(:,1:npml) = Hy_pml_yneg(:,npml:-1:1); Hx(Nx-npml+1:Nx,:) = Hx_pml_xpos(npml:-1:1,:); Hx(1:npml,:) = Hx_pml_xneg(npml:-1:1,:); Hx(:,Ny-npml+1:Ny) = Hx_pml_ypos(:,npml:-1:1); Hx(:,1:npml) = Hx_pml_yneg(:,npml:-1:1); % 绘制当前时刻的场分布 imagesc(abs(Ez)'); colormap(jet); colorbar; axis equal; axis([0 Ny 0 Nx]); xlabel('y (格点)'); ylabel('x (格点)'); title(sprintf('二维PML边界,TEz模式的FDTD (时间 %.2f 纳秒)', n*dt*1e9)); drawnow; end ``` 请将这段程序保存为一个 .m 文件并在 Matlab 中运行,程序会在计算过程中每个时刻绘制出当前时刻的场分布,并在计算结束后输出完整的计算结果。程序可能需要一些时间才能运行完毕,具体计算时间取决于计算区域和时间步长的大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝科研社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值