wgmodes.m
来自「强大的计算电磁场本征函数与本征模的程序」· M 代码 · 共 499 行 · 第 1/2 页
M
499 行
exx2.*exx3./ezz3./ew23 + ...
w.*(exx2.*exx4 - exx1.*exx3)./ew23./ew14)./(n+s);
ayxw = (exx3.*exx2./ezz2./ew23 - ...
exx4.*exx1./ezz1./ew14 + ...
e.*(exx4.*exx2 - exx1.*exx3)./ew23./ew14)./(n+s);
axye = (eyy4.*(1-eyy3./ezz3) - eyy3.*(1-eyy4./ezz4))./ns34./(e+w) - ...
2*(eyx1.*eyy2./ezz1.*n.*w./ns21 + ...
eyx2.*eyy1./ezz2.*s.*w./ns21 + ...
eyx4.*eyy3./ezz4.*n.*e./ns34 + ...
eyx3.*eyy4./ezz3.*s.*e./ns34 + ...
eyy1.*eyy2.*(1./ezz1-1./ezz2).*w.^2./ns21 + ...
eyy3.*eyy4.*(1./ezz4-1./ezz3).*e.*w./ns34)./e./(e+w).^2;
axyw = (eyy2.*(1-eyy1./ezz1) - eyy1.*(1-eyy2./ezz2))./ns21./(e+w) - ...
2*(eyx4.*eyy3./ezz4.*n.*e./ns34 + ...
eyx3.*eyy4./ezz3.*s.*e./ns34 + ...
eyx1.*eyy2./ezz1.*n.*w./ns21 + ...
eyx2.*eyy1./ezz2.*s.*w./ns21 + ...
eyy4.*eyy3.*(1./ezz3-1./ezz4).*e.^2./ns34 + ...
eyy2.*eyy1.*(1./ezz2-1./ezz1).*w.*e./ns21)./w./(e+w).^2;
ayxn = (exx4.*(1-exx1./ezz1) - exx1.*(1-exx4./ezz4))./ew14./(n+s) - ...
2*(exy3.*exx2./ezz3.*e.*s./ew23 + ...
exy2.*exx3./ezz2.*w.*s./ew23 + ...
exy4.*exx1./ezz4.*e.*n./ew14 + ...
exy1.*exx4./ezz1.*w.*n./ew14 + ...
exx3.*exx2.*(1./ezz3-1./ezz2).*s.^2./ew23 + ...
exx1.*exx4.*(1./ezz4-1./ezz1).*n.*s./ew14)./n./(n+s).^2;
ayxs = (exx2.*(1-exx3./ezz3) - exx3.*(1-exx2./ezz2))./ew23./(n+s) - ...
2*(exy4.*exx1./ezz4.*e.*n./ew14 + ...
exy1.*exx4./ezz1.*w.*n./ew14 + ...
exy3.*exx2./ezz3.*e.*s./ew23 + ...
exy2.*exx3./ezz2.*w.*s./ew23 + ...
exx4.*exx1.*(1./ezz1-1./ezz4).*n.^2./ew14 + ...
exx2.*exx3.*(1./ezz2-1./ezz3).*s.*n./ew23)./s./(n+s).^2;
axyne = +eyy3.*(1-eyy4./ezz4)./(e+w)./ns34;
axyse = -eyy4.*(1-eyy3./ezz3)./(e+w)./ns34;
axynw = -eyy2.*(1-eyy1./ezz1)./(e+w)./ns21;
axysw = +eyy1.*(1-eyy2./ezz2)./(e+w)./ns21;
ayxne = +exx1.*(1-exx4./ezz4)./(n+s)./ew14;
ayxse = -exx2.*(1-exx3./ezz3)./(n+s)./ew23;
ayxnw = -exx4.*(1-exx1./ezz1)./(n+s)./ew14;
ayxsw = +exx3.*(1-exx2./ezz2)./(n+s)./ew23;
axyp = -(axyn + axys + axye + axyw + axyne + axyse + axynw + axysw) ...
- k^2.*(w.*(n.*eyx1.*eyy2 + s.*eyx2.*eyy1)./ns21 + ...
e.*(s.*eyx3.*eyy4 + n.*eyx4.*eyy3)./ns34)./(e+w);
ayxp = -(ayxn + ayxs + ayxe + ayxw + ayxne + ayxse + ayxnw + ayxsw) ...
- k^2.*(n.*(w.*exy1.*exx4 + e.*exy4.*exx1)./ew14 + ...
s.*(w.*exy2.*exx3 + e.*exy3.*exx2)./ew23)./(n+s);
ii = zeros(nx,ny);
ii(:) = (1:nx*ny);
% NORTH boundary
ib = zeros(nx,1); ib(:) = ii(1:nx,ny);
switch (boundary(1))
case 'S', sign = +1;
case 'A', sign = -1;
case '0', sign = 0;
otherwise,
error('Unrecognized north boundary condition: %s.\n', boundary(1));
end
axxs(ib) = axxs(ib) + sign*axxn(ib);
axxse(ib) = axxse(ib) + sign*axxne(ib);
axxsw(ib) = axxsw(ib) + sign*axxnw(ib);
ayxs(ib) = ayxs(ib) + sign*ayxn(ib);
ayxse(ib) = ayxse(ib) + sign*ayxne(ib);
ayxsw(ib) = ayxsw(ib) + sign*ayxnw(ib);
ayys(ib) = ayys(ib) - sign*ayyn(ib);
ayyse(ib) = ayyse(ib) - sign*ayyne(ib);
ayysw(ib) = ayysw(ib) - sign*ayynw(ib);
axys(ib) = axys(ib) - sign*axyn(ib);
axyse(ib) = axyse(ib) - sign*axyne(ib);
axysw(ib) = axysw(ib) - sign*axynw(ib);
% SOUTH boundary
ib = zeros(nx,1); ib(:) = ii(1:nx,1);
switch (boundary(2))
case 'S', sign = +1;
case 'A', sign = -1;
case '0', sign = 0;
otherwise,
error('Unrecognized south boundary condition: %s.\n', boundary(2));
end
axxn(ib) = axxn(ib) + sign*axxs(ib);
axxne(ib) = axxne(ib) + sign*axxse(ib);
axxnw(ib) = axxnw(ib) + sign*axxsw(ib);
ayxn(ib) = ayxn(ib) + sign*ayxs(ib);
ayxne(ib) = ayxne(ib) + sign*ayxse(ib);
ayxnw(ib) = ayxnw(ib) + sign*ayxsw(ib);
ayyn(ib) = ayyn(ib) - sign*ayys(ib);
ayyne(ib) = ayyne(ib) - sign*ayyse(ib);
ayynw(ib) = ayynw(ib) - sign*ayysw(ib);
axyn(ib) = axyn(ib) - sign*axys(ib);
axyne(ib) = axyne(ib) - sign*axyse(ib);
axynw(ib) = axynw(ib) - sign*axysw(ib);
% EAST boundary
ib = zeros(1,ny); ib(:) = ii(nx,1:ny);
switch (boundary(3))
case 'S', sign = +1;
case 'A', sign = -1;
case '0', sign = 0;
otherwise,
error('Unrecognized east boundary condition: %s.\n', boundary(3));
end
axxw(ib) = axxw(ib) + sign*axxe(ib);
axxnw(ib) = axxnw(ib) + sign*axxne(ib);
axxsw(ib) = axxsw(ib) + sign*axxse(ib);
ayxw(ib) = ayxw(ib) + sign*ayxe(ib);
ayxnw(ib) = ayxnw(ib) + sign*ayxne(ib);
ayxsw(ib) = ayxsw(ib) + sign*ayxse(ib);
ayyw(ib) = ayyw(ib) - sign*ayye(ib);
ayynw(ib) = ayynw(ib) - sign*ayyne(ib);
ayysw(ib) = ayysw(ib) - sign*ayyse(ib);
axyw(ib) = axyw(ib) - sign*axye(ib);
axynw(ib) = axynw(ib) - sign*axyne(ib);
axysw(ib) = axysw(ib) - sign*axyse(ib);
% WEST boundary
ib = zeros(1,ny); ib(:) = ii(1,1:ny);
switch (boundary(4))
case 'S', sign = +1;
case 'A', sign = -1;
case '0', sign = 0;
otherwise,
error('Unrecognized west boundary condition: %s.\n', boundary(4));
end
axxe(ib) = axxe(ib) + sign*axxw(ib);
axxne(ib) = axxne(ib) + sign*axxnw(ib);
axxse(ib) = axxse(ib) + sign*axxsw(ib);
ayxe(ib) = ayxe(ib) + sign*ayxw(ib);
ayxne(ib) = ayxne(ib) + sign*ayxnw(ib);
ayxse(ib) = ayxse(ib) + sign*ayxsw(ib);
ayye(ib) = ayye(ib) - sign*ayyw(ib);
ayyne(ib) = ayyne(ib) - sign*ayynw(ib);
ayyse(ib) = ayyse(ib) - sign*ayysw(ib);
axye(ib) = axye(ib) - sign*axyw(ib);
axyne(ib) = axyne(ib) - sign*axynw(ib);
axyse(ib) = axyse(ib) - sign*axysw(ib);
% Assemble sparse matrix
iall = zeros(1,nx*ny); iall(:) = ii;
is = zeros(1,nx*(ny-1)); is(:) = ii(1:nx,1:(ny-1));
in = zeros(1,nx*(ny-1)); in(:) = ii(1:nx,2:ny);
ie = zeros(1,(nx-1)*ny); ie(:) = ii(2:nx,1:ny);
iw = zeros(1,(nx-1)*ny); iw(:) = ii(1:(nx-1),1:ny);
ine = zeros(1,(nx-1)*(ny-1)); ine(:) = ii(2:nx, 2:ny);
ise = zeros(1,(nx-1)*(ny-1)); ise(:) = ii(2:nx, 1:(ny-1));
isw = zeros(1,(nx-1)*(ny-1)); isw(:) = ii(1:(nx-1), 1:(ny-1));
inw = zeros(1,(nx-1)*(ny-1)); inw(:) = ii(1:(nx-1), 2:ny);
Axx = sparse ([iall,iw,ie,is,in,ine,ise,isw,inw], ...
[iall,ie,iw,in,is,isw,inw,ine,ise], ...
[axxp(iall),axxe(iw),axxw(ie),axxn(is),axxs(in), ...
axxsw(ine),axxnw(ise),axxne(isw),axxse(inw)]);
Axy = sparse ([iall,iw,ie,is,in,ine,ise,isw,inw], ...
[iall,ie,iw,in,is,isw,inw,ine,ise], ...
[axyp(iall),axye(iw),axyw(ie),axyn(is),axys(in), ...
axysw(ine),axynw(ise),axyne(isw),axyse(inw)]);
Ayx = sparse ([iall,iw,ie,is,in,ine,ise,isw,inw], ...
[iall,ie,iw,in,is,isw,inw,ine,ise], ...
[ayxp(iall),ayxe(iw),ayxw(ie),ayxn(is),ayxs(in), ...
ayxsw(ine),ayxnw(ise),ayxne(isw),ayxse(inw)]);
Ayy = sparse ([iall,iw,ie,is,in,ine,ise,isw,inw], ...
[iall,ie,iw,in,is,isw,inw,ine,ise], ...
[ayyp(iall),ayye(iw),ayyw(ie),ayyn(is),ayys(in), ...
ayysw(ine),ayynw(ise),ayyne(isw),ayyse(inw)]);
A = [[Axx Axy];[Ayx Ayy]];
fprintf(1,'nnz(A) = %d\n',nnz(A));
shift = (guess*k)^2;
options.tol = 1e-8;
options.disp = 0; % suppress output
clear Axx Axy Ayx Ayy ...
axxnw axxne axxne ...
axxw axxp axxe ...
axxsw axxse axxse ...
axynw axyne axyne ...
axyw axyp axye ...
axysw axyse axyse ...
ayynw ayyne ayyne ...
ayyw ayyp ayye ...
ayysw ayyse ayyse ...
ayxnw ayxne ayxne ...
ayxw ayxp ayxe ...
ayxsw ayxse ayxse ...
iall ie iw in iw ...
isw inw ine ise ...
exx1 exx2 exx3 exx4 ...
exy1 exy2 exy3 exy4 ...
eyx1 eyx2 eyx3 eyx4 ...
eyy1 eyy2 eyy3 eyy4 ...
ezz1 ezz2 ezz3 ezz4 ...
ns21 ns34 ew14 ew23;
[v,d] = eigs(A,speye(size(A)),nmodes,shift,options);
neff = lambda*sqrt(diag(d))/(2*pi);
phix = zeros(nx,ny,nmodes);
phiy = zeros(nx,ny,nmodes);
temp = zeros(nx,2*ny);
% Normalize modes
temp = zeros(nx*ny,2);
for kk = 1:nmodes;
temp(:) = v(:,kk);
[mag,ii] = max(sqrt(sum(abs(temp).^2,2)));
if abs(temp(ii,1)) > abs(temp(ii,2)),
jj = 1;
else
jj = 2;
end
mag = mag*temp(ii,jj)/abs(temp(ii,jj));
temp = temp/mag;
phix(:,:,kk) = reshape(temp(:,1),nx,ny);
phiy(:,:,kk) = reshape(temp(:,2),nx,ny);
end;
return;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?