24小时热门版块排行榜    

查看: 4770  |  回复: 11
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

zuzero

铁虫 (小有名气)

[交流] [交流]分享Matlab写的PML吸收边界条件。代码很精简 已有11人参与

%% 2-D FDTD PML吸收边界条件,点源辐射验证
% TE
clc;
clear;
fs = 20;
ft = 1.5;
% 边界的下标,垂直于x轴的
% 网格
Nsign = [1 -1];
diagSign = diag(Nsign);
Nx = 250;
Ny = 250;
% 吸收层厚度
Na = 20;
bxREx = 1 : Nx;
bxiREy = 2 : Nx;
byREy = 1 : Ny;
byiREx = 2 : Ny;
bxRH = 1 : Nx;
byRH = 1 : Ny;
% 场量
Hzx = zeros(Nx, Ny);
Hzy = zeros(Nx, Ny);
Ex = zeros(Nx, Ny + 1);
Ey = zeros(Nx + 1, Ny);
sigmamx = Hzx;
sigmamy = Hzy;
sigmax = Ey;
sigmay = Ex;
% 设定参数
% 最大电导率
sigmaMax = 0.2;
% 线性变化
sigma = sigmaMax * (Na : -1 : 1) / Na;
sigmam = sigmaMax * (2 * Na - 1 : -2 : 1) / 2 / Na;
sigmax([1 : Na, end : -1 : end - Na + 1], = repmat([sigma, sigma]', 1, Ny);
sigmamx([1 : Na, end : -1 : end - Na + 1], = repmat([sigmam, sigmam]', 1, Ny);
sigmay(:, [1 : Na, end : -1 : end - Na + 1]) = repmat([sigma, sigma], Nx, 1);
sigmamy(:, [1 : Na, end : -1 : end - Na + 1]) = repmat([sigmam, sigmam], Nx, 1);
% 计算系数
f1Ex = exp(-sigmay(bxREx, byiREx));
f1Ey = exp(-sigmax(bxiREy, byREy));
f2Ex = zeros(size(Ex));
f2Ey = zeros(size(Ey));
f2Ex(sigmay == 0) = 1 / ft;
f2Ey(sigmax == 0) = 1 / ft;
f2Ex(sigmay ~= 0) = (1 - exp(-sigmay(sigmay ~= 0))) ./ sigmay(sigmay ~= 0) / ft;
f2Ey(sigmax ~= 0) = (1 - exp(-sigmax(sigmax ~= 0))) ./ sigmax(sigmax ~= 0) / ft;
f2Ex = f2Ex(bxREx, byiREx);
f2Ey = f2Ey(bxiREy, byREy);

f1Hzx = exp(-sigmamx);
f1Hzy = exp(-sigmamy);
f2Hzx = zeros(size(Hzx));
f2Hzy = zeros(size(Hzy));
f2Hzx(sigmamx == 0) = 1 / ft;
f2Hzy(sigmamy == 0) = 1 / ft;
f2Hzx(sigmamx ~= 0) = (1 - exp(-sigmamx(sigmamx ~= 0))) ./ sigmamx(sigmamx ~= 0) / ft;
f2Hzy(sigmamy ~= 0) = (1 - exp(-sigmamy(sigmamy ~= 0))) ./ sigmamy(sigmamy ~= 0) / ft;
% 中心位置
centerX = floor((1 + Nx) / 2);
centerY = floor((1 + Ny) / 2);
% 迭代
for nn = 1 : 500
%     激励
    Hzx(centerX, centerY) = Hzx(centerX, centerY) + sin(2 * pi * nn / ft / fs);
    Hzy(centerX, centerY) = Hzy(centerX, centerY) + sin(2 * pi * nn / ft / fs);
%     更新E
    Ex(bxREx, byiREx) = f1Ex .* Ex(bxREx, byiREx) + f2Ex .* (Hzx(bxREx, byiREx) - Hzx(bxREx, byiREx - 1) + Hzy(bxREx, byiREx) - Hzy(bxREx, byiREx - 1));
    Ey(bxiREy, byREy) = f1Ey .* Ey(bxiREy, byREy) - f2Ey .* (Hzx(bxiREy, byREy) - Hzx(bxiREy - 1, byREy) + Hzy(bxiREy, byREy) - Hzy(bxiREy - 1, byREy));
%     更新H
    Hzx = f1Hzx .* Hzx - f2Hzx .* (Ey(bxRH + 1, - Ey(bxRH, );
    Hzy = f1Hzy .* Hzy + f2Hzy .* (Ex(:, byRH + 1) - Ex(:, byRH));
end
% 显示
figure('color', 'white');
imagesc(Hzx + Hzy);
colorbar;
axis image;



希望能对大家有所帮助。
下面是计算结果
回复此楼

» 收录本帖的淘帖专辑推荐

薄膜制备 表征 科研学习 matlab

» 本帖已获得的红花(最新10朵)

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

欢迎来我的个人主页,方便学术交流与合作:jijinzu.buaa.edu.cn
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

hfhhfh44

银虫 (初入文坛)


小木虫: 金币+0.5, 给个红包,谢谢回帖
LZ   我就试了试咋一点反应都没呢
9楼2013-12-29 16:50:57
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 12 个回答

alence

木虫 (著名写手)


小木虫(金币+0.5):给个红包,谢谢回帖
nice
要是三维的就更好了
知足常乐
2楼2011-08-22 19:56:16
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cbyhoo

新虫 (初入文坛)


小木虫: 金币+0.5, 给个红包,谢谢回帖
送鲜花一朵
非常感谢,呵呵,多向楼主请教啊
5楼2012-05-12 13:56:22
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

kevin123581

金虫 (正式写手)


小木虫: 金币+0.5, 给个红包,谢谢回帖
送鲜花一朵
感谢啊  我做的PML完全没有吸收效果。。。头疼
6楼2012-05-24 18:18:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见