اسکریپتنویسی 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، تغییر دادن تحرک حامل
در اولین لایه دستگاه، نوشتن دوباره پیکربندی بهروزشده روی دیسک، و سپس
اجرای شبیهسازی از پوشه شبیهسازی نشان میدهد.
# این را روی پوشه شبیهسازی خود تنظیم کنید (باید شامل 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 (همان مسیر JSON مانند صفحات Python/MATLAB)
$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
# افزودن به یک فایل متنی (در هر خط یک 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, ...)، گام بعدی استخراج یک شاخص کلیدی عملکرد از هر اجرا و نمایش روند آن است.
یک مثال رایج این است که ولتاژ مدار باز \(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\) رسم میکند.
# این را از پوشه پایهای که پوشههای اجرا را در خود دارد اجرا کنید
# (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 ("sim_info.dat یافت نشد در: {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, etc.).