PowerShell 스크립팅
1. 소개
OghmaNano에서 PowerShell 스크립팅은 디스크의 시뮬레이션 구성 파일을 직접 편집한 다음
시뮬레이션 엔진(oghma_core.exe)을 호출하여 모델을 실행하는 방식으로 동작합니다.
이 절에서는 이 워크플로를 자세히 설명합니다.
2. PowerShell로 시뮬레이션 파일 실행
OghmaNano 시뮬레이션은 단일 JSON 구성 파일인
sim.json에 의해 완전히 정의됩니다.
이 파일에는 소자 구조,
재료 매개변수, 수치 설정, 출력 구성 등을 포함한 시뮬레이션의 전체 상태가 들어 있습니다.
많은 경우 sim.json은 이미 시뮬레이션 디렉터리 안에 일반 파일로 존재합니다.
PowerShell에서 OghmaNano를 구동할 때 스크립트는 sim.json을 메모리로 읽고 하나 이상의
매개변수를 수정한 뒤 갱신된 JSON을 다시 디스크에 기록합니다.
중요하게도, PowerShell은 작업 디렉터리를
시뮬레이션 디렉터리 — 즉 sim.json(및
sim.oghma)가 들어 있는 디렉터리 — 로 설정한 상태에서 oghma_core.exe를 실행해야 합니다.
시뮬레이션 엔진은 항상 현재 작업 디렉터리에서 입력 파일을 읽기 때문에,
작업 디렉터리가 올바르지 않으면 시뮬레이션이 실패하거나 잘못된 모델이 실행됩니다.
이러한 책임 분리는 의도적이고 명시적입니다: 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, fill factor, \(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
# 텍스트 파일에 추가 (줄마다 Voc 하나)
$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 배치 스크립팅의 기초입니다: 실행당 하나의 디렉터리, 실행당 하나의 구성 파일, 그리고 각 매개변수 값에 대해 깨끗한 출력 폴더 하나.
# 스크립트는 기본 시뮬레이션 디렉터리에서 시작되어야 합니다
# (즉, 기준 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 등)로 불러오는 것입니다.