Utilisation du langage de script Lua pour la simulation de dispositifs à semi-conducteurs.
OghmaNano prend en charge le langage de script Lua pour définir les propriétés des matériaux, en alternative à la saisie manuelle des paramètres fixes des matériaux via l’éditeur graphique des paramètres électriques. Pour la plupart des simulations, les valeurs fixes saisies via l’interface graphique sont suffisantes. Le script Lua est destiné aux cas où les propriétés électriques, optiques ou thermiques des matériaux doivent être définies de manière programmatique ou varier en fonction de la température, de la position (x, y, z), de la composition ou de la densité de photons. Les paramètres tels que la bande interdite, l’affinité électronique, la mobilité des porteurs, les coefficients de recombinaison et la conductivité thermique peuvent donc être exprimés sous forme de fonctions plutôt que de simples constantes. Cette page explique comment les scripts Lua pour les matériaux sont structurés, comment OghmaNano les trouve et les sélectionne, comment ils sont liés aux matériaux et aux ensembles de données optiques n/k, et comment les paramètres définis dans les scripts sont utilisés dans une simulation.
1. Qu’est-ce qu’un script de matériau Lua ?
Un script de matériau Lua est un fichier texte simple .lua dans lequel les propriétés du matériau sont définies à l’aide de petites fonctions plutôt que de valeurs fixes. Chaque fonction renvoie la valeur d’un paramètre de matériau spécifique, tel que la largeur de bande interdite, l’affinité électronique, la mobilité des porteurs, le coefficient de recombinaison ou la conductivité thermique. Ces valeurs peuvent être constantes, ou elles peuvent varier en fonction de la température T et de la position (x, y, z). Les fonctions peuvent être activées ou désactivées individuellement, ce qui permet au script de modifier uniquement les paramètres souhaités, tandis que les valeurs restantes continuent de provenir des paramètres de simulation standard. Une fonction typique ressemble à ceci :
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
Tout fichier .lua présent dans la base de données OghmaNano Materials est considéré comme un script de matériau si la déclaration de table local material = {} apparaît dans les 1 000 premiers octets du fichier. Cela signifie qu’un en-tête de licence ou un bloc de commentaires explicatifs peuvent apparaître avant la déclaration, à condition que le marqueur reste près du début du fichier. Vous pouvez consulter et modifier le script d’un matériau directement à partir de l’onglet Éditeur de code dans l’éditeur de matériaux ??.
Un script de matériau peut définir autant ou aussi peu de paramètres que vous le souhaitez. Il peut définir uniquement la largeur de bande et l’affinité électronique, ou un ensemble complet de paramètres relatifs à la structure de bande, au transport, à la recombinaison et aux propriétés thermiques. Les fonctions dont vous n’avez pas besoin peuvent simplement être omises, ou renvoyées avec enabled = false afin que le modèle revienne à la valeur stockée dans les éditeurs standard.
enabled.
CH3NH3PbI3.lua). OghmaNano sélectionne le fichier le plus approprié pour la simulation.2. Emplacement des fichiers de script sur le disque dur.
Un script de matériau peut être stocké dans l’un des deux emplacements suivants, ce qui détermine son apparence dans OghmaNano :
- À l’intérieur d’un dossier de matériau, par exemple dans le dossier « arséniure de gallium » ou « MAPI-CH3NH3PbI3 ». Un script placé ici appartient à ce matériau et s’affiche dans ce dernier lorsque vous l’ouvrez, en même temps que ses données n/k et ses autres fichiers.
- À l’extérieur d’un dossier de matériaux, il s’agit d’un fichier autonome
.luaplacé ailleurs dans la base de données. Dans ce cas, il apparaît comme un fichier.luaà part entière dans le navigateur de la base de données des matériaux, plutôt que d’être associé à un matériau unique.
La figure ?? illustre un script se trouvant dans un dossier de matériau. Le dossier MAPI-CH3NH3PbI3, qui contient des données optiques (n/k), comprend plusieurs ensembles de données : Ball, Leguy, Leguy-hydrated et Phillips, représentés par des icônes d’atomes, ainsi qu’un seul script électrique, CH3NH3PbI3.lua, représenté par une icône de fichier de code.
3. Un seul script électrique, plusieurs ensembles de données optiques.
Il est courant d’avoir plusieurs ensembles de constantes optiques pour un même matériau, mais un seul ensemble pertinent de paramètres électriques. Différents groupes de recherche mesurent n et k sur différentes plages de longueurs d’onde, en utilisant différents échantillons et différentes méthodes. Il est donc utile de conserver chaque ensemble de données optiques séparément et de choisir celui qui convient le mieux pour chaque simulation. Les paramètres électriques (écart de bande, affinité, mobilités, etc.), en revanche, sont généralement mieux définis par une seule valeur cohérente pour le matériau. C’est précisément la configuration présentée dans ?? : quatre ensembles de données n/k et un seul ensemble de paramètres électriques.
Lorsque le matériau est utilisé, OghmaNano tente de sélectionner automatiquement le fichier le plus approprié. Si aucun script n’est présent au niveau du matériau spécifique en cours de simulation, le modèle effectuera une recherche dans l’arborescence des dossiers du matériau afin de trouver un script approprié à utiliser. Cela signifie que vous pouvez associer un script électrique à un niveau pertinent et l’appliquer à l’ensemble des données regroupées en dessous, sans avoir à dupliquer les mêmes paramètres électriques dans chaque variante optique.
Pourquoi les séparer ? Les données optiques sont souvent ce qui varie entre les mesures : un film mesuré à 800 nm par un groupe et à 1 100 nm par un autre donne deux ensembles de données n/k différents, ce qui est tout à fait normal. Le comportement électrique du matériau n’est pas lié à la plage de longueurs d’onde d’une mesure optique. Par conséquent, un seul script électrique permet de maintenir la cohérence physique, quelle que soit la base de données optique avec laquelle il est associé.
4. Analyse de la structure d’un script de matériau.
L’exemple ci-dessous présente un script complet pour les matériaux électriques. AlGaInAs — le matériau quaternaire à base d’InP, dont les paramètres de réseau sont compatibles, et qui est utilisé dans les lasers et les détecteurs de télécommunications. Il est présenté en entier afin que vous puissiez voir comment un script réel et entièrement documenté est assemblé ; chaque fonction est ensuite décomposée et expliquée. Section 5 voir ci-dessous. Cliquez pour afficher plus de détails.
Exemple complet de scénario — 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).
Afficher davantage.
-- 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. Description détaillée des fonctions.
Chaque fonction d’un script de matériau suit le même modèle : elle reçoit la table state et renvoie une valeur value ainsi qu’un indicateur enabled. Les sous-sections suivantes décrivent chaque groupe de fonctions de l’exemple AlGaInAs.
5.1 La structure state et le drapeau enabled
Chaque fonction reçoit un objet state contenant les conditions de simulation locales au point du dispositif où la valeur est demandée. En Lua, cela est mis en œuvre sous forme de tableau ; si vous connaissez le langage C, il est préférable de le considérer comme une structure struct, ou en C++ comme une petite classe/objet dont les membres contiennent l’état local actuel. Les champs disponibles sont les suivants :
state.T— température locale (en kelvins).state.x,state.y,state.z— position à l’intérieur de l’appareil (en mètres).state.photon_density— densité locale de photons (m-3).
Étant donné qu’OghmaNano fournit cette valeur locale state à la fonction, un paramètre de matériau peut être calculé à partir de la température, de la position ou de la densité de photons, plutôt que d’être limité à une seule valeur fixe. La deuxième valeur de retour, enabled, détermine si le modèle utilise la valeur renvoyée par le script. Si enabled est égal à true, la valeur du script est utilisée ; si c’est false, la valeur stockée dans les éditeurs standard est utilisée à la place. Cela permet à un script de définir uniquement les paramètres qui doivent varier, tout en laissant tous les autres paramètres avec des valeurs fixes habituelles.
5.2 Identité : name, description, formula
Ces trois fonctions renvoient des chaînes de caractères descriptives plutôt que des valeurs numériques. Elles permettent d’identifier le matériau, de fournir une brève description compréhensible et d’indiquer sa formule chimique.
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 Structure de bande : Eg et Xi
Eg renvoie la largeur de bande interdite (en électron-volts) et Xi l’affinité électronique (en électron-volts). Ensemble, ces deux grandeurs déterminent la position des limites des bandes de conduction et de valence, et elles sont utilisées dans tout le modèle (voir).
Section 7).
La fonction qui décrit l’énergie de bande du matériau AlGaInAs est la plus pertinente dans ce fichier : elle calcule la valeur de cette énergie à 300 K en fonction de la proportion d’aluminium.
x puis applique un décalage de température de type Varshni, de sorte que la valeur renvoyée dépend 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
Exemple concret : pour x = 0,30, le terme de composition à 300 K donne Eg(300 K) ≈ 0,76 + 0,49(0,30) + 0,20(0,30)2 ≈ 0,925 eV (environ 1,34 μm). Puisque Eg indique state.T, l’augmentation de la température du dispositif réduit automatiquement la largeur de la bande interdite grâce au terme de Varshni, ce qu’une valeur fixe ne pourrait jamais reproduire.
5.4 Densité d’états : Nc et Nv
Nc et Nv renvoient les densités d’états effectives des bandes de conduction et de valence (m-3). Dans cet exemple, les deux valeurs sont indiquées à 300 K et mises à l’échelle en fonction de la température selon la formule (T/300)1,5, ce qui correspond au résultat standard pour une bande parabolique. Cette dépendance à la température est spécifique au modèle de matériau utilisé ici ; d’autres matériaux peuvent utiliser des dépendances à la température différentes, selon les besoins.
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 Mobilités : mu_e, mu_h et alias directionnels.
mu_e et mu_h renvoient les valeurs de mobilité des électrons et des trous dans un champ magnétique faible (m2 V-1 s-1). Dans cet exemple, les valeurs de mobilité sont mises à l’échelle en fonction de la température selon la formule (300/T)1,5, mais cette dépendance à la température fait partie du modèle spécifique du matériau et peut être remplacée par une autre relation, le cas échéant. Par exemple, dans un semi-conducteur organique, la mobilité pourrait plutôt être décrite à l’aide d’une dépendance à la température de type activé ou par sauts. OghmaNano peut également utiliser des valeurs de mobilité dépendant de la direction, de sorte que le fichier fournit mue_x, mue_y, mue_z et muh_x, muh_y, muh_z. Dans cet exemple isotrope, chacun renvoie simplement la même valeur scalaire, mais chaque direction peut se voir attribuer sa propre expression pour un matériau anisotrope.
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 Permittivité : epsilonr
epsilonr renvoie la permittivité statique relative (sans dimension), qui définit les propriétés électrostatiques dans le solveur de diffusion-dérive.
function material.epsilonr(state)
-- Relative static permittivity, dimensionless
local enabled = true
local value = 13.4
return value, enabled
end
5.7 Recombinaison : radiative et Auger.
free_to_free_recombination renvoie le coefficient de recombinaison bande à bande (radiative) (m3 s-1), tandis que auger_Cn et auger_Cp renvoient les coefficients d’Auger pour les électrons et les trous (m6 s-1). La recombinaison d’Auger est un facteur de perte important dans les dispositifs III–V à faible bande interdite, et son importance augmente considérablement à mesure que la bande interdite se rétrécit. Par conséquent, ces coefficients sont des candidats naturels pour une expression qui dépend de la composition ou de la température, dans un script plus avancé.
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 Pièges pour la capture des SRH.
Les quatre fonctions de Shockley-Read-Hall décrivent un seul niveau d’équilibre des pièges : ss_srh_trap_energy (énergie du piège par rapport au milieu de la bande interdite, en eV ; une valeur positive indique une position vers la bande de conduction), ss_srh_Nt (densité des pièges, en m-3) et ss_srh_sigma_n / ss_srh_sigma_p (sections efficaces de capture des électrons et des trous, en m2). Ces valeurs dépendent fortement des défauts et de l’échantillon, de sorte que les valeurs données dans l’exemple ne sont que des valeurs indicatives qui doivent être remplacées par vos propres données mesurées.
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 Paramètres thermiques et structurels
Les fonctions physiques restantes décrivent le comportement thermique et structurel du matériau : thermal_kl (conductivité thermique du réseau cristallin, W m-1 K-1), heat_capacity (J kg-1 K-1), density (kg m-3), lattice_constant (m, avec dilatation thermique linéaire appliquée à environ 300 K), et les temps de relaxation de l’énergie des porteurs thermal_tau_e / thermal_tau_h (s). Notez comment thermal_kl et lattice_constant permettent d’obtenir state.T, qui renvoie des valeurs dépendant de la température.
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() — un outil d’aide à l’auto-évaluation
Enfin, print() est plutôt une fonction pratique qu’une propriété physique. Elle crée un tableau représentatif state (300 K, à l’origine, densité de photons nulle) et affiche toutes les valeurs calculées par le script. Cela est utile pour vérifier un script à partir de la ligne de commande ou dans un interpréteur Lua indépendant avant de l’utiliser dans une simulation, ce qui permet de vérifier rapidement si les résultats obtenus correspondent aux valeurs attendues.
6. Utiliser un script dans une simulation.
Jusqu’à présent, la discussion s’est concentrée sur les scripts Lua stockés dans la base de données des matériaux. Pour utiliser l’un de ces scripts dans une simulation d’appareil réelle, ouvrez l’éditeur des paramètres électriques pour la couche concernée. L’éditeur peut fonctionner de deux manières différentes : il peut utiliser les valeurs de paramètres fixes habituelles stockées dans sim.json, ou il peut obtenir les valeurs de paramètres sélectionnées directement à partir d’un script de matériau Lua.
Par défaut, la fonction de script est désactivée et l’éditeur fonctionne de manière habituelle ??. Chaque paramètre est représenté par une valeur numérique modifiable, stockée dans sim.json. Dans ce mode, le script Lua pour les matériaux n’est pas utilisé.
En cliquant sur le bouton « Script », vous activez la fonction de création de scripts ??. Les paramètres fournis par le script sont ensuite remplacés dans l’éditeur par la mention « Voir le script pour la valeur ». Les paramètres dont les fonctions Lua correspondantes sont désactivées continuent d’utiliser les valeurs fixes stockées dans sim.json. Cela permet à un script de contrôler uniquement les propriétés qui doivent être définies par script, tout en laissant les autres paramètres inchangés.
sim.json et le script n’est pas utilisé.
GaAs.lua).
sim.json.
sim.json énumère toutes les valeurs qui seront modifiées.Lorsque la fonction de script est activée, un onglet Éditeur de code apparaît à côté de l’onglet Paramètres ??. Cela vous permet d’examiner et de modifier directement le script Lua du matériau, sans avoir à revenir à la base de données des matériaux, et ce, directement dans la simulation.
6.1 Sélectionner un script ou copier ses valeurs dans la simulation.
Le petit menu situé à côté du bouton « Script » propose deux méthodes différentes pour utiliser un script de matériau ?? :
- Importer le script de matériau : ouvre la base de données des matériaux et vous permet de sélectionner le script de matériau Lua que la simulation doit utiliser.
- Remplir le fichier JSON à partir d’un script : exécute le script sélectionné et copie les valeurs de paramètres obtenues dans les valeurs fixes correspondantes de
sim.json.
Ces deux approches répondent à des objectifs différents. Si le script est utilisé directement, ses fonctions restent actives pendant la simulation. Il s’agit du mode approprié lorsque l’on souhaite faire varier un paramètre en fonction de quantités telles que la température, la position, la composition ou la densité de photons.
Eg et Xi se reflètent automatiquement ici.Autre possibilité : vous pouvez utiliser la fonction « Populate json from script » lorsque vous souhaitez que le script fournisse un ensemble précis de valeurs initiales, mais que vous n’avez pas besoin que le script reste actif. OghmaNano exécute le script, enregistre les résultats dans les champs de paramètres habituels, et ces valeurs peuvent ensuite être modifiées manuellement de la manière habituelle.
Étant donné que le remplissage de sim.json peut remplacer les valeurs déjà présentes dans la simulation, OghmaNano affiche d’abord une boîte de dialogue de confirmation ??. Cette boîte de dialogue affiche le script utilisé et présente chaque paramètre qui serait modifié, ainsi que sa valeur actuelle et la valeur proposée. Aucune valeur n’est modifiée tant que l’opération n’est pas confirmée.
Il existe deux façons d’utiliser le même script : soit conserver le script actif lorsque les paramètres doivent varier pendant la simulation, soit utiliser la fonction « Remplir le fichier JSON à partir du script » pour obtenir un ensemble de valeurs initiales fixes qui pourront ensuite être modifiées via l’interface graphique habituelle.
7. Indiquer où les valeurs du script sont utilisées.
Les valeurs générées par un script de matériau sont utilisées dans tout le modèle, et pas seulement dans le solveur électrique. Des quantités telles que Eg et Xi définissent les positions des limites de bande partout où elles sont nécessaires. Par exemple, les niveaux d’énergie affichés dans le diagramme de bandes/visualiseur du taux de génération sont tirés de ces valeurs ??. Par conséquent, la modification de la largeur de bande ou de l’affinité dans un script se répercute automatiquement sur le diagramme de bandes, le modèle optique et le solveur électrique.
Les erreurs les plus fréquentes.
- La déclaration
local material = {}doit figurer dans les 1000 premiers octets du fichier, sinon OghmaNano ne la reconnaîtra pas comme un script valide. - Chaque fonction doit renvoyer deux valeurs : la quantité et le drapeau
enabled. Une case affiche uniquement le message « Voir le script pour la valeur » lorsque sa fonction estenabled. - Utilisez systématiquement les unités du Système international (m, m⁻³, m² V⁻¹ s⁻¹, eV, comme indiqué). Vérifiez approximativement l’ordre de grandeur des valeurs : sont-elles cohérentes ?
- Le script qui remplit le fichier JSON écrase les valeurs fixes dans
sim.json. Lisez attentivement la boîte de dialogue de confirmation avant de valider.
Résumé et prochaines étapes
- Un script de matériau Lua définit les propriétés en fonction de la température, de la position, de la composition ou de la densité de photons. Il est facultatif et n’est nécessaire que pour les paramètres variables ou ceux dont la valeur est bien définie.
- Les fichiers sont reconnus par
local material = {}au cours des 1 000 premiers octets et peuvent être placés dans un dossier de matériaux (affiché avec le matériau) ou être des fichiers autonomes (affichés sous la forme d’un fichier.lua). - Un seul script électrique est généralement utilisé pour plusieurs ensembles de données optiques (n/k) ; le modèle sélectionne le fichier le plus approprié et effectue une recherche en sens inverse lorsqu’aucun script n’est présent au niveau du matériau.
- Dans une simulation, l’éditeur de paramètres électriques peut utiliser des valeurs fixes
sim.jsonou un script. La fonction « Remplir le fichier JSON à partir d’un script » permet d’intégrer les valeurs du script dans les champs prédéfinis. - Des valeurs telles que
EgetXisont utilisées dans tout le modèle, y compris dans le diagramme de bandes.
Suivant : Retour à Partie C pour savoir comment la base de données est stockée, ou consultez Base de données optique et Téléchargement de fichiers supplémentaires..