⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tmm.m

📁 用传输矩阵的方法来计算光子晶体带隙
💻 M
字号:
function [Qext Qsca Qabs] = TMM(varmLayers,varmFiles,r,m,MaxOrder,WavlenRange)      
%% [Qext Qsca Qabs] = TMM(varmLayers varmFiles r m ...      % Layers
%                         MaxOrder WavlenRange )            % Control
% copyright yhw2005

N = height_y(r);

%% Read refraction index from the input files.
% varm -- Save all the variant refraction indis.
varm = [];
for j = 1:height_y(varmLayers)
    filename = cell2mat(varmFiles(j));
    spe = load(filename);
    varm = [varm; (interp1(spe(:,1)', spe(:,2)', WavlenRange) +...
        interp1(spe(:,1)', spe(:,3)', WavlenRange)*i)];
end
clear spe

%% Main part of this programme,
% where the core matrix M and the scattering coefficients S and T will be
% calculated.

% Initialnize the normalized scattering cross section and extinction cross
% section, Qsca=Csca/(pi*a^2), and Qext=Cext/(pi*a^2).
Qsca=[];
Qext=[];

% Calculate every wavelength.
for wavlen = WavlenRange,
    % Initialization
    Csca_wav = 0;
    Cext_wav = 0;
    for j = 1:height_y(varmLayers)
        m(N+1-varmLayers(j)) = varm(j, find(WavlenRange==wavlen));
    end
    
    % Calculate every order.
    for n = 1:MaxOrder,
        % Scattering Layer
        k = m(1)*2*pi/wavlen;
        rho = k*r(2);
        
        coeff = sqrt(pi/2/rho);
        letBj = besselj(n+1/2,rho);
        letBy = bessely(n+1/2,rho);
        
        psiD = (rho*besselj(n-1+1/2,rho) - n*letBj)*coeff;
        xiD = (rho*bessely(n-1+1/2,rho) - n*letBy)*coeff;
        bj = letBj*coeff;
        by = letBy*coeff;
        M_S = [ bj           by;
                k/rho*psiD   k/rho*xiD ];
        M_T = [ psiD/rho    xiD/rho;
                -k*bj       -k*by    ];
        
        % Generate the transfer matrix from the scattering layer to the core layer.
        for j = 2:N-1,
            % Initialization
            k = m(j)*2*pi/wavlen;
            
            % Transfer matrix for the jth layer at the outer boundary
            rho = k*r(j);
            
            coeff = sqrt(pi/2/rho);
            letBj = besselj(n+1/2,rho);
            letBy = bessely(n+1/2,rho);
        
            psiD = (rho*besselj(n-1+1/2,rho) - n*letBj)*coeff;
            xiD = (rho*bessely(n-1+1/2,rho) - n*letBy)*coeff;
            bj = letBj*coeff;
            by = letBy*coeff;
            M_So = [ bj                 by;
                     k/rho*psiD         k/rho*xiD ];
            M_To = [ psiD/rho       xiD/rho;
                     -k*bj          -k*by ];
                 
            M_S = (M_So(1,1)*M_So(2,2)-M_So(1,2)*M_So(2,1))*...
                [ M_So(2,2)   -M_So(1,2);
                  -M_So(2,1)  M_So(1,1)   ]*M_S;
            M_T = (M_To(1,1)*M_To(2,2)-M_To(1,2)*M_To(2,1))*...
                [ M_To(2,2)   -M_To(1,2);
                  -M_To(2,1)  M_To(1,1)   ]*M_T;
            % Transfer matrix for the jth layer at the inner boundary
            rho = k*r(j+1);
            
            coeff = sqrt(pi/2/rho);
            letBj = besselj(n+1/2,rho);
            letBy = bessely(n+1/2,rho);
            
            psiD = (rho*besselj(n-1+1/2,rho) - n*letBj)*coeff;
            xiD = (rho*bessely(n-1+1/2,rho) - n*letBy)*coeff;
            bj = letBj*coeff;
            by = letBy*coeff;
            M_Si = [ bj             by;
                     k/rho*psiD     k/rho*xiD ];
            M_Ti = [ psiD/rho   xiD/rho;
                     -k*bj      -k*by   ];
            
            M_S = M_Si*M_S;
            M_T = M_Ti*M_T;
            
        end  % layer
        
        % Generate S and T at wavelength=wavlen and order=n.
        k = m(end)*2*pi/wavlen;
        rho = k*r(end);
        
        coeff = sqrt(pi/2/rho);
        letBj = besselj(n+1/2,rho);
        letBy = bessely(n+1/2,rho);
        
        psiD = (rho*besselj(n-1+1/2,rho) - n*letBj)*coeff;
        xiD = (rho*bessely(n-1+1/2,rho) - n*letBy)*coeff;
        bj = letBj*coeff;
        S = (bj*M_S(2,1) - k/rho*psiD*M_S(1,1)) / ...
            (k/rho*psiD*(M_S(1,1)+i*M_S(1,2)) - bj*(M_S(2,1)+i*M_S(2,2)));
        T = (i/rho*psiD*M_T(2,1) + i*k*bj*M_T(1,1)) / ...
            (k*bj*(M_T(1,1)+i*M_T(1,2)) + 1/rho*psiD*(M_T(2,1)+i*M_T(2,2)));
        
        Csca_wav = Csca_wav + (2*n+1)*(S*conj(S)+T*conj(T));
        Cext_wav = Cext_wav + (2*n+1)*real(-S-i*T);
        
    end  % order
    
    % Save the Qsca and Qext at wavelength=wavlen.
    Qsca = [Qsca Csca_wav*2*pi/real(m(1)*2*pi/wavlen)^2/r(end)^2/pi];
    Qext = [Qext Cext_wav*2*pi/real(m(1)*2*pi/wavlen)^2/r(end)^2/pi];
    
end  % wavelength

Qabs = Qext - Qsca;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -