Início Exemplos Capturas de ecrã Manual do utilizador Logótipo Bluesky YouTube ☰
OghmaNano Platforma symulacji wielofizycznych dla urządzeń optoelektronicznych i systemów fotonicznych DESCARREGAR Guia de início rápido

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.

You do not need a script for most work. As explained in Part A, fixed material parameters can be typed straight into the standard editors. A Lua script is only needed when you want a property to vary with temperature, position, composition, or photon density, or when you want a single well-defined, self-documenting source for a material's electrical parameters.

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.

OghmaNano Material editor showing the Code editor tab with a Lua material script defining mue_x, mue_y, mue_z and mu_h functions for the material m-MTDATA:TPBi
O separador do editor de código no editor de materiais exibe o script Lua para um material. Cada propriedade é uma pequena função que retorna um valor e um sinalizador enabled.
OghmaNano Open file dialog inside the material folder MAPI-CH3NH3PbI3, showing four optical n/k datasets (Ball, Leguy, Leguy-hydrated, Phillips) shown as atom icons alongside a single electrical Lua script CH3NH3PbI3.lua shown as a code-file icon
Uma única pasta contém quatro conjuntos de dados óticos (n/k) e um ficheiro de script elétrico (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:

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:

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.

OghmaNano Electrical parameter editor with the Script button off, showing ordinary fixed numeric values typed into each box (electron mobility 0.85, hole mobility 0.04, Xi 4.05, Eg 1.42, and so on) stored in sim.json
Script desativado: os valores fixos são armazenados diretamente em sim.json e o script não é utilizado.
OghmaNano Electrical parameter editor with the Script button depressed, showing Parameters and Code editor tabs and every parameter box greyed out reading See script for value
No script: os parâmetros ativados agora exibem a mensagem «Consulte o script para obter o valor» e são calculados pelo script Lua.
OghmaNano Electrical parameter editor Code editor tab showing the GaAs.lua material script source, with material.name, material.description and material.formula functions visible
O separador do editor de código, dentro do editor de parâmetros elétricos, mostra o script do material ativo (GaAs.lua).
OghmaNano Electrical parameter editor showing the Script dropdown menu with two options: Import material script and Populate json from script
O menu «Script»: a opção «Importar script» seleciona um ficheiro Lua; a opção «Preencher JSON a partir do script» escreve os seus valores em sim.json.
OghmaNano confirmation dialog listing the values that would be updated when populating the JSON from GaAs.lua, showing each parameter changing from its old to its new value
A caixa de diálogo de confirmação que é exibida antes de preencher 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 ??:

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.

OghmaNano Optical simulation editor showing the generation rate profile overlaid on a band-energy diagram for an ITO / PEDOT:PSS / P3HT:PCBM / Al device, with the labelled energy levels (-4.7, -5.1, -3.8, -4.9, -3.5, -8.3 eV) taken from the material scripts
O visualizador do diagrama de bandas/taxa de geração. Os níveis de energia identificados são obtidos a partir dos ficheiros de configuração do material, pelo que as alterações em 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.

Resumo e próximos passos.

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.