Υλοποίηση του ηλεκτρικού επιλυτή Newton στο OghmaNano μέσω Lua scripting.
1. Εισαγωγή
Το OghmaNano περιλαμβάνει μια ενσωματωμένη διεπαφή σεναρίων Lua, η οποία επιτρέπει την τροποποίηση του εσωτερικού αριθμητικού επιλυτή κατά τη διάρκεια της εκτέλεσης. Αυτό παρέχει προηγμένες δυνατότητες ελέγχου, όπως η ενεργοποίηση ή απενεργοποίηση εξισώσεων, η τροποποίηση του τρισδιάστατου επιλυτή Newton, η παγώμα επιλεγμένων φυσικών παραμέτρων κατά τη διάρκεια μεταβατικών φαινομένων ή σαρώσεων J–V, ή η εφαρμογή προσαρμοσμένων επαναληπτικών στρατηγικών.
Αυτό διαφέρει από την εξωτερική δημιουργία σεναρίων. Γλώσσες όπως η Python λειτουργούν τροποποιώντας το sim.json και εκκινώντας τον επιλυτή, γεγονός που τις καθιστά κατάλληλες για επαναληπτικές εκτελέσεις με διαφορετικές παραμέτρους, μαζική εκτέλεση και επεξεργασία μετά την εκτέλεση.
Αντίθετα, η Lua εκτελείται εντός του επιλυτή, επιτρέποντας την άμεση παρέμβαση στη διαδικασία αριθμητικής επίλυσης χωρίς να απαιτείται τροποποίηση του υποκείμενου κώδικα C.
2. Τι είναι η Lua;
Η Lua είναι μια ελαφριά, υψηλής απόδοσης γλώσσα σεναρίων, σχεδιασμένη για να ενσωματώνεται σε μεγαλύτερες εφαρμογές. Χρησιμοποιείται ευρέως σε τομείς όπως οι μηχανές παιχνιδιών και το επιστημονικό λογισμικό, όπου η εσωτερική συμπεριφορά πρέπει να τροποποιείται χωρίς να απαιτείται η επαναμεταγλώττιση του βασικού κώδικα. Σε σύγκριση με την Python, η Lua έχει πολύ μικρότερο αποτύπωμα και χαμηλότερη επιβάρυνση κατά την εκτέλεση, γεγονός που την καθιστά πιο κατάλληλη για εκτέλεση μέσα σε βρόχους που απαιτούν υψηλή απόδοση. Σε σύγκριση με την C, είναι σημαντικά ευκολότερη στην συγγραφή και την τροποποίηση, ενώ παράλληλα παρέχει λεπτομερή έλεγχο της συμπεριφοράς του προγράμματος. Αυτές οι ιδιότητες καθιστούν την Lua ιδιαίτερα κατάλληλη για το OghmaNano, όπου χρησιμοποιείται για να επηρεάζει άμεσα τον αριθμητικό επιλυτή κατά τη διάρκεια της εκτέλεσης.
Για να σας δώσω μια ιδέα για το πώς λειτουργεί η Lua, αν δεν την έχετε χρησιμοποιήσει ποτέ στο παρελθόν, ακολουθεί μια υλοποίηση του κλασικού αλγορίθμου ταξινόμησης με φυσαλίδες.
a = {5, 3, 8, 1, 2}
n = #a
for i = 1, n do
for j = 1, n - i do
if a[j] > a[j+1] then
a[j], a[j+1] = a[j+1], a[j]
end
end
end
2. Πρόσβαση στον επεξεργαστή σεναρίων Lua.
Ο επεξεργαστής σεναρίων Lua είναι προσβάσιμος από την ηλεκτρονική κορδέλα του κύριου παραθύρου, όπως φαίνεται στην εικόνα ??. Κάντε κλικ στο μικρό βέλος προς τα κάτω δίπλα στον ελεγκτή του επιλυτή εξίσωσης μεταφοράς-διάχυσης για να ανοίξετε το μενού, το οποίο φαίνεται στην εικόνα ??. Στη συνέχεια, κάντε κλικ στην επιλογή "Επεξεργασία μικροκώδικα" για να ανοίξετε τον επεξεργαστή Lua, ο οποίος φαίνεται στην εικόνα ??.
Πατήστε Ctrl+S για να αποθηκεύσετε το σενάριο ή χρησιμοποιήστε το κουμπί αποθήκευσης στη γραμμή εργαλείων του επεξεργαστή. Για να ενεργοποιήσετε τον μικροκώδικα, πρέπει να πατηθεί το κουμπί ενεργοποίησης, όπως φαίνεται στην εικόνα ??.
3. Ένα απλό παράδειγμα – ηλιακά κύτταρα περοβσκίτη με «παγωμένα» ιόντα.
Ένα απλό παράδειγμα χρήσης της γλώσσας σεναρίων Lua είναι στην προσομοίωση συσκευών περοβσκίτη, όπου μπορεί να είναι επιθυμητό να παγώσουν τα κινητά ιόντα κατά τη διάρκεια μιας σάρωσης J–V. Οι περοβσκίτες περιέχουν κινητά ιόντα που μετακινούνται σχετικά αργά. Πειραματικά, μια συσκευή συνήθως διατηρείται αρχικά σε αρνητική τάση, έτσι ώστε τα ιόντα να μετακινηθούν σε μια συγκεκριμένη διαμόρφωση, και στη συνέχεια εκτελείται μια πολύ γρήγορη σάρωση J–V πριν προλάβουν να αντιδράσουν σημαντικά.
Στο OghmaNano, όταν είναι ενεργοποιημένο το μοντέλο ιόντων περοβσκίτη, ο ηλεκτρικός επιλυτής επιτρέπει κανονικά στα ιόντα να χαλαρώνουν σε κάθε βήμα τάσης. Αυτό ισοδυναμεί με μια πολύ αργή ή σχεδόν σταθερή σάρωση J–V. Αυτό είναι χρήσιμο σε ορισμένες περιπτώσεις, αλλά δεν αναπαράγει πειράματα όπου η τάση μεταβάλλεται πολύ πιο γρήγορα. Για να μιμηθεί αυτός ο τύπος μέτρησης, το παρακάτω σενάριο Lua μπορεί να χρησιμοποιηθεί για να «παγώσει» τα ιόντα όταν ξεκινάει ο κύριος ηλεκτρικός βρόχος. Η προσομοίωση μπορεί ακόμα να αυξήσει την τάση στην απαιτούμενη αρχική τιμή με τον κανονικό τρόπο, επιτρέποντας στα ιόντα να κινούνται κατά τη διάρκεια της προετοιμασίας, αλλά μόλις εισέλθουμε στον κύριο βρόχο, η εξίσωση των ιόντων απενεργοποιείται.
-- Initialise solver
a = dd_solver()
a.verbose = false -- Suppress solver output
-- Apply logic only in the main electrical loop
if (a.problem_type & ELEC_PROB_MAIN_LOOP) ~= 0 then
a.solve_nion = false -- Disable ion equation (freeze ions)
print("ion solver off")
else
print("ion solver on") -- Keep ions active during initialisation
end
a:run() -- Execute solver step
Σε αυτό το παράδειγμα, το αντικείμενο του επιλυτή δημιουργείται πρώτα και η ποσότητα των διαγνωστικών δεδομένων εξόδου μειώνεται. Στη συνέχεια, το σενάριο ελέγχει εάν η τρέχουσα φάση του επιλυτή αντιστοιχεί στην κύρια ηλεκτρική επαναληπτική διαδικασία. Εάν ναι, η εξίσωση για τα κινούμενα ιόντα απενεργοποιείται ορίζοντας την τιμή solve_nion=false και, στη συνέχεια, ο επιλυτής εκτελείται με αυτό το τροποποιημένο σύνολο εξισώσεων. Υπάρχει ένα παράδειγμα προσομοίωσης που χρησιμοποιείται στα παραδείγματα που περιλαμβάνονται στο μοντέλο, στην ενότητα "Κελιά περοβσκίτη/Κελί ηλιακής ενέργειας περοβσκίτη - σταθερά ιόντα (MAPI)".
5. Παράδειγμα: Σάρωση ADI (Σάρωση με εναλλασσόμενη κατεύθυνση και έμμεση μέθοδο).
Ένα πιο εξελιγμένο παράδειγμα χρήσης της γλώσσας Lua είναι η υλοποίηση μιας στρατηγικής εναλλασσόμενων κατευθύνσεων για την επίλυση σύνθετων τρισδιάστατων προβλημάτων. Αυτή η προσέγγιση σχετίζεται στενά με την μέθοδο Εναλλασσόμενων Κατευθύνσεων (ADI), στην οποία ένα πολυδιάστατο πρόβλημα αποσυντίθεται σε μια ακολουθία επιλύσεων χαμηλότερης διάστασης.
Στο OghmaNano, αυτή η ιδέα μπορεί να εφαρμοστεί άμεσα στο επίπεδο του επιλυτή, ενεργοποιώντας και απενεργοποιώντας επιλεκτικά τις κατευθυντικές συνδέσεις. Αντί να επιλύεται το πλήρως συνδεδεμένο τρισδιάστατο σύστημα σε ένα μόνο βήμα, ο τομέας διατρέχεται εναλλάξ σε διαφορετικές κατευθύνσεις. Αυτό μπορεί να βελτιώσει σημαντικά τη σταθερότητα και τη σύγκλιση για δύσκολα τρισδιάστατα προβλήματα διάχυσης-μεταφοράς.
Η στρατηγική που χρησιμοποιείται εδώ είναι να διασπαστεί το τρισδιάστατο πρόβλημα σε διαδοχικές επεξεργασίες κατά κατεύθυνση. Στην πρώτη επεξεργασία, ο επιλυτής λειτουργεί σε επίπεδα κατά τον άξονα x, επιλύοντας το πρόβλημα σε όλη την έκταση κατά τους άξονες y και z, ενώ παράλληλα εξαλείφει τις αλληλεπιδράσεις κατά τον άξονα x. Στη δεύτερη επεξεργασία, ο επιλυτής μεταβαίνει σε επίπεδα κατά τον άξονα z και εκτελεί τη συμπληρωματική λειτουργία. Το συνολικό σφάλμα συσσωρεύεται και χρησιμοποιείται για τον ορισμό ενός προσαρμοσμένου κριτηρίου σύγκλισης.
Το παρακάτω παράδειγμα απεικονίζει πώς μπορεί να δημιουργηθεί μια σάρωση τύπου ADI χρησιμοποιώντας τη γλώσσα Lua:
-- Initialise solver and control variables
a = dd_solver()
cont = true
count = 0
-- Main ADI-style iteration loop
while cont == true do
-- ===== X-slice pass =====
a.set_newton_state("x") -- Use/store Newton state for x-pass
tot_error = 0.0
a.step_z = -1 -- Full domain in z
a.step_x = 1 -- Slice-by-slice in x
a.step_y = -1 -- Full domain in y
a.solve_pos_x = false -- Disable x-direction Poisson coupling
a.solve_pos_y = true
a.solve_pos_z = true
a.solve_je_x = 0 -- Disable x-direction electron current
a.solve_jh_x = 0 -- Disable x-direction hole current
a.solve_je_y = true
a.solve_jh_y = true
a.solve_je_z = true
a.solve_jh_z = true
a.solve_srh_e = true -- Keep SRH recombination active
a.solve_srh_h = true
a.solve_nion = 0 -- Disable ions
a.solve_singlet = false -- Disable excited-state physics
error = a:run() -- Execute x-slice solve
tot_error = tot_error + error
-- ===== Z-slice pass =====
a.set_newton_state("z") -- Switch to z-pass Newton state
a.step_z = 1 -- Slice-by-slice in z
a.step_x = -1 -- Full domain in x
a.step_y = -1 -- Full domain in y
a.solve_pos_x = true
a.solve_pos_y = true
a.solve_pos_z = false -- Disable z-direction Poisson coupling
a.solve_je_y = true
a.solve_jh_y = true
a.solve_je_x = true
a.solve_jh_x = true
a.solve_je_z = false -- Disable z-direction transport
a.solve_jh_z = false
a.solve_srh_e = true
a.solve_srh_h = true
a.solve_nion = false
a.solve_singlet = false
error = a:run() -- Execute z-slice solve
tot_error = tot_error + error
-- ===== Convergence logic =====
if (error < 1e-3) then -- Local convergence check
if (count > 2) then -- Ensure minimum iterations
cont = false
end
end
print("count", count, "tot error:", error)
count = count + 1
if (tot_error < 1e-7) then -- Global convergence criterion
cont = false
end
if (count > 10) then -- Safety iteration limit
cont = false
end
end
Σε αυτή την υλοποίηση, εκτελούνται δύο διαδοχικές επαναλήψεις σε κάθε κύκλο. Στην πρώτη επανάληψη, απενεργοποιούνται οι όροι μεταφοράς Poisson και φορέων στην κατεύθυνση x, επιλύοντας αποτελεσματικά το σύστημα τμηματικά κατά μήκος του άξονα x. Στη δεύτερη επανάληψη, απενεργοποιούνται οι αντίστοιχοι όροι στην κατεύθυνση z, δημιουργώντας μια συμπληρωματική επανάληψη.
Διατηρούνται ξεχωριστές καταστάσεις Newton για κάθε κατεύθυνση κατά τη διάρκεια της επανάληψης, χρησιμοποιώντας το set_newton_state(), επιτρέποντας στον επιλυτή να διατηρεί ανεξάρτητες εσωτερικές μεταβλητές, όπως το ηλεκτροστατικό δυναμικό, οι πυκνότητες φορέων και οι πληρότητες παγίδων.
Η σύγκλιση ελέγχεται ρητά στο σενάριο Lua. Ο βρόχος τερματίζεται όταν είτε το σφάλμα ανά επανάληψη και ο αριθμός των επαναλήψεων ικανοποιούν μια προκαθορισμένη συνθήκη, είτε το αθροιστικό σφάλμα πέφτει κάτω από μια καθορισμένη ανοχή, είτε επιτευχθεί ο μέγιστος αριθμός επαναλήψεων.
Αυτό το παράδειγμα απεικονίζει πώς η χρήση της γλώσσας σεναρίων Lua μπορεί να χρησιμοποιηθεί για τη δημιουργία πλήρως προσαρμοσμένων ροών εργασίας για επιλυτές. Αντί να βασίζεται σε ένα προκαθορισμένο αριθμητικό σχήμα, ο χρήστης μπορεί να ορίσει άμεσα τον τρόπο με τον οποίο αποσυντίθεται το πολυδιάστατο σύστημα, πώς διαχειρίζονται οι ενδιάμεσες καταστάσεις και πώς αξιολογείται η σύγκλιση. Αυτό είναι ιδιαίτερα χρήσιμο για πολύπλοκες τρισδιάστατες προσομοιώσεις, όπου οι πλήρως συνδεδεμένες προσεγγίσεις μπορεί να είναι ασταθείς ή υπολογιστικά αναποτελεσματικές.
3. Το αντικείμενο dd_solver()
Το σημείο εισόδου για τον έλεγχο του ηλεκτρικού επιλυτή μέσω Lua είναι το αντικείμενο dd_solver(). Αυτό παρέχει άμεση πρόσβαση στον εσωτερικό επιλυτή διάχυσης/μεθόδου Newton, επιτρέποντας την τροποποίηση τόσο του συνόλου των εξισώσεων όσο και της στρατηγικής επίλυσης κατά τη διάρκεια της εκτέλεσης.
Στην πράξη, το αντικείμενο του επιλυτή επιτρέπει τρεις βασικές λειτουργίες:
- Ελέγξτε το τρέχον περιβάλλον του επιλυτή (π.χ. τον τύπο του προβλήματος ή την εφαρμοσμένη προκατάληψη).
- Ενεργοποιήστε ή απενεργοποιήστε μεμονωμένες εξισώσεις και κατευθυντικές συνδέσεις.
- Εκτελέστε ένα βήμα του επιλυτή και ανακτήστε μια μετρική σύγκλισης/σφάλματος.
Τα πεδία που χρησιμοποιούνται πιο συχνά συνοψίζονται στον Πίνακα ??.
| πεδίο | Έννοια | Συνήθης χρήση |
|---|---|---|
step_x, step_y, step_z |
Ελέγχει την χωρική έκταση που υπολογίζεται σε κάθε κατεύθυνση. Το -1 υπολογίζει ολόκληρο τον τομέα· το 1 υπολογίζει τμηματικά, ανά φέτα. |
Αποσύνθεση κατά κατεύθυνση και επιλυτές βασισμένοι σε τομές. |
solve_pos_x, solve_pos_y, solve_pos_z |
Ενεργοποιεί ή απενεργοποιεί τη σύνδεση Poisson σε κάθε κατεύθυνση. | Αποσύνδεση των ηλεκτροστατικών δυνάμεων κατά μήκος επιλεγμένων αξόνων. |
solve_je_x, solve_je_y, solve_je_z |
Ελέγχει την εξίσωση συνέχειας των ηλεκτρονίων σε κάθε κατεύθυνση. | Έλεγχος μεταφοράς με βάση την κατεύθυνση. |
solve_jh_x, solve_jh_y, solve_jh_z |
Ελέγχει την εξίσωση της συνέχειας της οπής σε κάθε κατεύθυνση. | Έλεγχος μεταφοράς με βάση την κατεύθυνση. |
solve_srh_e, solve_srh_h |
Ενεργοποιεί την παγίδευση ηλεκτρονίων και οπών μέσω του μηχανισμού Shockley–Read–Hall. | Διατήρηση της δυναμικής των παγίδων σε απλοποιημένα συστήματα. |
solve_nion |
Ενεργοποιεί ή απενεργοποιεί την κινητή εξίσωση ιόντων. | Παγώνοντας την ιονική κίνηση σε προσομοιώσεις περοβσκιτών. |
solve_singlet |
Ελέγχει τον επιλυτή για την διεγερμένη κατάσταση (μονόπλεκτη). | Απενεργοποίηση της εξιτονικής/OLED φυσικής κατά τη διάρκεια των ηλεκτρικών υπολογισμών. |
verbose |
Ελέγχει την έξοδο διαγνωστικών του επιλυτή. | Ενεργοποίηση της λειτουργίας εντοπισμού σφαλμάτων ή αθόρυβης εκτέλεσης. |
problem_type |
Υποδεικνύει το τρέχον στάδιο της διαδικασίας επίλυσης. | Εφαρμογή της λογικής με επιλεκτικό τρόπο (π.χ., μόνο στον κύριο βρόχο). |
Vapplied |
Επιστρέφει την εφαρμοσμένη τάση στο άκρο. | Λογική ελέγχου που εξαρτάται από την τάση πόλωσης. |
scale_dphi_for_Bfree |
Παράμετρος κλιμάκωσης για τις ενημερώσεις του εσωτερικού δυναμικού. | Προηγμένη αριθμητική ρύθμιση. |
Εκτός από την πρόσβαση στα πεδία, ο επιλυτής παρέχει μια μικρή σειρά από βασικές μεθόδους:
| Μέθοδος | Ρόλος |
|---|---|
a:run() |
Εκτελεί το διαμορφωμένο βήμα του επιλυτή και επιστρέφει μια μετρική σφάλματος. |
a.set_newton_state("x") |
Επιλέγει ή δημιουργεί μια αποθηκευμένη κατάσταση Newton. Αυτό επιτρέπει τη διατήρηση ανεξάρτητων αντιγράφων των μεταβλητών της λύσης (δυναμικό, πυκνότητες φορέων, πληρότητα παγίδων) για διαφορετικές επαναλήψεις σε διάφορες κατευθύνσεις. |
8. Περίληψη
Η χρήση της γλώσσας Lua στο OghmaNano παρέχει άμεσο έλεγχο στον εσωτερικό επιλυτή εξισώσεων διάχυσης-μεταφοράς, επιτρέποντας στον χρήστη να τροποποιήσει το μαθηματικό σύστημα που επιλύεται κατά τη διάρκεια της εκτέλεσης. Σε αντίθεση με τις εξωτερικές προσεγγίσεις scripting, οι οποίες λειτουργούν σε αρχεία εισόδου, η Lua λειτουργεί εντός του ίδιου του βρόχου του επιλυτή και μπορεί, επομένως, να τροποποιήσει σύνολα εξισώσεων, κατευθυντικές συνδέσεις και τη συμπεριφορά σύγκλισης σε κάθε βήμα. Αυτή η δυνατότητα είναι ιδιαίτερα πολύτιμη σε περιπτώσεις όπου η τυπική, πλήρως συνδεδεμένη διατύπωση είτε δεν είναι φυσικά κατάλληλη είτε δεν είναι αριθμητικά αποδοτική. Παραδείγματα περιλαμβάνουν την «πάγωμα» αργών βαθμών ελευθερίας, όπως τα κινητά ιόντα, ή την αποσύνθεση σύνθετων τρισδιάστατων προβλημάτων σε κατευθυντικές επαναλήψεις χρησιμοποιώντας στρατηγικές τύπου ADI.
Τα παραδείγματα που παρουσιάζονται εδώ απεικονίζουν δύο βασικές περιπτώσεις χρήσης. Η πρώτη δείχνει μια ελάχιστη παρέμβαση, όπου η εξίσωση ιόντων απενεργοποιείται μόνο στον κύριο ηλεκτρικό βρόχο, προκειμένου να αναπαραχθούν οι συνθήκες πειραμάτων γρήγορης σάρωσης. Η δεύτερη δείχνει πώς η Lua μπορεί να χρησιμοποιηθεί για τη δημιουργία μιας προσαρμοσμένης ροής εργασίας επιλυτή, εναλλάσσοντας διαδοχικά διατομές και εφαρμόζοντας κριτήρια σύγκλισης που καθορίζονται από τον χρήστη.
Σε γενικότερο πλαίσιο, η Lua θα πρέπει να θεωρείται ως ένα πλαίσιο για την ανάπτυξη αριθμητικών μεθόδων εντός του OghmaNano. Επιτρέπει στον χρήστη να ξεπεράσει τις προκαθορισμένες διαμορφώσεις επιλυτών και, αντ' αυτού, να ορίσει προσαρμοσμένες στρατηγικές επίλυσης που είναι ευθυγραμμισμένες τόσο με τη φυσική του προβλήματος όσο και με τις αριθμητικές ιδιότητες του συστήματος που επιλύεται.