Створення сценаріїв за допомогою PowerShell.
1. Вступ
У OghmaNano сценарії PowerShell виконуються шляхом безпосередньої зміни файлів конфігурації моделювання, що зберігаються на диску, а потім запуску рушія моделювання (oghma_core.exe) для виконання моделі. У цьому розділі детально описано цей процес.
2. Запуск файлів моделювання за допомогою PowerShell.
Моделювання в OghmaNano повністю визначається одним файлом конфігурації у форматі JSON, sim.json. Цей файл містить повний стан моделювання, включно зі структурою пристрою, параметрами матеріалів, числовими налаштуваннями та конфігурацією вихідних даних. У багатьох випадках sim.json вже існує як звичайний файл у каталозі моделювання.
Під час запуску OghmaNano зі скрипту PowerShell, скрипт зчитує дані sim.json в пам’ять, змінює один або кілька параметрів і записує оновлений JSON-файл на диск.
Найважливіше, що PowerShell має запускатися oghma_core.exe із налаштованою робочою директорією, яка вказує на директорію моделювання, тобто на директорію, що містить sim.json (та sim.oghma). Механізм моделювання завжди зчитує вхідні файли з поточної робочої директорії, тому, якщо робоча директорія вказана неправильно, моделювання завершиться з помилкою або використовуватиметься не та модель.
Такий розподіл обов’язків є навмисним і чітко визначеним: PowerShell відповідає за визначення того, які зміни відбуваються в моделюванні, а OghmaNano відповідає за виконання фізичних розрахунків на основі файлів, що містяться в поточній директорії.
Наведений нижче приклад демонструє цей процес шляхом завантаження sim.json, зміни рухливості носіїв заряду в першому шарі пристрою, збереження оновленої конфігурації на диск, а потім запуску моделювання з каталогу моделювання.
# Set this to your simulation folder (must contain sim.json / sim.oghma)
$sim_dir = "C:\path\to\your\simulation"
# Read sim.json
$sim_path = Join-Path $sim_dir "sim.json"
$txt = Get-Content -Path $sim_path -Raw
$data = $txt | ConvertFrom-Json
# Edit a value: mobility of segment1 (same JSON path as the Python/MATLAB pages)
$data.epitaxy.segment1.shape_dos.mue_y = 1.0
# Write sim.json back to disk
$out = $data | ConvertTo-Json -Depth 200
Set-Content -Path $sim_path -Value $out -Encoding UTF8
# Run the simulation (working directory must be the simulation folder)
$orig_dir = Get-Location
Set-Location $sim_dir
& "oghma_core.exe"
Set-Location $orig_dir
Якщо в симуляції sim.json налаштовано отримання кривої залежності струму від напруги (J–V), OghmaNano створить вихідні файли в каталозі симуляції, які міститимуть такі параметри, як ККД, коефіцієнт заповнення, \(J_{sc}\) і \(V_{oc}\).
3. Отримання результатів
Багато вихідних файлів OghmaNano створено у форматі JSON. Зазвичай процес передбачає зчитування sim_info.dat, вилучення скалярного значення, що характеризує якість результату (наприклад, Voc), і додавання цього значення до текстового файлу для подальшого аналізу.
Наведений нижче приклад містить sim_info.dat і додає значення \(V_{oc}\) до окремого текстового файлу.
# Must be run from (or pointed at) a completed simulation directory
$sim_dir = "C:\path\to\your\simulation"
$info_path = Join-Path $sim_dir "sim_info.dat"
$txt = Get-Content -Path $info_path -Raw
$info = $txt | ConvertFrom-Json
$voc = $info.Voc
# Append to a text file (one Voc per line)
$out_path = Join-Path $sim_dir "out.dat"
Add-Content -Path $out_path -Value ("{0}" -f $voc)
3. Складніші моделювання.
У багатьох сценаріях автоматизації процесів вам знадобиться кілька разів запускати одну й ту саму базову симуляцію з різними значеннями параметрів і зберігати результати кожного запуску в окремій папці. Це найпростіший спосіб забезпечити охайність результатів і запобігти випадковому перезапису даних.
Наведений нижче приклад створює набір каталогів, що відповідають чотирьом типам мобільності (1e-5, 1e-6, 1e-7, 1e-8). Для кожного каталогу він:
- Створює каталог (якщо він ще не існує).
- Копіює поточний файл
sim.jsonдо вказаної директорії. - Редагує скопійований
sim.json, щоб задати цільову швидкість переміщення. - Змінює поточну робочу директорію на вказану.
- Запускає програму для розв’язання задач у вказаній директорії, генеруючи результати, які зберігаються локально для цього конкретного запуску.
Ця схема є основою для пакетного скриптингу в OghmaNano: для кожного запуску використовується окрема директорія, окремий файл конфігурації та окрема папка для виводу результатів для кожного значення параметра.
# The script should be started in the base simulation directory
# (i.e. the directory containing the reference sim.json).
$base_dir = (Get-Location).Path
$mobilities = @(1e-5, 1e-6, 1e-7, 1e-8)
$src_sim = Join-Path $base_dir "sim.json"
foreach ($mu in $mobilities) {
$run_name = ("mu_{0:0e}" -f $mu)
$run_dir = Join-Path $base_dir $run_name
if (-not (Test-Path -Path $run_dir -PathType Container)) {
New-Item -ItemType Directory -Path $run_dir | Out-Null
}
# Copy the base sim.json into the run directory
$dst_sim = Join-Path $run_dir "sim.json"
Copy-Item -Path $src_sim -Destination $dst_sim -Force
# Load the copied sim.json and edit the mobility in THAT copy
$txt = Get-Content -Path $dst_sim -Raw
$data = $txt | ConvertFrom-Json
$data.epitaxy.segment1.shape_dos.mue_y = [double]$mu
$out = $data | ConvertTo-Json -Depth 200
Set-Content -Path $dst_sim -Value $out -Encoding UTF8
# Change into the run directory and execute the solver there
Push-Location $run_dir
& "oghma_core.exe"
Pop-Location
}
4. Отримання результатів
Після виконання серії симуляцій в окремих папках (наприклад, mu_1e-05, mu_1e-06, ...), наступним кроком є отримання ключового показника ефективності для кожної симуляції та візуалізація отриманої тенденції. Типовим прикладом є зчитування значення напруги розімкнутого контуру \(V_{oc}\) з файлу sim_info.dat в кожній папці та побудова графіку залежності цього значення від оберненої рухливості \(1/\mu\).
Наведений нижче скрипт перевіряє заздалегідь визначений набір каталогів, що відповідають показникам рухливості 1e-5, 1e-6, 1e-7, 1e-8, і для кожного каталогу виконує наступне:
- Завантажити
sim_info.datу форматі JSON. - Уривки
Voc. - Обчислює \(1/\mu\) на основі показника мобільності, пов’язаного з цією директорією.
- Створює невеликий файл із підсумковою інформацією (
voc_vs_inv_mobility.dat). - Порівняння графіків \(V_{oc}\) та \(1/\mu\).
# Run this from the BASE directory that contains the run folders
# (mu_1e-05, mu_1e-06, ...). If not, set base_dir explicitly.
$base_dir = (Get-Location).Path
$mobilities = @(1e-5, 1e-6, 1e-7, 1e-8)
$inv_mu = @()
$vocs = @()
foreach ($mu in $mobilities) {
$run_dir = Join-Path $base_dir ("mu_{0:0e}" -f $mu)
$info_path = Join-Path $run_dir "sim_info.dat"
if (-not (Test-Path -Path $info_path -PathType Leaf)) {
throw ("Missing sim_info.dat in: {0}" -f $run_dir)
}
$txt = Get-Content -Path $info_path -Raw
$info = $txt | ConvertFrom-Json
$vocs += [double]$info.Voc
$inv_mu += (1.0 / [double]$mu)
}
# Write a small summary table to disk
$out_path = Join-Path $base_dir "voc_vs_inv_mobility.dat"
"# inv_mobility(1/mu) Voc(V)" | Set-Content -Path $out_path -Encoding UTF8
for ($i = 0; $i -lt $mobilities.Count; $i++) {
("{0:e6} {1}" -f $inv_mu[$i], $vocs[$i]) | Add-Content -Path $out_path -Encoding UTF8
}
# Plot Voc vs inverse mobility
# PowerShell does not have a built-in plotting window. The simplest workflow is to
# load voc_vs_inv_mobility.dat into your plotting tool of choice (MATLAB, Python, Excel, etc.).