Startseite Beispiele Screenshots Benutzerhandbuch Bluesky-Logo YouTube ☰
OghmaNano Simulation von organischen/Perowskit-Solarzellen, OFETs und OLEDs DOWNLOAD Quick Start guide

Lua-Skriptsprache für die Materialmodellierung bei der Simulation von Halbleiterbauelementen

OghmaNano unterstützt die Verwendung von Lua-Skripten für die Materialdefinition als Alternative zur manuellen Eingabe fester Materialparameter über den grafischen Editor für elektrische Parameter. Für die meisten Simulationen sind feste Werte, die über die grafische Benutzeroberfläche eingegeben werden, ausreichend. Lua-Skripte sind jedoch für Fälle gedacht, in denen elektrische, optische oder thermische Materialeigenschaften programmatisch definiert oder in Abhängigkeit von der Temperatur, der Position (x, y, z), der Zusammensetzung oder der Photonenanzahl variiert werden müssen. Parameter wie Bandlücke, Elektronenaffinität, Trägermobilität, Rekombinationskoeffizienten und Wärmeleitfähigkeit können daher als Funktionen und nicht als einzelne Konstanten ausgedrückt werden. Auf dieser Seite wird erläutert, wie Lua-Materialskripte aufgebaut sind, wie OghmaNano sie findet und auswählt, wie sie mit Materialien und optischen n/k-Datensätzen verknüpft werden und wie die in den Skripten definierten Parameter innerhalb einer Simulation verwendet werden.

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. Was ist ein Lua-Materialskript?

Ein Lua-Materialskript ist eine einfache Textdatei. .lua Datei, in der Materialeigenschaften mithilfe kleiner Funktionen definiert werden, anstatt feste Werte zu verwenden. Jede Funktion gibt den Wert eines bestimmten Materialparameters zurück, wie z. B. die Bandlücke, die Elektronenaffinität, die Trägermobilität, den Rekombinationskoeffizienten oder die Wärmeleitfähigkeit. Diese Werte können konstant sein oder als Funktionen der Temperatur variieren. T und Positionx, y, z). Einzelne Funktionen können aktiviert oder deaktiviert werden, sodass das Skript nur die von Ihnen gewünschten Parameter überschreiben kann, während die übrigen Werte weiterhin aus den Standardeinstellungen der Simulation übernommen werden. Eine typische Funktion sieht wie folgt aus:

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

Jede .lua-Datei in der OghmaNano-Materialdatenbank wird als Materialskript behandelt, wenn die Tabellendeklaration local material = {} innerhalb der ersten 1000 Bytes der Datei erscheint. Das bedeutet, dass ein Lizenzkopf oder ein Block mit erläuternden Kommentaren vor der Deklaration stehen können, vorausgesetzt, der Marker befindet sich weiterhin in der Nähe des Dateiendes. Sie können ein Materialskript direkt im Code-Editor-Reiter des Materialeditors ?? anzeigen und bearbeiten.

Ein Materialskript kann so detailliert oder so einfach sein, wie Sie es wünschen. Es kann beispielsweise nur die Bandlücke und die Elektronenaffinität definieren oder einen vollständigen Satz von Parametern für die Bandstruktur, den Transport, die Rekombination und die thermischen Eigenschaften. Funktionen, die Sie nicht benötigen, können einfach weggelassen oder mit enabled = false zurückgegeben werden, sodass das Modell auf den in den Standardeditoren gespeicherten Wert zurückgreift.

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
Die Registerkarte „Code-Editor“ im Material-Editor zeigt das Lua-Skript für ein Material an. Jede Eigenschaft ist eine kleine Funktion, die einen Wert und ein enabled-Flag zurückgibt.
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
Ein einzelner Materialordner enthält vier optische (n/k-)Datensätze und ein elektrisches Skript (CH3NH3PbI3.lua). OghmaNano wählt die am besten geeignete Datei für die Simulation aus.

2. Wo Skripte auf der Festplatte gespeichert sind.

Ein Materialskript kann an einem von zwei verschiedenen Orten gespeichert werden, und dies bestimmt, wie es in OghmaNano angezeigt wird:

Abbildung ?? zeigt ein Skript, das sich in einem Materialordner befindet. Der MAPI-CH3NH3PbI3-Perowskit-Ordner enthält mehrere optische Datensätze (n/k) – Ball, Leguy, Leguy-hydratisiert und Phillips –, die durch Atomsymbole dargestellt werden, zusammen mit einem einzelnen elektrischen Skript, CH3NH3PbI3.lua, das durch ein Code-Datei-Symbol dargestellt wird.

3. Ein elektrisches Signal, mehrere optische Datensätze

Es ist üblich, dass für ein bestimmtes Material mehrere Sätze von optischen Konstanten vorliegen, aber nur ein sinnvoller Satz von elektrischen Parametern. Verschiedene Forschungsgruppen messen n und k in unterschiedlichen Wellenlängenbereichen unter Verwendung unterschiedlicher Proben und unterschiedlicher Methoden. Daher ist es sinnvoll, diese optischen Datensätze getrennt voneinander zu speichern und für jede Simulation den jeweils passenden auszuwählen. Die elektrischen Parameter (Bandlücke, Affinität, Beweglichkeit usw.) sollten hingegen in der Regel als eine einzige, konsistente Definition für das Material gespeichert werden. Genau dies ist in ?? dargestellt: vier Datensätze für n/k und ein Datensatz für die elektrischen Parameter.

Wenn das Material verwendet wird, versucht OghmaNano, automatisch die am besten geeignete Datei auszuwählen. Falls für das jeweilige simulierte Material kein Skript vorhanden ist, durchsucht das Modell die Ordnerstruktur des Materials rückwärts, um ein geeignetes Skript zu finden, das verwendet werden kann. Das bedeutet, dass Sie ein elektrisches Skript auf einer sinnvollen Ebene hinzufügen können und dieses auf die darunter gruppierten Datensätze angewendet wird, ohne die gleichen elektrischen Parameter in jede optische Variante einfügen zu müssen.

Warum sollte man die beiden voneinander trennen? Optische Daten sind oft das, was sich zwischen den Messungen ändert – ein Film, der von einer Gruppe mit 800 nm und von einer anderen mit 1100 nm gemessen wird, liefert zwei tatsächlich unterschiedliche n/k-Datensätze. Das elektrische Verhalten des Materials ist nicht an den Wellenlängenbereich einer optischen Messung gebunden, daher sorgt ein einzelnes elektrisches Modell für eine konsistente physikalische Beschreibung, unabhängig davon, mit welchem optischen Datensatz es kombiniert wird.

4. Die Struktur eines Materialskripts

Das folgende Beispiel zeigt ein vollständiges Skript für ein elektrisches Material, nämlich AlGaInAs – ein gitterangepasstes, auf InP basierendes quaternäres Material, das für Telekommunikationslaser und -detektoren verwendet wird. Es wird in seiner Gesamtheit dargestellt, damit Sie sehen können, wie ein echtes, vollständig dokumentiertes Skript zusammengestellt wird; jede Funktion wird dann in Abschnitt 5 weiter unten aufgeschlüsselt und erläutert. Klicken Sie, um es zu erweitern.

Vollständiges Beispiel für ein Drehbuch – 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).
Mehr anzeigen
 -- 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. Die Funktionen im Detail

Jede Funktion in einem Materialskript folgt dem gleichen Muster: Sie empfängt die state-Tabelle und gibt eine value zusammen mit einem enabled-Flag zurück. Die folgenden Unterabschnitte dokumentieren jede Funktionsgruppe aus dem AlGaInAs-Beispiel.

5.1 Die state-Struktur und das enabled-Flag

Jeder Funktion wird ein state-Objekt übergeben, das die lokalen Simulationsbedingungen an dem Punkt im Gerät enthält, an dem der Wert angefordert wird. In Lua wird dies als Tabelle implementiert; wenn Sie mit C vertraut sind, können Sie sich dies am besten als eine struct vorstellen oder in C++ als eine kleine Klasse/ein kleines Objekt, dessen Elemente den aktuellen lokalen Zustand enthalten. Die verfügbaren Felder sind:

Da OghmaNano diesen lokalen Wert state an die Funktion übergibt, kann ein Materialparameter aus Temperatur, Position oder Photonenfluss berechnet werden, anstatt auf einen einzigen festen Wert beschränkt zu sein. Der zweite Rückgabewert, enabled, steuert, ob das Modell den vom Skript zurückgegebenen Wert verwendet. Wenn enabled gleich true ist, wird der Wert des Skripts verwendet; wenn es false ist, wird stattdessen der in den Standardeditoren gespeicherte Wert verwendet. Dies ermöglicht es einem Skript, nur die Parameter zu definieren, die variieren müssen, während alle anderen Parameter als normale feste Werte beibehalten werden.

5.2 Identität: name, description, formula

Diese drei Funktionen geben beschreibende Zeichenketten und keine tatsächlichen Werte zurück. Sie identifizieren das Material, geben eine kurze, für Menschen lesbare Beschreibung und die chemische Formel an.

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 Bandstruktur: Eg und Xi

Eg gibt die Bandlücke (in Elektronenvolt) und Xi die Elektronenaffinität (in Elektronenvolt) zurück. Zusammen bestimmen diese beiden Größen die Positionen der Leitungs- und Valenzbandränder, und sie werden im gesamten Modell verwendet (siehe Abschnitt 7). Die AlGaInAs-Bandlücke ist die aussagekräftigste Funktion in der Datei: Sie berechnet die Bandlücke bei 300 K anhand des Al-Anteils x und wendet dann eine temperaturbedingte Verschiebung vom Varshni-Typ an, sodass der zurückgegebene Wert von state.T abhängt.

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

Beispiel: Bei x = 0,30 ergibt der Term für die Zusammensetzung bei 300 K: Eg(300 K) ≈ 0,76 + 0,49(0,30) + 0,20(0,30)2 ≈ 0,925 eV (etwa 1,34 μm). Da Eg als state.T formuliert ist, führt eine Erhöhung der Betriebstemperatur automatisch zu einer Verringerung der Bandlücke durch den Varshni-Term – etwas, das ein fester Wert niemals erfassen könnte.

5.4 Zustandsdichte: Nc und Nv

Nc und Nv geben die effektiven Zustandsdichten der Leitungs- und Valenzbänder in Einheiten von m-3 zurück. In diesem Beispiel werden beide Werte bei 300 K angegeben und mit der Temperatur skaliert, und zwar als (T/300)1,5, was dem Standardergebnis für ein parabolisches Band entspricht. Diese Temperaturabhängigkeit ist spezifisch für das hier verwendete Materialmodell; andere Materialien können bei Bedarf andere Temperaturabhängigkeiten verwenden.

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äten: mu_e, mu_h und Richtungs-Aliasnamen

mu_e und mu_h geben die Elektronen- und Lochmobilität bei niedrigen Feldstärken (m2 V-1 s-1) zurück. In diesem Beispiel werden die Mobilitäten temperaturabhängig skaliert, und zwar als (300/T)1,5. Diese Temperaturabhängigkeit ist jedoch Teil des jeweiligen Materialmodells und kann bei Bedarf durch eine andere Beziehung ersetzt werden. In einem organischen Halbleiter könnte die Mobilität beispielsweise durch eine aktivierungs- oder sprungartige Temperaturabhängigkeit beschrieben werden. OghmaNano kann auch richtungsabhängige Mobilitäten verwenden, daher stellt die Datei mue_x, mue_y, mue_z und muh_x, muh_y, muh_z bereit. In diesem isotropen Beispiel gibt jede dieser Variablen einfach denselben Skalarwert zurück, aber für jedes anisotropes Material kann eine eigene Formel für jede Richtung angegeben werden.

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 Dielektrizitätskonstante: epsilonr

epsilonr gibt die relative, dimensionslose statische Permittivität zurück, die die elektrostatischen Eigenschaften im Drift-Diffusions-Solver festlegt.

function material.epsilonr(state)
	-- Relative static permittivity, dimensionless
	local enabled = true
	local value = 13.4
	return value, enabled
end

5.7 Rekombination: durch Strahlung und Auger-Prozess

free_to_free_recombination gibt den Rekombinationskoeffizienten für die Band-zu-Band-Rekombination (strahlende Rekombination) in der Einheit m³ s⁻¹ zurück, während auger_Cn und auger_Cp die Auger-Koeffizienten für Elektronen und Löcher in der Einheit m⁶ s⁻¹ zurückgeben. Die Auger-Rekombination ist ein wichtiger Verlustmechanismus in III–V-Halbleiterbauelementen mit schmaler Bandlücke, und ihre Stärke nimmt mit abnehmender Bandlücke deutlich zu. Daher eignen sich diese Parameter gut für eine Zusammensetzungs- oder temperaturabhängige Formulierung in einem anspruchsvolleren Modell.

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 SRH-Fallen

Die vier Shockley-Read-Hall-Funktionen beschreiben ein einzelnes Gleichgewichtsniveau für Defektelektronen: ss_srh_trap_energy (Defektenergie relativ zur Mitte der Bandlücke, eV; positive Werte beziehen sich auf das Leitungsband), ss_srh_Nt (Defektdichte, m-3) und ss_srh_sigma_n / ss_srh_sigma_p (Elektronen- und Loch-Einfangquerschnitte, m2). Diese Werte hängen stark von den Defekten und der jeweiligen Probe ab, daher sind die in dem Beispiel angegebenen Werte als vorläufige Platzhalter zu verstehen, die durch Ihre eigenen gemessenen Daten ersetzt werden sollten.

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 Thermische und strukturelle Parameter

Die verbleibenden physikalischen Eigenschaften beschreiben das thermische und strukturelle Verhalten des Materials: thermal_kl (Gitterwärmeleitfähigkeit, W m-1 K-1), heat_capacity (J kg-1 K-1), density (kg m-3), lattice_constant (m, wobei die lineare Wärmeausdehnung bei etwa 300 K berücksichtigt wird) und die Energierelaxationszeiten der Ladungsträger thermal_tau_e / thermal_tau_h (s). Beachten Sie, wie thermal_kl und lattice_constant state.T auslesen, um temperaturabhängige Werte zurückzugeben.

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() – ein Hilfsmittel für Selbsttests

Abschließend lässt sich sagen, dass print() eher eine Hilfsfunktion als eine materielle Eigenschaft ist. Sie erstellt eine repräsentative state-Tabelle (300 K, am Ursprung, Null-Photonendichte) und gibt alle Werte aus, die das Skript berechnet. Dies ist nützlich, um ein Skript über die Befehlszeile oder in einem eigenständigen Lua-Interpreter zu testen, bevor es in einer Simulation verwendet wird – eine schnelle Möglichkeit, um zu überprüfen, ob die Ergebnisse die erwarteten Größenordnungen aufweisen.

6. Verwenden eines Skripts in einer Simulation

Bisher konzentrierte sich die Diskussion auf Lua-Skripte, die in der Datenbank „Materials“ gespeichert sind. Um eines dieser Skripte in einer tatsächlichen Geräte-Simulation zu verwenden, öffnen Sie den Editor für elektrische Parameter für die jeweilige Schicht. Der Editor kann auf zwei verschiedene Arten arbeiten: Er kann die üblichen, festen Parameterwerte verwenden, die in sim.json gespeichert sind, oder er kann ausgewählte Parameterwerte direkt aus einem Lua-Materialskript beziehen.

Standardmäßig ist die Skriptfunktion deaktiviert, und der Editor funktioniert wie gewohnt ??. Jeder Parameter wird durch einen bearbeitbaren numerischen Wert dargestellt, der in sim.json gespeichert ist. In diesem Modus wird das Lua-Materialskript nicht verwendet.

Durch Klicken auf die Schaltfläche „Skript“ wird die Skriptbearbeitung aktiviert ??. Die vom Skript übermittelten Parameter werden dann im Editor durch „Wert im Skript nachsehen“ ersetzt. Parameter, deren zugehörigen Lua-Funktionen deaktiviert sind, verwenden weiterhin die in sim.json gespeicherten festen Werte. Dadurch kann ein Skript nur die Eigenschaften steuern, die skriptgesteuert werden müssen, während alle anderen Parameter unverändert bleiben.

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
Skript deaktiviert: Feste Werte werden direkt in sim.json gespeichert, und das Skript wird nicht verwendet.
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
Wenn ein Skript verwendet wird, lautet die Beschreibung der aktivierten Parameter nun „Wert siehe Skript“, und die Werte werden vom Lua-Skript berechnet.
OghmaNano Electrical parameter editor Code editor tab showing the GaAs.lua material script source, with material.name, material.description and material.formula functions visible
Der Reiter „Code-Editor“ innerhalb des Editors für elektrische Parameter zeigt das aktive Materialskript (GaAs.lua) an.
OghmaNano Electrical parameter editor showing the Script dropdown menu with two options: Import material script and Populate json from script
Das Menü „Skript“: „Materialskript importieren“ wählt eine Lua-Datei aus; „JSON aus Skript erstellen“ schreibt die Werte in 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
Das Bestätigungsfenster, das vor dem Einfüllen der Daten in sim.json angezeigt wird, listet alle Werte auf, die sich ändern würden.

Wenn die Skriptfunktion aktiviert ist, erscheint neben dem Tab „Parameter“ ?? ein Tab „Code-Editor“. Dadurch können Sie das Lua-Materialskript direkt innerhalb der Simulation einsehen und bearbeiten, ohne zur Materialdatenbank zurückkehren zu müssen.

6.1 Auswahl eines Skripts oder Übernahme seiner Werte in die Simulation.

Das kleine Menü neben der Schaltfläche „Skript“ bietet zwei verschiedene Möglichkeiten zur Verwendung eines Materialskripts ??:

Diese beiden Ansätze dienen unterschiedlichen Zwecken. Wenn das Skript direkt verwendet wird, bleiben seine Funktionen während der Simulation aktiv. Dies ist die geeignete Methode, wenn ein Parameter in Abhängigkeit von Größen wie Temperatur, Position, Zusammensetzung oder Photonenfluss variieren muss.

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
Die Anzeige für das Banddiagramm bzw. die Erzeugungsrate. Die beschrifteten Energieniveaus werden aus den Materialskripten übernommen, sodass Änderungen an Eg und Xi hier automatisch berücksichtigt werden.

Alternativ kann die Funktion „JSON-Daten aus einem Skript generieren“ verwendet werden, wenn Sie möchten, dass das Skript eine klar definierte Reihe von Anfangswerten liefert, das Skript aber nicht aktiv bleiben muss. OghmaNano führt das Skript aus, schreibt die resultierenden Zahlen in die entsprechenden Parameterfelder und diese Werte können dann auf die übliche Weise manuell bearbeitet werden.

Da das Befüllen von sim.json vorhandene Werte in der Simulation überschreiben kann, zeigt OghmaNano zunächst ein Bestätigungsfenster ?? an. In diesem Fenster werden das verwendete Skript und alle Parameter aufgelistet, die sich ändern würden, zusammen mit ihren aktuellen und vorgeschlagenen Werten. Keine Werte werden geändert, bevor die Operation bestätigt wurde.

Es gibt zwei Möglichkeiten, dasselbe Materialskript zu verwenden: Entweder das Skript während der Simulation aktiv lassen, wenn die Parameter variieren müssen, oder die Funktion „Populate json from script“ verwenden, um eine Reihe fester Anfangswerte zu erhalten, die anschließend über die normale grafische Benutzeroberfläche bearbeitet werden können.

7. Wo die Werte des Skripts verwendet werden

Die durch ein Materialskript erzeugten Werte werden im gesamten Modell verwendet, nicht nur im elektrischen Solver. Größen wie Eg und Xi legen die Bandkantenpositionen überall dort fest, wo sie benötigt werden. Beispielsweise werden die in dem Banddiagramm/der Darstellung der Erzeugungsrate dargestellten Energieniveaus aus diesen Werten ?? übernommen. Das Bearbeiten der Bandlücke oder der Affinität in einem Skript wirkt sich daher automatisch auf das Banddiagramm, das optische Modell und den elektrischen Solver aus.

Häufige Fehlerquellen

Zusammenfassung und nächste Schritte

Weiter: Gehen Sie zurück zu Teil C, um mehr darüber zu erfahren, wie die Datenbank gespeichert wird, oder lesen Sie Optische Datenbank und Weitere Materialien herunterladen.