{"sections":[{"heading":"Keep a runnable hierarchy separate from a support selection","paragraphs":["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."]},{"heading":"Prepare the complete teaching case","steps":["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.","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.","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.","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."]},{"code":"$ErrorActionPreference = 'Stop'\n$ix = 'C:\\Program Files\\SUN Magnetics\\InductEx\\bin\\inductex.exe'\nfunction Get-RecordSha256([string]$Path) {\n    $algorithm = [Security.Cryptography.SHA256]::Create()\n    $stream = $null\n    try {\n        $stream = [IO.File]::OpenRead((Resolve-Path -LiteralPath $Path).Path)\n        [BitConverter]::ToString($algorithm.ComputeHash($stream)).Replace('-', '').ToLowerInvariant()\n    }\n    finally { if ($stream) { $stream.Dispose() }; $algorithm.Dispose() }\n}\n$inputs = @('strip.ixi', 'process.ldf', 'strip.cir')\n$numerical = @('output/elements.txt', 'output/gmres.txt', 'output/solver_out.txt', 'output/strip.msh')\nforeach ($name in $inputs) {\n    if (-not (Test-Path -LiteralPath $name -PathType Leaf)) { throw \"Missing teaching input: $name\" }\n}\nforeach ($name in @('output', 'record-001', 'calculation-001.zip')) {\n    if (Test-Path -LiteralPath $name) { throw \"Use a fresh teaching directory; preserve the existing $name\" }\n}\n& $ix .\\strip.ixi\nif ($LASTEXITCODE -ne 0) { throw 'Extraction failed; inspect the diagnostic before packaging.' }\nforeach ($name in $numerical) {\n    if (-not (Test-Path -LiteralPath $name -PathType Leaf)) { throw \"No current numerical artifact: $name\" }\n}\n$rows = [regex]::Matches((Get-Content -LiteralPath 'output/elements.txt' -Raw), '(?m)^L1\\s+([-+.\\dEe]+)\\s*$')\nif ($rows.Count -ne 1) { throw 'Expected one current L1 result.' }\n$reported = $rows[0].Groups[1].Value\n$value = [double]::Parse($reported, [Globalization.CultureInfo]::InvariantCulture)\nif ([double]::IsNaN($value) -or [double]::IsInfinity($value) -or $value -le 0) { throw 'No positive finite L1 result.' }\n$solverVersion = [regex]::Match((Get-Content -LiteralPath 'output/gmres.txt' -Raw), 'TTH v([0-9.]+)').Groups[1].Value\nif (-not $solverVersion) { throw 'Record the actual solver identity before packaging.' }\nNew-Item -ItemType Directory -Path 'record-001/output' | Out-Null\nforeach ($name in @($inputs) + @($numerical)) {\n    Copy-Item -LiteralPath $name -Destination (Join-Path 'record-001' $name)\n}\n$files = foreach ($name in @($inputs) + @($numerical)) {\n    [ordered]@{ path = $name; sha256 = Get-RecordSha256 (Join-Path 'record-001' $name) }\n}\n$record = [ordered]@{\n    schema = 'sunmagnetics-calculation-record/1'\n    scope = 'Complete supplied MQS teaching strip; UnitL=1 H. No physical calibration or convergence claim.'\n    executable_name = (Get-Item -LiteralPath $ix).Name\n    executable_sha256 = Get-RecordSha256 $ix\n    solver_version_from_current_gmres = $solverVersion\n    L1_reported = $reported\n    L1_H = $value\n    files = @($files)\n}\n$record | ConvertTo-Json -Depth 5 | Set-Content -LiteralPath 'record-001/calculation-record.json' -Encoding utf8\nCompress-Archive -LiteralPath 'record-001' -DestinationPath 'calculation-001.zip'\nWrite-Host 'Created calculation-001.zip with relative inputs, selected numerical outputs and a file-hash record.'","heading":"Create a portable calculation record","paragraphs":["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."]},{"code":"$ErrorActionPreference = 'Stop'\n$ix = 'C:\\Program Files\\SUN Magnetics\\InductEx\\bin\\inductex.exe'\nfunction Get-RecordSha256([string]$Path) {\n    $algorithm = [Security.Cryptography.SHA256]::Create()\n    $stream = $null\n    try {\n        $stream = [IO.File]::OpenRead((Resolve-Path -LiteralPath $Path).Path)\n        [BitConverter]::ToString($algorithm.ComputeHash($stream)).Replace('-', '').ToLowerInvariant()\n    }\n    finally { if ($stream) { $stream.Dispose() }; $algorithm.Dispose() }\n}\nforeach ($name in @('expanded-001', 'rerun-001')) {\n    if (Test-Path -LiteralPath $name) { throw \"Choose a fresh verification directory; preserve $name\" }\n}\nExpand-Archive -LiteralPath 'calculation-001.zip' -DestinationPath 'expanded-001'\n$root = Join-Path 'expanded-001' 'record-001'\n$record = Get-Content -LiteralPath (Join-Path $root 'calculation-record.json') -Raw | ConvertFrom-Json\nif ($record.schema -ne 'sunmagnetics-calculation-record/1') { throw 'Unexpected teaching record schema.' }\nif ((Get-RecordSha256 $ix) -ne $record.executable_sha256) { throw 'This check requires the recorded InductEx binary; review other versions separately.' }\n$expected = @('strip.ixi', 'process.ldf', 'strip.cir', 'output/elements.txt', 'output/gmres.txt', 'output/solver_out.txt', 'output/strip.msh')\nif (@(Compare-Object $expected @($record.files.path)).Count -ne 0) { throw 'The teaching record has an unexpected file list.' }\nforeach ($entry in $record.files) {\n    if ((Get-RecordSha256 (Join-Path $root $entry.path)) -ne $entry.sha256) { throw \"Record hash mismatch: $($entry.path)\" }\n}\nNew-Item -ItemType Directory -Path 'rerun-001' | Out-Null\nforeach ($name in @('strip.ixi', 'process.ldf', 'strip.cir')) {\n    Copy-Item -LiteralPath (Join-Path $root $name) -Destination (Join-Path 'rerun-001' $name)\n}\nPush-Location 'rerun-001'\ntry {\n    & $ix .\\strip.ixi\n    if ($LASTEXITCODE -ne 0) { throw 'Fresh extraction failed; do not accept the archived output as a rerun.' }\n    $rows = [regex]::Matches((Get-Content -LiteralPath 'output/elements.txt' -Raw), '(?m)^L1\\s+([-+.\\dEe]+)\\s*$')\n    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.' }\n    $solverVersion = [regex]::Match((Get-Content -LiteralPath 'output/gmres.txt' -Raw), 'TTH v([0-9.]+)').Groups[1].Value\n    if ($solverVersion -ne $record.solver_version_from_current_gmres) { throw 'The fresh solver version differs from the recorded one.' }\n}\nfinally { Pop-Location }\nforeach ($entry in $record.files) {\n    if ((Get-RecordSha256 (Join-Path $root $entry.path)) -ne $entry.sha256) { throw \"Archived record changed: $($entry.path)\" }\n}\nWrite-Host 'Verified record hashes and a separate fresh rerun. Archived numerical files were preserved.'","heading":"Verify the archive and rerun a fresh copy","paragraphs":["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."]},{"heading":"Inspect the record before sharing it","paragraphs":["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."],"table":{"columns":["Record path","Purpose"],"rows":[["record-001/strip.ixi, process.ldf, strip.cir","Original relative input names and teaching process/topology."],["record-001/output/elements.txt","Extracted branch value, under the supplied UnitL convention."],["record-001/output/gmres.txt, solver_out.txt, strip.msh","Selected numerical solver/mesh evidence, kept separate from the rerun."],["record-001/calculation-record.json","Expected file list/hashes, actual InductEx file identity, reported TTH version and result."]],"wrap":true}},{"heading":"Recover without overwriting the earlier record","paragraphs":["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."]},{"code":"* Parameterised inline equivalent of the maintained microstrip geometry\n$COMMAND\n  MeshFile \"strip.msh\"\n  MeshType CUBE\n  Mode MQS\n  Netlist \"strip.cir\"\n  Process \"process.ldf\"\n$END\n$VARIABLE\n  Name strip_length\n  Value 100\n$END\n$VARIABLE\n  Name strip_width\n  Value 10\n$END\n$STRUCT\n  Name inline_strip\n  $POLY\n    Layer M1\n    XY\n    (0,0)\n    (0,%strip_width)\n    (%strip_length,%strip_width)\n    (%strip_length,0)\n    (0,0)\n  $END\n  $PATH\n    Layer TERM\n    Width 1\n    XY\n    (0,%strip_width)\n    (0,0)\n  $END\n  $PATH\n    Layer TERM\n    Width 1\n    XY\n    (%strip_length,%strip_width)\n    (%strip_length,0)\n  $END\n  $TEXT\n    Text \"P1 M1 M0\"\n    Layer TEXT\n    XY\n    (0,%strip_width/2)\n  $END\n  $TEXT\n    Text \"P2 M1 M0\"\n    Layer TEXT\n    XY\n    (%strip_length,%strip_width/2)\n  $END\n$END\n","heading":"Complete strip.ixi"},{"code":"* Public microstrip teaching stack; dimensions use Units below\n$Parameters\n  Units = 1e-6\n  SegmentSize = 2.0\n  AbsMin = 0.025\n  GPOverhang = 5.0\n  ProcessHasGroundPlane = TRUE\n  GPLayer = 17\n  TermLayer = 19\n  TextLayer = 18\n  HFilaments = 1\n  TerminalInRange = 1.0\n  UnitL = 1\n$End\n$Layer\n  Number = 17\n  Name = M0\n  Thickness = 0.2\n  Lambda = 0.09\n  Order = 0\n  Mask = -1\n  Filmtype = S\n  HFilaments = 2\n$End\n$Layer\n  Number = 2\n  Name = I0\n  Thickness = 0.15\n  Order = 1\n  Mask = -1\n  Filmtype = I\n$End\n$Layer\n  Number = 5\n  Name = M1\n  Thickness = 0.25\n  Lambda = 0.09\n  Order = 2\n  Mask = 1\n  Filmtype = S\n  HFilaments = 3\n$End\n","heading":"Complete process.ldf"},{"code":"* Extraction topology, design inductance in henries because UnitL=1\nL1 1 2 3.9e-12\nP1 1 0\nP2 2 0\n.end\n","heading":"Complete strip.cir"}],"canonical_url":"https://www.sun-magnetics.com/knowledge-base/inductex-export-project","url":"/knowledge-base/inductex-export-project","known_issues":[],"search_record":{"execution":true,"relatedProducts":["TetraHenry"],"version_tags":["InductEx 8 preview"],"text":"Create and verify a portable InductEx calculation record Preserve relative input names and selected numerical files, verify their hashes, and rerun the complete teaching project in a separate directory. InductEx 8 beta/preview; Windows catalog 8.0.1 / TTH 1.1.50 How to portable calculation record export project relative paths calculation-record.json record-001 SHA256 rerun tampered archive PowerShell 5.1 PowerShell 7 reproduction package 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 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. 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. 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. 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'\n$ix = 'C:\\Program Files\\SUN Magnetics\\InductEx\\bin\\inductex.exe'\nfunction Get-RecordSha256([string]$Path) {\n    $algorithm = [Security.Cryptography.SHA256]::Create()\n    $stream = $null\n    try {\n        $stream = [IO.File]::OpenRead((Resolve-Path -LiteralPath $Path).Path)\n        [BitConverter]::ToString($algorithm.ComputeHash($stream)).Replace('-', '').ToLowerInvariant()\n    }\n    finally { if ($stream) { $stream.Dispose() }; $algorithm.Dispose() }\n}\n$inputs = @('strip.ixi', 'process.ldf', 'strip.cir')\n$numerical = @('output/elements.txt', 'output/gmres.txt', 'output/solver_out.txt', 'output/strip.msh')\nforeach ($name in $inputs) {\n    if (-not (Test-Path -LiteralPath $name -PathType Leaf)) { throw \"Missing teaching input: $name\" }\n}\nforeach ($name in @('output', 'record-001', 'calculation-001.zip')) {\n    if (Test-Path -LiteralPath $name) { throw \"Use a fresh teaching directory; preserve the existing $name\" }\n}\n& $ix .\\strip.ixi\nif ($LASTEXITCODE -ne 0) { throw 'Extraction failed; inspect the diagnostic before packaging.' }\nforeach ($name in $numerical) {\n    if (-not (Test-Path -LiteralPath $name -PathType Leaf)) { throw \"No current numerical artifact: $name\" }\n}\n$rows = [regex]::Matches((Get-Content -LiteralPath 'output/elements.txt' -Raw), '(?m)^L1\\s+([-+.\\dEe]+)\\s*$')\nif ($rows.Count -ne 1) { throw 'Expected one current L1 result.' }\n$reported = $rows[0].Groups[1].Value\n$value = [double]::Parse($reported, [Globalization.CultureInfo]::InvariantCulture)\nif ([double]::IsNaN($value) -or [double]::IsInfinity($value) -or $value -le 0) { throw 'No positive finite L1 result.' }\n$solverVersion = [regex]::Match((Get-Content -LiteralPath 'output/gmres.txt' -Raw), 'TTH v([0-9.]+)').Groups[1].Value\nif (-not $solverVersion) { throw 'Record the actual solver identity before packaging.' }\nNew-Item -ItemType Directory -Path 'record-001/output' | Out-Null\nforeach ($name in @($inputs) + @($numerical)) {\n    Copy-Item -LiteralPath $name -Destination (Join-Path 'record-001' $name)\n}\n$files = foreach ($name in @($inputs) + @($numerical)) {\n    [ordered]@{ path = $name; sha256 = Get-RecordSha256 (Join-Path 'record-001' $name) }\n}\n$record = [ordered]@{\n    schema = 'sunmagnetics-calculation-record/1'\n    scope = 'Complete supplied MQS teaching strip; UnitL=1 H. No physical calibration or convergence claim.'\n    executable_name = (Get-Item -LiteralPath $ix).Name\n    executable_sha256 = Get-RecordSha256 $ix\n    solver_version_from_current_gmres = $solverVersion\n    L1_reported = $reported\n    L1_H = $value\n    files = @($files)\n}\n$record | ConvertTo-Json -Depth 5 | Set-Content -LiteralPath 'record-001/calculation-record.json' -Encoding utf8\nCompress-Archive -LiteralPath 'record-001' -DestinationPath 'calculation-001.zip'\nWrite-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'\n$ix = 'C:\\Program Files\\SUN Magnetics\\InductEx\\bin\\inductex.exe'\nfunction Get-RecordSha256([string]$Path) {\n    $algorithm = [Security.Cryptography.SHA256]::Create()\n    $stream = $null\n    try {\n        $stream = [IO.File]::OpenRead((Resolve-Path -LiteralPath $Path).Path)\n        [BitConverter]::ToString($algorithm.ComputeHash($stream)).Replace('-', '').ToLowerInvariant()\n    }\n    finally { if ($stream) { $stream.Dispose() }; $algorithm.Dispose() }\n}\nforeach ($name in @('expanded-001', 'rerun-001')) {\n    if (Test-Path -LiteralPath $name) { throw \"Choose a fresh verification directory; preserve $name\" }\n}\nExpand-Archive -LiteralPath 'calculation-001.zip' -DestinationPath 'expanded-001'\n$root = Join-Path 'expanded-001' 'record-001'\n$record = Get-Content -LiteralPath (Join-Path $root 'calculation-record.json') -Raw | ConvertFrom-Json\nif ($record.schema -ne 'sunmagnetics-calculation-record/1') { throw 'Unexpected teaching record schema.' }\nif ((Get-RecordSha256 $ix) -ne $record.executable_sha256) { throw 'This check requires the recorded InductEx binary; review other versions separately.' }\n$expected = @('strip.ixi', 'process.ldf', 'strip.cir', 'output/elements.txt', 'output/gmres.txt', 'output/solver_out.txt', 'output/strip.msh')\nif (@(Compare-Object $expected @($record.files.path)).Count -ne 0) { throw 'The teaching record has an unexpected file list.' }\nforeach ($entry in $record.files) {\n    if ((Get-RecordSha256 (Join-Path $root $entry.path)) -ne $entry.sha256) { throw \"Record hash mismatch: $($entry.path)\" }\n}\nNew-Item -ItemType Directory -Path 'rerun-001' | Out-Null\nforeach ($name in @('strip.ixi', 'process.ldf', 'strip.cir')) {\n    Copy-Item -LiteralPath (Join-Path $root $name) -Destination (Join-Path 'rerun-001' $name)\n}\nPush-Location 'rerun-001'\ntry {\n    & $ix .\\strip.ixi\n    if ($LASTEXITCODE -ne 0) { throw 'Fresh extraction failed; do not accept the archived output as a rerun.' }\n    $rows = [regex]::Matches((Get-Content -LiteralPath 'output/elements.txt' -Raw), '(?m)^L1\\s+([-+.\\dEe]+)\\s*$')\n    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.' }\n    $solverVersion = [regex]::Match((Get-Content -LiteralPath 'output/gmres.txt' -Raw), 'TTH v([0-9.]+)').Groups[1].Value\n    if ($solverVersion -ne $record.solver_version_from_current_gmres) { throw 'The fresh solver version differs from the recorded one.' }\n}\nfinally { Pop-Location }\nforeach ($entry in $record.files) {\n    if ((Get-RecordSha256 (Join-Path $root $entry.path)) -ne $entry.sha256) { throw \"Archived record changed: $($entry.path)\" }\n}\nWrite-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 path Purpose record-001/strip.ixi, process.ldf, strip.cir Original relative input names and teaching process/topology. record-001/output/elements.txt Extracted branch value, under the supplied UnitL convention. record-001/output/gmres.txt, solver_out.txt, strip.msh Selected numerical solver/mesh evidence, kept separate from the rerun. record-001/calculation-record.json Expected 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\n$COMMAND\n  MeshFile \"strip.msh\"\n  MeshType CUBE\n  Mode MQS\n  Netlist \"strip.cir\"\n  Process \"process.ldf\"\n$END\n$VARIABLE\n  Name strip_length\n  Value 100\n$END\n$VARIABLE\n  Name strip_width\n  Value 10\n$END\n$STRUCT\n  Name inline_strip\n  $POLY\n    Layer M1\n    XY\n    (0,0)\n    (0,%strip_width)\n    (%strip_length,%strip_width)\n    (%strip_length,0)\n    (0,0)\n  $END\n  $PATH\n    Layer TERM\n    Width 1\n    XY\n    (0,%strip_width)\n    (0,0)\n  $END\n  $PATH\n    Layer TERM\n    Width 1\n    XY\n    (%strip_length,%strip_width)\n    (%strip_length,0)\n  $END\n  $TEXT\n    Text \"P1 M1 M0\"\n    Layer TEXT\n    XY\n    (0,%strip_width/2)\n  $END\n  $TEXT\n    Text \"P2 M1 M0\"\n    Layer TEXT\n    XY\n    (%strip_length,%strip_width/2)\n  $END\n$END\n Complete process.ldf * Public microstrip teaching stack; dimensions use Units below\n$Parameters\n  Units = 1e-6\n  SegmentSize = 2.0\n  AbsMin = 0.025\n  GPOverhang = 5.0\n  ProcessHasGroundPlane = TRUE\n  GPLayer = 17\n  TermLayer = 19\n  TextLayer = 18\n  HFilaments = 1\n  TerminalInRange = 1.0\n  UnitL = 1\n$End\n$Layer\n  Number = 17\n  Name = M0\n  Thickness = 0.2\n  Lambda = 0.09\n  Order = 0\n  Mask = -1\n  Filmtype = S\n  HFilaments = 2\n$End\n$Layer\n  Number = 2\n  Name = I0\n  Thickness = 0.15\n  Order = 1\n  Mask = -1\n  Filmtype = I\n$End\n$Layer\n  Number = 5\n  Name = M1\n  Thickness = 0.25\n  Lambda = 0.09\n  Order = 2\n  Mask = 1\n  Filmtype = S\n  HFilaments = 3\n$End\n Complete strip.cir * Extraction topology, design inductance in henries because UnitL=1\nL1 1 2 3.9e-12\nP1 1 0\nP2 2 0\n.end\n","id":"inductex-export-project","keywords":"portable calculation record export project relative paths calculation-record.json record-001 SHA256 rerun tampered archive PowerShell 5.1 PowerShell 7 reproduction package","kind":"How to","title":"Create and verify a portable InductEx calculation record","product":"InductEx"},"version":"8 beta/preview; Windows catalog 8.0.1 / TTH 1.1.50","id":"inductex-export-project","related":["/knowledge-base/inductex-support-bundle","/knowledge-base/support-effective-report","/knowledge-base/inductex-ixi-geometry","/knowledge-base/inductex-read-results"],"downloads":[{"url":"/_functions/kbExample?name=inductex-calculation-record.zip","scope":"Exact checked input files plus instructions; final-release/platform applicability remains pending.","files":["strip.ixi","process.ldf","strip.cir","README.txt"],"id":"inductex-calculation-record","requires":["Complete writable teaching folder and existing compatible licensed InductEx/TTH runtime","Studio for the native support-bundle route; PowerShell 5.1 or 7 for the separate portable-record route","New result, archive and replay directories; review all content before sharing"],"title":"Complete MQS calculation-record teaching inputs"}],"publication_status":"published","numerical_output":null,"provenance":{"execution_checks":[{"routes":["powershell-cli"],"scope":"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","result":"passed","articles":["inductex-export-project","inductex-support-bundle"],"purpose":"portable-calculation-record-hashes-and-fresh-rerun","version":"Windows catalog InductEx 8.0.1 / TTH 1.1.50; PowerShell 7 and built-in Windows PowerShell 5.1.19041.7802","id":"VAL-035","records":["17 recipe checks pass on each of the two PowerShell hosts","both exact recipe blocks use the same checked command hashes","missing, existing and tampered input generations fail before accepting a record","Nine actual browser-download checks pass with both exact article/README recipe blocks in a fresh space-containing folder"],"limit":"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.","observed":{"archive_members":["record-001/calculation-record.json","record-001/output/elements.txt","record-001/output/gmres.txt","record-001/output/solver_out.txt","record-001/output/strip.msh","record-001/process.ldf","record-001/strip.cir","record-001/strip.ixi"],"solver_version":"1.1.50","same_binary_exact_reported_value_reproduces":true,"recorded_file_count":7,"L1_H":3.896479063e-12}}],"figure_evidence":[],"review_notes":["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."],"scope":"Recorded inputs/builds only. Complete walkthrough and final-package acceptance remain separate.","verification_requirements":{"gui_method":"not-required-for-this-answer","status":"review-incomplete","illustrations":"not-required-for-this-answer","required":["technical-review","release-applicability","execution","recovery","numerical-interpretation"],"legacy_walkthrough_field":"pending retained; not complete release or article acceptance"},"sources":[{"id":"inductex:docs/manual/studio_results.tex","section":"Keep a calculation record"},{"id":"inductex:docs/manual/studio_workspace.tex","section":"Native Support Bundle selection is distinct from project portability"},{"id":"inductex:docs/manual/ix_layoutinput.tex","section":"Relative process/netlist references and complete inline geometry"},{"id":"inductex:docs/manual/ix_ldf.tex","section":"UnitL and process units"},{"id":"validation:support-records-windows-20261104","section":"VAL-035 exact record/replay checks on two PowerShell hosts; VAL-034 native archive comparison"}]},"title":"Create and verify a portable InductEx® calculation record","type":"How to","markdown_url":"/_functions/kbResource?path=markdown%2Finductex-export-project.md","summary":"Preserve relative input names and selected numerical files, verify their hashes, and rerun the complete teaching project in a separate directory.","product":"InductEx"}