PyOghma
Można osiągnąć wiele, bezpośrednio modyfikując pliki konfiguracyjne JSON OghmaNano z poziomu Pythona (edycja sim.json na dysku i uruchomienie oghma_core.exe). Jednak jeśli chcemy uruchomić wiele symulacji równolegle w celu wygenerowania dużych zbiorów danych, szybko okaże się, że potrzebujemy warstwy zarządzającej: tworzenia katalogów dla uruchomionych symulacji, kopiowania plików wejściowych, uruchamiania wielu instancji solvera oraz zarządzania kolejką zadań na różnych rdzeniach procesora.
Ponadto, bezpośrednia manipulacja danymi JSON w języku Python nie zawsze jest wygodna: łatwo popełnić błędy, a kod może stać się zbyt obszerny w porównaniu z interfejsem wyższego poziomu, który uwzględnia typowe obiekty używane w symulacjach. Z tego powodu Cai Williams stworzył interfejs API o nazwie PyOghma, który można wykorzystać do manipulowania plikami JSON OghmaNano i uruchamiania symulacji. PyOghma to niezależny projekt, dlatego wszelkie pytania, zgłoszenia błędów i prośby o nowe funkcje należy kierować do autora PyOghma.
PyOghma jest dostępne na GitHub, a także poprzez pip:
python -m pip install PyOghma
Poniżej znajduje się przykład zastosowania PyOghma. [przykład_w_pythonie_3]:
import PyOghma as po
Oghma = po.OghmaNano()
Results = po.Results()
source_simulation = "\exapmle\pm6y6\"
Oghma.set_source_simulation(source_simulation)
experiment_name = 'NewExperiment'
Oghma.set_experiment_name(experiment_name)
mobility = 1e-5
trap_desnsity = 1e-18
trapping_crosssection = 1e-20
recombination_crosssection = 1e-20
urbach_energy = 40e-3
temperature = 300
intensity = 0.5
experiment_name = 'NewExperiment' + str(1)
Oghma.clone('NewExperiment0')
Oghma.Optical.Light.set_light_Intensity(intensity)
Oghma.Optical.Light.update()
Oghma.Thermal.set_temperature(temperature)
Oghma.Thermal.update()
Oghma.Epitaxy.load_existing()
Oghma.Epitaxy.pm6y6.dos.mobility('both', mobility)
Oghma.Epitaxy.pm6y6.dos.trap_density('both', trap_desnsity)
Oghma.Epitaxy.pm6y6.dos.trapping_rate('both', 'free to trap',..
trapping_crosssection)
Oghma.Epitaxy.pm6y6.dos.trapping_rate('both', 'trap to free',..
recombination_crosssection)
Oghma.Epitaxy.pm6y6.dos.urbach_energy('both', urbach_energy)
Oghma.Epitaxy.update()
Oghma.add_job(experiment_name)
Oghma.run_jobs()
W tym przykładzie biblioteka PyOghma jest importowana jako po, a plik źródłowy OghmaNano w formacie JSON jest modyfikowany poprzez zmianę wartości parametrów: ruchliwości, gęstości pułapek, szybkości wychwytywania i energii Urbacha. Oryginalny plik jest kopiowany za pomocą następującego polecenia:
Oghma.clone('NewExperiment0')
Następnie, na końcu kodu, należy dodać następujące dwie linie. Pierwsza dodaje zadanie do listy zadań PyOghma, a druga instruuje PyOghma, aby wykonało wszystkie zadania. Jeśli na liście znajdowałoby się więcej niż jedno zadanie, PyOghma wykonywałoby je równolegle na wszystkich procesorach, aż do ich zakończenia. Jeśli chcielibyśmy uruchomić symulacje z różnymi wartościami mobilności, dodalibyśmy każdą symulację do listy zadań, a następnie wywołalibyśmy \(run\_jobs\) raz, aby efektywnie uruchomić zadania na wszystkich rdzeniach.
Oghma.add_job(experiment_name)
Oghma.run_jobs()
Więcej informacji na temat PyOghma można znaleźć na stronie GitHub.