一、核心流程
- 网格划分:定义计算区域与PML边界厚度
- 波动方程离散化:采用FDTD方法离散波动方程
- PML参数设置:定义电导率/磁导率随空间的多项式分布
- 时间迭代:交替更新电场与磁场分量
- 边界处理:通过PML吸收边界条件抑制反射
- 可视化:动态展示波场传播过程
二、MATLAB代码实现
1. 参数初始化与网格划分
matlab
% 参数设置
nx = 200; nz = 100; % 计算区域网格数
dx = 10; dz = 10; % 网格步长 (m)
dt = 0.001; % 时间步长 (s)
nt = 500; % 总时间步数
% PML参数
bound_width = 20; % PML边界厚度 (网格数)
grading_order = 4; % 多项式阶数
refl_coeff = 1e-6; % 目标反射系数
% 介质参数
epsilon = 1.0 * ones(nx,nz); % 介电常数
mu = 1.0 * ones(nx,nz); % 磁导率
sigma_max = (-log10(refl_coeff)*(grading_order+1)*epsilon(1)*mu(1))/(2*bound_width*dx); % 最大电导率
2. PML电导率/磁导率初始化
matlab
% 电导率分布(Berenger分裂场模型)
sigma_x = zeros(nx,nz);
sigma_y = zeros(nx,nz);
for i = 1:nx
for j = 1:nz
dist_x = min(i-1, nx-i);
dist_y = min(j-1, nz-j);
sigma_x(i,j) = sigma_max*(dist_x/bound_width)^(grading_order+1);
sigma_y(i,j) = sigma_max*(dist_y/bound_width)^(grading_order+1);
end
end
% 磁导率修正(CPML)
sigma_star_x = sigma_x .* mu ./ epsilon;
sigma_star_y = sigma_y .* mu ./ epsilon;
3. 场量初始化与源设置
matlab
% 场量定义(TE模式:Ez, Hx, Hy)
Ez = zeros(nx,nz);
Hx = zeros(nx,nz);
Hy = zeros(nx,nz);
% 高斯脉冲源(中心频率100MHz)
t0 = 20/dt; % 脉冲延迟
source_pos = [round(nx/2), round(nz/2)]; % 源位置
for n = 1:nt
time = (n-1)*dt;
source = exp(-((time - t0)/10).^2) .* cos(2*pi*100e6*(time - t0));
Ez(source_pos(1), source_pos(2)) = source;
end
4. 时间迭代与场更新
matlab
% 系数预计算
C_Ez = (1 - sigma_x*dt/epsilon) ./ (1 + sigma_x*dt/epsilon);
D_Ez = dt ./ (epsilon*(1 + sigma_x*dt/epsilon));
C_Hx = (1 - sigma_y*dt/mu) ./ (1 + sigma_y*dt/mu);
D_Hx = dt ./ (mu*(1 + sigma_y*dt/mu));
C_Hy = (1 - sigma_x*dt/mu) ./ (1 + sigma_x*dt/mu);
D_Hy = dt ./ (mu*(1 + sigma_x*dt/mu));
% 主循环
for n = 1:nt
% 更新磁场(Hx, Hy)
Hx(2:end-1,:) = Hx(2:end-1,:) + (D_Hx(2:end-1,:) .* (Ez(2:end,:) - Ez(1:end-1,:)')) / dx;
Hy(:,2:end-1) = Hy(:,2:end-1) - (D_Hy(:,2:end-1) .* (Ez(:,2:end) - Ez(:,1:end-1))) / dz;
% 更新电场(Ez)
Ez = C_Ez .* Ez + D_Ez .* ( (Hy(2:end,:) - Hy(1:end-1,:)') / dz - (Hx(:,2:end) - Hx(:,1:end-1)) / dx );
% PML边界处理(吸收层)
Ez(1:bound_width,:) = 0; % 左右边界
Ez(:,1:bound_width) = 0; % 前边界
Ez(:,end-bound_width+1:end) = 0;% 后边界
end
5. 可视化与动画生成
matlab
% 动态波场显示
figure;
for k = 1:50:nt
pcolor(Ez); shading interp; colormap(jet);
title(sprintf('Time Step: %d', k));
axis equal tight; drawnow;
% 生成GIF
frame = getframe(gcf);
im = frame2im(frame);
[imind,cm] = rgb2ind(im,256);
if k==1
imwrite(imind,cm,'wave_pml.gif','gif','Loopcount',inf,'DelayTime',0.05);
else
imwrite(imind,cm,'wave_pml.gif','gif','WriteMode','append','DelayTime',0.05);
end
end
三、关键优化与验证
1. PML性能验证
-
反射系数计算:在边界附近设置监测点,计算反射能量占比
matlabreflection = sum(abs(Ez(1:bound_width,end/2) - Ez(1:bound_width,end/2-1))); fprintf('反射系数: %.2e\n', reflection); -
收敛性测试 :调整
bound_width(建议≥10λ)和grading_order(4-6阶)
2. 计算效率优化
-
GPU加速 :使用
gpuArray加速大规模计算matlabEz_gpu = gpuArray(Ez); % 后续场更新步骤替换为GPU运算 -
稀疏矩阵 :对系数矩阵
C_Ez等使用稀疏存储
3. 多物理场扩展
- 弹性波模拟:引入密度与拉梅常数,扩展为矢量场更新
- 电磁波散射:添加金属圆柱等散射体,验证PML吸收效果
四、典型应用场景
- 地震波勘探:模拟地下介质中的声波传播与反射
- 天线设计:分析电磁波在PML边界内的辐射特性
- 医学成像:模拟超声在人体组织中的传播与衰减
参考代码 二维波场模拟程序,使用pml边界条件生成波场 www.youwenfan.com/contentcsp/98635.html
五、参考
- 理论基础 :
- Sullivan D M. Electromagnetic Simulation Using the FDTD Method. Wiley, 2012.
- Berenger J P. A Perfectly Matched Layer for the Absorption of Electromagnetic Waves. J. Comp. Phys., 1994.
- 代码实现 :
- :含PML的2D FDTD MATLAB代码实现
- :开源FDTD-PML仿真工具包
六、注意事项
- 网格匹配:PML厚度需≥10个波长以避免倏逝波穿透
- 时间步长 :满足Courant条件:
dt ≤ dx/(c*sqrt(3))(三维) - 边界对称性:非对称问题需使用CPML(复坐标拉伸PML)