Linguagem de script Lua para simulação de dispositivos semicondutores
O OghmaNano oferece suporte à linguagem de script Lua para materiais, como alternativa à inserção manual de parâmetros de materiais fixos por meio do editor gráfico de parâmetros elétricos. Na maioria das simulações, os valores fixos inseridos por meio da interface gráfica são suficientes; o script Lua destina-se a casos em que as propriedades elétricas, óticas ou térmicas dos materiais precisam ser definidas de forma programática ou variar com a temperatura, a posição (x, y, z), a composição ou a densidade de fotões. Parâmetros como a largura de banda, a afinidade eletrônica, a mobilidade dos portadores, os coeficientes de recombinação e a condutividade térmica podem, portanto, ser expressos como funções, em vez de constantes únicas. Esta página explica como os scripts de materiais Lua são estruturados, como o OghmaNano os encontra e seleciona, como são associados a materiais e a conjuntos de dados óticos n/k e como os parâmetros definidos no script são utilizados em uma simulação.
1. O que é um script de material Lua?
Um script Lua para materiais é um ficheiro de texto simples .lua no qual as propriedades dos materiais são definidas através de pequenas funções, em vez de valores fixos. Cada função retorna o valor de um parâmetro específico do material, como a largura de banda, a afinidade eletrónica, a mobilidade dos portadores de carga, o coeficiente de recombinação ou a condutividade térmica. Estes valores podem ser constantes ou podem variar em função da temperatura T e da posição (x, y, z). As funções podem ser ativadas ou desativadas individualmente, permitindo que o script altere apenas os parâmetros desejados, enquanto os restantes valores continuam a ser obtidos a partir das configurações padrão da simulação. Uma função típica tem o seguinte aspeto:
function material.Eg(state)
-- Band gap, units: eV
local enabled = true
local T = state.T
local value = 1.42 - 4.5e-4*(T - 300.0)
return value, enabled
end
Qualquer ficheiro .lua na base de dados de Materiais OghmaNano é tratado como um script de material se a declaração da tabela local material = {} aparecer nos primeiros 1000 bytes do ficheiro. Isto significa que um cabeçalho de licença ou um bloco de comentários explicativos podem aparecer antes da declaração, desde que o marcador permaneça próximo do início do ficheiro. Pode visualizar e editar o script de um material diretamente a partir do separador do editor de código no editor de Materiais ??.
Um script de material pode definir tantos ou tão poucos parâmetros quanto desejar. Pode definir apenas a largura da banda e a afinidade eletrónica, ou um conjunto completo de parâmetros relacionados com a estrutura de bandas, transporte, recombinação e propriedades térmicas. As funções de que não precisa podem simplesmente ser omitidas ou retornar o valor enabled = false, de modo que o modelo volte a utilizar o valor armazenado nos editores padrão.
enabled.
CH3NH3PbI3.lua). O OghmaNano seleciona o ficheiro mais adequado para a simulação.2. Onde os scripts são armazenados no disco.
Um script de material pode ser armazenado em um de dois locais, e isso determina como ele é exibido no OghmaNano:
- Dentro de uma pasta de materiais — por exemplo, dentro da pasta de arsenieto de gálio ou de MAPI-CH3NH3PbI3. Um script colocado aqui pertence a esse material e é exibido dentro do material quando você o abre, juntamente com os seus dados n/k e outros ficheiros.
- Fora de uma pasta de materiais, encontra-se um ficheiro independente
.luaarmazenado noutro local da base de dados. Neste caso, é apresentado como um ficheiro.luaautónomo dentro do navegador da base de dados de Materiais, em vez de estar associado a um único material.
A figura ?? mostra um script armazenado dentro de uma pasta de materiais. A pasta MAPI-CH3NH3PbI3, que contém dados de perovskite, inclui vários conjuntos de dados óticos (n/k) — Ball, Leguy, Leguy-hidratado e Phillips — representados por ícones de átomos, juntamente com um único script elétrico, CH3NH3PbI3.lua, representado por um ícone de ficheiro de código.
3. Um único ficheiro de dados elétricos, vários conjuntos de dados óticos.
É comum ter vários conjuntos de constantes óticas para um mesmo material, mas apenas um conjunto coerente de parâmetros elétricos. Diferentes grupos de pesquisa medem os valores de n e k em diferentes intervalos de comprimento de onda, utilizando amostras e métodos distintos. Por isso, é útil manter cada um desses conjuntos de dados óticos separadamente e escolher entre eles para cada simulação. Os parâmetros elétricos (banda proibida, afinidade eletrónica, mobilidades, etc.), por outro lado, geralmente devem ser mantidos como uma única definição consistente para o material. É exatamente essa a organização mostrada em ??: quatro conjuntos de dados n/k e um único conjunto de parâmetros elétricos.
Quando o material é utilizado, o OghmaNano tenta selecionar automaticamente o ficheiro mais adequado. Se não existir um script no nível do material específico que está a ser simulado, o modelo procurará nos níveis superiores da estrutura de pastas do material, de forma a encontrar um script adequado para utilizar. Isto significa que pode anexar um único script elétrico a um nível apropriado e aplicá-lo aos conjuntos de dados agrupados abaixo dele, sem ter de duplicar os mesmos parâmetros elétricos em cada variante ótica.
Por que separar os dois? Os dados óticos são frequentemente o elemento que varia entre as medições — um filme medido em 800 nm por um grupo e em 1100 nm por outro produz dois conjuntos de dados n/k distintos e válidos. O comportamento elétrico do material não está ligado à faixa de comprimento de onda de uma medição ótica, portanto, um único script elétrico mantém a consistência física, independentemente do conjunto de dados óticos com o qual seja combinado.
4. Anatomia de um script de materiais
O exemplo abaixo apresenta um script completo para materiais elétricos. AlGaInAs — o material quaternário à base de InP, com estrutura cristalina compatível, utilizado em lasers e detetores para telecomunicações. Apresentamos o código completo para que possa ver como um script real e totalmente documentado é estruturado; em seguida, cada função é detalhada e explicada. Secção 5. abaixo. Clique para expandir.
Exemplo completo de roteiro para material didático — AlGaInAs.lua
-- See end of file for copyright, licensing and documentation links.
local material = {}
-- ---------------------------------------------------------------------------
-- NOTES ON AlGaInAs (read before using):
--
-- (Al_x Ga_{1-x})_{0.47} In_{0.53} As, LATTICE-MATCHED to InP (a = 5.869 A). The
-- workhorse quaternary for 1.3-1.55 um telecom lasers, modulators and
-- photodetectors. In is fixed at 0.53 for the InP match, so the single design
-- knob is the Al fraction x on the group-III sublattice.
--
-- DIRECT gap for all x (no crossover in the useful range): ~0.75 eV at x=0
-- (Ga0.47In0.53As, "InGaAs", ~1.65 um) rising to ~1.46 eV at x=1
-- (Al0.48In0.52As, ~0.85 um).
Mostrar mais
-- Compared with the older InGaAsP telecom
-- quaternary, AlGaInAs offers a larger conduction-band offset (better electron
-- confinement), which is why it is favoured for high-temperature laser
-- operation - a device advantage, captured here only via Xi/Eg.
--
-- The lattice constant is FIXED by the InP match (independent of x). Eg is
-- computed from x; the remaining parameters are given at a representative
-- x = 0.30 (Eg ~ 0.92 eV, ~1.34 um) with InGaAs/AlInAs end points noted.
--
-- REFERENCES
--
-- [1] I. Vurgaftman, J. R. Meyer, L. R. Ram-Mohan, J. Appl. Phys. 89, 5815
-- (2001). [constituent band parameters, bowing]
-- [2] S. Adachi, "Properties of Semiconductor Alloys", Wiley (2009); and
-- S. Adachi, "Physical Properties of III-V Semiconductor Compounds"
-- (1992). [Eg(x), transport, dielectric, thermal]
-- [3] O. Madelung, "Semiconductors: Data Handbook", Springer (2004).
-- ---------------------------------------------------------------------------
function material.name()
local enabled = true
return "AlGaInAs", enabled
end
function material.description()
local enabled = true
return "(AlxGa1-x)0.47In0.53As on InP, x = Al ~ 0.30 (direct gap)", enabled
end
function material.formula()
local enabled = true
return "AlGaInAs", enabled
end
function material.Eg(state)
-- Units: eV
-- Refs: [1],[2]
--
-- Direct gap, lattice-matched to InP, in Al fraction x. 300 K relation
-- [2]: Eg(x) = 0.76 + 0.49*x + 0.20*x^2
-- (0.76 eV at x=0 -> 1.45 eV at x=1). Temperature handled by a
-- Varshni-type shift about 300 K (alpha = 4.0e-4 eV/K, beta = 200 K).
-- x = 0.30 -> ~0.925 eV (~1.34 um) at 300 K. Change al_fraction here
-- and in the functions noted in the header.
local enabled = true
local al_fraction = 0.30
local x = al_fraction
local T = state.T
local eg_300 = 0.76 + 0.49*x + 0.20*x*x
local tshift = 4.0e-4*(90000.0/500.0 - T*T/(T + 200.0))
local value = eg_300 + tshift
return value, enabled
end
function material.Xi(state)
-- Electron affinity
-- Units: eV
-- Refs: [2],[3]
--
-- ~4.45 eV at x = 0.30. Falls with Al (InGaAs ~4.6 -> AlInAs ~4.1 eV);
-- the resulting large conduction-band offset to InP / across the alloy
-- is the key confinement advantage over InGaAsP.
local enabled = true
local value = 4.45
return value, enabled
end
function material.Nc(state)
-- Effective conduction-band density of states
-- Units: m^-3
-- Refs: [2],[3]
--
-- ~4e23 m^-3 at 300 K for x = 0.30 (small direct-valley mass, m_e* ~
-- 0.05-0.07 m0). Endpoints: InGaAs ~2.1e23, AlInAs ~5.4e23 m^-3.
local enabled = true
local T = state.T
local value = 4.0e23*(T/300.0)^1.5
return value, enabled
end
function material.Nv(state)
-- Effective valence-band density of states
-- Units: m^-3
-- Refs: [2],[3]
--
-- ~8e24 m^-3 at 300 K for x = 0.30 (InGaAs ~7.7e24, AlInAs ~9e24 m^-3).
local enabled = true
local T = state.T
local value = 8.0e24*(T/300.0)^1.5
return value, enabled
end
function material.mu_e(state)
-- Low-field electron mobility
-- Units: m^2 V^-1 s^-1
-- Refs: [2]
--
-- ~0.3 m^2/V/s (3000 cm^2/V/s) at x = 0.30 - high (small mass) but
-- alloy-scattering-reduced from InGaAs (~10000-13000 cm^2/V/s) toward
-- AlInAs (~1000-4000 cm^2/V/s). (300/T)^1.5 approximate.
local enabled = true
local T = state.T
local value = 0.30*(300.0/T)^1.5
return value, enabled
end
function material.mue_x(state)
return material.mu_e(state)
end
function material.mue_y(state)
return material.mu_e(state)
end
function material.mue_z(state)
return material.mu_e(state)
end
function material.mu_h(state)
-- Low-field hole mobility
-- Units: m^2 V^-1 s^-1
-- Refs: [2]
--
-- ~0.02 m^2/V/s (200 cm^2/V/s) at x = 0.30 (InGaAs ~300, AlInAs ~100
-- cm^2/V/s). (300/T)^1.5 approximate.
local enabled = true
local T = state.T
local value = 0.02*(300.0/T)^1.5
return value, enabled
end
function material.muh_x(state)
return material.mu_h(state)
end
function material.muh_y(state)
return material.mu_h(state)
end
function material.muh_z(state)
return material.mu_h(state)
end
function material.epsilonr(state)
-- Relative static permittivity
-- Dimensionless
-- Refs: [2],[3]
--
-- ~13.4 at x = 0.30 (InGaAs ~13.9 -> AlInAs ~12.5).
local enabled = true
local value = 13.4
return value, enabled
end
function material.free_to_free_recombination(state)
-- Radiative recombination coefficient
-- Units: m^3 s^-1
-- Refs: representative (see note)
--
-- Direct-gap value ~1e-10 cm^3/s = 1e-16 m^3/s. Representative; refine
-- against measured lifetimes.
local enabled = true
local value = 1.0e-16
return value, enabled
end
function material.auger_Cn(state)
-- Electron Auger recombination coefficient
-- Units: m^6 s^-1
-- Refs: representative (see note)
--
-- ~2e-28 cm^6/s = 2e-40 m^6/s at the InGaAs-rich (narrow-gap) end.
-- Auger is a major loss mechanism in 1.55 um AlGaInAs/InGaAsP lasers
-- and grows sharply as x decreases (gap narrows) - scale accordingly.
local enabled = true
local value = 2.0e-40
return value, enabled
end
function material.auger_Cp(state)
-- Hole Auger recombination coefficient
-- Units: m^6 s^-1
-- Refs: representative (see note)
--
-- As auger_Cn: representative 2e-28 cm^6/s = 2e-40 m^6/s.
local enabled = true
local value = 2.0e-40
return value, enabled
end
function material.ss_srh_trap_energy(state)
-- SRH trap energy relative to the middle of the band gap.
-- Units: eV
--
-- Positive values are above mid-gap (towards the conduction band).
-- Negative values are below mid-gap (towards the valence band).
--
-- Defect-dependent. Lattice-matched InP-based material can be very high
-- quality; set level and density from your own data. Mid-gap default.
local enabled = true
local value = 0.0
return value, enabled
end
function material.ss_srh_Nt(state)
-- SRH trap density
-- Units: m^-3
--
-- Defect-dependent placeholder; set from the intended material
-- quality.
local enabled = true
local value = 1.0e21
return value, enabled
end
function material.ss_srh_sigma_n(state)
-- Electron capture cross section
-- Units: m^2
--
-- Defect-dependent placeholder; set from measurement.
local enabled = true
local value = 1.0e-19
return value, enabled
end
function material.ss_srh_sigma_p(state)
-- Hole capture cross section
-- Units: m^2
--
-- Defect-dependent placeholder; set from measurement.
local enabled = true
local value = 1.0e-19
return value, enabled
end
function material.thermal_kl(state)
-- Thermal conductivity
-- Units: W m^-1 K^-1
-- Refs: [2]
--
-- ~4.5 W/m/K at x = 0.30 - LOW, from strong mass-disorder phonon
-- scattering in this quaternary (well below InP's ~68 or InAs's ~27
-- W/m/K). Weakly dependent in the alloy regime; (300/T)^0.4 approximate.
-- This low kappa contributes to self-heating in InP-based lasers.
local enabled = true
local T = state.T
local value = 4.5*(300.0/T)^0.4
return value, enabled
end
function material.heat_capacity(state)
-- Specific heat capacity
-- Units: J kg^-1 K^-1
-- Refs: [3]
--
-- ~320 J/kg/K near 300 K (interpolated across the constituents).
local enabled = true
local value = 320.0
return value, enabled
end
function material.density(state)
-- Mass density
-- Units: kg m^-3
-- Refs: [3]
--
-- ~5300 kg/m^3 at x = 0.30 (InGaAs ~5500 -> AlInAs ~4650 kg/m^3).
local enabled = true
local value = 5300.0
return value, enabled
end
function material.lattice_constant(state)
-- Cubic lattice constant
-- Units: m
-- Refs: [1],[3]
--
-- FIXED at the InP match, a = 5.8697 A, INDEPENDENT of x (Al substitutes
-- for Ga at constant lattice constant along the InP-matched line).
-- Linear thermal expansion ~4.6e-6 /K (InP-like).
local enabled = true
local T = state.T
local a300 = 5.8697e-10
local expansion = 4.6e-6
local value = a300*(1.0 + expansion*(T - 300.0))
return value, enabled
end
function material.thermal_tau_e(state)
-- Electron energy relaxation time towards the lattice temperature
-- Units: s
--
-- Value basis: III-V family estimate
-- Confidence: Medium
--
-- Reference:
-- https://www.mdpi.com/2673-3978/3/2/16
--
-- Comments:
-- Representative III-V carrier-to-lattice relaxation time. GaAs-like values
-- are typically sub-ps to ps and field dependent.
local enabled = true
local value = 5.000000e-13
return value, enabled
end
function material.thermal_tau_h(state)
-- Hole energy relaxation time towards the lattice temperature
-- Units: s
--
-- Value basis: III-V family estimate
-- Confidence: Medium
--
-- Reference:
-- https://www.mdpi.com/2673-3978/3/2/16
--
-- Comments:
-- Representative III-V carrier-to-lattice relaxation time. GaAs-like values
-- are typically sub-ps to ps and field dependent.
local enabled = true
local value = 5.000000e-13
return value, enabled
end
function material.print()
local state = {
T = 300.0,
x = 0.0,
y = 0.0,
z = 0.0,
photon_density = 0.0,
}
print(string.format("Material: %s", material.name()))
print(string.format("Description: %s", material.description()))
print(string.format("Formula: %s", material.formula()))
print(string.format("Temperature: %.2f K", state.T))
print(string.format("Position: %.6e, %.6e, %.6e m", state.x, state.y, state.z))
print(string.format("Photon density: %.6e m^-3", state.photon_density))
print(string.format("Band gap: %.6f eV", material.Eg(state)))
print(string.format("Electron affinity: %.6f eV", material.Xi(state)))
print(string.format("Electron mobility: %.6e m^2/V/s", material.mu_e(state)))
print(string.format("Hole mobility: %.6e m^2/V/s", material.mu_h(state)))
print(string.format("Nc: %.6e m^-3", material.Nc(state)))
print(string.format("Nv: %.6e m^-3", material.Nv(state)))
print(string.format("Relative permittivity: %.6f", material.epsilonr(state)))
print(string.format("Radiative coeff.: %.6e m^3/s", material.free_to_free_recombination(state)))
print(string.format("Electron Auger coeff.: %.6e m^6/s", material.auger_Cn(state)))
print(string.format("Hole Auger coeff.: %.6e m^6/s", material.auger_Cp(state)))
print(string.format("SRH trap energy: %.6f eV", material.ss_srh_trap_energy(state)))
print(string.format("SRH trap density: %.6e m^-3", material.ss_srh_Nt(state)))
print(string.format("SRH sigma n: %.6e m^2", material.ss_srh_sigma_n(state)))
print(string.format("SRH sigma p: %.6e m^2", material.ss_srh_sigma_p(state)))
print(string.format("Electron energy relax.: %.6e s", material.thermal_tau_e(state)))
print(string.format("Hole energy relax.: %.6e s", material.thermal_tau_h(state)))
print(string.format("Thermal conductivity: %.6e W/m/K", material.thermal_kl(state)))
print(string.format("Heat capacity: %.6e J/kg/K", material.heat_capacity(state)))
print(string.format("Mass density: %.6e kg/m^3", material.density(state)))
end
return material
5. As funções em detalhe.
Todas as funções num script de materiais seguem o mesmo padrão: recebem a tabela state e devolvem um valor value, juntamente com um sinalizador enabled. As subseções abaixo documentam cada grupo de funções do exemplo AlGaInAs.
5.1 A estrutura state e o sinalizador enabled
Cada função recebe um objeto state que contém as condições locais de simulação no ponto do dispositivo em que o valor está a ser solicitado. Em Lua, isto é implementado como uma tabela; se estiver familiarizado com C, é melhor pensar nisso como um struct ou, em C++, como uma pequena classe/objeto cujos membros contêm o estado local atual. Os campos disponíveis são:
state.T— temperatura local (em Kelvin).state.x,state.y,state.z— posição dentro do dispositivo (em metros).state.photon_density— densidade local de fotões (m-3).
Como a OghmaNano fornece este valor local state à função, é possível calcular um parâmetro do material com base na temperatura, na posição ou na densidade de fotões, em vez de limitar-se a um único valor fixo. O segundo valor de retorno, enabled, controla se o modelo utiliza o valor retornado pelo script. Se enabled for true, o valor do script é utilizado; se for false, é utilizado o valor armazenado nos editores padrão. Isto permite que um script defina apenas os parâmetros que precisam de variar, mantendo todos os outros parâmetros como valores fixos comuns.
5.2 Identidade: name, description, formula
Estas três funções devolvem cadeias de texto descritivas, em vez de valores numéricos. Elas identificam o material, fornecem uma breve descrição de fácil compreensão e indicam a sua fórmula química.
function material.name()
local enabled = true
return "AlGaInAs", enabled
end
function material.description()
local enabled = true
return "(AlxGa1-x)0.47In0.53As on InP, x = Al ~ 0.30 (direct gap)", enabled
end
function material.formula()
local enabled = true
return "AlGaInAs", enabled
end
5.3 Estrutura de bandas: Eg e Xi
Eg retorna a largura da banda proibida (eV) e Xi a afinidade eletrônica (eV). Juntas, estas duas grandezas definem as posições das extremidades das bandas de condução e de valência, e são utilizadas em todo o modelo (ver Seção 7). A largura da banda proibida do AlGaInAs é a função mais relevante no ficheiro: calcula a largura a 300 K a partir da fração de Al (x) e, em seguida, aplica um deslocamento de temperatura do tipo Varshni, pelo que o valor retornado depende de state.T.
function material.Eg(state)
-- Units: eV. Direct gap, lattice-matched to InP, in Al fraction x.
local enabled = true
local al_fraction = 0.30
local x = al_fraction
local T = state.T
local eg_300 = 0.76 + 0.49*x + 0.20*x*x -- 300 K value from composition
local tshift = 4.0e-4*(90000.0/500.0 - T*T/(T + 200.0)) -- Varshni-type shift
local value = eg_300 + tshift
return value, enabled
end
function material.Xi(state)
-- Electron affinity, units: eV
local enabled = true
local value = 4.45
return value, enabled
end
Exemplo prático: quando x = 0,30, o termo de composição a 300 K fornece Eg(300 K) ≈ 0,76 + 0,49(0,30) + 0,20(0,30)2 ≈ 0,925 eV (aproximadamente 1,34 μm). Como Eg indica state.T, o aumento da temperatura do dispositivo reduz automaticamente a largura da banda através do termo de Varshni — algo que um valor fixo nunca conseguiria representar.
5.4 Densidade de estados: Nc e Nv
Nc e Nv fornecem os valores efetivos das densidades de estados das bandas de condução e de valência (m-3). Neste exemplo, ambos os valores são apresentados a 300 K e ajustados em função da temperatura, seguindo a fórmula (T/300)1,5, que corresponde ao resultado padrão da banda parabólica. Esta dependência da temperatura é específica do modelo de material utilizado aqui; outros materiais podem utilizar diferentes dependências da temperatura, conforme apropriado.
function material.Nc(state)
local enabled = true
local T = state.T
local value = 4.0e23*(T/300.0)^1.5
return value, enabled
end
function material.Nv(state)
local enabled = true
local T = state.T
local value = 8.0e24*(T/300.0)^1.5
return value, enabled
end
5.5 Mobilidades: mu_e, mu_h e alias de direção.
mu_e e mu_h fornecem os valores da mobilidade dos eletrões e das lacunas em campos magnéticos baixos (m2 V-1 s-1). Neste exemplo, as mobilidades são ajustadas em função da temperatura, seguindo a relação (300/T)1,5, mas esta dependência da temperatura faz parte do modelo específico do material e pode ser substituída por uma relação diferente, quando apropriado. Por exemplo, num semicondutor orgânico, a mobilidade pode ser descrita de forma diferente, utilizando uma dependência da temperatura do tipo ativado ou por salto. O OghmaNano também pode utilizar mobilidades dependentes da direção, pelo que o ficheiro fornece mue_x, mue_y, mue_z e muh_x, muh_y, muh_z. Neste exemplo isotrópico, cada um simplesmente fornece o mesmo valor escalar, mas cada direção pode ter a sua própria expressão para um material anisotrópico.
function material.mu_e(state)
-- Low-field electron mobility, units: m^2 V^-1 s^-1
local enabled = true
local T = state.T
local value = 0.30*(300.0/T)^1.5
return value, enabled
end
function material.mue_x(state) return material.mu_e(state) end
function material.mue_y(state) return material.mu_e(state) end
function material.mue_z(state) return material.mu_e(state) end
function material.mu_h(state)
-- Low-field hole mobility, units: m^2 V^-1 s^-1
local enabled = true
local T = state.T
local value = 0.02*(300.0/T)^1.5
return value, enabled
end
function material.muh_x(state) return material.mu_h(state) end
function material.muh_y(state) return material.mu_h(state) end
function material.muh_z(state) return material.mu_h(state) end
5.6 Permissividade: epsilonr
epsilonr retorna a permissividade estática relativa (uma grandeza adimensional), que define as propriedades eletrostáticas no solucionador de equações de deriva e difusão.
function material.epsilonr(state)
-- Relative static permittivity, dimensionless
local enabled = true
local value = 13.4
return value, enabled
end
5.7 Recombinação: emissão de radiação e efeito Auger.
free_to_free_recombination retorna o coeficiente de recombinação banda-a-banda (radiativa) (m³ s⁻¹), enquanto auger_Cn e auger_Cp retornam os coeficientes de Auger para eletrões e lacunas (m⁶ s⁻¹). A recombinação de Auger é um dos principais mecanismos de perda em dispositivos III–V de banda estreita, e a sua importância aumenta consideravelmente à medida que a largura da banda diminui, pelo que estes são candidatos naturais para uma expressão que dependa da composição ou da temperatura, num script mais avançado.
function material.free_to_free_recombination(state)
-- Radiative recombination coefficient, units: m^3 s^-1
local enabled = true
local value = 1.0e-16
return value, enabled
end
function material.auger_Cn(state)
-- Electron Auger coefficient, units: m^6 s^-1
local enabled = true
local value = 2.0e-40
return value, enabled
end
function material.auger_Cp(state)
-- Hole Auger coefficient, units: m^6 s^-1
local enabled = true
local value = 2.0e-40
return value, enabled
end
5.8 Armadilhas para o controle de SRH.
As quatro funções de Shockley–Read–Hall descrevem um único nível de armadilha em equilíbrio: ss_srh_trap_energy (energia da armadilha em relação ao meio da banda proibida, eV; valores positivos indicam a direção da banda de condução), ss_srh_Nt (densidade de armadilhas, m-3) e ss_srh_sigma_n / ss_srh_sigma_p (seções eficazes de captura de eletrões e lacunas, m2). Estes parâmetros dependem fortemente dos defeitos e da amostra, pelo que os valores apresentados no exemplo são apenas valores de referência que devem ser substituídos pelos seus próprios dados medidos.
function material.ss_srh_trap_energy(state)
-- Trap energy relative to mid-gap, units: eV
local enabled = true
local value = 0.0
return value, enabled
end
function material.ss_srh_Nt(state)
-- SRH trap density, units: m^-3
local enabled = true
local value = 1.0e21
return value, enabled
end
function material.ss_srh_sigma_n(state)
-- Electron capture cross section, units: m^2
local enabled = true
local value = 1.0e-19
return value, enabled
end
function material.ss_srh_sigma_p(state)
-- Hole capture cross section, units: m^2
local enabled = true
local value = 1.0e-19
return value, enabled
end
5.9 Parâmetros térmicos e estruturais
As restantes funções físicas descrevem o comportamento térmico e estrutural do material: thermal_kl (condutividade térmica da rede cristalina, W m-1 K-1), heat_capacity (J kg-1 K-1), density (kg m-3), lattice_constant (m, com expansão térmica linear aplicada a cerca de 300 K) e os tempos de relaxamento da energia dos portadores thermal_tau_e / thermal_tau_h (s). Observe como thermal_kl e lattice_constant interpretam state.T para obter valores que variam em função da temperatura.
function material.thermal_kl(state)
-- Thermal conductivity, units: W m^-1 K^-1
local enabled = true
local T = state.T
local value = 4.5*(300.0/T)^0.4
return value, enabled
end
function material.heat_capacity(state)
-- Specific heat capacity, units: J kg^-1 K^-1
local enabled = true
local value = 320.0
return value, enabled
end
function material.density(state)
-- Mass density, units: kg m^-3
local enabled = true
local value = 5300.0
return value, enabled
end
function material.lattice_constant(state)
-- Cubic lattice constant, units: m (with thermal expansion)
local enabled = true
local T = state.T
local a300 = 5.8697e-10
local expansion = 4.6e-6
local value = a300*(1.0 + expansion*(T - 300.0))
return value, enabled
end
function material.thermal_tau_e(state)
-- Electron energy relaxation time, units: s
local enabled = true
local value = 5.000000e-13
return value, enabled
end
function material.thermal_tau_h(state)
-- Hole energy relaxation time, units: s
local enabled = true
local value = 5.000000e-13
return value, enabled
end
5.10 print() — um assistente para testes de autodiagnóstico
Por fim, print() é uma função de conveniência, e não uma propriedade material. Ela cria uma tabela representativa state (300 K, na origem, densidade de fotões nula) e imprime todos os valores que o script calcula. Isso é útil para verificar um script a partir da linha de comandos ou num interpretador Lua independente, antes de o utilizar numa simulação — uma forma rápida de confirmar se os resultados correspondem aos valores esperados.
6. Utilizar um script numa simulação
Até agora, a discussão centrou-se nos scripts Lua armazenados na base de dados de Materiais. Para utilizar um destes scripts numa simulação real de um dispositivo, abra o editor de parâmetros elétricos para a camada desejada. O editor pode funcionar de duas formas diferentes: pode utilizar os valores de parâmetros fixos habituais armazenados em sim.json ou pode obter os valores de parâmetros selecionados diretamente de um script de material Lua.
Por padrão, a funcionalidade de script está desativada e o editor funciona da forma habitual ??. Cada parâmetro é representado por um valor numérico editável, armazenado em sim.json. Neste modo, o script Lua do material não é utilizado.
Ao clicar no botão «Script», é ativada a criação de scripts ??. Os parâmetros fornecidos pelo script são, então, substituídos no editor por «Consultar o script para obter o valor». Os parâmetros cujas funções Lua correspondentes estão desativadas continuam a utilizar os valores fixos armazenados em sim.json. Isto permite que um script controle apenas as propriedades que precisam de ser definidas por script, mantendo todos os outros parâmetros inalterados.
sim.json e o script não é utilizado.
GaAs.lua).
sim.json.
sim.json, listando todos os valores que serão alterados.Quando a funcionalidade de script está ativada, surge um separador «Editor de Código» ao lado do separador «Parâmetros» ??. Isto permite que visualize e edite o script Lua do material diretamente dentro da simulação, sem ter de voltar à base de dados de Materiais.
6.1 Selecionar um script ou copiar os seus valores para a simulação.
O pequeno menu ao lado do botão «Script» oferece duas formas diferentes de utilizar um script de material ??:
- Importar script de material — abre a base de dados de Materiais e permite selecionar o script de material Lua que a simulação deverá utilizar.
- Preenche o ficheiro JSON a partir de um script — executa o script selecionado e copia os valores de parâmetro resultantes para os valores fixos correspondentes em
sim.json.
Estas duas abordagens têm finalidades distintas. Se o script for utilizado diretamente, as suas funções permanecem ativas durante a simulação. Esta é a modalidade adequada quando um parâmetro precisa de variar em função de grandezas como a temperatura, a posição, a composição ou a densidade de fotões.
Eg e Xi são refletidas automaticamente aqui.Em alternativa, pode-se usar a opção «Preencher JSON a partir do script» quando se pretende que o script forneça um conjunto bem definido de valores iniciais, mas não é necessário que o script permaneça ativo. O OghmaNano avalia o script, escreve os resultados nos campos de parâmetros habituais e, em seguida, esses valores podem ser editados manualmente da forma usual.
Como o preenchimento de sim.json pode substituir valores já existentes na simulação, o OghmaNano exibe primeiro uma caixa de diálogo de confirmação ??. A caixa de diálogo lista o script que está a ser utilizado e mostra cada parâmetro que será alterado, juntamente com o seu valor atual e o valor proposto. Nenhum valor é alterado até que a operação seja confirmada.
Existem duas formas de utilizar o mesmo script: manter o script ativo quando os parâmetros precisam variar durante a simulação ou utilizar a função «Preencher JSON a partir do script» para obter um conjunto de valores iniciais fixos, que podem ser posteriormente editados através da interface gráfica normal.
7. Onde os valores do script são utilizados.
Os valores gerados por um script de material são utilizados em todo o modelo, e não apenas no solucionador elétrico. Quantidades como Eg e Xi definem as posições da extremidade da banda em todos os locais onde são necessárias. Por exemplo, os níveis de energia representados no diagrama de bandas/visualizador da taxa de geração são obtidos a partir desses valores ??. Assim, a edição da diferença de energia ou da afinidade num script é automaticamente refletida no diagrama de bandas, no modelo ótico e no solucionador elétrico.
Erros comuns.
- A declaração
local material = {}deve aparecer nos primeiros 1000 bytes do ficheiro, caso contrário, o OghmaNano não a reconhecerá como um script válido. - Cada função deve retornar dois valores: a quantidade e o indicador
enabled. Uma caixa exibe apenas a mensagem «Consulte o script para obter o valor» quando a sua função éenabled. - Utilize unidades do Sistema Internacional (SI) em todas as etapas (m, m⁻³, m² V⁻¹ s⁻¹, eV, conforme indicado). Verifique se as ordens de grandeza dos valores são plausíveis.
- Preencher o ficheiro JSON a partir do script substitui os valores predefinidos em
sim.json. Leia a caixa de diálogo de confirmação antes de aceitar.
Resumo e próximos passos.
- Um script Lua para materiais define propriedades como funções da temperatura, posição, composição ou densidade de fotões; é opcional e só é necessário para parâmetros variáveis ou bem definidos.
- Os ficheiros são identificados pelo
local material = {}nos primeiros 1000 bytes e podem estar armazenados numa pasta de materiais (indicada juntamente com o material) ou como ficheiros independentes (indicados como ficheiro.lua). - Um único script elétrico é geralmente utilizado para vários conjuntos de dados óticos (n/k); o modelo seleciona o ficheiro mais adequado e realiza uma pesquisa retroativa quando não existe nenhum script ao nível do material.
- Numa simulação, o editor de parâmetros elétricos pode utilizar valores fixos
sim.jsonou um script; a função «Preencher JSON a partir do script» permite inserir os valores do script nas caixas de valores fixos. - Valores como
EgeXisão utilizados em todo o modelo, incluindo o diagrama de bandas.
Em seguida: volte a Parte C para saber como a base de dados é armazenada ou consulte Base de dados ótica e Download de mais materiais.