• 二维光子晶体带隙仿真Matlab完全程序_平面波展开法


    本程序为二维光子晶体Matlab仿真程序,该结果与文献【1】Molding the flow of light,p68 figure 2相互吻合

     

    主程序

    %This is a simple demo for Photonic Crystals simulation
    %10 points is considered.
    %---------------------------------------M
    %| / |
    %| / |
    %| / |
    %| --------------------|X
    %| T |
    %| |
    %| |
    %---------------------------------------
    %by Gao Haikuo
    %date:20170411
    clear; clc; epssys=1.0e-6; %设定一个最小量,避免系统截断误差或除0错误
    global NG G f Nkpoints
    %this is the lattice vector and the reciprocal lattice vector
    a=1; a1=a*[1 0]; a2=a*[0 1];
    b1=2*pi/a*[1 0];b2=2*pi/a*[0 1];
    Nkpoints=10; %每个方向上取的点数,
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %定义晶格的参数
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    epsa = 8.9; %inner
    epsb = 1; %outer
    Pf = 0.1257; %Pf = Ac/Au 填充率,可根据需要自行设定
    Au =a^2; %二维格子原胞面积
    Rc = (Pf *Au/pi)^(1/2); %介质柱截面半径
    Ac = pi*(Rc)^2; %介质柱横截面积

    %construct the G list
    NrSquare = 10;
    NG =(2*NrSquare+1)^2; % NG is the number of the G value
    G = zeros(NG,2);
    i = 1;
    for l = -NrSquare:NrSquare
    for m = -NrSquare:NrSquare
    G(i,:)=l*b1+m*b2;
    i = i+1;
    end
    end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %生成k空间中的f(Gi-Gj)的值,i,j 从1到NG。
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    f=zeros(NG,NG);
    for i=1:NG
    for j=1:NG
    Gij=norm(G(i,:)-G(j,:));
    if (Gij < epssys)
    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;
    T=(2*pi/a)*[epssys 0];
    M=(2*pi/a)*[1/2 1/2];
    X=(2*pi/a)*[1/2 0];
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    [MT_TE_eig]=getEigValue(M,T,0);
    [TX_TE_eig]=getEigValue(T,X,0);
    [XM_TE_eig]=getEigValue(X,M,0);
    [MT_TM_eig]=getEigValue(M,T,1);
    [TX_TM_eig]=getEigValue(T,X,1);
    [XM_TM_eig]=getEigValue(X,M,1);
    %draw
    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);

    Ntraject = 3;
    figure (1)
    hold on;
    Nk=Nkpoints;
    for k=1:NG
    for i=1:Nkpoints
    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);
    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);
    end
    linehandle=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',...
    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',...
    'LineWidth',1 );
    set (linehandle, 'linesmoothing', 'on');
    end
    grid on;
    xlabel('K-Space');
    yLabel('Frequency(omegaa/2piC)');
    axis([0 MTaxis(Nkpoints) 0 0.8]);
    set(gca,'XTick',[TXaxis(1), TXaxis(Nkpoints),...
    XMaxis(Nkpoints),MTaxis(Nkpoints)]);
    xtixlabel = strvcat('T','X','M','T');
    set(gca,'XTickLabel',xtixlabel);

    核心获取本征值的函数

    function [eigValue]=getEigValue(k_begin,k_end,mode)
    %mode :0 for TE 1 for TH
    global NG G f Nkpoints
    THETA=zeros(NG,NG); %待解的TE波矩阵
    stepsize=0:1/(Nkpoints-1):1; %每个方向上的步长
    TX_TE_eig = zeros(Nkpoints,NG); 
    for n=1:Nkpoints %scan the 10 points along the direction
        fprintf(['
     k-point:',int2str(n),'of',int2str(Nkpoints),'.
    ']);
        step = stepsize(n)*(k_end-k_begin)+k_begin;  % get the k
        for i=1:(NG-1)   % G
            for j=(i+1):NG % G'
                kGi = step+G(i,:); %k+G
                kGj = step+G(j,:); %K+G'
                switch mode
                    case 0  %TE mode
                        THETA(i,j)=f(i,j)*dot(kGi,kGj); %(K+G)(K+G')f(G-G')
                    case 1 %TH mode
                         THETA(i,j)=f(i,j)*norm(kGi)*norm(kGj);
                end
                THETA(j,i)=conj(THETA(i,j)); 
            end
        end    
        for i=1:NG
            kGi = step+G(i,:);
            THETA(i,i)=f(i,i)*norm(kGi)*norm(kGi); 
        end
        eigValue(n,:)=sort(sqrt(eig(THETA))).';
    end
  • 相关阅读:
    验证 Email
    取系统时间
    DbHelperSQL.cs
    显示BYTE流图片
    [原]c# 读取文本文件(txt)
    数据库文件组和文件的作用
    Transact—SQL
    m_pMainWnd
    sql server 2005 window 身份证验证模式与SQL Server身份验证
    WM_CLOSE WM_DESTROY WM_QUIT
  • 原文地址:https://www.cnblogs.com/Iknowyou/p/6705250.html
Copyright © 2020-2023  润新知