예제 스크린샷 사용자 매뉴얼 Bluesky 로고 YouTube
OghmaNano 유기/페로브스카이트 태양전지, OFET 및 OLED 시뮬레이션 다운로드

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)에 대응하는 디렉터리 집합을 만듭니다. 각 디렉터리에 대해 다음을 수행합니다:

  1. 디렉터리를 생성합니다(아직 없을 경우).
  2. 현재 sim.json을 해당 디렉터리로 복사합니다.
  3. 복사된 sim.json을 편집하여 목표 이동도를 설정합니다.
  4. 작업 디렉터리를 해당 디렉터리로 변경합니다.
  5. 그 디렉터리에서 솔버를 실행하여, 각 실행의 출력을 해당 디렉터리에 로컬로 생성합니다.

이 패턴은 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에 대응하는 고정된 실행 디렉터리 집합을 스캔하고 각 디렉터리에 대해 다음을 수행합니다:

  1. sim_info.dat를 JSON으로 불러옵니다.
  2. Voc를 추출합니다.
  3. 해당 디렉터리와 연관된 이동도를 사용하여 \(1/\mu\)를 계산합니다.
  4. 작은 요약 파일(voc_vs_inv_mobility.dat)을 기록합니다.
  5. \(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 등)로 불러오는 것입니다.