Compatibility
8 beta/preview; Windows catalog 8.0.1 / TTH 1.1.50
Package applicability is under review; follow the stated version and platform limits.
Download Complete MQS calculation-record teaching inputs (ZIP)Includes strip.ixi, process.ldf, strip.cir, README.txt. Exact checked input files plus instructions; final-release/platform applicability remains pending.

Keep a runnable hierarchy separate from a support selection

A portable calculation record keeps saved inputs, relative dependencies, numerical output and provenance together. Studio’s native Support Bundle is a selected diagnostic archive: the checked document copies have prefixed names and their internal references are unchanged. Use the related native-bundle guide when that is the evidence you need.

The commands below are a complete Windows teaching workflow, checked with both built-in Windows PowerShell 5.1 and PowerShell 7. They use .NET SHA-256 and built-in ZIP commands, so no Python or extra hashing module is required. They do not package arbitrary projects automatically.

Prepare the complete teaching case

  1. Extract all three inputs from the complete example ZIP into a fresh writable folder outside the installed examples directory. Keep strip.ixi, process.ldf and strip.cir together.
  2. Use an existing compatible licensed InductEx®/TTH installation. The checked payload was Windows InductEx® 8.0.1 with TTH 1.1.50. In each block, set $ix to the actual absolute InductEx® executable path.
  3. The supplied model is a 100 × 10 µm MQS strip. Its process uses UnitL = 1 H, so the reported L1 is in henries. For other projects, preserve the complete relative hierarchy and all referenced GDS/process/netlist/include/model files; review their permissions and contents before sharing.
  4. Use the new directory for the first block. It refuses an existing output directory, record-001 or calculation-001.zip, keeping an older result from being mistaken for a new run.

Create a portable calculation record

Run this block in PowerShell from the extracted directory. It checks the current result and required numerical files before copying anything into the record. The original three inputs stay unchanged.

The record includes the three relative input names, four selected numerical files and calculation-record.json with seven content hashes, the InductEx® executable hash, the solver version reported in the current GMRES file and L1. It excludes executables, licence files and the full console/runtime-health reports. It is not a general content anonymizer.

$ErrorActionPreference = 'Stop'
$ix = 'C:\Program Files\SUN Magnetics\InductEx\bin\inductex.exe'
function Get-RecordSha256([string]$Path) {
    $algorithm = [Security.Cryptography.SHA256]::Create()
    $stream = $null
    try {
        $stream = [IO.File]::OpenRead((Resolve-Path -LiteralPath $Path).Path)
        [BitConverter]::ToString($algorithm.ComputeHash($stream)).Replace('-', '').ToLowerInvariant()
    }
    finally { if ($stream) { $stream.Dispose() }; $algorithm.Dispose() }
}
$inputs = @('strip.ixi', 'process.ldf', 'strip.cir')
$numerical = @('output/elements.txt', 'output/gmres.txt', 'output/solver_out.txt', 'output/strip.msh')
foreach ($name in $inputs) {
    if (-not (Test-Path -LiteralPath $name -PathType Leaf)) { throw "Missing teaching input: $name" }
}
foreach ($name in @('output', 'record-001', 'calculation-001.zip')) {
    if (Test-Path -LiteralPath $name) { throw "Use a fresh teaching directory; preserve the existing $name" }
}
& $ix .\strip.ixi
if ($LASTEXITCODE -ne 0) { throw 'Extraction failed; inspect the diagnostic before packaging.' }
foreach ($name in $numerical) {
    if (-not (Test-Path -LiteralPath $name -PathType Leaf)) { throw "No current numerical artifact: $name" }
}
$rows = [regex]::Matches((Get-Content -LiteralPath 'output/elements.txt' -Raw), '(?m)^L1\s+([-+.\dEe]+)\s*$')
if ($rows.Count -ne 1) { throw 'Expected one current L1 result.' }
$reported = $rows[0].Groups[1].Value
$value = [double]::Parse($reported, [Globalization.CultureInfo]::InvariantCulture)
if ([double]::IsNaN($value) -or [double]::IsInfinity($value) -or $value -le 0) { throw 'No positive finite L1 result.' }
$solverVersion = [regex]::Match((Get-Content -LiteralPath 'output/gmres.txt' -Raw), 'TTH v([0-9.]+)').Groups[1].Value
if (-not $solverVersion) { throw 'Record the actual solver identity before packaging.' }
New-Item -ItemType Directory -Path 'record-001/output' | Out-Null
foreach ($name in @($inputs) + @($numerical)) {
    Copy-Item -LiteralPath $name -Destination (Join-Path 'record-001' $name)
}
$files = foreach ($name in @($inputs) + @($numerical)) {
    [ordered]@{ path = $name; sha256 = Get-RecordSha256 (Join-Path 'record-001' $name) }
}
$record = [ordered]@{
    schema = 'sunmagnetics-calculation-record/1'
    scope = 'Complete supplied MQS teaching strip; UnitL=1 H. No physical calibration or convergence claim.'
    executable_name = (Get-Item -LiteralPath $ix).Name
    executable_sha256 = Get-RecordSha256 $ix
    solver_version_from_current_gmres = $solverVersion
    L1_reported = $reported
    L1_H = $value
    files = @($files)
}
$record | ConvertTo-Json -Depth 5 | Set-Content -LiteralPath 'record-001/calculation-record.json' -Encoding utf8
Compress-Archive -LiteralPath 'record-001' -DestinationPath 'calculation-001.zip'
Write-Host 'Created calculation-001.zip with relative inputs, selected numerical outputs and a file-hash record.'

Verify the archive and rerun a fresh copy

This second block extracts the record, checks the expected file list and hashes, and copies only the three inputs into a separate fresh rerun-001 directory. It verifies the recorded InductEx® binary identity, the exact reported teaching L1 and solver version, then checks that the archived numerical files remain unchanged.

The checked result is L1 = 3.896479063e-12 H, or 3.896479063 pH, against a 3.9 pH design value. Exact repetition here is a same-binary teaching check, not a universal solver tolerance, mesh-convergence result or physical calibration.

$ErrorActionPreference = 'Stop'
$ix = 'C:\Program Files\SUN Magnetics\InductEx\bin\inductex.exe'
function Get-RecordSha256([string]$Path) {
    $algorithm = [Security.Cryptography.SHA256]::Create()
    $stream = $null
    try {
        $stream = [IO.File]::OpenRead((Resolve-Path -LiteralPath $Path).Path)
        [BitConverter]::ToString($algorithm.ComputeHash($stream)).Replace('-', '').ToLowerInvariant()
    }
    finally { if ($stream) { $stream.Dispose() }; $algorithm.Dispose() }
}
foreach ($name in @('expanded-001', 'rerun-001')) {
    if (Test-Path -LiteralPath $name) { throw "Choose a fresh verification directory; preserve $name" }
}
Expand-Archive -LiteralPath 'calculation-001.zip' -DestinationPath 'expanded-001'
$root = Join-Path 'expanded-001' 'record-001'
$record = Get-Content -LiteralPath (Join-Path $root 'calculation-record.json') -Raw | ConvertFrom-Json
if ($record.schema -ne 'sunmagnetics-calculation-record/1') { throw 'Unexpected teaching record schema.' }
if ((Get-RecordSha256 $ix) -ne $record.executable_sha256) { throw 'This check requires the recorded InductEx binary; review other versions separately.' }
$expected = @('strip.ixi', 'process.ldf', 'strip.cir', 'output/elements.txt', 'output/gmres.txt', 'output/solver_out.txt', 'output/strip.msh')
if (@(Compare-Object $expected @($record.files.path)).Count -ne 0) { throw 'The teaching record has an unexpected file list.' }
foreach ($entry in $record.files) {
    if ((Get-RecordSha256 (Join-Path $root $entry.path)) -ne $entry.sha256) { throw "Record hash mismatch: $($entry.path)" }
}
New-Item -ItemType Directory -Path 'rerun-001' | Out-Null
foreach ($name in @('strip.ixi', 'process.ldf', 'strip.cir')) {
    Copy-Item -LiteralPath (Join-Path $root $name) -Destination (Join-Path 'rerun-001' $name)
}
Push-Location 'rerun-001'
try {
    & $ix .\strip.ixi
    if ($LASTEXITCODE -ne 0) { throw 'Fresh extraction failed; do not accept the archived output as a rerun.' }
    $rows = [regex]::Matches((Get-Content -LiteralPath 'output/elements.txt' -Raw), '(?m)^L1\s+([-+.\dEe]+)\s*$')
    if ($rows.Count -ne 1 -or $rows[0].Groups[1].Value -ne $record.L1_reported) { throw 'The fresh teaching result differs; review the runtime and inputs.' }
    $solverVersion = [regex]::Match((Get-Content -LiteralPath 'output/gmres.txt' -Raw), 'TTH v([0-9.]+)').Groups[1].Value
    if ($solverVersion -ne $record.solver_version_from_current_gmres) { throw 'The fresh solver version differs from the recorded one.' }
}
finally { Pop-Location }
foreach ($entry in $record.files) {
    if ((Get-RecordSha256 (Join-Path $root $entry.path)) -ne $entry.sha256) { throw "Archived record changed: $($entry.path)" }
}
Write-Host 'Verified record hashes and a separate fresh rerun. Archived numerical files were preserved.'

Inspect the record before sharing it

Hashes detect disagreement with this manifest; they do not establish authorship, physical correctness or that the manifest itself was trustworthy. Runtime dependency closure is also separate: the example records the InductEx® file hash and reported TTH version, not every runtime library or the actual TTH binary hash.

For a real design, include the assumptions, units, reference conventions and numerical checks needed to interpret the result. The supplied teaching ZIP contains no customer process values. A different project can contain proprietary data or passkeys even when filenames look ordinary.

Record pathPurpose
record-001/strip.ixi, process.ldf, strip.cirOriginal relative input names and teaching process/topology.
record-001/output/elements.txtExtracted branch value, under the supplied UnitL convention.
record-001/output/gmres.txt, solver_out.txt, strip.mshSelected numerical solver/mesh evidence, kept separate from the rerun.
record-001/calculation-record.jsonExpected file list/hashes, actual InductEx® file identity, reported TTH version and result.

Recover without overwriting the earlier record

For an existing record/output directory, choose a new working copy/generation rather than forcing replacement. The checked reuse attempt failed and preserved the original ZIP bytes.

For a missing dependency, restore the complete saved input set before extraction. The checked missing process was rejected before output or archive creation.

For a content hash mismatch, preserve the record and investigate the changed file. A deliberately altered teaching netlist was rejected before a fresh rerun directory was created. Do not replace its manifest hash merely to make verification pass.

If the executable, solver version or printed result differs, compare that environment deliberately. This example refuses to treat a different runtime as its checked same-binary repetition. Other platforms and final distributed packages still need their own qualification.

Complete strip.ixi

* Parameterised inline equivalent of the maintained microstrip geometry
$COMMAND
  MeshFile "strip.msh"
  MeshType CUBE
  Mode MQS
  Netlist "strip.cir"
  Process "process.ldf"
$END
$VARIABLE
  Name strip_length
  Value 100
$END
$VARIABLE
  Name strip_width
  Value 10
$END
$STRUCT
  Name inline_strip
  $POLY
    Layer M1
    XY
    (0,0)
    (0,%strip_width)
    (%strip_length,%strip_width)
    (%strip_length,0)
    (0,0)
  $END
  $PATH
    Layer TERM
    Width 1
    XY
    (0,%strip_width)
    (0,0)
  $END
  $PATH
    Layer TERM
    Width 1
    XY
    (%strip_length,%strip_width)
    (%strip_length,0)
  $END
  $TEXT
    Text "P1 M1 M0"
    Layer TEXT
    XY
    (0,%strip_width/2)
  $END
  $TEXT
    Text "P2 M1 M0"
    Layer TEXT
    XY
    (%strip_length,%strip_width/2)
  $END
$END

Complete process.ldf

* Public microstrip teaching stack; dimensions use Units below
$Parameters
  Units = 1e-6
  SegmentSize = 2.0
  AbsMin = 0.025
  GPOverhang = 5.0
  ProcessHasGroundPlane = TRUE
  GPLayer = 17
  TermLayer = 19
  TextLayer = 18
  HFilaments = 1
  TerminalInRange = 1.0
  UnitL = 1
$End
$Layer
  Number = 17
  Name = M0
  Thickness = 0.2
  Lambda = 0.09
  Order = 0
  Mask = -1
  Filmtype = S
  HFilaments = 2
$End
$Layer
  Number = 2
  Name = I0
  Thickness = 0.15
  Order = 1
  Mask = -1
  Filmtype = I
$End
$Layer
  Number = 5
  Name = M1
  Thickness = 0.25
  Lambda = 0.09
  Order = 2
  Mask = 1
  Filmtype = S
  HFilaments = 3
$End

Complete strip.cir

* Extraction topology, design inductance in henries because UnitL=1
L1 1 2 3.9e-12
P1 1 0
P2 2 0
.end
Sources and verification details

Recorded inputs/builds only. Complete walkthrough and final-package acceptance remain separate.

VAL-035 · Windows catalog InductEx® 8.0.1 / TTH 1.1.50; PowerShell 7 and built-in Windows PowerShell 5.1.19041.7802
Exact two PowerShell recipe blocks on a complete Windows MQS teaching project: relative-name ZIP, selected numerical files and hash/solver record, fresh extraction after unpacking, unchanged original outputs and guarded existing/missing/tampered inputs. No general secret scrubbing, authenticity, physical accuracy or final-package qualification
Seventeen behaviours were checked on each shell; this is not 34 different behaviours. The complete supplied inline MQS project is qualified. Other dependency graphs, arbitrary archives, physical accuracy, runtime dependency closure, authenticity and final packages remain unqualified.

  • inductex:docs/manual/studio_results.tex · Keep a calculation record
  • inductex:docs/manual/studio_workspace.tex · Native Support Bundle selection is distinct from project portability
  • inductex:docs/manual/ix_layoutinput.tex · Relative process/netlist references and complete inline geometry
  • inductex:docs/manual/ix_ldf.tex · UnitL and process units
  • validation:support-records-windows-20261104 · VAL-035 exact record/replay checks on two PowerShell hosts; VAL-034 native archive comparison
  • Seventeen recipe checks pass on each of PowerShell 7 and Windows PowerShell 5.1. This is a two-host matrix, not 34 distinct behaviours.
  • The record is deliberately limited to the complete supplied MQS project. It is not an arbitrary dependency collector, a signed result or proof of physical accuracy.
  • Native support archives contain different content/names and remain private; no direct CLI equivalent of the Support Bundle dialog is claimed.
Read MarkdownRead structured articleBrowse all guides