A Análise de Ondas Acopladas Rigorosas (RCWA), também conhecida como Método Modal de Fourier (FMM), é um algoritmo robusto utilizado para calcular a eficiência de difração de grades ópticas. Este método é amplamente empregado na pesquisa e design de dispositivos fotônicos, oferecendo uma abordagem precisa para enalisar a interação de ondas eletromagnéticas com estruturas periódicas.
Processo Central do Algoritmo RCWA
O RCWA opera decompondo a estrutura da grade em múltiplas camadas ao longo do eixo de propagação (eixo z). Cada uma dessas camadas é então caracterizada por sua distribuição de permissividade ou índice de refração, que é expandida em uma série de Fourier. O fluxo de trabalho principal inclui:
- Determinar os coeficientes da série de Fourier da permissividade (
ε(x,y)) para cada camada, formando a matriz[ε]. - Resolver a equação de autovalores para cada camada:
([Kx]² + [Ky]² - ω²μ₀[ε]) * E = 0. - Calcular os autovetores (campos modais) e autovalores (constantes de propagação) resultantes.
- Utilizar a Matriz S (Matriz de Espalhamento) para conectar as soluções de modo entre as camadas, prevenindo instabilidades numéricas.
- Calcular os vetores de Poynting nos portos de transmissão e reflexão para determinar as eficiências de difração.
Modelagem Matemática Essencial
1. Expansão de Fourier
Para uma grade com período \\(\\Lambda\\), a permissividade é expandida em uma série de Fourier da seguinte forma:
\[\varepsilon(x) = \sum_{m=-M}^{M} \varepsilon_m e^{j m K x}, \quad K = \frac{2\pi}{\Lambda} \]
onde \\(M\\) é a ordem de truncamento de Fourier.
2. Equação de Autovalores
A equação característica para os campos elétricos \\(\\mathbf{E}\\) dentro de uma camada, após a aplicação da expansão de Fourier, é expressa como:
\[\left( [K_x][K_x] + [K_y][K_y] - \omega^2 \mu_0 [\varepsilon] \right) \mathbf{E} = 0 \]
Nesta formulação, \\(\[\\varepsilon\]\\) representa a Matriz de Toeplitz dos coeficientes de Fourier da permissividade da camada. \\([K_x]\\) e \\([K_y]\\) são matrizes diagonais dos componentes do vetor de onda no espaço de Fourier.
Implementação em MATLAB (Exemplos de Código)
1. Construção da Matriz de Permissividade de Topelitz
Esta função calcula os coeficientes de Fourier da distribuição de permissividade de uma camada e os organiza em uma matriz de Toeplitz.
function [matriz_eps_toeplitz] = construirMatrizToeplitzEps(perfil_permissividade_1d, ordem_max_fourier)
% CONSTRUIRMATRIZTOEPLITZ_EPS: Cria a matriz de Toeplitz para a permissividade no dominio de Fourier.
% perfil_permissividade_1d: Vetor 1D da permissividade no espaco real ao longo de um periodo.
% ordem_max_fourier: Ordem maxima de truncamento M (os indices de Fourier vao de -M a M).
N_pontos = length(perfil_permissividade_1d);
% Calcula os coeficientes de Fourier (FFT) e normaliza.
% Usamos fftshift para centralizar a componente DC (ordem 0).
coef_fourier_eps = fftshift(fft(perfil_permissividade_1d)) / N_pontos;
num_ordens = 2 * ordem_max_fourier + 1;
matriz_eps_toeplitz = zeros(num_ordens, num_ordens);
% Preenche a matriz de Toeplitz [ε]_{mn} = ε_{m-n}
% Os indices m e n variam de -ordem_max_fourier a ordem_max_fourier.
for m_idx = 1:num_ordens % Mapeia 1..num_ordens para -M..M
for n_idx = 1:num_ordens % Mapeia 1..num_ordens para -M..M
ordem_m = m_idx - 1 - ordem_max_fourier;
ordem_n = n_idx - 1 - ordem_max_fourier;
delta_ordem = ordem_m - ordem_n;
% Mapeia o delta_ordem (que varia de -2M a 2M) para o indice do array coef_fourier_eps.
% coef_fourier_eps tem N_pontos elementos, com o centro em N_pontos/2 + 1.
idx_coef_fft = delta_ordem + N_pontos/2 + 1; % Assume N_pontos e par
% Garante que o indice esteja dentro dos limites do array de coeficientes
if idx_coef_fft >= 1 && idx_coef_fft <= N_pontos
matriz_eps_toeplitz(m_idx, n_idx) = coef_fourier_eps(idx_coef_fft);
else
% Caso o coeficiente para esta diferenca de ordem nao esteja disponivel, assume 0.
matriz_eps_toeplitz(m_idx, n_idx) = 0;
end
end
end
end
2. Solução dos Modos de Propagação (Autovalores)
Esta função resolve o problema de autovalores para encontrar as constantes de propagação (\\(k_z\\)) e os campos modais em uma camada da grade.
function [constantes_kz, campos_modais] = calcularModosPropagacao(comprimento_onda_vazio, matriz_eps_fourier, ordem_max_fourier, angulo_incidencia_rad, periodo_grade)
% CALCULARMODOSPROPAGACAO: Resolve os modos eigen de uma camada da grade.
% comprimento_onda_vazio: Comprimento de onda no vácuo (em metros).
% matriz_eps_fourier: Matriz de Toeplitz da permissividade da camada.
% ordem_max_fourier: Ordem máxima de Fourier M.
% angulo_incidencia_rad: Ângulo de incidência da onda (em radianos).
% periodo_grade: Período da grade (em metros).
numero_onda_vazio = 2 * pi / comprimento_onda_vazio; % k0
kx_incidente = numero_onda_vazio * sin(angulo_incidencia_rad); % Componente kx da onda incidente
% Cria um vetor de ordens de Fourier de -M a M
ordens_fourier = (-ordem_max_fourier:ordem_max_fourier);
% Calcula os kx para cada ordem difratada
vetor_kx_ordens = kx_incidente + ordens_fourier * (2 * pi / periodo_grade);
% Constrói a matriz diagonal Kx para as ordens de Fourier
matriz_kx_diagonal = diag(vetor_kx_ordens);
% Monta a matriz do problema de autovalores para kz^2 (para polarização TE)
% A^2 - k0^2 * [epsilon] = -kz^2 * I => ([Kx]^2 - k0^2 * [epsilon]) * E = -[Kz]^2 * E
% Resolvendo [A] * E = lambda * E, onde lambda = -kz^2
matriz_para_autovalores = matriz_kx_diagonal^2 - numero_onda_vazio^2 * matriz_eps_fourier;
% Resolve o problema de autovalores: [matriz_para_autovalores] * V = V * D
% onde D contem os autovalores (-kz^2) e V contem os autovetores (campos modais).
[autovetores, autovalores_diag] = eig(matriz_para_autovalores);
% Extrai os valores de kz^2 dos autovalores
kz_quadrado = -diag(autovalores_diag); % k_z^2 = -lambda
% Calcula as constantes de propagação kz
constantes_kz = sqrt(kz_quadrado);
% Os autovetores representam os campos modais
campos_modais = autovetores;
end
3. Algoritmo da Matriz S
O método da Matriz S é crucial para a estabilidade numérica ao lidar com estruturas multicamadas espessas, pois evita a multiplicação de matrizes de propagação exponencialmente divergentes. A complexidade de uma implementação completa é significativa, então apresentamos a estrutura conceitual.
function [coef_refletidos, coef_transmitidos] = propagacaoComMatrizS(configuracao_camadas, k0_vazio, M_ordem_fourier)
% PROPAGACAOCAMADAS_MATRIZ_S: Funcao conceitual para a propagacao em sistemas multicamadas usando o metodo da Matriz S.
% NOTA: A implementacao completa da recursao da Matriz S eh extensa e complexa,
% este codigo ilustra a estrutura geral e nao contém a logica completa de combinacao.
% configuracao_camadas: Estrutura contendo parametros de cada camada (espessura, propriedades).
% k0_vazio: Numero de onda no vácuo.
% M_ordem_fourier: Ordem máxima de Fourier.
num_ordens = 2 * M_ordem_fourier + 1; % Dimensao das matrizes S
% Inicializa as sub-matrizes S para todo o sistema (ar/substrato).
% Estas matrizes representam a resposta global do sistema ate o momento.
S_sistema_11 = zeros(num_ordens, num_ordens); % Reflexão global para frente
S_sistema_12 = eye(num_ordens); % Transmissão global para tras
S_sistema_21 = eye(num_ordens); % Transmissão global para frente
S_sistema_22 = zeros(num_ordens, num_ordens); % Reflexão global para tras
% Itera sobre cada camada da estrutura
for i_camada = 1:length(configuracao_camadas)
camada_atual = configuracao_camadas(i_camada);
% --- Parte 1: Calcular as Matrizes S para a camada atual (S_layer_11, etc.) ---
% Esta etapa envolve:
% 1. Determinar os modos eigen (constantes_kz, campos_modais) da camada.
% 2. Calcular as matrizes de interface R e T entre o meio anterior e esta camada.
% 3. Calcular a matriz de propagacao P dentro da camada (exp(1j*kz*espessura)).
% 4. Combinar R, T, P para formar as sub-matrizes S da camada (e.g., S_camada_11, S_camada_12).
% (Esta logica e omitida aqui para brevidade, como no original)
% Exemplo de placeholders para as matrizes S de uma unica camada
% (Em uma implementacao real, estas seriam calculadas com base nas propriedades da camada)
S_camada_11 = rand(num_ordens);
S_camada_12 = rand(num_ordens);
S_camada_21 = rand(num_ordens);
S_camada_22 = rand(num_ordens);
% --- Parte 2: Combinar as Matrizes S globais com as da camada atual ---
% Esta eh a recursao central do algoritmo da Matriz S.
% Ela combina um sistema S_prev (S_sistema_XX_anterior) com S_layer (S_camada_XX)
% para obter S_sistema_XX_novo. As formulas sao complexas e envolvem inversao de matrizes.
if i_camada == 1
% Se for a primeira camada, as matrizes do sistema sao as da camada
S_sistema_11 = S_camada_11;
S_sistema_12 = S_camada_12;
S_sistema_21 = S_camada_21;
S_sistema_22 = S_camada_22;
else
% Logica de recursao da Matriz S (omitida para brevidade)
% Esta etapa combina S_sistema_anterior com S_camada para obter S_sistema_atual.
% A recursao S-matrix evita a instabilidade numerica de modos evanescentes.
fprintf(' -> Combinando matrizes S globais com camada %d (logica de recursao omitida)...\n', i_camada);
% A implementacao real aqui envolveria inversao de matrizes e produtos.
end
end
% Ao final, S_sistema_11 e S_sistema_21 contêm os coeficientes globais de reflexão e transmissão.
% Coeficientes de reflexão (amplitude): sqrt(abs(S_sistema_11).^2)
% Coeficientes de transmissão (amplitude): sqrt(abs(S_sistema_21).^2)
% Para este exemplo conceitual, retornamos valores fictícios.
coef_refletidos = 0.1;
coef_transmitidos = 0.8;
end
Cálculo da Eficiência de Difração em Grade 1D
A seguir, um exemplo de como calcular a eficiência de difração de 0ª ordem para uma grade 1D simples utilizando as funções acima.
%% 1. Definicao de Parametros da Grade e da Onda
comprimento_onda_nm = 1550e-9; % Comprimento de onda (metros)
periodo_grade_nm = 800e-9; % Periodo da grade (metros)
ciclo_trabalho = 0.5; % Ciclo de trabalho (fracao do periodo preenchida pelo material)
n_substrato = 1.45; % Indice de refracao do substrato/material da grade
n_ambiente = 1.0; % Indice de refracao do ambiente (ar)
ordem_max_fourier = 5; % Numero de ordens de Fourier (-M a M)
%% 2. Construcao da Distribuicao de Permissividade da Grade
num_pontos_espaciais = 1024; % Resolucao para a discretizacao espacial
posicoes_x = linspace(0, periodo_grade_nm, num_pontos_espaciais);
% Permissividade do ambiente
permissividade_distribuicao = ones(1, num_pontos_espaciais) * (n_ambiente^2);
% Permissividade do material da grade
permissividade_distribuicao(posicoes_x < ciclo_trabalho * periodo_grade_nm) = n_substrato^2;
%% 3. Expansao de Fourier da Permissividade
matriz_eps_fourier_final = construirMatrizToeplitzEps(permissividade_distribuicao, ordem_max_fourier);
%% 4. Resolucao dos Modos Eigen
angulo_incidencia_rad = 0; % Incidencia normal (0 radianos)
[constantes_propagacao_kz, modos_campo] = ...
calcularModosPropagacao(comprimento_onda_nm, matriz_eps_fourier_final, ordem_max_fourier, angulo_incidencia_rad, periodo_grade_nm);
%% 5. Calculo da Eficiencia de Difracao (0a Ordem Transmitida, polarizacao TE)
% Para uma incidencia normal e grade 1D, a 0a ordem corresponde ao primeiro modo (indice 1).
% A eficiencia de difração da 0a ordem transmitida é calculada a partir dos campos modais e kz.
% Assumindo que modos_campo(1,1) e constantes_propagacao_kz(1) correspondem à 0a ordem.
% Esta formula eh uma simplificacao para o fluxo de potencia de 0a ordem.
k0 = 2 * pi / comprimento_onda_nm;
eficiencia_0_ordem = abs(modos_campo(1,1))^2 * real(constantes_propagacao_kz(1)) / (k0 * cos(angulo_incidencia_rad));
fprintf('Eficiência de difração de 0a ordem (Transmissão): %.2f%%\n', eficiencia_0_ordem * 100);
Convergência e Experiência Prática
| Parâmetro | Valor Sugerido | Impacto |
|---|---|---|
| Ordem de Fourier (M) | 5 ~ 15 | M pequeno: baixa precisão; M grande: instabilidade numérica. |
| Fatorização da Permissividade | Usar Fatorização de Li | A expansão direta da permissividade em interfaces metal/dielétrico causa erros significativos. |
| Matriz S | Uso Obrigatório | Evita a divergência exponencial para grades espessas ou multicamadas. |
| Resolução da Malha | > 10 pontos/período | Garante a precisão da Transformada de Fourier da permissividade. |
Fatorização de Li (Recomendada)
Para campos magnéticos \\(\\mathbf{H}\\), e em casos de interfaces dielétricas com alta contraste ou meios metálicos, é essencial usar a fatorização de Li. Isso significa expandir o inverso da permissividade em vez da própria permissividade:
\[\frac{1}{\varepsilon(x)} = \sum_{m} \left(\frac{1}{\varepsilon}\right)_m e^{jmKx} \]
Esta abordagem corrige a convergência da série de Fourier em interfaces descontínuas.
Tipos de Grades Suportados
O RCWA é um método versátil que pode ser aplicado a uma vasta gama de estruturas de grades, incluindo:
- Grades 1D (retangulares, senoidais, inclinadas)
- Grades 2D (grades cruzadas, padrões bi-periódicos)
- Materiais Anisotrópicos (cristais líquidos, perovskitas)
- Grades Multicamadas
- Difração Cônica (incidência de luz fora do plano principal)