setupEM 0.13.1__tar.gz → 0.14.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. {setupem-0.13.1/src/setupEM.egg-info → setupem-0.14.0}/PKG-INFO +7 -7
  2. {setupem-0.13.1 → setupem-0.14.0}/README_pypi.md +5 -5
  3. {setupem-0.13.1 → setupem-0.14.0}/pyproject.toml +1 -1
  4. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/__init__.py +1 -1
  5. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/setupEM.py +62 -41
  6. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/setup_common.py +7 -0
  7. {setupem-0.13.1 → setupem-0.14.0/src/setupEM.egg-info}/PKG-INFO +7 -7
  8. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM.egg-info/requires.txt +1 -1
  9. {setupem-0.13.1 → setupem-0.14.0}/LICENSE +0 -0
  10. {setupem-0.13.1 → setupem-0.14.0}/README.md +0 -0
  11. {setupem-0.13.1 → setupem-0.14.0}/setup.cfg +0 -0
  12. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/__main__.py +0 -0
  13. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/data/SG13CMOS5L_200um.xml +0 -0
  14. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/data/SG13G2_100um.xml +0 -0
  15. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/data/SG13G2_200um.xml +0 -0
  16. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/data/SG13G2_FEM_200um.xml +0 -0
  17. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/data/SG13G2_FEM_200um_passi3D.xml +0 -0
  18. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/data/SG13G2_nosub.xml +0 -0
  19. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/field_viewer.py +0 -0
  20. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/gds_hierarchy_scan.py +0 -0
  21. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/layout_preview.py +0 -0
  22. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/momentum_import.py +0 -0
  23. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/palace_results.py +0 -0
  24. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/result_viewer.py +0 -0
  25. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/setupThermal.py +0 -0
  26. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/simplify_gds.py +0 -0
  27. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/stackupEditor.py +0 -0
  28. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/stackup_writer.py +0 -0
  29. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/thermal_results.py +0 -0
  30. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM.egg-info/SOURCES.txt +0 -0
  31. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM.egg-info/dependency_links.txt +0 -0
  32. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM.egg-info/entry_points.txt +0 -0
  33. {setupem-0.13.1 → setupem-0.14.0}/src/setupEM.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: setupEM
3
- Version: 0.13.1
3
+ Version: 0.14.0
4
4
  Summary: Python tool for configuration of gds2palace workflow with GUI.
5
5
  Author-email: Volker Muehlhaus <volker@muehlhaus.com>
6
6
  License-Expression: GPL-3.0-or-later
@@ -10,7 +10,7 @@ Project-URL: Changelog, https://github.com/VolkerMuehlhaus/setupEM/blob/main/doc
10
10
  Requires-Python: >=3.9
11
11
  Description-Content-Type: text/markdown
12
12
  License-File: LICENSE
13
- Requires-Dist: gds2palace>=0.8.0
13
+ Requires-Dist: gds2palace>=0.9.0
14
14
  Requires-Dist: gds_prepare_for_EM>=1.3.0
15
15
  Requires-Dist: PySide6
16
16
  Requires-Dist: shiboken6
@@ -38,6 +38,10 @@ https://github.com/VolkerMuehlhaus/setupEM
38
38
 
39
39
  ## Recent changes
40
40
 
41
+ # What's New - October 17, 2026
42
+
43
+ **Conductor model** replaces **Conductor meshing** on the Mesh and Boundaries tab (Palace only), with a third choice: **Surface impedance** (default, as before), **Solve inside (volume mesh)** and the new **Solve inside + skin layers**, which adds thin layers along the conductor faces for accurate Q and loss at high frequency. Generated model scripts now use `settings['conductor_model']` instead of `settings['filled_metals']`. Older projects and model scripts with `filled_metals` still load. setupEM now requires gds2palace 0.9.0 or later; `pip install --upgrade setupEM` updates it.
44
+
41
45
  # What's New - October 16, 2026
42
46
 
43
47
  **Boundary conditions per side:** **Advanced...** next to **Boundary conditions** on the Mesh and Boundaries tab opens a table with the six sides of the simulation box. Each side can have its own boundary condition (**Absorbing**, **PEC** or **PMC**) and air layer thickness; a blank entry uses the value from the tab. For example, **PEC** at zmin with 0 µm air models a backside ground plane at the box boundary. This replaces the "same on all sides / different per side" choice for the air layer, which now lives in the same table.
@@ -58,17 +62,13 @@ Loading a model with different boundary conditions per side no longer changes it
58
62
 
59
63
  **Port de-embedding in `scripts/combine_extend_snp.py` fixed** (the `_deembedded.sNp` and `_dc_deembedded.sNp` files): the negative inductance of all ports was put in series at port 1, and the other ports were not de-embedded. For a 3-port, port 1 got the sum of all three values. Now each port gets the value for its own port number; a port without geometry data in `port_information.json` is not de-embedded. The raw `.sNp` and the `_dc.sNp` files were not affected. Please run `combine_snp` again to create the de-embedded files again. The same bug was fixed in gds2palace, where Gianluca Simone and David Lurz (FAU) found it.
60
64
 
61
- # What's New - October 8, 2026
62
-
63
- **Loading the wrong kind of model:** setupEM and setupThermal now tell you when a file belongs to the other app. A `*.simcfg` file opened in setupThermal or a `*.tsimcfg` file opened in setupEM shows a message naming the app to use instead. An imported `*.py` model script that is a thermal model (`create_elmer_thermal`, heat sources) in setupEM, or an EM model (`create_palace`/`create_elmer`, ports) in setupThermal, asks for confirmation first; the default is not to import.
64
-
65
65
  Full history: [CHANGES.md](https://github.com/VolkerMuehlhaus/setupEM/blob/main/doc/CHANGES.md)
66
66
 
67
67
  ---
68
68
 
69
69
  **Note:** the `setupEM` PyPI package itself requires:
70
70
 
71
- - gds2palace>=0.8.0
71
+ - gds2palace>=0.9.0
72
72
  - gds_prepare_for_EM>=1.3.0
73
73
  - PySide6
74
74
  - shiboken6
@@ -11,6 +11,10 @@ https://github.com/VolkerMuehlhaus/setupEM
11
11
 
12
12
  ## Recent changes
13
13
 
14
+ # What's New - October 17, 2026
15
+
16
+ **Conductor model** replaces **Conductor meshing** on the Mesh and Boundaries tab (Palace only), with a third choice: **Surface impedance** (default, as before), **Solve inside (volume mesh)** and the new **Solve inside + skin layers**, which adds thin layers along the conductor faces for accurate Q and loss at high frequency. Generated model scripts now use `settings['conductor_model']` instead of `settings['filled_metals']`. Older projects and model scripts with `filled_metals` still load. setupEM now requires gds2palace 0.9.0 or later; `pip install --upgrade setupEM` updates it.
17
+
14
18
  # What's New - October 16, 2026
15
19
 
16
20
  **Boundary conditions per side:** **Advanced...** next to **Boundary conditions** on the Mesh and Boundaries tab opens a table with the six sides of the simulation box. Each side can have its own boundary condition (**Absorbing**, **PEC** or **PMC**) and air layer thickness; a blank entry uses the value from the tab. For example, **PEC** at zmin with 0 µm air models a backside ground plane at the box boundary. This replaces the "same on all sides / different per side" choice for the air layer, which now lives in the same table.
@@ -31,17 +35,13 @@ Loading a model with different boundary conditions per side no longer changes it
31
35
 
32
36
  **Port de-embedding in `scripts/combine_extend_snp.py` fixed** (the `_deembedded.sNp` and `_dc_deembedded.sNp` files): the negative inductance of all ports was put in series at port 1, and the other ports were not de-embedded. For a 3-port, port 1 got the sum of all three values. Now each port gets the value for its own port number; a port without geometry data in `port_information.json` is not de-embedded. The raw `.sNp` and the `_dc.sNp` files were not affected. Please run `combine_snp` again to create the de-embedded files again. The same bug was fixed in gds2palace, where Gianluca Simone and David Lurz (FAU) found it.
33
37
 
34
- # What's New - October 8, 2026
35
-
36
- **Loading the wrong kind of model:** setupEM and setupThermal now tell you when a file belongs to the other app. A `*.simcfg` file opened in setupThermal or a `*.tsimcfg` file opened in setupEM shows a message naming the app to use instead. An imported `*.py` model script that is a thermal model (`create_elmer_thermal`, heat sources) in setupEM, or an EM model (`create_palace`/`create_elmer`, ports) in setupThermal, asks for confirmation first; the default is not to import.
37
-
38
38
  Full history: [CHANGES.md](https://github.com/VolkerMuehlhaus/setupEM/blob/main/doc/CHANGES.md)
39
39
 
40
40
  ---
41
41
 
42
42
  **Note:** the `setupEM` PyPI package itself requires:
43
43
 
44
- - gds2palace>=0.8.0
44
+ - gds2palace>=0.9.0
45
45
  - gds_prepare_for_EM>=1.3.0
46
46
  - PySide6
47
47
  - shiboken6
@@ -12,7 +12,7 @@ authors = [
12
12
  { name = "Volker Muehlhaus", email = "volker@muehlhaus.com" }
13
13
  ]
14
14
  dependencies = [
15
- "gds2palace>=0.8.0",
15
+ "gds2palace>=0.9.0",
16
16
  "gds_prepare_for_EM>=1.3.0",
17
17
  "PySide6",
18
18
  "shiboken6",
@@ -24,4 +24,4 @@ A Python tool for EM setup using gds2palace.
24
24
  from .setupEM import main
25
25
 
26
26
  __all__ = ["main"]
27
- __version__ = "0.13.1"
27
+ __version__ = "0.14.0"
@@ -60,7 +60,7 @@ if __package__ in (None, ""):
60
60
  get_preference, get_preference_bool, set_preference, clear_preferences,
61
61
  eval_simple_python_expression, collect_module_level_constants,
62
62
  find_paraview_exe, FILL_FACTOR_CORRECTION_SOLVERS, PALACE_LINEAR_SOLVER_SETTINGS,
63
- MODEL_KIND_EM,
63
+ GDS2PALACE_CONDUCTOR_MODELS, MODEL_KIND_EM,
64
64
  )
65
65
  from palace_results import build_results_summary, find_output_dir, find_paraview_files
66
66
  else:
@@ -74,7 +74,7 @@ else:
74
74
  get_preference, get_preference_bool, set_preference, clear_preferences,
75
75
  eval_simple_python_expression, collect_module_level_constants,
76
76
  find_paraview_exe, FILL_FACTOR_CORRECTION_SOLVERS, PALACE_LINEAR_SOLVER_SETTINGS,
77
- MODEL_KIND_EM,
77
+ GDS2PALACE_CONDUCTOR_MODELS, MODEL_KIND_EM,
78
78
  )
79
79
  from .palace_results import build_results_summary, find_output_dir, find_paraview_files
80
80
 
@@ -1173,41 +1173,49 @@ class MeshTab(QWidget):
1173
1173
  self.mesh_group = QGroupBox("Mesh settings")
1174
1174
  self.mesh_layout = QVBoxLayout()
1175
1175
 
1176
- # Palace-only: settings['filled_metals'] - model conductors as solid
1177
- # bulk-conductivity volumes instead of the default surface-impedance boundary
1178
- # condition. Hidden under Elmer mode (setPalaceMode()/setElmerMode() below),
1179
- # and excluded from Elmer's generated settings dict in create_model_text(),
1180
- # since gds2palace's filled_metals_em also covers Elmer EM - untested there
1181
- # so not exposed yet.
1182
- self.filled_metals_layout = QHBoxLayout()
1183
- self.label_filled_metals = QLabel("Conductor meshing")
1184
- self.label_filled_metals.setFixedWidth(label_width)
1185
- self._mesh_labels.append(self.label_filled_metals)
1186
- self.filled_metals_layout.addWidget(self.label_filled_metals)
1187
-
1188
- self.filled_metals_box = QComboBox()
1176
+ # Palace-only: settings['conductor_model'] - 'surface' (surface impedance
1177
+ # boundary on all conductor faces), 'solve_inside' (conductors as solid
1178
+ # bulk-conductivity volumes) or 'solve_inside_skin' (volumes plus thin skin
1179
+ # layers along their faces). Hidden under Elmer mode (setPalaceMode()/
1180
+ # setElmerMode() below), and excluded from Elmer's generated settings dict in
1181
+ # create_model_text(), since gds2palace's volume conductors also cover Elmer
1182
+ # EM - untested there so not exposed yet. An older gds2palace without
1183
+ # conductor_model only gets the first two choices, written as filled_metals.
1184
+ self.conductor_model_layout = QHBoxLayout()
1185
+ self.label_conductor_model = QLabel("Conductor model")
1186
+ self.label_conductor_model.setFixedWidth(label_width)
1187
+ self._mesh_labels.append(self.label_conductor_model)
1188
+ self.conductor_model_layout.addWidget(self.label_conductor_model)
1189
+
1190
+ self.conductor_model_box = QComboBox()
1189
1191
  # wider than the usual edit_width (170) - "Surface impedance (recommended)"/
1190
1192
  # "Solve inside (volume mesh)" don't fit that without clipping. 254 (not
1191
1193
  # edit_width) so its right edge lines up with the "Advanced..." button's
1192
1194
  # right edge on the row below (measured: edit_width 170 + that button's
1193
1195
  # own ~79px + inter-widget spacing = 254).
1194
- self.filled_metals_box.setFixedWidth(254)
1195
- self.filled_metals_box.setStyleSheet(COMBO_STYLE_OPTIONAL)
1196
- self.filled_metals_box.addItems(["Surface impedance (recommended)", "Solve inside (volume mesh)"])
1197
- self.filled_metals_box.setCurrentIndex(0)
1198
- self.filled_metals_box.setToolTip(
1196
+ self.conductor_model_box.setFixedWidth(254)
1197
+ self.conductor_model_box.setStyleSheet(COMBO_STYLE_OPTIONAL)
1198
+ conductor_model_labels = {"surface": "Surface impedance (fastest)",
1199
+ "solve_inside": "Solve inside (volume mesh)",
1200
+ "solve_inside_skin": "Solve inside + skin layers"}
1201
+ for model in (GDS2PALACE_CONDUCTOR_MODELS or ("surface", "solve_inside")):
1202
+ self.conductor_model_box.addItem(conductor_model_labels.get(model, model), model)
1203
+ self.conductor_model_box.setCurrentIndex(0)
1204
+ self.conductor_model_box.setToolTip(
1199
1205
  # Qt tooltips don't auto-wrap plain text - only explicit "\n" breaks
1200
1206
  # a line, so this is wrapped by hand rather than left as one long line.
1201
- "Surface mesh is the recommended default for microwave frequencies.\n"
1202
- "Volume mesh gives more accurate conductor loss at low frequency, where\n"
1203
- "skin depth is no longer small compared to the conductor cross section.\n"
1204
- "Not recommended as a default: it costs more RAM and simulation time,\n"
1205
- "and becomes inaccurate at higher frequencies unless the mesh actually\n"
1206
- "resolves the skin effect."
1207
+ "Surface impedance: fastest. Accurate for inductance, coupling, resonances,\n"
1208
+ "match and balance. Loss is less accurate: peak Q of coils on\n"
1209
+ "TopMetal1/TopMetal2 is 18-30 % too high.\n"
1210
+ "Solve inside: conductors meshed as volumes. For Q and loss while\n"
1211
+ "designing, a few percent pessimistic at a 2 um mesh, 1.25-1.7x the run time.\n"
1212
+ "Solve inside + skin layers: thin layers along the conductor faces resolve\n"
1213
+ "the skin effect. For final Q and loss numbers, within about 3 %,\n"
1214
+ "1.5-3.5x the run time of the surface model."
1207
1215
  )
1208
- self.filled_metals_layout.addWidget(self.filled_metals_box)
1209
- self.filled_metals_layout.addStretch()
1210
- self.mesh_layout.addLayout(self.filled_metals_layout)
1216
+ self.conductor_model_layout.addWidget(self.conductor_model_box)
1217
+ self.conductor_model_layout.addStretch()
1218
+ self.mesh_layout.addLayout(self.conductor_model_layout)
1211
1219
 
1212
1220
  self.refinement_layout = QHBoxLayout()
1213
1221
  self.label2 = QLabel("Mesh refinement at metal edges (µm)")
@@ -1641,7 +1649,14 @@ class MeshTab(QWidget):
1641
1649
  saved_values ["refined_cellsize_override"] = self._refined_cellsize_override
1642
1650
 
1643
1651
  saved_values ["order"] = self.mesh_order_box.currentIndex()+1
1644
- saved_values ["filled_metals"] = self.filled_metals_box.currentIndex() == 1
1652
+ conductor_model = self.conductor_model_box.currentData()
1653
+ if GDS2PALACE_CONDUCTOR_MODELS:
1654
+ saved_values ["conductor_model"] = conductor_model
1655
+ saved_values.pop("filled_metals", None) # older name, would conflict in gds2palace
1656
+ else:
1657
+ # an older gds2palace only knows filled_metals
1658
+ saved_values ["filled_metals"] = conductor_model == "solve_inside"
1659
+ saved_values.pop("conductor_model", None)
1645
1660
 
1646
1661
  try:
1647
1662
  value = float(self.cells_lambda_edit.text())
@@ -1761,7 +1776,13 @@ class MeshTab(QWidget):
1761
1776
  self.margins_edit.setText(str(saved_values.get("margin", get_preference(app_name, "margin", "200"))))
1762
1777
 
1763
1778
  self.mesh_order_box.setCurrentIndex(int(saved_values.get("order", 2))-1)
1764
- self.filled_metals_box.setCurrentIndex(1 if saved_values.get("filled_metals", False) else 0)
1779
+ # older .simcfg files and model scripts have filled_metals (True = 'solve_inside') instead
1780
+ conductor_model = saved_values.get(
1781
+ "conductor_model", "solve_inside" if saved_values.get("filled_metals", False) else "surface")
1782
+ index = self.conductor_model_box.findData(conductor_model)
1783
+ if index < 0 and conductor_model == "solve_inside_skin":
1784
+ index = self.conductor_model_box.findData("solve_inside") # older gds2palace: closest choice
1785
+ self.conductor_model_box.setCurrentIndex(max(index, 0))
1765
1786
  # older .simcfg files predate these keys - fall back to the preference
1766
1787
  # (complex coarse solve) or gds2palace's defaults
1767
1788
  self.complex_coarse_box.setCurrentIndex(0 if saved_values.get(
@@ -2905,12 +2926,12 @@ class ModelEditorTab(QWidget):
2905
2926
  # leak into an Elmer-mode script; the synthesized settings['fdump'] line
2906
2927
  # (below, after special_keylist) is emitted instead when the checkbox is on.
2907
2928
  ignore_list.append('fdump')
2908
- # filled_metals (Conductor meshing) is Palace-only in the GUI (its combo box
2909
- # is hidden under Elmer mode) - gds2palace's filled_metals_em actually also
2910
- # covers Elmer EM, but that path is untested from setupEM so far, so exclude
2911
- # it here too, same as 'iterative' is excluded under Palace mode above,
2929
+ # conductor_model (filled_metals with an older gds2palace) is Palace-only in the
2930
+ # GUI (its combo box is hidden under Elmer mode) - gds2palace's volume conductors
2931
+ # actually also cover Elmer EM, but that path is untested from setupEM so far, so
2932
+ # exclude it here too, same as 'iterative' is excluded under Palace mode above,
2912
2933
  # rather than let a value set earlier in Palace mode leak into an Elmer script.
2913
- ignore_list.append('filled_metals')
2934
+ ignore_list.extend(['conductor_model', 'filled_metals'])
2914
2935
  # an older gds2palace supports the via fill factor correction for Palace only
2915
2936
  if 'elmer' not in FILL_FACTOR_CORRECTION_SOLVERS:
2916
2937
  ignore_list.append('fill_factor_correction')
@@ -2937,7 +2958,7 @@ class ModelEditorTab(QWidget):
2937
2958
  'preprocess_gds', 'merge_polygon_size', 'fill_factor_correction']),
2938
2959
  ("Frequencies", ['fstart', 'fstop', 'fstep', 'fpoint', 'fdump']),
2939
2960
  ("Mesh", ['unit', 'refined_cellsize', 'refined_cellsize_override', 'cells_per_wavelength',
2940
- 'meshsize_max', 'order', 'filled_metals']),
2961
+ 'meshsize_max', 'order', 'conductor_model', 'filled_metals']),
2941
2962
  ("Adaptive mesh refinement", ['adaptive_mesh_iterations', 'amr_tol', 'amr_max_dof',
2942
2963
  'adaptive_mesh_conformal']),
2943
2964
  ("Simulation boundary", ['boundary', 'margin', 'air_around']),
@@ -3575,8 +3596,8 @@ class MainWindow(MainWindowBase):
3575
3596
  self.frequencies_tab.fdump_enabled_checkbox.setVisible(False)
3576
3597
  self.mesh_tab.AMR_group.setVisible(True)
3577
3598
  self.mesh_tab.Elmer_group.setVisible(False)
3578
- self.mesh_tab.label_filled_metals.setVisible(True)
3579
- self.mesh_tab.filled_metals_box.setVisible(True)
3599
+ self.mesh_tab.label_conductor_model.setVisible(True)
3600
+ self.mesh_tab.conductor_model_box.setVisible(True)
3580
3601
  self.file_tab.show_fill_factor_correction()
3581
3602
  self.create_model_tab.apply_preference_visibility()
3582
3603
 
@@ -3599,8 +3620,8 @@ class MainWindow(MainWindowBase):
3599
3620
  self.frequencies_tab.fdump_enabled_checkbox.setVisible(True)
3600
3621
  self.mesh_tab.AMR_group.setVisible(False)
3601
3622
  self.mesh_tab.Elmer_group.setVisible(True)
3602
- self.mesh_tab.label_filled_metals.setVisible(False)
3603
- self.mesh_tab.filled_metals_box.setVisible(False)
3623
+ self.mesh_tab.label_conductor_model.setVisible(False)
3624
+ self.mesh_tab.conductor_model_box.setVisible(False)
3604
3625
  self.file_tab.show_fill_factor_correction()
3605
3626
  self.create_model_tab.apply_preference_visibility()
3606
3627
 
@@ -96,6 +96,11 @@ FILL_FACTOR_CORRECTION_SOLVERS = getattr(
96
96
  # the installed gds2palace understands - empty for an older gds2palace, which hardcodes them
97
97
  # and would silently ignore these keys, so the Mesh tab hides its linear solver rows then.
98
98
  PALACE_LINEAR_SOLVER_SETTINGS = tuple(getattr(simulation_setup, "PALACE_LINEAR_SOLVER_SETTINGS", ()))
99
+ # Values of settings['conductor_model'] the installed gds2palace understands - empty for an
100
+ # older gds2palace, which only knows settings['filled_metals'] (True = 'solve_inside',
101
+ # False = 'surface') and would silently ignore conductor_model, so the Mesh tab then offers
102
+ # only those two choices and writes filled_metals instead.
103
+ GDS2PALACE_CONDUCTOR_MODELS = tuple(getattr(simulation_setup, "CONDUCTOR_MODELS", ()))
99
104
 
100
105
 
101
106
  # QSettings scope for the File menu's "Load Recent Config"/"Import Recent Model" lists -
@@ -4325,6 +4330,8 @@ class MainWindowBase(QMainWindow):
4325
4330
  "amr_max_dof": "amr_max_dof",
4326
4331
  "adaptive_mesh_conformal": "adaptive_mesh_conformal",
4327
4332
  "order": "order",
4333
+ "conductor_model": "conductor_model",
4334
+ # scripts from gds2palace before 0.9.0, mapped to conductor_model in MeshTab.load_values()
4328
4335
  "filled_metals": "filled_metals",
4329
4336
  "fill_factor_correction": "fill_factor_correction",
4330
4337
  "iterative": "iterative",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: setupEM
3
- Version: 0.13.1
3
+ Version: 0.14.0
4
4
  Summary: Python tool for configuration of gds2palace workflow with GUI.
5
5
  Author-email: Volker Muehlhaus <volker@muehlhaus.com>
6
6
  License-Expression: GPL-3.0-or-later
@@ -10,7 +10,7 @@ Project-URL: Changelog, https://github.com/VolkerMuehlhaus/setupEM/blob/main/doc
10
10
  Requires-Python: >=3.9
11
11
  Description-Content-Type: text/markdown
12
12
  License-File: LICENSE
13
- Requires-Dist: gds2palace>=0.8.0
13
+ Requires-Dist: gds2palace>=0.9.0
14
14
  Requires-Dist: gds_prepare_for_EM>=1.3.0
15
15
  Requires-Dist: PySide6
16
16
  Requires-Dist: shiboken6
@@ -38,6 +38,10 @@ https://github.com/VolkerMuehlhaus/setupEM
38
38
 
39
39
  ## Recent changes
40
40
 
41
+ # What's New - October 17, 2026
42
+
43
+ **Conductor model** replaces **Conductor meshing** on the Mesh and Boundaries tab (Palace only), with a third choice: **Surface impedance** (default, as before), **Solve inside (volume mesh)** and the new **Solve inside + skin layers**, which adds thin layers along the conductor faces for accurate Q and loss at high frequency. Generated model scripts now use `settings['conductor_model']` instead of `settings['filled_metals']`. Older projects and model scripts with `filled_metals` still load. setupEM now requires gds2palace 0.9.0 or later; `pip install --upgrade setupEM` updates it.
44
+
41
45
  # What's New - October 16, 2026
42
46
 
43
47
  **Boundary conditions per side:** **Advanced...** next to **Boundary conditions** on the Mesh and Boundaries tab opens a table with the six sides of the simulation box. Each side can have its own boundary condition (**Absorbing**, **PEC** or **PMC**) and air layer thickness; a blank entry uses the value from the tab. For example, **PEC** at zmin with 0 µm air models a backside ground plane at the box boundary. This replaces the "same on all sides / different per side" choice for the air layer, which now lives in the same table.
@@ -58,17 +62,13 @@ Loading a model with different boundary conditions per side no longer changes it
58
62
 
59
63
  **Port de-embedding in `scripts/combine_extend_snp.py` fixed** (the `_deembedded.sNp` and `_dc_deembedded.sNp` files): the negative inductance of all ports was put in series at port 1, and the other ports were not de-embedded. For a 3-port, port 1 got the sum of all three values. Now each port gets the value for its own port number; a port without geometry data in `port_information.json` is not de-embedded. The raw `.sNp` and the `_dc.sNp` files were not affected. Please run `combine_snp` again to create the de-embedded files again. The same bug was fixed in gds2palace, where Gianluca Simone and David Lurz (FAU) found it.
60
64
 
61
- # What's New - October 8, 2026
62
-
63
- **Loading the wrong kind of model:** setupEM and setupThermal now tell you when a file belongs to the other app. A `*.simcfg` file opened in setupThermal or a `*.tsimcfg` file opened in setupEM shows a message naming the app to use instead. An imported `*.py` model script that is a thermal model (`create_elmer_thermal`, heat sources) in setupEM, or an EM model (`create_palace`/`create_elmer`, ports) in setupThermal, asks for confirmation first; the default is not to import.
64
-
65
65
  Full history: [CHANGES.md](https://github.com/VolkerMuehlhaus/setupEM/blob/main/doc/CHANGES.md)
66
66
 
67
67
  ---
68
68
 
69
69
  **Note:** the `setupEM` PyPI package itself requires:
70
70
 
71
- - gds2palace>=0.8.0
71
+ - gds2palace>=0.9.0
72
72
  - gds_prepare_for_EM>=1.3.0
73
73
  - PySide6
74
74
  - shiboken6
@@ -1,4 +1,4 @@
1
- gds2palace>=0.8.0
1
+ gds2palace>=0.9.0
2
2
  gds_prepare_for_EM>=1.3.0
3
3
  PySide6
4
4
  shiboken6
File without changes
File without changes
File without changes