Σπίτι Παραδείγματα Στιγμιότυπα οθόνης Εγχειρίδιο χρήστη Λογότυπο της Bluesky YouTube ☰
OghmaNano Πλατφόρμα προσομοίωσης πολλαπλών φυσικών πεδίων για οπτοηλεκτρονικές συσκευές και φωτονικά συστήματα. Λήψη Οδηγός γρήγορης εκκίνησης

Φάσματα εκπομπής στο OghmaNano.

Ένα φάσμα εκπομπής περιγράφει τον τρόπο με τον οποίο το φως που εκπέμπεται από ένα υλικό κατανέμεται σε σχέση με το μήκος κύματος. Η OghmaNano αποθηκεύει αυτά τα φάσματα ως μέρος της βάσης δεδομένων Υλικών της, όπου μπορούν να ελεγχθούν, να εισαχθούν ή να ενημερωθούν. Αυτή η σελίδα εξηγεί τι αντιπροσωπεύει ένα φάσμα εκπομπής, πώς αποθηκεύεται και εισάγεται, και τέλος, πώς να δημιουργήσετε ένα κατά προσέγγιση φάσμα χρησιμοποιώντας την Python όταν δεν είναι διαθέσιμα μετρημένα δεδομένα.

1. Τι είναι το φάσμα εκπομπής;

Όταν τα ηλεκτρόνια και οι οπές συνδυάζονται με ακτινοβολία, εκπέμπονται φωτόνια σε ένα εύρος ενεργειών και όχι σε ένα ακριβές μήκος κύματος. Ένα φάσμα εκπομπής περιγράφει τη σχετική ένταση αυτού του φωτός ως συνάρτηση του μήκους κύματος. Μπορεί να προέρχεται από ένα πείραμα, όπως η φωτοφωταύγεια (PL) ή η ηλεκτροφωταύγεια (EL), ή από ένα θεωρητικό μοντέλο. Το φάσμα δεν είναι το ίδιο με τον συντελεστή απορρόφησης ή τον δείκτη διάθλασης του υλικού.

Το φασματικό σχήμα εξαρτάται από την ηλεκτρονική δομή του ημιαγωγού, τη θερμοκρασία, τη σύνθεση και, σε μια πραγματική συσκευή, τις συγκεντρώσεις φορέων και τις οπτικές επιδράσεις. Ένα κανονικοποιημένο φάσμα εκπομπής αντιπροσωπεύει τη σχετική κατανομή των μηκών κύματος, όχι την απόλυτη οπτική ισχύ ή την απόδοση της LED.

2. Φάσματα εκπομπής στη βάση δεδομένων υλικών.

Κάθε υλικό έχει τον δικό του φάκελο στη βάση δεδομένων υλικών OghmaNano. Όταν υπάρχουν διαθέσιμα δεδομένα εκπομπής, αυτά αποθηκεύονται σε ένα αρχείο με όνομα emission.csv, μαζί με άλλα αρχεία όπως τα alpha.csv και n.csv. Για παράδειγμα, ένας φάκελος υλικού μπορεί να περιέχει:

materials/
  GaAs/
    emission.csv
    alpha.csv
    n.csv

Η βάση δεδομένων υλικών που χρησιμοποιούν οι προσομοιώσεις βρίσκεται στον φάκελο oghma_local/materials του χρήστη. Για μια περιγραφή της δομής του φακέλου και των μορφών αρχείων υλικών, δείτε το Βάση δεδομένων υλικών: Μέρος Γ – Πώς αποθηκεύονται τα υλικά. Για μια εισαγωγή στην περιήγηση και την επεξεργασία υλικών, δείτε το Βάση δεδομένων υλικών: Μέρος Α.

Ένα αρχείο emission.csv περιέχει το μήκος κύματος σε μέτρα και τη σχετική ένταση εκπομπής σε αυθαίρετες μονάδες. Τα αρχεία μορφής OghmaNano περιέχουν επίσης μια κεφαλίδα μεταδεδομένων· η τιμή y_len της κεφαλίδας υποδεικνύει τον αριθμό των ζευγών δεδομένων μήκους κύματος–έντασης που ακολουθούν.

3. Εισαγωγή μετρημένων φασμάτων εκπομπής.

Όταν υπάρχουν διαθέσιμα μετρημένα δεδομένα φωτοφωταύγειας (PL) ή ηλεκτροφωταύγειας (EL), αυτά είναι προτιμότερα από ένα κατά προσέγγιση δημιουργημένο φάσμα, υπό την προϋπόθεση ότι οι μετρήσεις είναι κατάλληλες για το υλικό και τη συγκεκριμένη συσκευή. Ανοίξτε το σχετικό υλικό στη βάση δεδομένων Υλικών, επιλέξτε το φάσμα εκπομπής του και χρησιμοποιήστε τη λειτουργία εισαγωγής δεδομένων για να εισαγάγετε την μετρημένη καμπύλη. Η γενική διαδικασία για την εισαγωγή ενός συνόλου δεδομένων δύο στηλών, την επιλογή των μονάδων μήκους κύματος και την αναθεώρηση των μετασχηματισμένων τιμών περιγράφεται στο Βάση δεδομένων Υλικών: Μέρος Α – Εισαγωγή δεδομένων.

Μονάδες: Οι αποθηκευμένες τιμές μήκους κύματος είναι σε μέτρα, ακόμη και αν το γράφημα εμφανίζεται σε νανόμετρα. Χρησιμοποιήστε κανονικοποιημένη ένταση (σχετικές μονάδες) για αντιπροσωπευτικά δεδομένα σχήματος εκπομπής. Ελέγξτε τα μεταδεδομένα του αρχείου και τον αριθμό των σημείων μετά την εισαγωγή ή τη δημιουργία ενός φάσματος.

4. Εκτίμηση των φασμάτων εκπομπής όταν δεν είναι διαθέσιμα μετρημένα δεδομένα.

Εάν δεν είναι διαθέσιμο κάποιο κατάλληλο μετρούμενο φάσμα, το παρακάτω σενάριο Python μπορεί να δημιουργήσει ένα προσωρινό, κανονικοποιημένο φάσμα εκπομπής ημιαγωγού. Χρησιμοποιεί ένα απλοποιημένο θερμικό μοντέλο μετάπτωσης ζώνης για υλικά άμεσου ενεργειακού χάσματος:

\(S_E(E) \propto \sqrt{E-E_g}\,\exp[-(E-E_g)/(k_B T)]\), για \(E \geq E_g\).

Εδώ, το \(E_g\) είναι το ενεργειακό χάσμα και το \(T\) είναι η θερμοκρασία. Το σενάριο μετατρέπει το υπολογισμένο προφίλ εκπομπής στον ενεργειακό τομέα σε ένταση ανά μονάδα μήκους κύματος, κανονικοποιεί την κορυφή του στο ένα και αποθηκεύει το emission.csv στην ίδια μορφή μεταδεδομένων και δεδομένων που χρησιμοποιεί το OghmaNano. Από προεπιλογή, δημιουργεί 2.036 σημεία έντασης-μήκους κύματος στους 300 K.

Το παρεχόμενο σενάριο δημιουργεί έναν φάκελο για καθεμία από τις 29 διαφορετικές καταχωρήσεις ημιαγωγών, συμπεριλαμβανομένων των GaAs, AlGaAs, GaN, InGaN, InP και InGaAs. Οι τιμές του ενεργειακού διαστήματος των υλικών είναι ενδεικτικές αρχικές τιμές· για τις κράματα των οποίων οι ιδιότητες εξαρτώνται από τη σύνθεση, το παραγόμενο φάσμα αντιπροσωπεύει μόνο μία ονομαστική σύνθεση.

Πότε είναι κατάλληλο αυτό; Χρησιμοποιήστε αυτές τις δημιουργημένες καμπύλες ως ενδεικτικά προφίλ συνολικής εκπομπής, ειδικά για τη δοκιμή της αλυσίδας επεξεργασίας εκπομπής ή μέχρι να είναι διαθέσιμα καλύτερα δεδομένα ή μια υπολογιστική μέθοδος που βασίζεται στη δομή ζωνών. Δεν είναι μετρημένα φάσματα και δεν θα πρέπει να παρουσιάζονται ως ποσοτικές προβλέψεις για μια συγκεκριμένη LED.

Το μοντέλο δεν περιλαμβάνει περιορισμό σε κβαντικό πηγάδι, αταξία του κράματος, εξιτονικές ιδιότητες, εκπομπή από ελαττώματα, τάση ή οπτική έξοδο. Επομένως, δεν είναι κατάλληλο για έμμεσες μεταπτώσεις, συμπεριλαμβανομένης της περίπτωσης του GaP: η καμπύλη που παράγει απεικονίζει μια τυπική άμεση μετάπτωση και όχι την τυπική εκπομπή από μια LED GaP.

5. Παράδειγμα: Δημιουργία φασμάτων εκπομπής με τη χρήση της Python.

Αποθηκεύστε τον παρακάτω κώδικα ως generate_emission_spectra.py και εκτελέστε τον:

python3 generate_emission_spectra.py

Ο προεπιλεγμένος φάκελος εξόδου είναι ο emission_generated. Για να επιλέξετε έναν άλλο φάκελο ή να αλλάξετε τον αριθμό των σημείων:

python3 generate_emission_spectra.py --output my_emission_database --points 2036

Για να αλλάξετε τη θερμοκρασία λειτουργίας ή να χρησιμοποιήσετε τις δικές σας τιμές bandgap:

python3 generate_emission_spectra.py --temperature 300 --bandgap-file bandgaps.json

Ένα παράδειγμα αρχείου bandgaps.json είναι:

{
  "GaAs": 1.424,
  "AlGaAs": 1.80,
  "InGaN": 2.75
}

Ελέγξτε τα προκύπτοντα φάσματα πριν τοποθετήσετε τα κατάλληλα αρχεία emission.csv στους αντίστοιχους φακέλους υλικών. Οι τιμές των ενεργειακών κενών σε αυτό το σενάριο καθορίζονται χειροκίνητα και είναι ενδεικτικές· το σενάριο δεν καλεί τα σενάρια υλικών Lua για να τα υπολογίσει.

6. Πλήρης πηγαίος κώδικας Python.

Ακολουθεί ο πλήρης κώδικας του προγράμματος, ο οποίος χρησιμοποιεί αποκλειστικά τις ενσωματωμένες βιβλιοθήκες της Python. Αντιγράψτε τον κώδικα και επικολλήστε τον σε ένα τοπικό αρχείο Python.

Εμφάνισε τον πλήρη γεννήτορα φάσματος εκπομπής 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()

Σημείωση: Τα παραγόμενα φάσματα εκπομπής αποτελούν μια προσωρινή λύση. Για ποσοτικές προσομοιώσεις συσκευών, προτιμήστε να χρησιμοποιείτε μετρημένα δεδομένα εκπομπής ή φάσματα που υπολογίζονται με τη χρήση ενός κατάλληλου μοντέλου ηλεκτρονικής δομής ζωνών και οπτικών μεταπτώσεων, όπως μια υπολογιστική μέθοδος βασισμένη στο k·p.