f(i,j)=(1/epsa)*Pf+(1/epsb)*(1-Pf);
else
f(i,j)=(1/epsa-1/epsb)*Pf*2*besselj(1,Gij*Rc)/(Gij*Rc);
end;
end;
end;
%定义简约布里渊区的各高对称点
switchlatticetype
case1
T=(2*pi/a)*[epssys0];
M=(2*pi/a)*[1/21/2];
X=(2*pi/a)*[1/20];
case0
T=(2*pi/a)*[epssys0];
M=(2*pi/a)*[sqrt(3)/30];
K=(2*pi/a)*[sqrt(3)/31/3];
end;
%对于简约布里渊区边界上的每个k,求解其特征频率
THETA_TM=zeros(NG,NG);%待解的TM波矩阵
THETA_TE=zeros(NG,NG);%待解的TE波矩阵
Nkpoints=10;%每个方向上取的点数,
stepsize=0:
1/(Nkpoints-1):
1;%每个方向上的步长
switchlatticetype
case1
TX_TM_eig=zeros(Nkpoints,NG);%沿TX方向的TM波的待解的特征频率矩阵
TX_TE_eig=zeros(Nkpoints,NG);%沿TX方向的TE波的待解的特征频率矩阵
XM_TM_eig=zeros(Nkpoints,NG);%沿XM方向的TM波的待解的特征频率矩阵
XM_TE_eig=zeros(Nkpoints,NG);%沿XM方向的TE波的待解的特征频率矩阵
MT_TM_eig=zeros(Nkpoints,NG);%沿MT方向的TM波的待解的特征频率矩阵
MT_TE_eig=zeros(Nkpoints,NG);%沿MT方向的TE波的待解的特征频率矩阵
case0
TM_TM_eig=zeros(Nkpoints,NG);%沿TM方向的TM波的待解的特征频率矩阵
TM_TE_eig=zeros(Nkpoints,NG);%沿TM方向的TE波的待解的特征频率矩阵
MK_TM_eig=zeros(Nkpoints,NG);%沿MK方向的TM波的待解的特征频率矩阵
MK_TE_eig=zeros(Nkpoints,NG);%沿MK方向的TE波的待解的特征频率矩阵
KT_TM_eig=zeros(Nkpoints,NG);%沿KT方向的TM波的待解的特征频率矩阵
KT_TE_eig=zeros(Nkpoints,NG);%沿KT方向的TE波的待解的特征频率矩阵
end;
forn=1:
Nkpoints
fprintf(['\nk-point:
',int2str(n),'of',int2str(Nkpoints),'.\n']);
%对于TX(正方格子)或TM(三角格子)方向上的每个k值,
%求解其特征频率
switchlatticetype
case1
TX_step=stepsize(n)*(X-T)+T;
case0
TM_step=stepsize(n)*(M-T)+T;
end;
%先求非对角线上的元素
fori=1:
(NG-1)
forj=(i+1):
NG
switchlatticetype
case1
kGi=TX_step+G(i,:
);
kGj=TX_step+G(j,:
);
case0
kGi=TM_step+G(i,:
);
kGj=TM_step+G(j,:
);
end;
THETA_TM(i,j)=f(i,j)*norm(kGi)*norm(kGj);
THETA_TM(j,i)=conj(THETA_TM(i,j));
THETA_TE(i,j)=f(i,j)*dot(kGi,kGj);
THETA_TE(j,i)=conj(THETA_TE(i,j));
end;
end;
%%%%%
%再求对角线上的元素
%%%%%
fori=1:
NG
switchlatticetype
case1
kGi=TX_step+G(i,:
);
case0
kGi=TM_step+G(i,:
);
end;
THETA_TM(i,i)=f(i,i)*norm(kGi)*norm(kGi);
THETA_TE(i,i)=f(i,i)*norm(kGi)*norm(kGi);
end;
%求解TX(正方格子)或TM(三角格子)方向上的k矩阵的特征频率
switchlatticetype
case1
TX_TM_eig(n,:
)=sort(sqrt(eig(THETA_TM))).';
TX_TE_eig(n,:
)=sort(sqrt(eig(THETA_TE))).';
case0
TM_TM_eig(n,:
)=sort(sqrt(eig(THETA_TM))).';
TM_TE_eig(n,:
)=sort(sqrt(eig(THETA_TE))).';
end;
%对于XM(正方格子)或MK(三角格子)方向上的每个k值,
%求解其特征频率
switchlatticetype
case1
XM_step=stepsize(n)*(M-X)+X;
case0
MK_step=stepsize(n)*(K-M)+M;
end;
%先求非对角线上的元素
fori=1:
(NG-1)
forj=(i+1):
NG
switchlatticetype
case1
kGi=XM_step+G(i,:
);
kGj=XM_step+G(j,:
);
case0
kGi=MK_step+G(i,:
);
kGj=MK_step+G(j,:
);
end;
THETA_TM(i,j)=f(i,j)*norm(kGi)*norm(kGj);
THETA_TM(j,i)=conj(THETA_TM(i,j));
THETA_TE(i,j)=f(i,j)*dot(kGi,kGj);
THETA_TE(j,i)=conj(THETA_TE(i,j));
end;
end;
%再求对角线上的元素
fori=1:
NG
switchlatticetype
case1
kGi=XM_step+G(i,:
);
case0
kGi=MK_step+G(i,:
);
end;
THETA_TM(i,i)=f(i,i)*norm(kGi)*norm(kGi);
THETA_TE(i,i)=f(i,i)*norm(kGi)*norm(kGi);
end;
%求解XM(正方格子)或MK(三角格子)方向上的k矩阵的特征频率
switchlatticetype
case1
XM_TM_eig(n,:
)=sort(sqrt(eig(THETA_TM))).';
XM_TE_eig(n,:
)=sort(sqrt(eig(THETA_TE))).';
case0
MK_TM_eig(n,:
)=sort(sqrt(eig(THETA_TM))).';
MK_TE_eig(n,:
)=sort(sqrt(eig(THETA_TE))).';
end;
%对于MT(正方格子)或KT(三角格子)方向上的每个k值,
%求解其特征频率
switchlatticetype
case1
MT_step=stepsize(n)*(T-M)+M;
case0
KT_step=stepsize(n)*(T-K)+K;
end;
%先求非对角线上的元素
fori=1:
(NG-1)
forj=(i+1):
NG
switchlatticetype
case1
kGi=MT_step+G(i,:
);
kGj=MT_step+G(j,:
);
case0
kGi=KT_step+G(i,:
);
kGj=KT_step+G(j,:
);
end;
THETA_TM(i,j)=f(i,j)*norm(kGi)*norm(kGj);
THETA_TM(j,i)=conj(THETA_TM(i,j));
THETA_TE(i,j)=f(i,j)*dot(kGi,kGj);
THETA_TE(j,i)=conj(THETA_TE(i,j));
end;
end;
%再求对角线上的元素
fori=1:
NG
switchlatticetype
case1
kGi=MT_step+G(i,:
);
case0
kGi=KT_step+G(i,:
);
end;
THETA_TM(i,i)=f(i,i)*norm(kGi)*norm(kGi);
THETA_TE(i,i)=f(i,i)*norm(kGi)*norm(kGi);
end;
%求解TX(正方格子)或TM(三角格子)方向上的k矩阵的特征频率
switchlatticetype
case1
MT_TM_eig(n,:
)=sort(sqrt(eig(THETA_TM))).';
MT_TE_eig(n,:
)=sort(sqrt(eig(THETA_TE))).';
case0
KT_TM_eig(n,:
)=sort(sqrt(eig(THETA_TM))).';
KT_TE_eig(n,:
)=sort(sqrt(eig(THETA_TE))).';
end;
end%这个是'forn=1:
Nkpoints'(115行)的循环结束
fprintf('\nCalculationTime:
%dsec',toc)
savepbs2D
%以下部分是绘制光子晶体光子带图
%首先将特定方向(正方格子:
TX,XM,MT;三角格子:
TM,MK,KT)离散化
switchlatticetype
case1
kaxis=0;
TXaxis=kaxis:
norm(T-X)/(Nkpoints-1):
(kaxis+norm(T-X));
kaxis=kaxis+norm(T-X);
XMaxis=kaxis:
norm(X-M)/(Nkpoints-1):
(kaxis+norm(X-M));
kaxis=kaxis+norm(X-M);
MTaxis=kaxis:
norm(M-T)/(Nkpoints-1):
(kaxis+norm(M-T));
kaxis=kaxis+norm(M-T);
case0
kaxis=0;
TMaxis=kaxis:
norm(T-M)/(Nkpoints-1):
(kaxis+norm(T-M));
kaxis=kaxis+norm(T-M);
MKaxis=kaxis:
norm(M-K)/(Nkpoints-1):
(kaxis+norm(M-K));
kaxis=kaxis+norm(M-K);
KTaxis=kaxis:
norm(K-T)/(Nkpoints-1):
(kaxis+norm(K-T));
kaxis=kaxis+norm(K-T);
end;
Ntraject=3;%所需绘制的特定方向的数目
EigFreq_TM=zeros(Ntraject*Nkpoints,1);
EigFreq_TE=zeros(Ntraject*Nkpoints,1);
figure
(1)
holdon;
Nk=Nkpoints;
fork=1:
NG
fori=1:
Nkpoints
switchlatticetype
case1
EigFreq_TM(i+0*Nk)=TX_TM_eig(i,k)/(2*pi/a);
EigFreq_TM(i+1*Nk)=XM_TM_eig(i,k)/(2*pi/a);
EigFreq_TM(i+2*Nk)=MT_TM_eig(i,k)/(2*pi/a);
EigFreq_TE(i+0*Nk)=TX_TE_eig(i,k)/(2*pi/a);
EigFreq_TE(i+1*Nk)=XM_TE_eig(i,k)/(2*pi/a);
EigFreq_TE(i+2*Nk)=MT_TE_eig(i,k)/(2*pi/a);
case0
EigFreq_TM(i+0*Nk)=TM_TM_eig(i,k)/(2*pi/a);
EigFreq_TM(i+1*Nk)=MK_TM_eig(i,k)/(2*pi/a);
EigFreq_TM(i+2*Nk)=KT_TM_eig(i,k)/(2*pi/a);
EigFreq_TE(i+0*Nk)=TM_TE_eig(i,k)/(2*pi/a);
EigFreq_TE(i+1*Nk)=MK_TE_eig(i,k)/(2*pi/a);
EigFreq_TE(i+2*Nk)=KT_TE_eig(i,k)/(2*pi/a);
end;
end;%fork=1:
Nkpoints的结束
switchlatticetype
case1
plot(TXaxis(1:
Nk),EigFreq_TM(1+0*Nk:
1*Nk),'b',...
XMaxis(1:
Nk),EigFreq_TM(1+1*Nk:
2*Nk),'b',...
MTaxis(1:
Nk),EigFreq_TM(1+2*Nk:
3*Nk),'b');
plot(TXaxis(1:
Nk),EigFreq_TE(1+0*Nk:
1*Nk),'r',...
XMaxis(1:
Nk),EigFreq_TE(1+1*Nk:
2*Nk),'r',...
MTaxis(1:
Nk),EigFreq_TE(1+2*Nk:
3*Nk),'r');
case0
plot(TMaxis(1:
Nk),EigFreq_TM(1+0*Nk:
1*Nk),'b',...
MKaxis(1:
Nk),EigFreq_TM(1+1*Nk:
2*Nk),'b',...
KTaxis(1:
Nk),EigFreq_TM(1+2*Nk:
3*Nk),'b');
plot(TMaxis(1:
Nk),EigFreq_TE(1+0*Nk:
1*Nk),'r',...
MKaxis(1:
Nk),EigFreq_TE(1+1*Nk:
2*Nk),'r',...
KTaxis(1:
Nk),EigFreq_TE(1+2*Nk:
3*Nk),'r');
end;
end;%fork=1:
NG的结束
gridon;
holdoff;
titlestr='2DPhotonicbandstructurefor';
switchlatticetype
case1
titlestr=[titlestr,'square'];
case0
titlestr=[titlestr,'triangle'];
end;
titlestr=[titlestr,'latticeofdielectriccolumns.'];
titlestr=[titlestr,'(epsa=',num2str(epsa),'epsb=',...
num2str(epsb),')'];
title(titlestr);
xlabel('k-Space');
ylabel('Frequency(\omegaa/2\piC)');
switchlatticetype
case1
axis([0MTaxis(Nkpoints)01]);
set(gca,'XTick',[TXaxis
(1)...
TXaxis(Nkpoints)...
XMaxis(Nkpoints)...
MTaxis(Nkpoints)]);
xtixlabel=strvcat('T','X','M','T');
case0
axis([0KTaxis(Nkpoints)01]);
set(gca,'XTick',[TMaxis
(1)...
TMaxis(Nkpoints)...
MKaxis(Nkpoints)...
KTaxis(Nkpoints)]);
xtixlabel=strvcat('T','M','K','T');
end;
set(gca,'XTickLabel',xtixlabel);
end