Strona główna Przykłady Zrzuty ekranu Instrukcja obsługi Logo Bluesky. YouTube ☰
OghmaNano Platforma do symulacji wielofizycznych procesów zachodzących w optoelektronicznych urządzeniach i systemach fotonicznych. POBIERZ Przewodnik szybkiego uruchomienia

Skryptowanie w języku Lua do modelowania zachowania urządzeń półprzewodnikowych.

OghmaNano obsługuje skrypty materiałowe w języku Lua jako alternatywę dla ręcznego wprowadzania stałych parametrów materiałów za pomocą graficznego edytora parametrów elektrycznych. W większości symulacji wystarczające są stałe wartości wprowadzane za pomocą interfejsu graficznego; skrypty Lua są przeznaczone do przypadków, w których właściwości elektryczne, optyczne lub termiczne materiałów muszą być definiowane programowo lub zmieniać się w zależności od temperatury, położenia (x, y, z), składu lub gęstości fotonów. Parametry takie jak przerwa energetyczna, powinowactwo elektronowe, ruchliwość nośników, współczynniki rekombinacji i przewodność cieplna mogą być zatem wyrażone jako funkcje, a nie pojedyncze stałe. Na tej stronie wyjaśniono, jak są strukturowane skrypty materiałowe Lua, jak OghmaNano je znajduje i wybiera, jak są one powiązane z materiałami i zbiorami danych optycznych n/k oraz jak skryptowane parametry są wykorzystywane w symulacji.

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. Czym jest skrypt materiału Lua?

Skrypt materiału w języku Lua to zwykły plik tekstowy. .lua plik, w którym właściwości materiału są definiowane za pomocą krótkich funkcji, a nie stałych wartości. Każda funkcja zwraca wartość określonego parametru materiału, takiego jak energia przerwy, powinowactwo elektronowe, ruchliwość nośników, współczynnik rekombinacji lub przewodność cieplna. Wartości te mogą być stałe lub mogą zmieniać się w zależności od temperatury. T oraz pozycjax, y, z). Poszczególne funkcje można włączać lub wyłączać, co pozwala skryptowi modyfikować tylko wybrane parametry, podczas gdy pozostałe wartości pozostają niezmienione i są pobierane z domyślnych ustawień symulacji. Typowa funkcja wygląda następująco:

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

Każdy plik .lua w bazie danych OghmaNano Materials jest traktowany jako skrypt materiału, jeśli deklaracja tabeli local material = {} znajduje się w pierwszych 1000 bajtach pliku. Oznacza to, że nagłówek licencji lub blok komentarzy wyjaśniających może się pojawić przed deklaracją, pod warunkiem, że znacznik pozostanie w górnej części pliku. Można przeglądać i edytować skrypt materiału bezpośrednio z karty edytora kodu w edytorze materiałów ??.

Skrypt definiujący właściwości materiału może określać dowolną liczbę parametrów, w zależności od potrzeb. Może definiować jedynie przerwę energetyczną i powinowactwo elektronowe, lub pełny zestaw parametrów dotyczących struktury pasmowej, transportu, rekombinacji i właściwości termicznych. Funkcje, które nie są potrzebne, można po prostu pominąć lub zwrócić wartość enabled = false, dzięki czemu model powróci do wartości zapisanej w standardowych edytorach.

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
Zakładka „Edytor kodu” w edytorze materiałów, wyświetlająca skrypt Lua dla danego materiału. Każda właściwość to mała funkcja, która zwraca wartość i flagę 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
Pojedynczy folder zawierający cztery zestawy danych optycznych (n/k) i jeden skrypt elektryczny (CH3NH3PbI3.lua). OghmaNano wybiera najbardziej odpowiedni plik do symulacji.

2. Gdzie skrypty są przechowywane na dysku.

Skrypt definiujący wygląd materiału może być przechowywany w jednym z dwóch miejsc, co wpływa na to, jak jest on wyświetlany w OghmaNano:

Na rysunku ?? przedstawiono skrypt znajdujący się wewnątrz folderu materiałowego. Folder perovskitu MAPI-CH3NH3PbI3 zawiera kilka zestawów danych optycznych (n/k) – Ball, Leguy, Leguy-hydrated i Phillips – reprezentowanych za pomocą ikon atomów, a także pojedynczy skrypt elektryczny, CH3NH3PbI3.lua, reprezentowany za pomocą ikony pliku kodu.

3. Jeden schemat elektryczny, kilka zbiorów danych optycznych.

Zazwyczaj dla jednego materiału dostępne są różne zestawy stałych optycznych, ale tylko jeden sensowny zestaw parametrów elektrycznych. Różne grupy badawcze mierzą wartości n i k w różnych zakresach długości fal, używając różnych próbek i różnych metod, dlatego warto przechowywać każdy z tych zestawów danych optycznych oddzielnie i wybierać spośród nich w zależności od potrzeb symulacji. Parametry elektryczne (przerwa energetyczna, powinowactwo, ruchliwość i inne) zazwyczaj najlepiej definiować jako jeden, spójny zestaw dla danego materiału. Dokładnie taki układ przedstawiono w ??: cztery zestawy danych n/k i jeden zestaw danych elektrycznych.

Po wybraniu materiału, OghmaNano automatycznie próbuje wybrać najbardziej odpowiedni plik. Jeśli w folderze danego materiału nie znajduje się odpowiedni skrypt, program przeszukuje strukturę folderów, aby znaleźć odpowiedni skrypt do użycia. Oznacza to, że można przypisać jeden skrypt elektryczny do odpowiedniego poziomu i zastosować go do zestawów danych zgrupowanych poniżej, bez konieczności powtarzania tych samych parametrów elektrycznych w każdej wariacji optycznej.

Dlaczego rozdzielać te dwa zestawy danych? Dane optyczne to często element, który zmienia się między poszczególnymi pomiarami – film, którego grubość zmierzono na 800 nm przez jedną grupę badaczy, a przez inną na 1100 nm, daje dwa odrębne, choć poprawne, zestawy danych n/k. Właściwości elektryczne materiału nie są związane z zakresem długości fal pomiaru optycznego, dlatego jeden program do analizy danych elektrycznych zapewnia spójność fizyczną, niezależnie od tego, z którym zestawem danych optycznych zostanie on połączony.

4. Struktura skryptu materiałowego

Poniższy przykład przedstawia kompletny skrypt dotyczący materiału elektrycznego AlGaInAs – czteroelementowego związku na bazie InP, charakteryzującego się dopasowaniem struktury krystalicznej, stosowanego w laserach i detektorach telekomunikacyjnych. Przedstawiono go w całości, aby można było zobaczyć, jak tworzy się rzeczywisty, w pełni udokumentowany skrypt; każda funkcja jest następnie szczegółowo omówiona w sekcji Sekcja 5 poniżej. Kliknij, aby rozwinąć.

Pełny przykład scenariusza materiału edukacyjnego — 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).
Pokaż więcej.
 -- 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. Szczegółowy opis funkcji.

Każda funkcja w skrypcie materiałowym działa według tego samego schematu: przyjmuje tabelę state i zwraca wartość value wraz z flagą enabled. W poniższych podsekcjach opisano poszczególne grupy funkcji z przykładu AlGaInAs.

5.1 Struktura state i flaga enabled

Każda funkcja otrzymuje obiekt state, który zawiera lokalne warunki symulacji w danym punkcie urządzenia, z którego żądana jest wartość. W języku Lua jest to zaimplementowane jako tabela; jeśli znasz język C, najlepiej pomyśleć o tym jako o strukturze struct, a w języku C++ jako o małej klasie/obiekcie, którego elementy zawierają aktualny lokalny stan. Dostępne pola to:

Ponieważ OghmaNano dostarcza tę lokalną wartość state do funkcji, można obliczyć parametr materiału na podstawie temperatury, położenia lub gęstości fotonów, zamiast ograniczać się do jednej, stałej wartości. Druga zwracana wartość, enabled, określa, czy model wykorzystuje wartość zwróconą przez skrypt. Jeśli enabled ma wartość true, używana jest wartość ze skryptu; jeśli ma wartość false, zamiast tego używana jest wartość przechowywana w standardowych edytorach. Dzięki temu skrypt może definiować tylko te parametry, które muszą się zmieniać, pozostawiając wszystkie pozostałe parametry jako zwykłe, stałe wartości.

5.2 Identyfikacja: name, description, formula

Te trzy funkcje zwracają opisy tekstowe, a nie wartości liczbowe. Określają rodzaj materiału, podają krótką, zrozumiałą dla człowieka charakterystykę oraz jego wzór chemiczny.

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 Struktura pasmowa: Eg i Xi

Eg zwraca wartość szerokości pasma energetycznego (w eV), a Xi powinowactwo elektronowe (w eV). Razem te dwie wartości określają położenie krawędzi pasma przewodnictwa i pasma walencyjnego i są wykorzystywane w całym modelu (patrz Sekcja 7). Szerokość pasma energetycznego AlGaInAs jest najważniejszą funkcją w pliku: oblicza ona wartość szerokości pasma przy 300 K na podstawie udziału Al (x), a następnie stosuje korektę temperatury typu Varshni, więc zwracana wartość zależy od 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

Przykład: dla x = 0,30 skład, przy temperaturze 300 K, daje Eg(300 K) ≈ 0,76 + 0,49(0,30) + 0,20(0,30)2 ≈ 0,925 eV (około 1,34 μm). Ponieważ Eg mówi, że state.T, podnoszenie temperatury urządzenia automatycznie zmniejsza przerwę energetyczną dzięki członowi Varshniego – czego stała wartość nigdy nie byłaby w stanie uwzględnić.

5.4 Gęstość stanów: Nc i Nv

Nc i Nv zwracają efektywne gęstości stanów w pasmach przewodnictwa i walencyjnych (m-3). W tym przykładzie obie wartości podano dla temperatury 300 K i przeskalowano w zależności od temperatury zgodnie ze wzorem (T/300)1,5, co odpowiada standardowemu parabolicznemu modelowi pasm. Ta zależność od temperatury jest charakterystyczna dla użytego modelu materiału; w przypadku innych materiałów można zastosować inne zależności od temperatury, jeśli to konieczne.

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 Mobilność: mu_e, mu_h i aliasy kierunkowe.

mu_e i mu_h zwracają wartości mobilności elektronów i dziur w niskich polach (m2 V-1 s-1). W tym przykładzie mobilność jest skalowana w zależności od temperatury zgodnie z zależnością (300/T)1,5, ale ta zależność od temperatury jest częścią konkretnego modelu materiału i w razie potrzeby można ją zastąpić inną zależnością. Na przykład, w organicznym półprzewodniku mobilność może być opisywana za pomocą aktywowanej lub skokowej zależności od temperatury. OghmaNano może również wykorzystywać mobilności zależne od kierunku, dlatego plik zawiera mue_x, mue_y, mue_z oraz muh_x, muh_y, muh_z. W tym izotropowym przykładzie każdy z nich zwraca po prostu tę samą wartość skalarną, ale dla każdego kierunku można podać odrębną zależność dla materiału anizotropowego.

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 Permittivity: epsilonr

epsilonr zwraca względną przenikalność elektryczną (wielkość bezwymiarowa), która określa właściwości elektrostatyczne w solverze opartym na modelu dryfu i dyfuzji.

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

5.7 Rekombinacja: radiacyjna i proces Augera

free_to_free_recombination zwraca współczynnik rekombinacji pasmowej (radiacyjnej) (m³ s⁻¹), natomiast auger_Cn i auger_Cp zwracają współczynniki rekombinacji Augera dla elektronów i dziur (m⁶ s⁻¹). Rekombinacja Augera jest głównym mechanizmem strat w urządzeniach półprzewodnikowych III–V o wąskiej przerwie energetycznej, a jej intensywność gwałtownie wzrasta wraz ze zmniejszaniem się przerwy, dlatego te parametry stanowią naturalny kandydat do uwzględnienia w bardziej zaawansowanym modelu, w którym uwzględniona jest zależność od składu materiału lub temperatury.

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 Pułapki SRH

Cztery funkcje Shockleya–Reada–Halla opisują pojedynczy poziom pułapki w stanie równowagi: ss_srh_trap_energy (energia pułapki w odniesieniu do środka przerwy energetycznej, eV; wartość dodatnia oznacza położenie bliżej pasma przewodnictwa), ss_srh_Nt (gęstość pułapek, m-3) oraz ss_srh_sigma_n / ss_srh_sigma_p (przekroje czynne dla wychwytu elektronów i dziur, m2). Wartości te silnie zależą od rodzaju defektów i właściwości próbki, dlatego podane w przykładzie wartości stanowią jedynie przykładowe dane zastępcze, które należy zastąpić własnymi, zmierzonymi danymi.

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 Parametry termiczne i konstrukcyjne

Pozostałe właściwości fizyczne opisują właściwości termiczne i strukturalne materiału: thermal_kl (przewodność cieplna sieci krystalicznej, W m-1 K-1), heat_capacity (J kg-1 K-1), density (kg m-3), lattice_constant (m, z uwzględnieniem liniowego współczynnika rozszerzalności cieplnej w temperaturze około 300 K) oraz czas relaksacji nośników energii thermal_tau_e / thermal_tau_h (s). Należy zauważyć, że thermal_kl i lattice_constant odczytują state.T w celu uzyskania wartości zależnych od temperatury.

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() – narzędzie wspomagające samodzielne testowanie.

Podsumowując, print() to raczej funkcja ułatwiająca pracę niż właściwość fizyczna. Tworzy reprezentatywną tabelę state (dla temperatury 300 K, w punkcie początkowym, przy zerowej gęstości fotonów) i wyświetla wszystkie wartości obliczane przez skrypt. Jest to przydatne do sprawdzania skryptu z poziomu wiersza poleceń lub w niezależnym interpreterze Lua przed użyciem go w symulacji – pozwala to szybko sprawdzić, czy otrzymane wyniki mają oczekiwane wartości.

6. Wykorzystanie skryptu w symulacji.

Dotychczasowa dyskusja koncentrowała się na skryptach Lua przechowywanych w bazie danych materiałów. Aby użyć jednego z tych skryptów w rzeczywistej symulacji urządzenia, otwórz edytor parametrów elektrycznych dla odpowiedniej warstwy. Edytor może działać na dwa różne sposoby: może wykorzystywać standardowe, stałe wartości parametrów przechowywane w sim.json lub może pobierać wybrane wartości parametrów bezpośrednio ze skryptu materiałowego Lua.

Domyślnie skrypty są wyłączone, a edytor działa w standardowy sposób ??. Każdy parametr jest reprezentowany przez edytowalną wartość liczbową, która jest przechowywana w sim.json. W tym trybie skrypt materiału Lua nie jest używany.

Kliknięcie przycisku „Skrypt” umożliwia tworzenie skryptów dla materiałów ??. Parametry zdefiniowane w skrypcie są następnie zastępowane w edytorze wyrażeniem „Wartość określona w skrypcie”. Parametry, dla których odpowiadające im funkcje Lua są wyłączone, nadal korzystają z wartości stałych zapisanych w sim.json. Dzięki temu skrypt może kontrolować tylko te właściwości, które wymagają definiowania w skrypcie, pozostawiając wszystkie inne parametry bez zmian.

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
Wyłączono skrypt: wartości stałe są zapisywane bezpośrednio w komórce sim.json, a skrypt nie jest używany.
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
Włączono skrypt: aktywowane parametry wyświetlają teraz informację „Wartość określona w skrypcie” i są obliczane przez skrypt 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
Zakładka „Edytor kodu” w oknie edytora parametrów elektrycznych, wyświetlająca aktywny skrypt materiału (GaAs.lua).
OghmaNano Electrical parameter editor showing the Script dropdown menu with two options: Import material script and Populate json from script
Menu „Skrypty”: opcja „Importuj skrypt” umożliwia wybranie pliku Lua; opcja „Wypełnij JSON ze skryptu” zapisuje wartości z tego skryptu do 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
Okno dialogowe z potwierdzeniem, które pojawia się przed wypełnieniem pola sim.json i wyświetla listę wszystkich wartości, które zostaną zmienione.

Po włączeniu funkcji skryptów, obok karty „Parametry” ?? pojawia się karta „Edytor kodu”. Umożliwia to bezpośrednie przeglądanie i edytowanie skryptu materiału Lua w ramach symulacji, bez konieczności powracania do bazy danych materiałów.

6.1 Wybór skryptu lub skopiowanie jego wartości do symulacji.

Krótkie menu znajdujące się obok przycisku „Skrypt” oferuje dwie różne metody wykorzystania skryptu materiałowego ??:

Oba te podejścia służą różnym celom. Jeśli skrypt jest używany bezpośrednio, jego funkcje pozostają aktywne podczas symulacji. Jest to odpowiedni tryb, gdy dany parametr musi zmieniać się w zależności od takich wielkości, jak temperatura, położenie, skład lub gęstość fotonów.

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
Program do wyświetlania diagramów pasmowych / wykresów szybkości generowania. Oznaczone poziomy energii są pobierane z plików konfiguracyjnych materiałów, więc wszelkie zmiany w parametrach Eg i Xi są automatycznie odzwierciedlane w programie.

Alternatywnie, można użyć funkcji „Populate json from script”, gdy chcemy, aby skrypt dostarczył zdefiniowany zestaw wartości początkowych, ale nie chcemy, aby skrypt pozostawał aktywny. OghmaNano wykonuje skrypt, zapisuje wynikowe wartości w standardowych polach parametrów, a następnie można je ręcznie edytować w zwykły sposób.

Ponieważ wypełnianie sim.json może nadpisać wartości już obecne w symulacji, OghmaNano najpierw wyświetla okno dialogowe z prośbą o potwierdzenie ??. W oknie tym wyświetlana jest lista używanego skryptu oraz każdego parametru, który ulegnie zmianie, wraz z jego aktualną i proponowaną wartością. Żadne wartości nie są zmieniane, dopóki operacja nie zostanie potwierdzona.

Istnieją dwa sposoby wykorzystania tego samego skryptu: można go pozostawić aktywnym podczas symulacji, jeśli parametry mają się zmieniać, lub można użyć funkcji „Populate json from script”, aby uzyskać zestaw stałych wartości początkowych, które można następnie modyfikować za pomocą standardowego interfejsu graficznego.

7. Gdzie wykorzystywane są wartości zdefiniowane w skrypcie.

Wartości generowane przez skrypt materiałowy są wykorzystywane w całym modelu, a nie tylko w module obliczeniowym dla właściwości elektrycznych. Wielkości takie jak Eg i Xi określają położenie krawędzi pasma energetycznego wszędzie tam, gdzie jest to wymagane. Na przykład, poziomy energii wyświetlane na diagramie pasmowym/w oknie wizualizującym szybkość generowania są pobierane z tych wartości ??. Zatem edycja przerwy energetycznej lub powinowactwa w skrypcie automatycznie wpływa na diagram pasmowy, model optyczny i moduł obliczeniowy dla właściwości elektrycznych.

Typowe błędy, na które należy uważać.

Podsumowanie i kolejne kroki.

Następnie: wróć do sekcji Część C, w której omówiono sposób przechowywania danych w bazie, lub zapoznaj się z sekcjami Baza danych optyczna i Pobieranie dodatkowych materiałów.