{"sections":[{"heading":"Generate the mesh before importing it","paragraphs":["Generate an ASCII, first-order MSH 2.2 volume mesh in Gmsh, give the conductor a named Physical Volume and each port end a named Physical Surface, then reference that MSH from the saved IXI. Use a nested $PHYSICAL assignment to connect the volume name to an explicit $MATERIAL. The checked Windows 8.0.1 route uses $IMPORTMESH; the manual’s shorter $IMPORT spelling currently fails in this runtime.","The complete download supplies bar.geo, bar.ixi, bar.cir, process.ldf and run_import.py. It describes a uniform 100 × 10 × 10 µm conductor with conductivity 5 × 10⁷ S/m, no London penetration depth and relative permeability one. It is a teaching model with a simple resistance reference, not calibrated package technology.","Use Gmsh separately to evaluate the supplied OpenCASCADE GEO and create bar.msh. This workflow imports that mesh into InductEx; direct GEO parsing, arbitrary CAD healing and automatic material/terminal assignment are not established by these checks. A normal compatible issued InductEx licence is required."]},{"code":"$ErrorActionPreference = 'Stop'\n$python = 'python'\n$gmsh = 'C:\\InductEx\\bin\\gmsh.exe'\n$inductex = 'C:\\Program Files\\SUN Magnetics\\InductEx\\bin\\inductex.exe'\n$licence = 'C:\\Program Files\\SUN Magnetics\\Licenses\\sm_license.txt'\n& $python .\\run_import.py --gmsh $gmsh --inductex $inductex --licence $licence --results .\\bar-results-001\nif ($LASTEXITCODE -ne 0) { throw 'The bar check failed. Review its current private log and receipt.' }\n& $python .\\run_import.py --gmsh $gmsh --inductex $inductex --licence $licence --results .\\bar-results-002 --mesh-factor 0.5\nif ($LASTEXITCODE -ne 0) { throw 'The refined bar check failed. Review its current private log and receipt.' }","heading":"Generate and extract the complete bar from PowerShell","language":"powershell","paragraphs":["Extract all five inputs into a new writable folder. Select your actual Python, Gmsh and InductEx executables and issued licence path in this complete PowerShell command, then run it from that folder. Both result names must be unused. The client references the existing licence through an isolated configuration; it never copies licence contents.","Each run copies the four model inputs, executes Gmsh with -3 -format msh2, checks the supplied physical/coordinate contract, runs InductEx and compares the current positive R1 with the stated bar reference. Raw output and settings can contain local paths or licence metadata; keep them private until reviewed. The public client is specific to this supplied bar."]},{"figures":[{"asset_id":"studio-imported-bar-groups","caption":"Actual Open preview and Groups view for the supplied source mesh: one volume with 434 tetrahedra and two terminal surfaces with 14 triangles each. This visual check is separate from the extraction verdict."}],"heading":"Inspect and run the project in Studio","paragraphs":["The native scenario checks the production controls, default licensed Core runner, current results and correction. File selections enter at the production dialog boundary; physical picker operation, all editing branches, restart and final distributed-package qualification remain pending. The clipped settings image and earlier private-path provenance image are withheld."],"steps":["After successful mesh generation, open bar.ixi in the first result directory. Keep bar.msh, bar.cir and process.ldf beside it. The process file is still loaded by this import-only route; its layout layers are unused here, but its global settings remain relevant.","On Basic > Review, expand Advanced setup and choose Layout/imports. Expand Imported geometry and physical assignments and select bar.msh. Review Name, Unit, Scale, Rotate and Translate. Terminal rows are read-only in Basic; edit those pairs deliberately in Raw IXI. Nested $PHYSICAL Name and Material must match the intended mesh volume and explicit material record.","In Raw IXI, use the mesh-import banner’s Open preview action. On the mesh document’s Groups tab, check metal, left and right, including their dimensions and element counts. Preview applies numeric Unit/Scale/Rotate/Translate; it does not establish material validity, port connection or a completed solve.","Return to the saved IXI, choose Check and run and Run extraction, then read current Results and Raw output. The checked baseline completes with R1 = 0.02 Ω. Changing Scale to 2 through its visible Apply control, saving and rerunning gives 0.01 Ω; restoring Scale 1 recovers 0.02 Ω.","For the missing-input recovery exercise, change the import Name to absent.msh, save and run. The native task reports Failed with an external-mesh loading error. Restore bar.msh, save and run again; the checked current result returns to Completed and 0.02 Ω. Preserve any result generation you need before rerunning."]},{"heading":"Keep units, transforms and physical assignments explicit","paragraphs":["A checked 90° Z rotation followed by translation (0.001, 0.002, 0.003) places the bar at x = 0.00099–0.001 m, y = 0.002–0.0021 m, z = 0.003–0.00301 m and preserves its resistance. Scaling by two changes the physical model, while a rigid transform preserves this isolated uniform-bar reference.","Do not repair a unit mistake by changing only a plot label. The disposable Unit 1e-3 variant creates a bar a thousand times larger and produces a zero fitted resistance with about 99.7% fit error despite exit zero. That run is rejected. Changing dimensions at fixed frequency also changes the electromagnetic regime; inverse-size resistance is not a general AC scaling rule."],"table":{"columns":["Input","Meaning and checked value"],"rows":[["Unit 1e-6","Metres per mesh-coordinate unit. Raw bounds 0–100, 0–10, 0–10 become 100 × 10 × 10 µm. Exported combined-mesh coordinates in this run are metres."],["Scale 1; Rotate; Translate","Coordinates are multiplied by Unit and Scale, rotated about the origin in XYZ degrees, then translated in metres. The triple follows Rotate or Translate on its next line."],["Terminal \"P1+\" \"left\" / \"P1-\" \"right\"","The port name and polarity connect the netlist port to named physical surfaces. Both ends must exist; a visually plausible body alone does not establish a port."],["$PHYSICAL Name \"metal\"; Material \"metal_material\"","Map the mesh volume name to the intended explicit $MATERIAL. Material names in the Basic controls are raw text and are not validated against the material records."],["Sigma / Lambda / MuR","Conductivity is S/m, London penetration depth is metres and relative permeability is dimensionless. This normal-metal example uses 5e7, 0 and 1 respectively."]],"wrap":true}},{"heading":"Check the reference and the actual refinement","paragraphs":["For a uniform low-frequency bar, R = length / (conductivity × cross-sectional area) = 0.02 Ω. The checked baseline has 190 nodes and 434 tetrahedra and gives 0.0200000 Ω. A separate mesh-factor 0.5 run has 1,073 nodes and 3,586 tetrahedra and gives 0.0200132 Ω, approximately 0.066% above that reference and above the baseline.","The client uses a declared 1% reference comparison for this simple teaching bar. These two meshes and their observed difference are a bounded refinement check; they do not establish a universal convergence tolerance or package accuracy. For a real structure, refine the relevant current-carrying geometry, inspect solver and model-fit errors, compare the quantities of interest and retain an appropriate independent reference.","The example uses 1 kHz. A preliminary zero-frequency attempt was rejected because this InductEx route enabled AC analysis. The independent R formula supplies a low-frequency reference; the example does not claim to qualify a general DC import route. Its lack of an extracted inductance is intentional: bar.cir asks for R1."]},{"heading":"Recognise the checked format and mapping limits","paragraphs":["For this exercised legacy import path, retain ASCII MSH 2.2, first-order triangles and tetrahedra, globally distinct contiguous physical tags in declaration order, sequential node IDs in file order and the checked two-tag element layout. The supplied GEO generates those conditions. Do not assume that a mesh which opens in a viewer is accepted by Core.","Disposable MSH 4.1 and quadratic-tetrahedron files fail at the solver with Physical contains no elements. Valid meshes rewritten with sparse physical tags or nonsequential node IDs also fail in this runtime. Re-export a compatible mesh from the geometry source and inspect the actual header, groups and connectivity. Editing only the header or stripping element nodes is not a conversion."],"table":{"columns":["Observed failure","Recovery and unresolved finding"],"rows":[["Record or command $import not recognised","KB-IMPORT-001: the manual/editor catalog and exercised Core reader disagree. The supplied checked 8.0.1 IXI uses $IMPORTMESH and preserves that spelling during native Scale Apply. Reconcile the supported contract before broader release claims."],["External object metal has no material assigned. Default to first defined material.","KB-IMPORT-002: an unknown mapped material returns exit zero and R1 = 0 with 100% fit error in the disposable test. Reject that result, correct the exact material mapping and rerun. A warning or fallback is not an approved material choice."],["No negative terminal found, or an unknown material from an unmatched volume","KB-IMPORT-003: missing terminal or volume-name mappings produce errors followed by an abnormal Windows process exit in the checked cases. Correct the exact mesh/port/volume names from the intact files; retain the actual diagnostic. Product crash handling remains open."],["Error while loading external mesh","Check the exact saved Name, working copy and file existence. Restore the complete generated MSH beside this IXI and rerun; CLI and native correction recover the reference result."]],"wrap":true}},{"code":"// Public teaching bar. Coordinate numbers represent micrometres.\nSetFactory(\"OpenCASCADE\");\nBox(1) = {0, 0, 0, 100, 10, 10};\nepsilon = 1e-6;\nleft() = Surface In BoundingBox {-epsilon, -epsilon, -epsilon,\n                                 epsilon, 10+epsilon, 10+epsilon};\nright() = Surface In BoundingBox {100-epsilon, -epsilon, -epsilon,\n                                  100+epsilon, 10+epsilon, 10+epsilon};\n// Distinct physical tags are intentional across both dimensions.\nPhysical Surface(\"left\", 1) = {left()};\nPhysical Surface(\"right\", 2) = {right()};\nPhysical Volume(\"metal\", 3) = {1};\nMesh.MeshSizeMin = 4;\nMesh.MeshSizeMax = 5;\nMesh.ElementOrder = 1;\nMesh.MshFileVersion = 2.2;\nMesh.Binary = 0;\nMesh.SaveAll = 0;","heading":"Save bar.geo","language":"text"},{"code":"* Public external tetrahedral mesh teaching example\n$COMMAND\n  MeshFile \"imported-bar.msh\"\n  MeshType TETRA\n  Mode MQS\n  Frequency 1e3\n  Process \"process.ldf\"\n  Netlist \"bar.cir\"\n$END\n$MATERIAL\n  Name \"metal_material\"\n  Sigma 5e7\n  Lambda 0\n  MuR 1\n$END\n$IMPORTMESH\n  Name \"bar.msh\"\n  Unit 1e-6\n  Scale 1\n  Rotate\n  (0, 0, 0)\n  Translate\n  (0, 0, 0)\n  Terminal \"P1+\" \"left\"\n  Terminal \"P1-\" \"right\"\n  $PHYSICAL\n    Name \"metal\"\n    Material \"metal_material\"\n  $END\n$END","heading":"Save bar.ixi","language":"text"},{"code":"* One port across a uniform resistive bar; R = L/(sigma * area)\nP1 1 0\nR1 1 0 0.02","heading":"Save bar.cir","language":"text"},{"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","heading":"Save process.ldf","language":"text"},{"code":"\"\"\"Run the complete public Gmsh bar teaching example in a new result directory.\n\nThis client is deliberately specific to the supplied bar. It is not a general\nmesh validator or a way to assign unknown materials/terminals automatically.\nRaw solver logs and settings may contain private local information.\n\"\"\"\nimport argparse\nimport hashlib\nimport json\nimport math\nimport os\nfrom pathlib import Path\nimport re\nimport shutil\nimport subprocess\nimport sys\n\nINPUTS = ('bar.geo', 'bar.ixi', 'bar.cir', 'process.ldf')\n\n\ndef sha(path):\n    return hashlib.sha256(path.read_bytes()).hexdigest()\n\n\ndef read_msh2(path):\n    lines = path.read_text(encoding='ascii').splitlines()\n    def section(name):\n        start = lines.index('$' + name) + 1\n        end = lines.index('$End' + name, start)\n        return lines[start:end]\n    if section('MeshFormat') != ['2.2 0 8']:\n        raise ValueError('This checked reader requires ASCII MSH 2.2 (2.2 0 8).')\n    groups = section('PhysicalNames')\n    if int(groups[0]) != len(groups)-1:\n        raise ValueError('Physical-name count does not match the complete file.')\n    physicals = {}\n    for row in groups[1:]:\n        match = re.fullmatch(r'(\\d+)\\s+(\\d+)\\s+\"([^\"]+)\"', row)\n        if not match:\n            raise ValueError('Unsupported physical-name record.')\n        dimension, tag = int(match[1]), int(match[2])\n        if tag in physicals:\n            raise ValueError('Use distinct physical tags across dimensions for this checked import path.')\n        physicals[tag] = {'dimension': dimension, 'name': match[3]}\n    rows = section('Nodes')\n    if int(rows[0]) != len(rows)-1:\n        raise ValueError('Node count does not match the complete file.')\n    nodes = []\n    for index, row in enumerate(rows[1:], 1):\n        values = row.split()\n        if len(values) != 4 or int(values[0]) != index:\n            raise ValueError('This import path requires sequential node IDs in physical row order.')\n        point = tuple(float(v) for v in values[1:])\n        if not all(math.isfinite(v) for v in point):\n            raise ValueError('Nonfinite mesh coordinate.')\n        nodes.append(point)\n    rows = section('Elements')\n    if int(rows[0]) != len(rows)-1:\n        raise ValueError('Element count does not match the complete file.')\n    elements = []\n    for row in rows[1:]:\n        values = [int(v) for v in row.split()]\n        kind, tags = values[1:3]\n        if kind not in (1, 2, 4) or tags != 2:\n            raise ValueError('Use first-order lines/triangles/tetrahedra and the checked two-tag MSH layout.')\n        node_ids = values[5:]\n        if len(node_ids) != {1:2, 2:3, 4:4}[kind] or not all(1 <= n <= len(nodes) for n in node_ids):\n            raise ValueError('Invalid element-node reference.')\n        if values[3] not in physicals:\n            raise ValueError('Element references an undeclared physical group.')\n        elements.append({'kind':kind,'physical':values[3],'nodes':node_ids})\n    return {'physicals':physicals,'nodes':nodes,'elements':elements}\n\n\ndef bounds(mesh):\n    return [[min(p[i] for p in mesh['nodes']), max(p[i] for p in mesh['nodes'])] for i in range(3)]\n\n\ndef main():\n    parser = argparse.ArgumentParser(description=__doc__)\n    parser.add_argument('--gmsh', type=Path, required=True)\n    parser.add_argument('--inductex', type=Path, required=True)\n    parser.add_argument('--licence', type=Path, required=True)\n    parser.add_argument('--results', type=Path, required=True)\n    parser.add_argument('--mesh-factor', type=float, default=1.0)\n    args = parser.parse_args()\n    source = Path(__file__).resolve().parent\n    work = args.results.absolute()\n    try:\n        gmsh, inductex, licence = [p.resolve(strict=True) for p in (args.gmsh, args.inductex, args.licence)]\n        if not all(p.is_file() for p in (gmsh, inductex, licence)):\n            raise ValueError('Select existing Gmsh, InductEx and issued-licence files.')\n        if work.exists() or not work.parent.is_dir():\n            raise ValueError('Select a new result directory under an existing writable parent.')\n        if not math.isfinite(args.mesh_factor) or not .25 <= args.mesh_factor <= 2:\n            raise ValueError('Use a mesh factor from 0.25 to 2 for this teaching study.')\n        originals = {n:sha(source/n) for n in INPUTS}\n        work.mkdir()\n        for n in INPUTS:\n            shutil.copyfile(source/n, work/n)\n        home = work/'private-home/.sunmagnetics'\n        home.mkdir(parents=True)\n        (home/'ixcfg.ini').write_text('[General]\\nLicenseFileName='+licence.as_posix()+'\\n',encoding='utf-8')\n        env = os.environ.copy()\n        env['USERPROFILE'] = str(home.parent)\n        env['PATH'] = str(inductex.parent)+';'+str(gmsh.parent)+';'+env.get('PATH','')\n        flags = {'creationflags':subprocess.CREATE_NO_WINDOW} if os.name=='nt' else {}\n        receipt = {'status':'running','inputs':originals,'mesh_factor':args.mesh_factor,\n                   'scope':'Supplied uniform public bar at 1 kHz; independent low-frequency resistance reference, not general convergence or physical calibration.'}\n        def save():\n            (work/'receipt.json').write_text(json.dumps(receipt,indent=2)+'\\n',encoding='utf-8')\n        save()\n        command = [str(gmsh),'bar.geo','-3','-format','msh2','-clscale',str(args.mesh_factor),'-o','bar.msh','-v','2']\n        generated = subprocess.run(command,cwd=work,env=env,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,timeout=90,**flags)\n        (work/'gmsh-private.log').write_bytes(generated.stdout)\n        receipt['gmsh_exit_code'] = generated.returncode\n        if generated.returncode != 0:\n            raise RuntimeError('Gmsh failed; retain its private log.')\n        mesh = read_msh2(work/'bar.msh')\n        expected = {1:{'dimension':2,'name':'left'},2:{'dimension':2,'name':'right'},3:{'dimension':3,'name':'metal'}}\n        if mesh['physicals'] != expected or bounds(mesh) != [[0,100],[0,10],[0,10]]:\n            raise ValueError('Generated mesh does not match the supplied bar/terminal physical contract.')\n        if not any(e['kind']==4 and e['physical']==3 for e in mesh['elements']):\n            raise ValueError('The imported body has no tetrahedral volume elements.')\n        receipt['raw_mesh'] = {'sha256':sha(work/'bar.msh'),'nodes':len(mesh['nodes']),\n                               'triangles':sum(e['kind']==2 for e in mesh['elements']),\n                               'tetrahedra':sum(e['kind']==4 for e in mesh['elements']),'bounds_in_mesh_units':bounds(mesh)}\n        run = subprocess.run([str(inductex),'bar.ixi'],cwd=work,env=env,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,timeout=150,**flags)\n        (work/'inductex-private.log').write_bytes(run.stdout)\n        receipt['inductex_exit_code'] = run.returncode\n        text = run.stdout.decode('utf-8',errors='replace')\n        if run.returncode != 0 or re.search(r'(?im)^\\s*(ToolEngine error|Unexpected exception|Warnings?\\b)|CONVERGENCE FAILED|Not successful',text):\n            raise RuntimeError('Extraction failed or requires warning review; retain the current private log.')\n        match = re.fullmatch(r'R1\\s+([-+0-9.eE]+)\\s*',(work/'output/elements.txt').read_text(encoding='ascii'))\n        if not match:\n            raise ValueError('No current single R1 result was found.')\n        resistance = float(match[1])\n        reference = 100e-6 / (5e7 * 10e-6 * 10e-6)\n        difference = abs(resistance/reference-1)\n        if not math.isfinite(resistance) or resistance <= 0 or difference > .01:\n            raise ValueError('The teaching bar failed its stated 1% low-frequency reference comparison.')\n        settings = json.loads((work/'output/settings_imported-bar.json').read_text(encoding='utf-8'))\n        if settings['MATERIALS']['metal_material']['SIGMA'] != 5e7:\n            raise ValueError('Current solver settings do not retain the requested conductivity.')\n        if not all(sha(source/n)==h==sha(work/n) for n,h in originals.items()):\n            raise ValueError('A source input changed during the run.')\n        receipt.update(status='passed',resistance_ohm=resistance,reference_ohm=reference,relative_reference_difference=difference,\n                       gmsh_sha256=sha(gmsh),inductex_sha256=sha(inductex),inputs_preserved=True)\n        save()\n        print(json.dumps({'status':'passed','R1_ohm':resistance,'reference_ohm':reference,\n                          'tetrahedra':receipt['raw_mesh']['tetrahedra']}))\n        return 0\n    except (OSError,ValueError,RuntimeError,subprocess.TimeoutExpired) as error:\n        if 'receipt' in locals():\n            receipt.update(status='failed',reason=str(error));save()\n        print(str(error),file=sys.stderr)\n        return 2\n\n\nif __name__=='__main__':\n    raise SystemExit(main())","heading":"Save run_import.py","language":"python"},{"heading":"Extend the model deliberately","paragraphs":["For your structure, start from its complete geometry, intended materials, terminal surfaces, coordinate system and frequency regime. Record the Gmsh and InductEx/TetraHenry versions, mesh density, port mapping, raw numerical units and acceptance checks with each result. The supplied bar client should not be relabelled as a general validator for a different design.","Package dies, substrate-to-package connections, wedge or ball-and-stitch wires, bump bonds and coupled extraction need their own complete examples and continuity/refinement checks. This imported bar provides a checked foundation; those package workflows remain a separate coverage gap. Capacitance numerical acceptance remains held under the existing EQS finding."]}],"canonical_url":"https://www.sun-magnetics.com/knowledge-base/inductex-gmsh-import","url":"/knowledge-base/inductex-gmsh-import","known_issues":[{"disposition":"supported_path","id":"KB-IMPORT-001","title":"documented import spelling is rejected by Core","public_notice":"Use the complete checked $IMPORTMESH input on the reviewed runtime and confirm spelling for other releases. Editor acceptance of $IMPORT does not establish runtime support.","claim_scope":"Only the affected claim and recorded build/input; not whole-guide or final-release acceptance"},{"disposition":"verified_workaround","id":"KB-IMPORT-002","title":"unknown imported material falls back with successful exit","public_notice":"Correct the actual physical-volume/material names and rerun. Reject fallback-to-first-material warnings and the failed reference; successful process status is insufficient.","claim_scope":"Only the affected claim and recorded build/input; not whole-guide or final-release acceptance"},{"disposition":"verified_workaround","id":"KB-IMPORT-003","title":"missing physical mappings can end with an abnormal exit","public_notice":"Preserve the failed generation, restore the intact mesh and correct volume, terminal and material mappings. Require a fresh successful solve and numerical checks; the crash branches are not accepted results.","claim_scope":"Only the affected claim and recorded build/input; not whole-guide or final-release acceptance"}],"search_record":{"execution":true,"relatedProducts":[],"version_tags":["InductEx 8.0.1 Windows","Studio current source"],"text":"Import an external Gmsh structure and check its result Generate a complete first-order bar mesh, assign its material and port surfaces, inspect it in Studio and verify units, transforms, refinement and current failure recovery. InductEx 8.0.1 Windows / current-source Studio review How to Gmsh external mesh MSH 2.2 IMPORTMESH IMPORT Physical Volume Physical Surface Unit Scale Rotate Translate port mapping material assignment KB-IMPORT-001 KB-IMPORT-002 KB-IMPORT-003 Generate the mesh before importing it Generate an ASCII, first-order MSH 2.2 volume mesh in Gmsh, give the conductor a named Physical Volume and each port end a named Physical Surface, then reference that MSH from the saved IXI. Use a nested $PHYSICAL assignment to connect the volume name to an explicit $MATERIAL. The checked Windows 8.0.1 route uses $IMPORTMESH; the manual’s shorter $IMPORT spelling currently fails in this runtime. The complete download supplies bar.geo, bar.ixi, bar.cir, process.ldf and run_import.py. It describes a uniform 100 × 10 × 10 µm conductor with conductivity 5 × 10⁷ S/m, no London penetration depth and relative permeability one. It is a teaching model with a simple resistance reference, not calibrated package technology. Use Gmsh separately to evaluate the supplied OpenCASCADE GEO and create bar.msh. This workflow imports that mesh into InductEx; direct GEO parsing, arbitrary CAD healing and automatic material/terminal assignment are not established by these checks. A normal compatible issued InductEx licence is required.  Generate and extract the complete bar from PowerShell Extract all five inputs into a new writable folder. Select your actual Python, Gmsh and InductEx executables and issued licence path in this complete PowerShell command, then run it from that folder. Both result names must be unused. The client references the existing licence through an isolated configuration; it never copies licence contents. Each run copies the four model inputs, executes Gmsh with -3 -format msh2, checks the supplied physical/coordinate contract, runs InductEx and compares the current positive R1 with the stated bar reference. Raw output and settings can contain local paths or licence metadata; keep them private until reviewed. The public client is specific to this supplied bar. $ErrorActionPreference = 'Stop'\n$python = 'python'\n$gmsh = 'C:\\InductEx\\bin\\gmsh.exe'\n$inductex = 'C:\\Program Files\\SUN Magnetics\\InductEx\\bin\\inductex.exe'\n$licence = 'C:\\Program Files\\SUN Magnetics\\Licenses\\sm_license.txt'\n& $python .\\run_import.py --gmsh $gmsh --inductex $inductex --licence $licence --results .\\bar-results-001\nif ($LASTEXITCODE -ne 0) { throw 'The bar check failed. Review its current private log and receipt.' }\n& $python .\\run_import.py --gmsh $gmsh --inductex $inductex --licence $licence --results .\\bar-results-002 --mesh-factor 0.5\nif ($LASTEXITCODE -ne 0) { throw 'The refined bar check failed. Review its current private log and receipt.' } Inspect and run the project in Studio The native scenario checks the production controls, default licensed Core runner, current results and correction. File selections enter at the production dialog boundary; physical picker operation, all editing branches, restart and final distributed-package qualification remain pending. The clipped settings image and earlier private-path provenance image are withheld. After successful mesh generation, open bar.ixi in the first result directory. Keep bar.msh, bar.cir and process.ldf beside it. The process file is still loaded by this import-only route; its layout layers are unused here, but its global settings remain relevant. On Basic > Review, expand Advanced setup and choose Layout/imports. Expand Imported geometry and physical assignments and select bar.msh. Review Name, Unit, Scale, Rotate and Translate. Terminal rows are read-only in Basic; edit those pairs deliberately in Raw IXI. Nested $PHYSICAL Name and Material must match the intended mesh volume and explicit material record. In Raw IXI, use the mesh-import banner’s Open preview action. On the mesh document’s Groups tab, check metal, left and right, including their dimensions and element counts. Preview applies numeric Unit/Scale/Rotate/Translate; it does not establish material validity, port connection or a completed solve. Return to the saved IXI, choose Check and run and Run extraction, then read current Results and Raw output. The checked baseline completes with R1 = 0.02 Ω. Changing Scale to 2 through its visible Apply control, saving and rerunning gives 0.01 Ω; restoring Scale 1 recovers 0.02 Ω. For the missing-input recovery exercise, change the import Name to absent.msh, save and run. The native task reports Failed with an external-mesh loading error. Restore bar.msh, save and run again; the checked current result returns to Completed and 0.02 Ω. Preserve any result generation you need before rerunning.  Actual Open preview and Groups view for the supplied source mesh: one volume with 434 tetrahedra and two terminal surfaces with 14 triangles each. This visual check is separate from the extraction verdict. Actual mesh preview shows the uniform imported bar and three physical groups: metal with 434 tetrahedra, right and left with 14 triangles each. Keep units, transforms and physical assignments explicit A checked 90° Z rotation followed by translation (0.001, 0.002, 0.003) places the bar at x = 0.00099–0.001 m, y = 0.002–0.0021 m, z = 0.003–0.00301 m and preserves its resistance. Scaling by two changes the physical model, while a rigid transform preserves this isolated uniform-bar reference. Do not repair a unit mistake by changing only a plot label. The disposable Unit 1e-3 variant creates a bar a thousand times larger and produces a zero fitted resistance with about 99.7% fit error despite exit zero. That run is rejected. Changing dimensions at fixed frequency also changes the electromagnetic regime; inverse-size resistance is not a general AC scaling rule.  Input Meaning and checked value Unit 1e-6 Metres per mesh-coordinate unit. Raw bounds 0–100, 0–10, 0–10 become 100 × 10 × 10 µm. Exported combined-mesh coordinates in this run are metres. Scale 1; Rotate; Translate Coordinates are multiplied by Unit and Scale, rotated about the origin in XYZ degrees, then translated in metres. The triple follows Rotate or Translate on its next line. Terminal \"P1+\" \"left\" / \"P1-\" \"right\" The port name and polarity connect the netlist port to named physical surfaces. Both ends must exist; a visually plausible body alone does not establish a port. $PHYSICAL Name \"metal\"; Material \"metal_material\" Map the mesh volume name to the intended explicit $MATERIAL. Material names in the Basic controls are raw text and are not validated against the material records. Sigma / Lambda / MuR Conductivity is S/m, London penetration depth is metres and relative permeability is dimensionless. This normal-metal example uses 5e7, 0 and 1 respectively. Check the reference and the actual refinement For a uniform low-frequency bar, R = length / (conductivity × cross-sectional area) = 0.02 Ω. The checked baseline has 190 nodes and 434 tetrahedra and gives 0.0200000 Ω. A separate mesh-factor 0.5 run has 1,073 nodes and 3,586 tetrahedra and gives 0.0200132 Ω, approximately 0.066% above that reference and above the baseline. The client uses a declared 1% reference comparison for this simple teaching bar. These two meshes and their observed difference are a bounded refinement check; they do not establish a universal convergence tolerance or package accuracy. For a real structure, refine the relevant current-carrying geometry, inspect solver and model-fit errors, compare the quantities of interest and retain an appropriate independent reference. The example uses 1 kHz. A preliminary zero-frequency attempt was rejected because this InductEx route enabled AC analysis. The independent R formula supplies a low-frequency reference; the example does not claim to qualify a general DC import route. Its lack of an extracted inductance is intentional: bar.cir asks for R1.  Recognise the checked format and mapping limits For this exercised legacy import path, retain ASCII MSH 2.2, first-order triangles and tetrahedra, globally distinct contiguous physical tags in declaration order, sequential node IDs in file order and the checked two-tag element layout. The supplied GEO generates those conditions. Do not assume that a mesh which opens in a viewer is accepted by Core. Disposable MSH 4.1 and quadratic-tetrahedron files fail at the solver with Physical contains no elements. Valid meshes rewritten with sparse physical tags or nonsequential node IDs also fail in this runtime. Re-export a compatible mesh from the geometry source and inspect the actual header, groups and connectivity. Editing only the header or stripping element nodes is not a conversion.  Observed failure Recovery and unresolved finding Record or command $import not recognised KB-IMPORT-001: the manual/editor catalog and exercised Core reader disagree. The supplied checked 8.0.1 IXI uses $IMPORTMESH and preserves that spelling during native Scale Apply. Reconcile the supported contract before broader release claims. External object metal has no material assigned. Default to first defined material. KB-IMPORT-002: an unknown mapped material returns exit zero and R1 = 0 with 100% fit error in the disposable test. Reject that result, correct the exact material mapping and rerun. A warning or fallback is not an approved material choice. No negative terminal found, or an unknown material from an unmatched volume KB-IMPORT-003: missing terminal or volume-name mappings produce errors followed by an abnormal Windows process exit in the checked cases. Correct the exact mesh/port/volume names from the intact files; retain the actual diagnostic. Product crash handling remains open. Error while loading external mesh Check the exact saved Name, working copy and file existence. Restore the complete generated MSH beside this IXI and rerun; CLI and native correction recover the reference result. Save bar.geo // Public teaching bar. Coordinate numbers represent micrometres.\nSetFactory(\"OpenCASCADE\");\nBox(1) = {0, 0, 0, 100, 10, 10};\nepsilon = 1e-6;\nleft() = Surface In BoundingBox {-epsilon, -epsilon, -epsilon,\n                                 epsilon, 10+epsilon, 10+epsilon};\nright() = Surface In BoundingBox {100-epsilon, -epsilon, -epsilon,\n                                  100+epsilon, 10+epsilon, 10+epsilon};\n// Distinct physical tags are intentional across both dimensions.\nPhysical Surface(\"left\", 1) = {left()};\nPhysical Surface(\"right\", 2) = {right()};\nPhysical Volume(\"metal\", 3) = {1};\nMesh.MeshSizeMin = 4;\nMesh.MeshSizeMax = 5;\nMesh.ElementOrder = 1;\nMesh.MshFileVersion = 2.2;\nMesh.Binary = 0;\nMesh.SaveAll = 0; Save bar.ixi * Public external tetrahedral mesh teaching example\n$COMMAND\n  MeshFile \"imported-bar.msh\"\n  MeshType TETRA\n  Mode MQS\n  Frequency 1e3\n  Process \"process.ldf\"\n  Netlist \"bar.cir\"\n$END\n$MATERIAL\n  Name \"metal_material\"\n  Sigma 5e7\n  Lambda 0\n  MuR 1\n$END\n$IMPORTMESH\n  Name \"bar.msh\"\n  Unit 1e-6\n  Scale 1\n  Rotate\n  (0, 0, 0)\n  Translate\n  (0, 0, 0)\n  Terminal \"P1+\" \"left\"\n  Terminal \"P1-\" \"right\"\n  $PHYSICAL\n    Name \"metal\"\n    Material \"metal_material\"\n  $END\n$END Save bar.cir * One port across a uniform resistive bar; R = L/(sigma * area)\nP1 1 0\nR1 1 0 0.02 Save 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 Save run_import.py \"\"\"Run the complete public Gmsh bar teaching example in a new result directory.\n\nThis client is deliberately specific to the supplied bar. It is not a general\nmesh validator or a way to assign unknown materials/terminals automatically.\nRaw solver logs and settings may contain private local information.\n\"\"\"\nimport argparse\nimport hashlib\nimport json\nimport math\nimport os\nfrom pathlib import Path\nimport re\nimport shutil\nimport subprocess\nimport sys\n\nINPUTS = ('bar.geo', 'bar.ixi', 'bar.cir', 'process.ldf')\n\n\ndef sha(path):\n    return hashlib.sha256(path.read_bytes()).hexdigest()\n\n\ndef read_msh2(path):\n    lines = path.read_text(encoding='ascii').splitlines()\n    def section(name):\n        start = lines.index('$' + name) + 1\n        end = lines.index('$End' + name, start)\n        return lines[start:end]\n    if section('MeshFormat') != ['2.2 0 8']:\n        raise ValueError('This checked reader requires ASCII MSH 2.2 (2.2 0 8).')\n    groups = section('PhysicalNames')\n    if int(groups[0]) != len(groups)-1:\n        raise ValueError('Physical-name count does not match the complete file.')\n    physicals = {}\n    for row in groups[1:]:\n        match = re.fullmatch(r'(\\d+)\\s+(\\d+)\\s+\"([^\"]+)\"', row)\n        if not match:\n            raise ValueError('Unsupported physical-name record.')\n        dimension, tag = int(match[1]), int(match[2])\n        if tag in physicals:\n            raise ValueError('Use distinct physical tags across dimensions for this checked import path.')\n        physicals[tag] = {'dimension': dimension, 'name': match[3]}\n    rows = section('Nodes')\n    if int(rows[0]) != len(rows)-1:\n        raise ValueError('Node count does not match the complete file.')\n    nodes = []\n    for index, row in enumerate(rows[1:], 1):\n        values = row.split()\n        if len(values) != 4 or int(values[0]) != index:\n            raise ValueError('This import path requires sequential node IDs in physical row order.')\n        point = tuple(float(v) for v in values[1:])\n        if not all(math.isfinite(v) for v in point):\n            raise ValueError('Nonfinite mesh coordinate.')\n        nodes.append(point)\n    rows = section('Elements')\n    if int(rows[0]) != len(rows)-1:\n        raise ValueError('Element count does not match the complete file.')\n    elements = []\n    for row in rows[1:]:\n        values = [int(v) for v in row.split()]\n        kind, tags = values[1:3]\n        if kind not in (1, 2, 4) or tags != 2:\n            raise ValueError('Use first-order lines/triangles/tetrahedra and the checked two-tag MSH layout.')\n        node_ids = values[5:]\n        if len(node_ids) != {1:2, 2:3, 4:4}[kind] or not all(1 <= n <= len(nodes) for n in node_ids):\n            raise ValueError('Invalid element-node reference.')\n        if values[3] not in physicals:\n            raise ValueError('Element references an undeclared physical group.')\n        elements.append({'kind':kind,'physical':values[3],'nodes':node_ids})\n    return {'physicals':physicals,'nodes':nodes,'elements':elements}\n\n\ndef bounds(mesh):\n    return [[min(p[i] for p in mesh['nodes']), max(p[i] for p in mesh['nodes'])] for i in range(3)]\n\n\ndef main():\n    parser = argparse.ArgumentParser(description=__doc__)\n    parser.add_argument('--gmsh', type=Path, required=True)\n    parser.add_argument('--inductex', type=Path, required=True)\n    parser.add_argument('--licence', type=Path, required=True)\n    parser.add_argument('--results', type=Path, required=True)\n    parser.add_argument('--mesh-factor', type=float, default=1.0)\n    args = parser.parse_args()\n    source = Path(__file__).resolve().parent\n    work = args.results.absolute()\n    try:\n        gmsh, inductex, licence = [p.resolve(strict=True) for p in (args.gmsh, args.inductex, args.licence)]\n        if not all(p.is_file() for p in (gmsh, inductex, licence)):\n            raise ValueError('Select existing Gmsh, InductEx and issued-licence files.')\n        if work.exists() or not work.parent.is_dir():\n            raise ValueError('Select a new result directory under an existing writable parent.')\n        if not math.isfinite(args.mesh_factor) or not .25 <= args.mesh_factor <= 2:\n            raise ValueError('Use a mesh factor from 0.25 to 2 for this teaching study.')\n        originals = {n:sha(source/n) for n in INPUTS}\n        work.mkdir()\n        for n in INPUTS:\n            shutil.copyfile(source/n, work/n)\n        home = work/'private-home/.sunmagnetics'\n        home.mkdir(parents=True)\n        (home/'ixcfg.ini').write_text('[General]\\nLicenseFileName='+licence.as_posix()+'\\n',encoding='utf-8')\n        env = os.environ.copy()\n        env['USERPROFILE'] = str(home.parent)\n        env['PATH'] = str(inductex.parent)+';'+str(gmsh.parent)+';'+env.get('PATH','')\n        flags = {'creationflags':subprocess.CREATE_NO_WINDOW} if os.name=='nt' else {}\n        receipt = {'status':'running','inputs':originals,'mesh_factor':args.mesh_factor,\n                   'scope':'Supplied uniform public bar at 1 kHz; independent low-frequency resistance reference, not general convergence or physical calibration.'}\n        def save():\n            (work/'receipt.json').write_text(json.dumps(receipt,indent=2)+'\\n',encoding='utf-8')\n        save()\n        command = [str(gmsh),'bar.geo','-3','-format','msh2','-clscale',str(args.mesh_factor),'-o','bar.msh','-v','2']\n        generated = subprocess.run(command,cwd=work,env=env,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,timeout=90,**flags)\n        (work/'gmsh-private.log').write_bytes(generated.stdout)\n        receipt['gmsh_exit_code'] = generated.returncode\n        if generated.returncode != 0:\n            raise RuntimeError('Gmsh failed; retain its private log.')\n        mesh = read_msh2(work/'bar.msh')\n        expected = {1:{'dimension':2,'name':'left'},2:{'dimension':2,'name':'right'},3:{'dimension':3,'name':'metal'}}\n        if mesh['physicals'] != expected or bounds(mesh) != [[0,100],[0,10],[0,10]]:\n            raise ValueError('Generated mesh does not match the supplied bar/terminal physical contract.')\n        if not any(e['kind']==4 and e['physical']==3 for e in mesh['elements']):\n            raise ValueError('The imported body has no tetrahedral volume elements.')\n        receipt['raw_mesh'] = {'sha256':sha(work/'bar.msh'),'nodes':len(mesh['nodes']),\n                               'triangles':sum(e['kind']==2 for e in mesh['elements']),\n                               'tetrahedra':sum(e['kind']==4 for e in mesh['elements']),'bounds_in_mesh_units':bounds(mesh)}\n        run = subprocess.run([str(inductex),'bar.ixi'],cwd=work,env=env,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,timeout=150,**flags)\n        (work/'inductex-private.log').write_bytes(run.stdout)\n        receipt['inductex_exit_code'] = run.returncode\n        text = run.stdout.decode('utf-8',errors='replace')\n        if run.returncode != 0 or re.search(r'(?im)^\\s*(ToolEngine error|Unexpected exception|Warnings?\\b)|CONVERGENCE FAILED|Not successful',text):\n            raise RuntimeError('Extraction failed or requires warning review; retain the current private log.')\n        match = re.fullmatch(r'R1\\s+([-+0-9.eE]+)\\s*',(work/'output/elements.txt').read_text(encoding='ascii'))\n        if not match:\n            raise ValueError('No current single R1 result was found.')\n        resistance = float(match[1])\n        reference = 100e-6 / (5e7 * 10e-6 * 10e-6)\n        difference = abs(resistance/reference-1)\n        if not math.isfinite(resistance) or resistance <= 0 or difference > .01:\n            raise ValueError('The teaching bar failed its stated 1% low-frequency reference comparison.')\n        settings = json.loads((work/'output/settings_imported-bar.json').read_text(encoding='utf-8'))\n        if settings['MATERIALS']['metal_material']['SIGMA'] != 5e7:\n            raise ValueError('Current solver settings do not retain the requested conductivity.')\n        if not all(sha(source/n)==h==sha(work/n) for n,h in originals.items()):\n            raise ValueError('A source input changed during the run.')\n        receipt.update(status='passed',resistance_ohm=resistance,reference_ohm=reference,relative_reference_difference=difference,\n                       gmsh_sha256=sha(gmsh),inductex_sha256=sha(inductex),inputs_preserved=True)\n        save()\n        print(json.dumps({'status':'passed','R1_ohm':resistance,'reference_ohm':reference,\n                          'tetrahedra':receipt['raw_mesh']['tetrahedra']}))\n        return 0\n    except (OSError,ValueError,RuntimeError,subprocess.TimeoutExpired) as error:\n        if 'receipt' in locals():\n            receipt.update(status='failed',reason=str(error));save()\n        print(str(error),file=sys.stderr)\n        return 2\n\n\nif __name__=='__main__':\n    raise SystemExit(main()) Extend the model deliberately For your structure, start from its complete geometry, intended materials, terminal surfaces, coordinate system and frequency regime. Record the Gmsh and InductEx/TetraHenry versions, mesh density, port mapping, raw numerical units and acceptance checks with each result. The supplied bar client should not be relabelled as a general validator for a different design. Package dies, substrate-to-package connections, wedge or ball-and-stitch wires, bump bonds and coupled extraction need their own complete examples and continuity/refinement checks. This imported bar provides a checked foundation; those package workflows remain a separate coverage gap. Capacitance numerical acceptance remains held under the existing EQS finding. ","id":"inductex-gmsh-import","keywords":"Gmsh external mesh MSH 2.2 IMPORTMESH IMPORT Physical Volume Physical Surface Unit Scale Rotate Translate port mapping material assignment KB-IMPORT-001 KB-IMPORT-002 KB-IMPORT-003","kind":"How to","title":"Import an external Gmsh structure and check its result","product":"InductEx"},"version":"8.0.1 Windows / current-source Studio review","id":"inductex-gmsh-import","related":["/knowledge-base/inductex-inspect-mesh-fields","/knowledge-base/inductex-mesh-convergence","/knowledge-base/inductex-missing-input","/knowledge-base/inductex-support-bundle","/knowledge-base/inductex-package-wirebond"],"downloads":[{"url":"/_functions/kbExample?name=gmsh-import-bar.zip","scope":"Exact checked input files plus instructions; final-release/platform applicability remains pending.","files":["bar.geo","bar.ixi","bar.cir","process.ldf","run_import.py","README.txt"],"id":"gmsh-import-bar","requires":["Compatible Gmsh executable (checked 4.13.1), licensed Windows InductEx 8.0.1/TetraHenry runtime and Python standard library","Keep all five supplied inputs together in a writable folder; choose existing executable/licence paths and new result names"],"title":"Complete Gmsh imported-bar model and bounded run client"}],"publication_status":"published","numerical_output":null,"provenance":{"execution_checks":[{"routes":["cli"],"scope":"Windows Gmsh 4.13.1 and catalog InductEx 8.0.1/TTH 1.1.50; complete public first-order uniform bar at 1 kHz, two mesh densities, transforms, actual bad-input cases and recovery. One-percent resistance reference belongs only to this teaching bar; invalid zero/poor-fit runs are rejected. No arbitrary CAD import, bond geometry, capacitance, physical calibration or final-package qualification. Actual browser-downloaded five-input bar ZIP, complete PowerShell 7 article/README command with only Python and InductEx executable selections changed, existing issued InductEx licence and new results under a folder with spaces. Both generation/extraction/reference/refinement runs pass; no GUI, general CAD, material fallback or final-release acceptance.","result":"passed","articles":["inductex-gmsh-import"],"purpose":"external-mesh-bar-reference-transforms-and-bad-input-recovery","version":"Windows InductEx 8.0.1 / TTH 1.1.50; Gmsh 4.13.1 and frozen current-source Studio","id":"VAL-045","records":["31 independent scoped checks","10 actual browser-download/exact PowerShell command checks"],"limit":"Public first-order bar only; no arbitrary CAD/bond connection, full physical GUI route, product issue repair, device accuracy or final-package/platform qualification.","observed":{"refined_R_ohm":0.0200132,"baseline_R_ohm":0.02,"refined_tetrahedra":3586,"refined_reference_difference_percent":0.0660000000000105,"rigid_transform_R_ohm":0.02,"issues":["KB-IMPORT-001","KB-IMPORT-002","KB-IMPORT-003"],"baseline_tetrahedra":434,"scale_two_R_ohm":0.01}},{"routes":["gui-native-scenario"],"scope":"Frozen current-source licensed Windows Studio/Core 8.0.1. Actual baseline/Scale Apply/save/run/recovery, referenced-mesh preview and missing-mesh correction. Exact native Groups image only; path-bearing provenance and clipped settings captures withheld. No physical picker, crash repair, arbitrary material validation, other platform or final-package acceptance.","result":"passed","articles":["inductex-gmsh-import"],"purpose":"native-import-scale-preview-and-missing-file-recovery","version":"Windows InductEx 8.0.1 / TTH 1.1.50; Gmsh 4.13.1 and frozen current-source Studio","id":"VAL-046","records":["17 independent scoped checks"],"limit":"Public first-order bar only; no arbitrary CAD/bond connection, full physical GUI route, product issue repair, device accuracy or final-package/platform qualification.","observed":{"R1_ohm":{"recovered":0.02,"baseline":0.02,"restored":0.02,"scaled":0.01,"missing-mesh":null},"physical_groups":3,"task_statuses":{"recovered":"Completed","baseline":"Completed","restored":"Completed","scaled":"Completed","missing-mesh":"Failed - Simulation error"}}}],"figure_evidence":[{"evidence_limit":"Referenced numeric-transform mesh preview; material/terminal correctness and extraction are checked separately. No physical picker or final-package acceptance.","id":"studio-imported-bar-groups","reference_label":"Windows current-source Studio/Core 8.0.1 native scenario, reviewed 4 November 2026"}],"review_notes":["No arbitrary CAD, package/wirebond connection, product crash repair, complete physical GUI or final-release acceptance."],"scope":"Recorded inputs/builds only. Complete walkthrough and final-package acceptance remain separate.","verification_requirements":{"gui_method":"product-native-scenario","status":"review-incomplete","illustrations":"required","required":["technical-review","release-applicability","execution","gui-workflow","recovery","illustrations"],"legacy_walkthrough_field":"pending retained; complete physical operator route and final packages remain open"},"sources":[{"id":"inductex:docs/manual/ix_offchip.tex","section":"Arbitrary structures from Gmsh; Physical structures"},{"id":"inductex:docs/manual/ix_layoutinput.tex","section":"IXI import and material records; explicit spelling discrepancy"},{"id":"inductex:docs/manual/studio_projects.tex","section":"Basic/Raw IXI, retained Advanced setup and current Results"},{"id":"validation:gmsh-import-windows-20261104","section":"VAL-045 and VAL-046; complete bar, transforms, bad inputs and native recovery"}]},"title":"Import an external Gmsh structure and check its result","type":"How to","markdown_url":"/_functions/kbResource?path=markdown%2Finductex-gmsh-import.md","summary":"Generate a complete first-order bar mesh, assign its material and port surfaces, inspect it in Studio and verify units, transforms, refinement and current failure recovery.","product":"InductEx"}