Home Esempi Immagini dello schermo Manuale utente Logo di Bluesky YouTube ☰
OghmaNano Piattaforma di simulazione multifisica per dispositivi optoelettronici e sistemi fotonici SCARICA Guida rapida per iniziare.

Scripting in PythonScripting in Python

1. Introduzione1. Introduzione

In OghmaNano, lo scripting Python funziona modificando direttamente i file di configurazione della simulazione presenti sul disco e quindi avviando il motore di simulazione (oghma_core.exe) per eseguire il modello. In questa sezione viene descritto nel dettaglio questo processo.In OghmaNano, lo scripting Python funziona modificando direttamente i file di configurazione della simulazione presenti sul disco e quindi avviando il motore di simulazione (oghma_core.exe) per eseguire il modello. In questa sezione viene descritto nel dettaglio questo processo.

2. Esecuzione di file di simulazione con Python2. Esecuzione di file di simulazione con Python

Una simulazione OghmaNano è definita interamente da un singolo file di configurazione in formato JSON, sim.json. Questo file contiene lo stato completo della simulazione, inclusa la struttura del dispositivo, i parametri dei materiali, le impostazioni numeriche e la configurazione dell’output. In molti casi, sim.json esiste già come file normale all’interno della directory della simulazione.Una simulazione OghmaNano è definita interamente da un singolo file di configurazione in formato JSON, sim.json. Questo file contiene lo stato completo della simulazione, inclusa la struttura del dispositivo, i parametri dei materiali, le impostazioni numeriche e la configurazione dell’output. In molti casi, sim.json esiste già come file normale all’interno della directory della simulazione.

Quando si utilizza OghmaNano tramite Python, lo script legge il file sim.json in memoria utilizzando la libreria standard json di Python, modifica uno o più parametri e salva nuovamente il file JSON aggiornato su disco.Quando si utilizza OghmaNano tramite Python, lo script legge il file sim.json in memoria utilizzando la libreria standard json di Python, modifica uno o più parametri e salva nuovamente il file JSON aggiornato su disco.

Fondamentalmente, lo script Python deve essere eseguito impostando la directory di lavoro sul percorso della directory di simulazione, ovvero la directory che contiene sim.json (e sim.oghma). Questa è la directory da cui viene avviato oghma_core.exe.Fondamentalmente, lo script Python deve essere eseguito impostando la directory di lavoro sul percorso della directory di simulazione, ovvero la directory che contiene sim.json (e sim.oghma). Questa è la directory da cui viene avviato oghma_core.exe.

Una volta aggiornato il file JSON, lo script avvia oghma_core.exe dalla stessa directory. Il motore di simulazione legge sempre i file di input dalla directory di lavoro corrente; pertanto, se la directory di lavoro è errata, la simulazione fallirà o eseguirà il modello sbagliato.Una volta aggiornato il file JSON, lo script avvia oghma_core.exe dalla stessa directory. Il motore di simulazione legge sempre i file di input dalla directory di lavoro corrente; pertanto, se la directory di lavoro è errata, la simulazione fallirà o eseguirà il modello sbagliato.

Questa suddivisione delle responsabilità è intenzionale e ben definita: Python è responsabile della definizione delle modifiche apportate alla simulazione, mentre OghmaNano è responsabile dell’esecuzione delle simulazioni fisiche utilizzando i file presenti nella directory corrente.Questa suddivisione delle responsabilità è intenzionale e ben definita: Python è responsabile della definizione delle modifiche apportate alla simulazione, mentre OghmaNano è responsabile dell’esecuzione delle simulazioni fisiche utilizzando i file presenti nella directory corrente.

L’esempio riportato di seguito illustra questo processo caricando sim.json, modificando la mobilità dei portatori di carica del primo strato del dispositivo, salvando la configurazione aggiornata su disco e quindi eseguendo la simulazione dalla directory di simulazione.L’esempio riportato di seguito illustra questo processo caricando sim.json, modificando la mobilità dei portatori di carica del primo strato del dispositivo, salvando la configurazione aggiornata su disco e quindi eseguendo la simulazione dalla directory di simulazione.


       import json
       import os
       import sys

       f=open('sim.json')              #open the sim.json file
       lines=f.readlines()
       f.close()
       lines="".join(lines)    #convert the text to a python json object
     data = json.loads(lines)

     #Edit a value (use firefox as a json viewer
     # to help you figure out which value to edit)
     # this time we are editing the mobility of layer 1
     data['epitaxy']['segment1']['shape_dos']['mue_y']=1.0


     #convert the json object back to a string
     jstr = json.dumps(data, sort_keys=False, indent='\t')

     #write it back to disk
     f=open('sim.json',"w")
     f.write(jstr)
     f.close()

     #run the simulation using oghma_core
     os.system("oghma_core.exe")

Se la simulazione in sim.json è configurata per generare una curva corrente-tensione (J–V), OghmaNano creerà dei file di output nella directory della simulazione, contenenti dati quali l’efficienza di conversione della potenza (PCE), il fattore di riempimento e i valori di \(J_{sc}\) e \(V_{oc}\).Se la simulazione in sim.json è configurata per generare una curva corrente-tensione (J–V), OghmaNano creerà dei file di output nella directory della simulazione, contenenti dati quali l’efficienza di conversione della potenza (PCE), il fattore di riempimento e i valori di \(J_{sc}\) e \(V_{oc}\).

L’esempio riportato di seguito illustra come leggere un file di output in formato JSON e aggiungere il valore di \(V_{oc}\) a un file di testo separato.L’esempio riportato di seguito illustra come leggere un file di output in formato JSON e aggiungere il valore di \(V_{oc}\) a un file di testo separato.

f=open('sim_info.dat')
lines=f.readlines()
f.close()
lines="".join(lines)
data = json.loads(lines)

f=open('out.dat',"a")
f.write(str(data["Voc"])+"\n");
f.close()

3. Simulazioni più complesse3. Simulazioni più complesse

In molti processi di scripting, potrebbe essere necessario eseguire la stessa simulazione di base più volte, utilizzando valori di parametri diversi, e mantenere ogni esecuzione isolata in una directory dedicata. Questo è il metodo più semplice per mantenere i risultati organizzati e per evitare di sovrascriverli accidentalmente.In molti processi di scripting, potrebbe essere necessario eseguire la stessa simulazione di base più volte, utilizzando valori di parametri diversi, e mantenere ogni esecuzione isolata in una directory dedicata. Questo è il metodo più semplice per mantenere i risultati organizzati e per evitare di sovrascriverli accidentalmente.

L’esempio riportato di seguito crea una serie di directory corrispondenti a quattro modalità di movimento (1e-5, 1e-6, 1e-7, 1e-8). Per ciascuna directory, vengono eseguite le seguenti operazioni:L’esempio riportato di seguito crea una serie di directory corrispondenti a quattro modalità di movimento (1e-5, 1e-6, 1e-7, 1e-8). Per ciascuna directory, vengono eseguite le seguenti operazioni:

  1. Crea la directory (se questa non esiste già).Crea la directory (se questa non esiste già).
  2. Copia il file sim.json corrente nella directory specificata.Copia il file sim.json corrente nella directory specificata.
  3. Modifica la copia di sim.json per impostare la mobilità desiderata.Modifica la copia di sim.json per impostare la mobilità desiderata.
  4. Modifica la directory di lavoro impostandola sulla directory specificata.Modifica la directory di lavoro impostandola sulla directory specificata.
  5. Esegue il programma di risoluzione nella directory specificata, generando i risultati relativi a tale esecuzione.Esegue il programma di risoluzione nella directory specificata, generando i risultati relativi a tale esecuzione.

Questo schema costituisce la base per la creazione di script batch in OghmaNano: una directory per ogni esecuzione, un file di configurazione per ogni esecuzione e una cartella di output dedicata per ogni valore di parametro.Questo schema costituisce la base per la creazione di script batch in OghmaNano: una directory per ogni esecuzione, un file di configurazione per ogni esecuzione e una cartella di output dedicata per ogni valore di parametro.


       import json
       import os
       import shutil

       # The script must be started in the base simulation directory
       # (i.e. the directory containing the reference sim.json).
       base_dir = os.getcwd()

       mobilities = [1e-5, 1e-6, 1e-7, 1e-8]

       for mu in mobilities:
           # Create a directory name that is easy to read and sorts nicely
           run_dir = os.path.join(base_dir, f"mu_{mu:.0e}")
           os.makedirs(run_dir, exist_ok=True)

           # Copy the base sim.json into the run directory
           src_sim = os.path.join(base_dir, "sim.json")
           dst_sim = os.path.join(run_dir, "sim.json")
           shutil.copyfile(src_sim, dst_sim)

           # Load the copied sim.json and edit the mobility in THAT copy
           f = open(dst_sim)
           lines = f.readlines()
           f.close()
           lines = "".join(lines)
           data = json.loads(lines)

           # Edit a value: set the mobility for the first device layer
           data['epitaxy']['segment1']['shape_dos']['mue_y'] = mu

           jstr = json.dumps(data, sort_keys=False, indent='\t')
           f = open(dst_sim, "w")
           f.write(jstr)
           f.close()

           # Change into the run directory and execute the solver there
           os.chdir(run_dir)

           # If your command is "augment.nano" instead, replace the string below.
           os.system("oghma_core.exe")

           # Return to the base directory for the next run
           os.chdir(base_dir)

Dopo l’esecuzione, ogni directory conterrà i risultati corrispondenti al valore di mobilità specifico. Nella sezione successiva, amplieremo questo script per raccogliere i risultati principali di ogni esecuzione e combinarli in un unico file riepilogativo.Dopo l’esecuzione, ogni directory conterrà i risultati corrispondenti al valore di mobilità specifico. Nella sezione successiva, amplieremo questo script per raccogliere i risultati principali di ogni esecuzione e combinarli in un unico file riepilogativo.

Rappresentazione grafica di \(V_{oc}\) in funzione dell’inverso della mobilità.Rappresentazione grafica di \(V_{oc}\) in funzione dell’inverso della mobilità.

Dopo aver eseguito una serie di simulazioni in directory separate, il passo successivo consiste solitamente nell’estrarre un parametro chiave da ciascuna simulazione e visualizzare l’andamento. Un esempio comune è leggere la tensione a circuito aperto \(V_{oc}\) dal file di output in formato JSON (sim_info.dat) e rappresentarla graficamente in relazione all’inverso della mobilità \(1/\mu\).Dopo aver eseguito una serie di simulazioni in directory separate, il passo successivo consiste solitamente nell’estrarre un parametro chiave da ciascuna simulazione e visualizzare l’andamento. Un esempio comune è leggere la tensione a circuito aperto \(V_{oc}\) dal file di output in formato JSON (sim_info.dat) e rappresentarla graficamente in relazione all’inverso della mobilità \(1/\mu\).

Lo script riportato di seguito analizza una serie di directory (ad esempio mu_1e-05, mu_1e-06, ...) e, per ciascuna di esse:Lo script riportato di seguito analizza una serie di directory (ad esempio mu_1e-05, mu_1e-06, ...) e, per ciascuna di esse:

  1. Carica sim_info.dat in formato JSON.Carica sim_info.dat in formato JSON.
  2. Estratti Voc.Estratti Voc.
  3. Calcola \(1/\mu\) utilizzando la mobilità associata a tale directory.Calcola \(1/\mu\) utilizzando la mobilità associata a tale directory.
  4. Crea un piccolo file di riepilogo (voc_vs_inv_mobility.dat).Crea un piccolo file di riepilogo (voc_vs_inv_mobility.dat).
  5. Confronto tra i grafici \(V_{oc}\) e \(1/\mu\).Confronto tra i grafici \(V_{oc}\) e \(1/\mu\).

       import json
       import os

       # Optional: plotting (requires matplotlib)
       import matplotlib.pyplot as plt

       base_dir = os.getcwd()

       # Mobilities must match the run directories you generated earlier
       mobilities = [1e-5, 1e-6, 1e-7, 1e-8]

       inv_mu = []
       vocs = []

       for mu in mobilities:
           run_dir = os.path.join(base_dir, f"mu_{mu:.0e}")
           info_path = os.path.join(run_dir, "sim_info.dat")

           # Read the JSON output file and extract Voc
           f = open(info_path)
           lines = f.readlines()
           f.close()
           lines = "".join(lines)
           data = json.loads(lines)

           voc = data["Voc"]

           inv_mu.append(1.0 / mu)
           vocs.append(voc)

       # Write a small summary table to disk
       out = open("voc_vs_inv_mobility.dat", "w")
       out.write("# inv_mobility(1/mu)    Voc(V)\n")
       for x, y in zip(inv_mu, vocs):
           out.write(f"{x:.6e}    {y}\n")
       out.close()

       # Plot Voc against inverse mobility
       plt.plot(inv_mu, vocs, "o-")
       plt.xlabel("Inverse mobility (1/μ)")
       plt.ylabel("Open-circuit voltage Voc (V)")
       plt.title("Voc vs inverse mobility")
       plt.grid(True)
       plt.tight_layout()
       plt.show()

📺 Video correlato📺 Video correlato

Il video qui sotto mostra come è possibile controllare OghmaNano tramite script Python.Il video qui sotto mostra come è possibile controllare OghmaNano tramite script Python.

Nota: l’API e l’interfaccia di scripting interna mostrate nel video non sono più supportate e non vengono più fornite, in quanto si è rivelato difficile mantenerle. Il flusso di lavoro attuale e consigliato prevede l’utilizzo di uno script Python esterno per modificare direttamente i file di simulazione JSON e quindi richiamare oghma_core.exe. Questo approccio è più semplice, più affidabile e più facile da gestire. Potrebbe comunque essere utile consultare il video per comprendere il flusso di lavoro generale e i casi d’uso tipici, ma per il metodo più aggiornato, seguire le istruzioni descritte sopra.Nota: l’API e l’interfaccia di scripting interna mostrate nel video non sono più supportate e non vengono più fornite, in quanto si è rivelato difficile mantenerle. Il flusso di lavoro attuale e consigliato prevede l’utilizzo di uno script Python esterno per modificare direttamente i file di simulazione JSON e quindi richiamare oghma_core.exe. Questo approccio è più semplice, più affidabile e più facile da gestire. Potrebbe comunque essere utile consultare il video per comprendere il flusso di lavoro generale e i casi d’uso tipici, ma per il metodo più aggiornato, seguire le istruzioni descritte sopra.

Creazione di uno script Python per la simulazione di una cella solare in perovskite in OghmaNano.Creazione di uno script Python per la simulazione di una cella solare in perovskite in OghmaNano.