From bde2f5b09b64581cb57660bb7b8db9d9968822c5 Mon Sep 17 00:00:00 2001 From: adrianarce-elemwave Date: Tue, 14 Oct 2025 13:03:46 +0200 Subject: [PATCH 1/2] Minor | Added complex nested cas and updated doc --- README.md | 7 + test/test_mesher.py | 23 +- .../UnshieldedNested/UnshieldedNested.FCStd | Bin 0 -> 11971 bytes .../UnshieldedNested/UnshieldedNested.json | 22 ++ .../UnshieldedNested/UnshieldedNested.step | 230 ++++++++++++++++++ 5 files changed, 281 insertions(+), 1 deletion(-) create mode 100644 testData/UnshieldedNested/UnshieldedNested.FCStd create mode 100644 testData/UnshieldedNested/UnshieldedNested.json create mode 100644 testData/UnshieldedNested/UnshieldedNested.step diff --git a/README.md b/README.md index 2b4b8fd..e2da77e 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,13 @@ Install requirements with ## Usage +Step2gmsh requires two diferent files: +- A json file where material properties are described for each geometry +- A step file with all the geometry info + +Both files must have the same label and share folder path. +An example of those files can be found in [Five wires case](testData/five_wires/) + Launch from command line as ```shell diff --git a/test/test_mesher.py b/test/test_mesher.py index c371d0d..34d7cd1 100644 --- a/test/test_mesher.py +++ b/test/test_mesher.py @@ -268,13 +268,34 @@ def test_lansink2024_single_wire_multipolar(self): 'OpenBoundary_0', 'Vacuum_0', 'Vacuum_1'] expectedEntities = [1, 1, 1, - 1, 1, 1] self.assertEqual(sorted(pGNames), sorted(expectedNames)) for idx, name in enumerate(expectedNames): self.assertEqual(self.countEntitiesInPhysicalGroupWithName(name), expectedEntities[idx], name) + def test_unshielded_nesting(self): + caseName = 'UnshieldedNested' + Mesher().meshFromStep(self.inputFileFromCaseName(caseName), caseName) + + #gmsh.write(caseName + '.msh') + #gmsh.write(caseName + '.vtk') + + pGs = gmsh.model.getPhysicalGroups() + pGNames = [gmsh.model.getPhysicalName(*pG) for pG in pGs] + expectedNames = ['Conductor_0', + 'Conductor_1', + 'Conductor_2', + 'OpenBoundary_0', + 'Vacuum_0', 'Vacuum_1'] + expectedEntities = [2, 1, 1, + 1, + 2, 1] + self.assertEqual(sorted(pGNames), sorted(expectedNames)) + + for idx, name in enumerate(expectedNames): + self.assertEqual(self.countEntitiesInPhysicalGroupWithName(name), expectedEntities[idx], name) + if __name__ == '__main__': unittest.main() \ No newline at end of file diff --git a/testData/UnshieldedNested/UnshieldedNested.FCStd b/testData/UnshieldedNested/UnshieldedNested.FCStd new file mode 100644 index 0000000000000000000000000000000000000000..faae23a86493b927ec797a81ee9d64e7a5f7c1df GIT binary patch literal 11971 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 h(=f1)QxOmRHv Date: Thu, 16 Oct 2025 09:52:02 +0200 Subject: [PATCH 2/2] Minor | Readme update --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e2da77e..af4e3bc 100644 --- a/README.md +++ b/README.md @@ -29,13 +29,13 @@ Launch from command line as python src/step2gmsh.py <-i path_to_step_file> ``` -The tested input step files have been generated with [FreeCAD](https://www.freecad.org/). The geometrical entities within the step file must be separated in layers. The operations which are performed of the different layers depend on their name. +The tested input step files have been generated with [FreeCAD](https://www.freecad.org/). The geometrical entities within the step file must be separated in layers. The operations performed on the different layers depend on their material asignment registered in the json file. -- A layer named `Conductor_N` with `N` being an integer represents a perfect conductor. `Conductor_0` is a special case of which represents the ground and defines the global domain. For layers named `Conductor_N` with `N` different to zero their areas will be substracted from the computational domain and removed. -- Layers named as `Dielectric_N` are used to identify regions which will have a material assigned. +- A layer with a `PEC material`, represent a perfect conductor. In case one of the layers surrounds the rest of elements, it will be asigned as ground and defines the global domain for the rest of conductors. Internally, this will be represented as Conductor_0. The areas of the rest of conductors different to zero will be substracted from the computational domain and removed. In open cases, Conductor_0 is just another conductor and the domain is defined using the bounding box of the layers. +- Layers registered as `Dielectric` are used to identify regions which will have a material assigned. - Open and semi-open problems can be defined using a single layer called `OpenBoundary`. -Below is shown an example of a closed case with 6 conductors and 5 dielectrics, the external boundary corresponds to `Conductor_0`. The case is modeled with FreeCAD and can be found in the `testData/five_wires` folder together with the exported as a step file. The resulting mesh after applying `step2gmsh` is shown below. +Below is shown an example of a closed case with 6 conductors and 5 dielectrics, the external boundary corresponds to `Conductor_0`. The case is modeled with FreeCAD and can be found in the [testData/five_wires](testData/five_wires/) folder together with the exported as a step file. The resulting mesh after applying `step2gmsh` is shown below. ![Five wires example as modeled with FreeCAD](doc/fig/five_wires_freecad.png) ![Five wires example meshed with gmsh](doc/fig/five_wires_gmsh.png)