From a921bc7928be5f8f0d9555f82f984982b163ce49 Mon Sep 17 00:00:00 2001 From: Luis Manuel Diaz Angulo Date: Thu, 12 Mar 2026 06:40:15 +0100 Subject: [PATCH 1/2] Add unshielded single wire test data files in FreeCAD and STEP formats --- .../unshielded_single_wire.FCStd | Bin 0 -> 5458 bytes .../unshielded_single_wire.json | 10 +++ .../unshielded_single_wire.step | 79 ++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 testData/unshielded_single_wire/unshielded_single_wire.FCStd create mode 100644 testData/unshielded_single_wire/unshielded_single_wire.json create mode 100644 testData/unshielded_single_wire/unshielded_single_wire.step diff --git a/testData/unshielded_single_wire/unshielded_single_wire.FCStd b/testData/unshielded_single_wire/unshielded_single_wire.FCStd new file mode 100644 index 0000000000000000000000000000000000000000..77f5d7ec4a40b79827bf74b14396fc1b3df17dd6 GIT binary patch literal 5458 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 Date: Thu, 12 Mar 2026 07:15:50 +0100 Subject: [PATCH 2/2] Adds unshielded single wire test --- src/ShapesClassification.py | 2 ++ test/test_mesher.py | 42 +++++++++++++++++++++++++++---------- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/ShapesClassification.py b/src/ShapesClassification.py index be22b8a..5bf280d 100644 --- a/src/ShapesClassification.py +++ b/src/ShapesClassification.py @@ -90,6 +90,8 @@ def isOpenProblem(self) -> bool: return True if roots[0] in self.dielectrics.keys(): return True + if roots[0] in self.pecs.keys() and roots[0] not in self.nestedGraph.getParentNodes(): + return True return False def removeConductorsFromDielectrics(self): diff --git a/test/test_mesher.py b/test/test_mesher.py index 9ea4e26..39d44fc 100644 --- a/test/test_mesher.py +++ b/test/test_mesher.py @@ -149,7 +149,7 @@ def test_mesh_dielectric_unshielded_pair(self) -> None: expectedEntities = [1, 1, 1, 1, 1, 1, 1] Mesher().meshFromStep(self.inputFileFromCaseName(caseName), caseName) - + gmsh.write(caseName + '.vtk') gmsh.write(caseName + '.msh') @@ -157,17 +157,17 @@ def test_mesh_dielectric_unshielded_pair(self) -> None: def test_mesh_dielectric_unshielded_pair_defined_boundary(self) -> None: caseName = 'DielectricUnshieldedPairDefinedBoundary' - + meshing_options = copy.deepcopy(Mesher.DEFAULT_MESHING_OPTIONS) meshing_options["Mesh.ElementOrder"] = 1 - + Mesher().meshFromStep( - self.inputFileFromCaseName(caseName), + self.inputFileFromCaseName(caseName), caseName, meshingOptions=meshing_options) gmsh.write(caseName + '.vtk') - + expectedNames = [ 'Conductor_0', 'Conductor_1', 'Dielectric_0', 'Dielectric_1', @@ -190,7 +190,7 @@ def test_mesh_from_step_with_five_wires(self): Mesher().meshFromStep(self.inputFileFromCaseName(caseName), caseName) gmsh.write(caseName + '.vtk') - + pGs = gmsh.model.getPhysicalGroups() pGNames = [gmsh.model.getPhysicalName(*pG) for pG in pGs] self.assertEqual(sorted(pGNames), sorted(expectedNames)) @@ -365,16 +365,35 @@ def test_lansink2024_single_wire_multipolar(self): self.assertEqual(self.countEntitiesInPhysicalGroupWithName( name), expectedEntities[idx], name) + def test_unshielded_single_wire(self): + caseName = 'unshielded_single_wire' + Mesher().meshFromStep(self.inputFileFromCaseName(caseName), caseName) + + expectedNames = [ + 'Conductor_0', + 'OpenBoundary_0', + 'Vacuum_0', # Inner region + 'Vacuum_1' # Outer region + ] + expectedEntities = [1, 1, 1, 1] + + # For debugging. + gmsh.write(caseName + '.vtk') + gmsh.write(caseName + '.msh') + # gmsh.fltk.run() + + self.assertPhysicalGroup(expectedNames, expectedEntities) + def test_unshielded_nesting(self): caseName = 'UnshieldedNested' Mesher().meshFromStep(self.inputFileFromCaseName(caseName), caseName) - - #gmsh.write(caseName + '.msh') - #gmsh.write(caseName + '.vtk') + + # gmsh.write(caseName + '.msh') + # gmsh.write(caseName + '.vtk') pGs = gmsh.model.getPhysicalGroups() pGNames = [gmsh.model.getPhysicalName(*pG) for pG in pGs] - expectedNames = ['Conductor_0', + expectedNames = ['Conductor_0', 'Conductor_1', 'Conductor_2', 'OpenBoundary_0', @@ -385,7 +404,8 @@ def test_unshielded_nesting(self): self.assertEqual(sorted(pGNames), sorted(expectedNames)) for idx, name in enumerate(expectedNames): - self.assertEqual(self.countEntitiesInPhysicalGroupWithName(name), expectedEntities[idx], name) + self.assertEqual(self.countEntitiesInPhysicalGroupWithName( + name), expectedEntities[idx], name) if __name__ == '__main__':