PowerShell スクリプティング
1. はじめに
OghmaNano では、PowerShell スクリプティングは、ディスク上のシミュレーション設定ファイルを直接編集し、
その後シミュレーションエンジン(oghma_core.exe)を呼び出してモデルを実行することで機能します。
このセクションでは、このワークフローについて詳しく説明します。
2. PowerShell でシミュレーションファイルを実行する
OghmaNano シミュレーションは、単一の JSON 設定ファイル
sim.json によって完全に定義されます。
このファイルには、デバイス構造、
材料パラメータ、数値設定、および出力設定を含む、シミュレーションの完全な状態が含まれています。
多くの場合、sim.json はすでにシミュレーションディレクトリ内の通常ファイルとして存在します。
PowerShell から OghmaNano を駆動する場合、スクリプトは sim.json をメモリへ読み込み、
1 つ以上のパラメータを変更し、更新された JSON をディスクへ書き戻します。
重要なのは、PowerShell が oghma_core.exe を
シミュレーションディレクトリを作業ディレクトリとして設定して実行しなければならないことです —
つまり、sim.json(および
sim.oghma)を含むディレクトリです。
シミュレーションエンジンは常に現在の作業ディレクトリから入力ファイルを読み込むため、
作業ディレクトリが正しくない場合、シミュレーションは失敗するか、誤ったモデルを実行します。
この役割分担は意図的かつ明示的です: PowerShell はシミュレーション内で 何を 変更するかを定義する責任を持ち、 OghmaNano は現在のディレクトリ内に存在するファイルを使用して 物理を 実行する 責任を持ちます。
以下の例は、sim.json を読み込み、最初のデバイス層のキャリア
移動度を変更し、更新された設定をディスクへ書き戻し、その後
シミュレーションディレクトリからシミュレーションを実行することで、この処理を実演しています。
# これをシミュレーションフォルダに設定します(sim.json / sim.oghma を含む必要があります)
$sim_dir = "C:\path\to\your\simulation"
# sim.json を読み込む
$sim_path = Join-Path $sim_dir "sim.json"
$txt = Get-Content -Path $sim_path -Raw
$data = $txt | ConvertFrom-Json
# 値を編集: segment1 の移動度(Python/MATLAB ページと同じ JSON パス)
$data.epitaxy.segment1.shape_dos.mue_y = 1.0
# sim.json をディスクへ書き戻す
$out = $data | ConvertTo-Json -Depth 200
Set-Content -Path $sim_path -Value $out -Encoding UTF8
# シミュレーションを実行する(作業ディレクトリはシミュレーションフォルダでなければなりません)
$orig_dir = Get-Location
Set-Location $sim_dir
& "oghma_core.exe"
Set-Location $orig_dir
sim.json 内のシミュレーションが J–V 曲線を実行するように設定されている場合、OghmaNano は
シミュレーションディレクトリ内に、PCE、フィルファクタ、\(J_{sc}\) および
\(V_{oc}\) のような量を含む出力ファイルを書き込みます。
3. 結果の抽出
多くの OghmaNano 出力ファイルは JSON 形式で書き出されます。一般的なパターンは、
sim_info.dat を読み込み、スカラーな性能指標(たとえば Voc)を抽出し、
後で解析するためにテキストファイルへ追加することです。
以下の例では、sim_info.dat を読み込み、
\(V_{oc}\) の値を別のテキストファイルへ追加します。
# 完了したシミュレーションディレクトリから実行するか、そこを指定する必要があります
$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
# テキストファイルへ追加する(1 行につき 1 つの Voc)
$out_path = Join-Path $sim_dir "out.dat"
Add-Content -Path $out_path -Value ("{0}" -f $voc)
3. より複雑なシミュレーション
多くのスクリプティングワークフローでは、同じベースシミュレーションを異なるパラメータ値で複数回実行し、 各実行をそれぞれ独立したディレクトリに分離して保持したい場合があります。これは出力を整理し、 結果を誤って上書きするのを防ぐ最も簡単な方法です。
以下の例は、4 つの移動度
(1e-5、1e-6、1e-7、1e-8)
に対応する一連のディレクトリを作成します。各ディレクトリに対して次を行います:
- ディレクトリを作成する(存在しない場合)。
- 現在の
sim.jsonをそのディレクトリにコピーする。 - コピーした
sim.jsonを編集して、対象の移動度を設定する。 - 作業ディレクトリをそのディレクトリへ変更する。
- そのディレクトリでソルバーを実行し、その実行に固有の出力を生成する。
このパターンが OghmaNano におけるバッチスクリプティングの基礎です。すなわち、実行ごとに 1 つのディレクトリ、 実行ごとに 1 つの設定ファイル、そして各パラメータ値に対して整理された出力フォルダです。
# スクリプトはベースシミュレーションディレクトリから開始する必要があります
# (つまり、参照用の 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
}
# ベース sim.json を実行ディレクトリへコピーする
$dst_sim = Join-Path $run_dir "sim.json"
Copy-Item -Path $src_sim -Destination $dst_sim -Force
# コピーした sim.json を読み込み、そのコピー内の移動度を編集する
$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
# 実行ディレクトリへ移動し、そこでソルバーを実行する
Push-Location $run_dir
& "oghma_core.exe"
Pop-Location
}
4. 結果の抽出
別々の実行ディレクトリ(たとえば mu_1e-05、
mu_1e-06, ...)で一連のシミュレーションを実行した後の次のステップは、
各実行から重要な性能指標を抽出し、その傾向を可視化することです。
一般的な例は、各ディレクトリの sim_info.dat から開放電圧 \(V_{oc}\) を読み出し、
それを逆移動度 \(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\) に対してプロットする。
# これを実行フォルダを含むベースディレクトリから実行します
# (mu_1e-05, mu_1e-06, ...)。そうでない場合は、base_dir を明示的に設定してください。
$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)
}
# 小さなサマリ表をディスクへ書き出す
$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
}
# Voc を逆移動度に対してプロットする
# PowerShell には組み込みのプロットウィンドウがありません。最も簡単なワークフローは、
# voc_vs_inv_mobility.dat をお好みのプロットツール(MATLAB、Python、Excel など)へ読み込むことです。