Spettri di emissione in OghmaNanoSpettri di emissione in OghmaNano
Uno spettro di emissione descrive come la luce emessa da un materiale è distribuita in funzione della lunghezza d’onda. OghmaNano memorizza questi spettri all’interno del suo database di materiali, dove è possibile visualizzarli, importarli o aggiornarli. Questa pagina spiega cosa rappresenta uno spettro di emissione, come viene memorizzato e importato, e infine come generare uno spettro approssimativo utilizzando Python quando i dati misurati non sono disponibili.Uno spettro di emissione descrive come la luce emessa da un materiale è distribuita in funzione della lunghezza d’onda. OghmaNano memorizza questi spettri all’interno del suo database di materiali, dove è possibile visualizzarli, importarli o aggiornarli. Questa pagina spiega cosa rappresenta uno spettro di emissione, come viene memorizzato e importato, e infine come generare uno spettro approssimativo utilizzando Python quando i dati misurati non sono disponibili.
1. Cos'è uno spettro di emissione?1. Cos'è uno spettro di emissione?
Quando elettroni e lacune si ricombinano emettendo radiazione, vengono emessi fotoni in un intervallo di energie, anziché a una singola lunghezza d’onda precisa. Uno spettro di emissione descrive l’intensità relativa di questa luce in funzione della lunghezza d’onda. Può derivare da un esperimento, come la fotoluminescenza (PL) o l’elettroluminescenza (EL), oppure da un modello teorico. Lo spettro non è lo stesso del coefficiente di assorbimento o dell’indice di rifrazione del materiale.Quando elettroni e lacune si ricombinano emettendo radiazione, vengono emessi fotoni in un intervallo di energie, anziché a una singola lunghezza d’onda precisa. Uno spettro di emissione descrive l’intensità relativa di questa luce in funzione della lunghezza d’onda. Può derivare da un esperimento, come la fotoluminescenza (PL) o l’elettroluminescenza (EL), oppure da un modello teorico. Lo spettro non è lo stesso del coefficiente di assorbimento o dell’indice di rifrazione del materiale.
La forma dello spettro dipende dalla struttura elettronica del semiconduttore, dalla temperatura, dalla composizione e, in un dispositivo reale, dalla concentrazione di portatori di carica e dagli effetti ottici. Uno spettro di emissione normalizzato rappresenta la distribuzione relativa delle lunghezze d’onda, e non la potenza ottica assoluta o l’efficienza del LED.La forma dello spettro dipende dalla struttura elettronica del semiconduttore, dalla temperatura, dalla composizione e, in un dispositivo reale, dalla concentrazione di portatori di carica e dagli effetti ottici. Uno spettro di emissione normalizzato rappresenta la distribuzione relativa delle lunghezze d’onda, e non la potenza ottica assoluta o l’efficienza del LED.
2. Spettri di emissione nel database dei materiali2. Spettri di emissione nel database dei materiali
Ogni materiale ha una propria cartella all’interno del database OghmaNano Materials. Quando sono disponibili i dati relativi alle emissioni, vengono salvati in un file denominato emission.csv, insieme ad altri file come alpha.csv e n.csv. Ad esempio, una cartella di materiali può contenere:Ogni materiale ha una propria cartella all’interno del database OghmaNano Materials. Quando sono disponibili i dati relativi alle emissioni, vengono salvati in un file denominato emission.csv, insieme ad altri file come alpha.csv e n.csv. Ad esempio, una cartella di materiali può contenere:
materials/
GaAs/
emission.csv
alpha.csv
n.csv
Il database dei materiali utilizzato nelle simulazioni si trova nella directory oghma_local/materials dell’utente. Per una descrizione della struttura della directory e dei formati dei file dei materiali, consultare Database dei materiali: Parte C – Modalità di archiviazione dei materiali. Per un’introduzione alla navigazione e alla modifica dei materiali, consultare Database dei materiali: Parte A.Il database dei materiali utilizzato nelle simulazioni si trova nella directory oghma_local/materials dell’utente. Per una descrizione della struttura della directory e dei formati dei file dei materiali, consultare Database dei materiali: Parte C – Modalità di archiviazione dei materiali. Per un’introduzione alla navigazione e alla modifica dei materiali, consultare Database dei materiali: Parte A.
Un file di tipo emission.csv contiene la lunghezza d’onda espressa in metri e l’intensità di emissione relativa, espressa in unità arbitrarie. I file in formato OghmaNano contengono anche un’intestazione con metadati; il valore y_len presente nell’intestazione indica il numero di coppie di dati lunghezza d’onda/intensità che seguono.Un file di tipo emission.csv contiene la lunghezza d’onda espressa in metri e l’intensità di emissione relativa, espressa in unità arbitrarie. I file in formato OghmaNano contengono anche un’intestazione con metadati; il valore y_len presente nell’intestazione indica il numero di coppie di dati lunghezza d’onda/intensità che seguono.
3. Importazione degli spettri di emissione misurati3. Importazione degli spettri di emissione misurati
Qualora siano disponibili dati relativi alla fotoluminescenza (PL) o all’elettroluminescenza (EL), è preferibile utilizzare questi dati anziché uno spettro generato in modo approssimativo, a condizione che le misurazioni siano adatte al materiale e al dispositivo previsto. Aprire il materiale corrispondente nel database dei materiali, selezionare il suo spettro di emissione e utilizzare la funzione di importazione dati per importare la curva misurata. Il processo generale per importare un set di dati a due colonne, selezionare le unità di lunghezza d’onda e controllare i valori convertiti è descritto in Database dei materiali: Parte A – Importazione dei dati.Qualora siano disponibili dati relativi alla fotoluminescenza (PL) o all’elettroluminescenza (EL), è preferibile utilizzare questi dati anziché uno spettro generato in modo approssimativo, a condizione che le misurazioni siano adatte al materiale e al dispositivo previsto. Aprire il materiale corrispondente nel database dei materiali, selezionare il suo spettro di emissione e utilizzare la funzione di importazione dati per importare la curva misurata. Il processo generale per importare un set di dati a due colonne, selezionare le unità di lunghezza d’onda e controllare i valori convertiti è descritto in Database dei materiali: Parte A – Importazione dei dati.
Unità di misura: i valori di lunghezza d’onda memorizzati sono espressi in metri, anche se il grafico viene visualizzato in nanometri. Utilizzare l’intensità normalizzata (u.a.) per i dati rappresentativi della forma dello spettro di emissione. Dopo aver importato o generato uno spettro, controllare i metadati del file e il numero di punti.Unità di misura: i valori di lunghezza d’onda memorizzati sono espressi in metri, anche se il grafico viene visualizzato in nanometri. Utilizzare l’intensità normalizzata (u.a.) per i dati rappresentativi della forma dello spettro di emissione. Dopo aver importato o generato uno spettro, controllare i metadati del file e il numero di punti.
4. Stima degli spettri di emissione in assenza di dati misurati.4. Stima degli spettri di emissione in assenza di dati misurati.
Qualora non sia disponibile uno spettro misurato adeguato, lo script Python riportato di seguito può generare uno spettro di emissione normalizzato temporaneo per un semiconduttore. Esso utilizza un modello termico semplificato per la transizione tra bande in materiali a banda proibita diretta:Qualora non sia disponibile uno spettro misurato adeguato, lo script Python riportato di seguito può generare uno spettro di emissione normalizzato temporaneo per un semiconduttore. Esso utilizza un modello termico semplificato per la transizione tra bande in materiali a banda proibita diretta:
\(S_E(E) \propto \sqrt{E-E_g}\,\exp[-(E-E_g)/(k_B T)]\), per \(E \geq E_g\).\(S_E(E) \propto \sqrt{E-E_g}\,\exp[-(E-E_g)/(k_B T)]\), per \(E \geq E_g\).
Qui, \(E_g\) rappresenta il divario di energia e \(T\) la temperatura. Lo script converte il profilo di emissione calcolato nel dominio energetico in intensità per unità di lunghezza d’onda, normalizza il suo picco a uno e scrive emission.csv nello stesso formato di metadati e dati utilizzato da OghmaNano. Per impostazione predefinita, genera 2.036 punti che rappresentano la relazione tra lunghezza d’onda e intensità a 300 K.Qui, \(E_g\) rappresenta il divario di energia e \(T\) la temperatura. Lo script converte il profilo di emissione calcolato nel dominio energetico in intensità per unità di lunghezza d’onda, normalizza il suo picco a uno e scrive emission.csv nello stesso formato di metadati e dati utilizzato da OghmaNano. Per impostazione predefinita, genera 2.036 punti che rappresentano la relazione tra lunghezza d’onda e intensità a 300 K.
Lo script fornito crea una cartella per ciascuna delle 29 diverse tipologie di semiconduttori, tra cui GaAs, AlGaAs, GaN, InGaN, InP e InGaAs. I valori indicati per il divario di banda dei materiali rappresentano valori di riferimento; per le leghe la cui composizione influisce sulle proprietà, lo spettro generato rappresenta solo una composizione nominale.Lo script fornito crea una cartella per ciascuna delle 29 diverse tipologie di semiconduttori, tra cui GaAs, AlGaAs, GaN, InGaN, InP e InGaAs. I valori indicati per il divario di banda dei materiali rappresentano valori di riferimento; per le leghe la cui composizione influisce sulle proprietà, lo spettro generato rappresenta solo una composizione nominale.
Quando è opportuno utilizzare questi dati? Si possono impiegare le curve generate come esempi di profili di emissione complessivi, in particolare per testare la catena di elaborazione delle emissioni o fino a quando non saranno disponibili dati migliori o un calcolo basato sulla struttura a bande. Si tratta di dati simulati e non di spettri misurati, pertanto non devono essere presentati come previsioni quantitative relative a un particolare LED.Quando è opportuno utilizzare questi dati? Si possono impiegare le curve generate come esempi di profili di emissione complessivi, in particolare per testare la catena di elaborazione delle emissioni o fino a quando non saranno disponibili dati migliori o un calcolo basato sulla struttura a bande. Si tratta di dati simulati e non di spettri misurati, pertanto non devono essere presentati come previsioni quantitative relative a un particolare LED.
Il modello non tiene conto del confinamento quantistico, del disordine nelle leghe, delle caratteristiche eccitoniche, dell’emissione dovuta a difetti, della sollecitazione o dell’accoppiamento ottico. In particolare, non è adatto per le transizioni a banda indiretta, compresa la transizione del GaP: la curva generata rappresenta un esempio di transizione diretta piuttosto che l’emissione convenzionale di un LED al GaP.Il modello non tiene conto del confinamento quantistico, del disordine nelle leghe, delle caratteristiche eccitoniche, dell’emissione dovuta a difetti, della sollecitazione o dell’accoppiamento ottico. In particolare, non è adatto per le transizioni a banda indiretta, compresa la transizione del GaP: la curva generata rappresenta un esempio di transizione diretta piuttosto che l’emissione convenzionale di un LED al GaP.
5. Esempio: generazione di spettri di emissione con Python.5. Esempio: generazione di spettri di emissione con Python.
Salva il codice riportato di seguito con il nome generate_emission_spectra.py ed eseguilo:Salva il codice riportato di seguito con il nome generate_emission_spectra.py ed eseguilo:
python3 generate_emission_spectra.py
La cartella di destinazione predefinita è emission_generated. Per selezionare un’altra cartella o modificare il numero di punti:La cartella di destinazione predefinita è emission_generated. Per selezionare un’altra cartella o modificare il numero di punti:
python3 generate_emission_spectra.py --output my_emission_database --points 2036
Per modificare la temperatura di funzionamento o utilizzare i propri valori di riferimento:Per modificare la temperatura di funzionamento o utilizzare i propri valori di riferimento:
python3 generate_emission_spectra.py --temperature 300 --bandgap-file bandgaps.json
Un esempio di file bandgaps.json è:Un esempio di file bandgaps.json è:
{
"GaAs": 1.424,
"AlGaAs": 1.80,
"InGaN": 2.75
}
Esaminare gli spettri ottenuti prima di inserire i file emission.csv appropriati nelle cartelle corrispondenti ai diversi materiali. Nel presente script, i valori dei gap di banda sono indicati manualmente e rappresentano valori di riferimento; lo script non utilizza gli script Lua relativi ai materiali per calcolarli.Esaminare gli spettri ottenuti prima di inserire i file emission.csv appropriati nelle cartelle corrispondenti ai diversi materiali. Nel presente script, i valori dei gap di banda sono indicati manualmente e rappresentano valori di riferimento; lo script non utilizza gli script Lua relativi ai materiali per calcolarli.
6. Codice sorgente completo in Python.6. Codice sorgente completo in Python.
Di seguito è riportato il codice completo del generatore, che utilizza esclusivamente le librerie standard di Python. Copia il codice e incollalo in un file Python locale.Di seguito è riportato il codice completo del generatore, che utilizza esclusivamente le librerie standard di Python. Copia il codice e incollalo in un file Python locale.
Mostra il generatore completo dello spettro di emissione in Python.Mostra il generatore completo dello spettro di emissione in Python.
#!/usr/bin/env python3
"""Generate illustrative bulk band-edge emission.csv files for OghmaNano.
No external Python dependencies. Each directory contains a 2036-point
OghmaNano-format emission.csv. Spectra are normalised per wavelength and
are NOT measured or k.p-calculated spectra. Alloy bandgaps below represent
one nominal composition only; edit MATERIALS or use --bandgap-file.
"""
import argparse
import json
import math
from pathlib import Path
# Representative, approximate 300 K bulk DIRECT-transition gaps (eV).
# NOT universal values for alloys. Entries such as AlInP and AlInAs may be
# indirect at common compositions: their curves are illustrative ONLY.
# One directory per unique material; InSb was duplicated in the supplied list.
MATERIALS = {
"InP": (1.344, "InP/InP.lua"),
"GaP": (2.78, "GaP/GaP.lua"), # direct transition; GaP fundamental gap is indirect!
"AlGaInP": (2.05, "AlGaInP.lua"),
"GaAs": (1.424, "GaAs/GaAs.lua"),
"AlInP": (2.35, "AlInP.lua"), # illustrative; verify direct-gap composition
"InSb": (0.17, "InSb/InSb.lua"),
"GaSb": (0.726, "GaSb/GaSb.lua"),
"CdS": (2.42, "CdS/CdS.lua"),
"GaN": (3.40, "GaN/GaN.lua"),
"AlN": (6.03, "AlN.lua"),
"ZnS": (3.68, "ZnS.lua"),
"InAs": (0.354, "InAs/InAs.lua"),
"AlGaAs": (1.80, "AlGaAs/AlGaAs.lua"), # nominal Al x~0.3
"InAsP": (0.95, "InAsP.lua"),
"InGaAsP": (0.80, "InGaAsP.lua"),
"AlInAs": (1.45, "AlInAs.lua"), # composition-dependent and possibly indirect
"GaAsP": (1.90, "GaAsP.lua"),
"InGaAs": (0.75, "InGaAs/InGaAs.lua"), # nominal In0.53Ga0.47As
"ZnTe": (2.26, "ZnTe.lua"),
"InGaN": (2.75, "InGaN.lua"),
"GaInNAs": (0.95, "GaInNAs.lua"),
"InGaP": (1.90, "InGaP.lua"),
"GaInAs": (0.75, "GaInAs.lua"),
"InN": (0.69, "InN.lua"),
"AlGaN": (4.43, "AlGaN.lua"),
"AlGaInAs": (0.80, "AlGaInAs.lua"),
"CdSe": (1.74, "CdSe.lua"),
"ZnSe": (2.70, "ZnSe.lua"),
"CdTe": (1.50, "CdTe/CdTe.lua"),
}
HC_EV_NM = 1239.8419843320026
KB_EV_K = 8.617333262145e-5
def make_spectrum(eg, temp, points):
"""3D nondegenerate direct-gap model, intensity per unit wavelength.
S_E(E) ~ sqrt(E-Eg)*exp(-(E-Eg)/kT), E>=Eg.
Convert using dE/dlambda ~ 1/lambda**2, then peak-normalise.
Span covers Eg to Eg + max(0.35 eV, 12 kT); wavelength increases.
"""
kt = KB_EV_K * temp
upper = eg + max(0.35, 12.0 * kt)
lo_nm = HC_EV_NM / upper
hi_nm = HC_EV_NM / eg
values = []
for i in range(points):
wavelength_nm = lo_nm + (hi_nm - lo_nm) * i / (points - 1)
e = HC_EV_NM / wavelength_nm
de = max(0.0, e - eg)
intensity = math.sqrt(de) * math.exp(-de / kt) / (wavelength_nm * wavelength_nm)
values.append((wavelength_nm * 1e-9, intensity))
top = max(v for _, v in values)
return [(lam, value / top) for lam, value in values]
def generate(out, material, eg, lua_path, temp, points):
folder = out / material
folder.mkdir(parents=True, exist_ok=True)
metadata = {
"title": "Illustrative band-edge emission of " + material,
"type": "xy",
"y_label": "Wavelength",
"data_label": "Intensity",
"y_units": "nm",
"y_mul": 1e9,
"data_units": "au",
"icon": "spectra_file",
"time ": 0.0,
"Vexternal": 0.0,
"x_len": 1,
"y_len": points,
"z_len": 1,
"cols": "yd",
}
values = make_spectrum(eg, temp, points)
path = folder / "emission.csv"
with path.open("w", encoding="utf-8", newline="\n") as f:
f.write("#oghma_csv " + json.dumps(metadata, ensure_ascii=False, separators=(",", ":")) + "*\n")
for lam, value in values:
f.write(f"{lam:.12e}\t{value:.12e}\n")
return path
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--output", type=Path, default=Path("emission_generated"))
parser.add_argument("--points", type=int, default=2036)
parser.add_argument("--temperature", type=float, default=300.0)
parser.add_argument("--bandgap-file", type=Path,
help='Optional JSON map e.g. {"GaAs":1.424,"AlGaAs":1.80} to override nominal gaps')
args = parser.parse_args()
if args.points < 3 or args.temperature <= 0:
parser.error("--points must be >=3 and --temperature must be positive")
gap_overrides = {}
if args.bandgap_file:
gap_overrides = json.loads(args.bandgap_file.read_text(encoding="utf-8"))
unknown = set(gap_overrides) - set(MATERIALS)
if unknown:
parser.error("Unknown material(s): " + ", ".join(sorted(unknown)))
args.output.mkdir(parents=True, exist_ok=True)
for material, (nominal_eg, lua_path) in MATERIALS.items():
eg = float(gap_overrides.get(material, nominal_eg))
if not math.isfinite(eg) or eg <= 0:
parser.error(f"Invalid bandgap for {material}: {eg}")
path = generate(args.output, material, eg, lua_path, args.temperature, args.points)
print(f"{path} Eg={eg:g} eV (source: {lua_path})")
print(f"Generated {len(MATERIALS)} unique material directories with {args.points} points each.")
print("CAUTION: nominal/illustrative bulk direct-transition profiles; validate alloy composition and gap type.")
if __name__ == "__main__":
main()
Nota: gli spettri di emissione generati rappresentano una soluzione provvisoria. Per le simulazioni quantitative dei dispositivi, è preferibile utilizzare dati di emissione misurati o spettri calcolati con un modello appropriato della struttura a bande elettroniche e delle transizioni ottiche, come un calcolo basato sul modello k·p.Nota: gli spettri di emissione generati rappresentano una soluzione provvisoria. Per le simulazioni quantitative dei dispositivi, è preferibile utilizzare dati di emissione misurati o spettri calcolati con un modello appropriato della struttura a bande elettroniche e delle transizioni ottiche, come un calcolo basato sul modello k·p.