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.
- {setupem-0.13.1/src/setupEM.egg-info → setupem-0.14.0}/PKG-INFO +7 -7
- {setupem-0.13.1 → setupem-0.14.0}/README_pypi.md +5 -5
- {setupem-0.13.1 → setupem-0.14.0}/pyproject.toml +1 -1
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/__init__.py +1 -1
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/setupEM.py +62 -41
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/setup_common.py +7 -0
- {setupem-0.13.1 → setupem-0.14.0/src/setupEM.egg-info}/PKG-INFO +7 -7
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM.egg-info/requires.txt +1 -1
- {setupem-0.13.1 → setupem-0.14.0}/LICENSE +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/README.md +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/setup.cfg +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/__main__.py +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/data/SG13CMOS5L_200um.xml +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/data/SG13G2_100um.xml +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/data/SG13G2_200um.xml +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/data/SG13G2_FEM_200um.xml +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/data/SG13G2_FEM_200um_passi3D.xml +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/data/SG13G2_nosub.xml +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/field_viewer.py +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/gds_hierarchy_scan.py +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/layout_preview.py +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/momentum_import.py +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/palace_results.py +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/result_viewer.py +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/setupThermal.py +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/simplify_gds.py +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/stackupEditor.py +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/stackup_writer.py +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM/thermal_results.py +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM.egg-info/SOURCES.txt +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM.egg-info/dependency_links.txt +0 -0
- {setupem-0.13.1 → setupem-0.14.0}/src/setupEM.egg-info/entry_points.txt +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
44
|
+
- gds2palace>=0.9.0
|
|
45
45
|
- gds_prepare_for_EM>=1.3.0
|
|
46
46
|
- PySide6
|
|
47
47
|
- shiboken6
|
|
@@ -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['
|
|
1177
|
-
#
|
|
1178
|
-
#
|
|
1179
|
-
#
|
|
1180
|
-
#
|
|
1181
|
-
#
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
self.
|
|
1185
|
-
self.
|
|
1186
|
-
self.
|
|
1187
|
-
|
|
1188
|
-
self.
|
|
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.
|
|
1195
|
-
self.
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
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
|
|
1202
|
-
"
|
|
1203
|
-
"
|
|
1204
|
-
"
|
|
1205
|
-
"
|
|
1206
|
-
"
|
|
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.
|
|
1209
|
-
self.
|
|
1210
|
-
self.mesh_layout.addLayout(self.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
#
|
|
2909
|
-
# is hidden under Elmer mode) - gds2palace's
|
|
2910
|
-
#
|
|
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.
|
|
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.
|
|
3579
|
-
self.mesh_tab.
|
|
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.
|
|
3603
|
-
self.mesh_tab.
|
|
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.
|
|
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.
|
|
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.
|
|
71
|
+
- gds2palace>=0.9.0
|
|
72
72
|
- gds_prepare_for_EM>=1.3.0
|
|
73
73
|
- PySide6
|
|
74
74
|
- shiboken6
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|