PyOghma
Você pode avançar bastante manipulando diretamente os arquivos de configuração JSON do OghmaNano a partir de Python (editando
sim.json no disco e executando oghma_core.exe).
Entretanto, se você quiser executar muitas simulações em paralelo para gerar grandes conjuntos de dados, rapidamente precisará
de uma camada de orquestração: criar diretórios de execução, clonar arquivos de entrada, iniciar múltiplas instâncias do solver e
gerenciar uma fila de trabalhos entre os núcleos de CPU.
Além disso, a manipulação direta de JSON em Python nem sempre é agradável: é fácil cometer erros, e o código pode se tornar verboso em comparação com uma interface de nível mais alto que conhece objetos comuns de simulação. Por esse motivo, Cai Williams criou uma API chamada PyOghma que pode ser usada para manipular arquivos JSON do OghmaNano e executar simulações. PyOghma é um projeto independente, portanto direcione perguntas, relatórios de bugs e solicitações de recursos ao autor do PyOghma.
PyOghma está disponível no
GitHub
e também via pip:
python -m pip install PyOghma
Um exemplo de uso do PyOghma é dado abaixo [python-example3]:
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()
Neste exemplo, PyOghma é importado como po, e um arquivo JSON de origem do OghmaNano é manipulado alterando os
valores de mobilidade, densidade de armadilhas, taxa de aprisionamento e energia de Urbach. O arquivo original é clonado com a linha:
Oghma.clone('NewExperiment0')
Em seguida, no final do código, aparecem as duas linhas abaixo. A primeira adiciona o trabalho à lista de trabalhos do PyOghma, e a segunda instrui o PyOghma a executar todos os trabalhos. Se houvesse mais de um trabalho, o PyOghma executaria múltiplos trabalhos em todas as CPUs até que fossem concluídos. Se você quisesse executar simulações com diferentes valores de mobilidade, adicionaria cada simulação à lista de trabalhos e depois chamaria \(run\_jobs\) uma vez para executar os trabalhos em todos os núcleos de forma eficiente.
Oghma.add_job(experiment_name)
Oghma.run_jobs()
Mais informações sobre o PyOghma estão disponíveis na página do GitHub.