gsim 0.0.2__py3-none-any.whl → 0.0.3__py3-none-any.whl
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.
- gsim/__init__.py +1 -1
- gsim/common/__init__.py +9 -13
- gsim/common/stack/extractor.py +4 -4
- gsim/common/stack/materials.py +2 -2
- gsim/common/stack/visualization.py +3 -3
- gsim/gcloud.py +78 -25
- gsim/palace/__init__.py +53 -64
- gsim/palace/base.py +313 -8
- gsim/palace/driven.py +26 -302
- gsim/palace/eigenmode.py +44 -264
- gsim/palace/electrostatic.py +35 -259
- gsim/palace/mesh/__init__.py +13 -1
- gsim/palace/mesh/config_generator.py +367 -0
- gsim/palace/mesh/generator.py +40 -899
- gsim/palace/mesh/geometry.py +472 -0
- gsim/palace/mesh/groups.py +170 -0
- gsim/palace/models/__init__.py +8 -15
- gsim/palace/models/mesh.py +9 -9
- gsim/palace/models/numerical.py +9 -9
- gsim/palace/models/ports.py +4 -5
- gsim/palace/models/problems.py +1 -1
- gsim/palace/models/results.py +5 -4
- gsim/viz.py +9 -6
- {gsim-0.0.2.dist-info → gsim-0.0.3.dist-info}/METADATA +6 -5
- gsim-0.0.3.dist-info/RECORD +35 -0
- {gsim-0.0.2.dist-info → gsim-0.0.3.dist-info}/WHEEL +1 -1
- gsim-0.0.2.dist-info/RECORD +0 -32
- {gsim-0.0.2.dist-info → gsim-0.0.3.dist-info}/top_level.txt +0 -0
gsim/palace/models/mesh.py
CHANGED
|
@@ -45,49 +45,49 @@ class MeshConfig(BaseModel):
|
|
|
45
45
|
return self
|
|
46
46
|
|
|
47
47
|
@classmethod
|
|
48
|
-
def coarse(cls, **kwargs) -> Self:
|
|
48
|
+
def coarse(cls, **kwargs: float | bool | list[str] | None) -> Self:
|
|
49
49
|
"""Fast mesh for quick iteration (~2.5 elements per wavelength).
|
|
50
50
|
|
|
51
51
|
This preset is suitable for initial debugging and quick checks.
|
|
52
52
|
Not recommended for accurate results.
|
|
53
53
|
"""
|
|
54
|
-
defaults = {
|
|
54
|
+
defaults: dict[str, float | int | bool | list[str] | None] = {
|
|
55
55
|
"refined_mesh_size": 10.0,
|
|
56
56
|
"max_mesh_size": 600.0,
|
|
57
57
|
"cells_per_wavelength": 5,
|
|
58
58
|
}
|
|
59
59
|
defaults.update(kwargs)
|
|
60
|
-
return cls(**defaults)
|
|
60
|
+
return cls(**defaults) # type: ignore[arg-type]
|
|
61
61
|
|
|
62
62
|
@classmethod
|
|
63
|
-
def default(cls, **kwargs) -> Self:
|
|
63
|
+
def default(cls, **kwargs: float | bool | list[str] | None) -> Self:
|
|
64
64
|
"""Balanced mesh matching COMSOL defaults (~5 elements per wavelength).
|
|
65
65
|
|
|
66
66
|
This preset provides a good balance between accuracy and computation time.
|
|
67
67
|
Suitable for most simulations.
|
|
68
68
|
"""
|
|
69
|
-
defaults = {
|
|
69
|
+
defaults: dict[str, float | int | bool | list[str] | None] = {
|
|
70
70
|
"refined_mesh_size": 5.0,
|
|
71
71
|
"max_mesh_size": 300.0,
|
|
72
72
|
"cells_per_wavelength": 10,
|
|
73
73
|
}
|
|
74
74
|
defaults.update(kwargs)
|
|
75
|
-
return cls(**defaults)
|
|
75
|
+
return cls(**defaults) # type: ignore[arg-type]
|
|
76
76
|
|
|
77
77
|
@classmethod
|
|
78
|
-
def fine(cls, **kwargs) -> Self:
|
|
78
|
+
def fine(cls, **kwargs: float | bool | list[str] | None) -> Self:
|
|
79
79
|
"""High accuracy mesh (~10 elements per wavelength).
|
|
80
80
|
|
|
81
81
|
This preset provides higher accuracy at the cost of increased
|
|
82
82
|
computation time. Use for final production simulations.
|
|
83
83
|
"""
|
|
84
|
-
defaults = {
|
|
84
|
+
defaults: dict[str, float | int | bool | list[str] | None] = {
|
|
85
85
|
"refined_mesh_size": 2.0,
|
|
86
86
|
"max_mesh_size": 70.0,
|
|
87
87
|
"cells_per_wavelength": 20,
|
|
88
88
|
}
|
|
89
89
|
defaults.update(kwargs)
|
|
90
|
-
return cls(**defaults)
|
|
90
|
+
return cls(**defaults) # type: ignore[arg-type]
|
|
91
91
|
|
|
92
92
|
|
|
93
93
|
__all__ = [
|
gsim/palace/models/numerical.py
CHANGED
|
@@ -44,21 +44,21 @@ class NumericalConfig(BaseModel):
|
|
|
44
44
|
|
|
45
45
|
def to_palace_config(self) -> dict:
|
|
46
46
|
"""Convert to Palace JSON config format."""
|
|
47
|
-
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"Tolerance": self.tolerance,
|
|
51
|
-
"MaxIterations": self.max_iterations,
|
|
52
|
-
},
|
|
47
|
+
solver_config: dict[str, str | int | float] = {
|
|
48
|
+
"Tolerance": self.tolerance,
|
|
49
|
+
"MaxIterations": self.max_iterations,
|
|
53
50
|
}
|
|
54
51
|
|
|
55
52
|
if self.solver_type != "Default":
|
|
56
|
-
|
|
53
|
+
solver_config["Type"] = self.solver_type
|
|
57
54
|
|
|
58
55
|
if self.preconditioner != "Default":
|
|
59
|
-
|
|
56
|
+
solver_config["Preconditioner"] = self.preconditioner
|
|
60
57
|
|
|
61
|
-
return
|
|
58
|
+
return {
|
|
59
|
+
"Order": self.order,
|
|
60
|
+
"Solver": solver_config,
|
|
61
|
+
}
|
|
62
62
|
|
|
63
63
|
|
|
64
64
|
__all__ = [
|
gsim/palace/models/ports.py
CHANGED
|
@@ -47,11 +47,10 @@ class PortConfig(BaseModel):
|
|
|
47
47
|
"""Validate layer configuration based on geometry type."""
|
|
48
48
|
if self.geometry == "inplane" and self.layer is None:
|
|
49
49
|
raise ValueError("Inplane ports require 'layer' to be specified")
|
|
50
|
-
if self.geometry == "via"
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
)
|
|
50
|
+
if self.geometry == "via" and (
|
|
51
|
+
self.from_layer is None or self.to_layer is None
|
|
52
|
+
):
|
|
53
|
+
raise ValueError("Via ports require both 'from_layer' and 'to_layer'")
|
|
55
54
|
return self
|
|
56
55
|
|
|
57
56
|
|
gsim/palace/models/problems.py
CHANGED
gsim/palace/models/results.py
CHANGED
|
@@ -103,9 +103,8 @@ class SimulationResult(BaseModel):
|
|
|
103
103
|
# Edge lengths
|
|
104
104
|
edge = self.mesh_stats.get("edge_length", {})
|
|
105
105
|
if edge:
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
)
|
|
106
|
+
e_min, e_max = edge.get("min", 0), edge.get("max", 0)
|
|
107
|
+
lines.append(f"Edge length: {e_min:.2f} - {e_max:.2f} µm")
|
|
109
108
|
|
|
110
109
|
# Mesh quality (gamma)
|
|
111
110
|
quality = self.mesh_stats.get("quality", {})
|
|
@@ -119,7 +118,9 @@ class SimulationResult(BaseModel):
|
|
|
119
118
|
if sicn:
|
|
120
119
|
invalid = sicn.get("invalid", 0)
|
|
121
120
|
if invalid > 0:
|
|
122
|
-
lines.append(
|
|
121
|
+
lines.append(
|
|
122
|
+
f"SICN: {sicn.get('mean', 0):.3f} ({invalid} invalid!)"
|
|
123
|
+
)
|
|
123
124
|
else:
|
|
124
125
|
lines.append(f"SICN: {sicn.get('mean', 0):.3f} (all valid)")
|
|
125
126
|
|
gsim/viz.py
CHANGED
|
@@ -5,10 +5,13 @@ This module provides visualization tools for meshes and simulation results.
|
|
|
5
5
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
|
|
8
|
+
import logging
|
|
8
9
|
from pathlib import Path
|
|
9
10
|
|
|
10
|
-
import meshio
|
|
11
|
-
import pyvista as pv
|
|
11
|
+
import meshio
|
|
12
|
+
import pyvista as pv
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
12
15
|
|
|
13
16
|
|
|
14
17
|
def plot_mesh(
|
|
@@ -44,7 +47,7 @@ def plot_mesh(
|
|
|
44
47
|
else:
|
|
45
48
|
plotter = pv.Plotter(off_screen=True, window_size=[1200, 900])
|
|
46
49
|
|
|
47
|
-
plotter.set_background("white")
|
|
50
|
+
plotter.set_background("white") # type: ignore[arg-type]
|
|
48
51
|
|
|
49
52
|
if show_groups:
|
|
50
53
|
# Filter to matching groups
|
|
@@ -64,7 +67,7 @@ def plot_mesh(
|
|
|
64
67
|
line_width=1,
|
|
65
68
|
label=group_map.get(gid, str(gid)),
|
|
66
69
|
)
|
|
67
|
-
plotter.add_legend()
|
|
70
|
+
plotter.add_legend() # type: ignore[call-arg]
|
|
68
71
|
else:
|
|
69
72
|
plotter.add_mesh(mesh, style="wireframe", color="black", line_width=1)
|
|
70
73
|
|
|
@@ -79,8 +82,8 @@ def plot_mesh(
|
|
|
79
82
|
plotter.close()
|
|
80
83
|
# Display in notebook if available
|
|
81
84
|
try:
|
|
82
|
-
from IPython.display import Image, display
|
|
85
|
+
from IPython.display import Image, display
|
|
83
86
|
|
|
84
87
|
display(Image(str(output)))
|
|
85
88
|
except ImportError:
|
|
86
|
-
|
|
89
|
+
logger.info("Saved mesh plot to %s", output)
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gsim
|
|
3
|
-
Version: 0.0.
|
|
4
|
-
Author-email:
|
|
3
|
+
Version: 0.0.3
|
|
4
|
+
Author-email: GDSFactory <contact@gdsfactory.com>
|
|
5
5
|
Classifier: Programming Language :: Python :: 3.12
|
|
6
6
|
Classifier: Programming Language :: Python :: 3.13
|
|
7
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
7
8
|
Classifier: Operating System :: OS Independent
|
|
8
|
-
Requires-Python:
|
|
9
|
+
Requires-Python: >=3.12
|
|
9
10
|
Description-Content-Type: text/markdown
|
|
10
11
|
Requires-Dist: gdsfactory>=9.32.0
|
|
11
|
-
Requires-Dist: gdsfactoryplus>=1.3.
|
|
12
|
+
Requires-Dist: gdsfactoryplus>=1.3.12
|
|
12
13
|
Requires-Dist: gmsh
|
|
13
14
|
Requires-Dist: meshio>=5.0.0
|
|
14
15
|
Requires-Dist: plotly
|
|
@@ -46,7 +47,7 @@ Requires-Dist: ty>=0.0.13; extra == "dev"
|
|
|
46
47
|
Provides-Extra: docs
|
|
47
48
|
Requires-Dist: ihp-gdsfactory>=0.1.4; extra == "docs"
|
|
48
49
|
|
|
49
|
-
# Gsim 0.0.
|
|
50
|
+
# Gsim 0.0.3
|
|
50
51
|
|
|
51
52
|
> a GDSFactory Simulation Plugin
|
|
52
53
|
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
gsim/__init__.py,sha256=nh1lQGlwYoL_ugWb6OIZHqtqs-AUEwN0GmJXNWsD7vc,288
|
|
2
|
+
gsim/gcloud.py,sha256=47ThJn-MSMSi2jGb4rElUknN70iY-YIO3mk6LxBRt7E,7426
|
|
3
|
+
gsim/viz.py,sha256=joFz6c7XasW8YER8ZLtJlqKFnzkt0O96Ye9hFxyfUUo,2673
|
|
4
|
+
gsim/common/__init__.py,sha256=HYVmB77s_0ELtEsp3ryaBod3thwiMPiz5rN-oc1SBxU,1298
|
|
5
|
+
gsim/common/geometry.py,sha256=WdFhbHFZjKM7HL35UDmNgmgwWJHPf3YFs-sxMd4w6f4,2170
|
|
6
|
+
gsim/common/stack/__init__.py,sha256=0v44u-BQSnW7Gb9t7a9tZ0HFxBVaCFKIAbXf40C3sFU,4023
|
|
7
|
+
gsim/common/stack/extractor.py,sha256=dRm63yOZntjV_TWp7c7yOCQs-32-xuFtvT1fHYGwxNU,17849
|
|
8
|
+
gsim/common/stack/materials.py,sha256=hQunUO3YwXDecrJxlklCTDcv0oXdSbhG_ByksgoOMrU,5164
|
|
9
|
+
gsim/common/stack/visualization.py,sha256=avBKbuXHcFXksK7xcjsiHgd2VDCTVhIPrpVj2wOokoI,19294
|
|
10
|
+
gsim/palace/__init__.py,sha256=SVUI7YRDKQeeKziu4Lc8hKGLRk_nxt4mK8o-hvveiec,3744
|
|
11
|
+
gsim/palace/base.py,sha256=XFmPM6KJFV5B-tl1217nmkC8D8g5AkJfvmHVW2WVP78,12561
|
|
12
|
+
gsim/palace/driven.py,sha256=w0j-hoXtt_XbTO9vt9e8_wWQqIhAIFEoZFth-sfYKYQ,25029
|
|
13
|
+
gsim/palace/eigenmode.py,sha256=2RXWW5Ph9-gbBSQMQqfCsac2kIt-XM4HX43fbnx0jVY,19001
|
|
14
|
+
gsim/palace/electrostatic.py,sha256=E0LKcWecBEZ0Z3WYwnUFRgqZtSwmvXx3dfbvq6WxRRU,13259
|
|
15
|
+
gsim/palace/mesh/__init__.py,sha256=m6p_RsxYgVXP5euVRoxpGag50R9TzCrkLH_vR8Ll2hc,1438
|
|
16
|
+
gsim/palace/mesh/config_generator.py,sha256=YebLBybZ3RK5dKpFb1U5SJAT_zw1a5SOHHAsaatkC-I,11581
|
|
17
|
+
gsim/palace/mesh/generator.py,sha256=c1-fshWHwB6H05wZiwEKzaYq403UOKn7CS0OPuJrkwY,8217
|
|
18
|
+
gsim/palace/mesh/geometry.py,sha256=jhnqpnTt9c2Ahs-FH7RAlpvol8swk4JyCvDdBpfRUfk,14675
|
|
19
|
+
gsim/palace/mesh/gmsh_utils.py,sha256=G8JJUSlUL2Rr1tcM9G0M6F9UjxePFpWSUGfmJ-LWh8E,13801
|
|
20
|
+
gsim/palace/mesh/groups.py,sha256=f-en11W2-RtR18xLMbSWHoWMf50-N59_yCNbUwE2nns,6243
|
|
21
|
+
gsim/palace/mesh/pipeline.py,sha256=cMGyuHuY6ZJYoT3cjf1Jneck2UZQTgGQQhG-D-0oz9Q,6695
|
|
22
|
+
gsim/palace/models/__init__.py,sha256=CHjp_1apFtROmBtyWmwuk8EpOYNj8WLqqAX2LPuSeic,1497
|
|
23
|
+
gsim/palace/models/geometry.py,sha256=9jD2HKeJKYhyaBLLCNc4LyuW-OpIouX32WYiE2XP9wg,987
|
|
24
|
+
gsim/palace/models/mesh.py,sha256=20aOEKViSe58JavFB90L02ZTGrNiopKiyUm_9MC3vJw,3446
|
|
25
|
+
gsim/palace/models/numerical.py,sha256=waWxOlOXTIoSdnxa5FujGv6DAfVBnu7GXAAoUv7P1DU,1818
|
|
26
|
+
gsim/palace/models/ports.py,sha256=ZcWwOGP59qPGjvv9Cu_gZ7pdlfbfAeaABSYqOLfWadw,4520
|
|
27
|
+
gsim/palace/models/problems.py,sha256=CPVsCprNWx3Sch5Y6RZMVJmw9Qo_zDmGygKoOIqT30s,6568
|
|
28
|
+
gsim/palace/models/results.py,sha256=14Lsc1uKOjhQwGixb0GRSS4A4tFulvNr-wQj_a_u5L4,5607
|
|
29
|
+
gsim/palace/models/stack.py,sha256=g3cw-YliXAoMqEoynMXYUY2Ys39llpN-9nPhRBQYfYU,1975
|
|
30
|
+
gsim/palace/ports/__init__.py,sha256=IoP11atw-Uf447AkZC5ixNcgqlNrC3GCnTGugjR_wgw,803
|
|
31
|
+
gsim/palace/ports/config.py,sha256=DK8TwspCsghQFl1uqKzu-YYEhjfu37rMDuHErOLPPgU,12289
|
|
32
|
+
gsim-0.0.3.dist-info/METADATA,sha256=_j2Xmw-F1l7bpIdVGlvmfYDQ2nuoyosOIeyXBffemT8,4347
|
|
33
|
+
gsim-0.0.3.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
34
|
+
gsim-0.0.3.dist-info/top_level.txt,sha256=USwf5QaCLsXq3JCR6ejGvHANZmIifvuQAAl7w-cUE0Y,5
|
|
35
|
+
gsim-0.0.3.dist-info/RECORD,,
|
gsim-0.0.2.dist-info/RECORD
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
gsim/__init__.py,sha256=ltF9Dg54VN5FFluo_Ixh2hEEsCv603Cqs9omInOjyyc,288
|
|
2
|
-
gsim/gcloud.py,sha256=ulYaNyGXCRoTbud0im1qHyuwcvIpNpk1RRvnRxekCe4,5155
|
|
3
|
-
gsim/viz.py,sha256=cakE-oH_O0wuL51gURl5YjLeCZQz-FFUzfr2jn2-MI4,2645
|
|
4
|
-
gsim/common/__init__.py,sha256=76hHcbSSJw45_Xz-WNTPzAhxJXqacs9Vx5BOKaMk3xw,1415
|
|
5
|
-
gsim/common/geometry.py,sha256=WdFhbHFZjKM7HL35UDmNgmgwWJHPf3YFs-sxMd4w6f4,2170
|
|
6
|
-
gsim/common/stack/__init__.py,sha256=0v44u-BQSnW7Gb9t7a9tZ0HFxBVaCFKIAbXf40C3sFU,4023
|
|
7
|
-
gsim/common/stack/extractor.py,sha256=u9ZAf8PjBig_OJefSocONE2NIAEDzE_ys1QQa2ALlYQ,17745
|
|
8
|
-
gsim/common/stack/materials.py,sha256=Eq8u1LwrY03Ewc5BSRTILofp_sqNXP-DAhUmORf3cM8,5168
|
|
9
|
-
gsim/common/stack/visualization.py,sha256=JwUDmdWqKYjSfeBX_EA1vp3ggxYAX8lI5soNIKHpwkg,19216
|
|
10
|
-
gsim/palace/__init__.py,sha256=XOA8ZmwFu3hJm7wlm7HNGqIgPxMhIpOdyEslfmwhxao,3997
|
|
11
|
-
gsim/palace/base.py,sha256=GHbiVhxeXJ7IL_3_OqZIL_Kpi0dpUFOUv_4XzqrjNE0,2002
|
|
12
|
-
gsim/palace/driven.py,sha256=kgF-jncBD0ffXZkUfyiV5zX6E88PpGYtDZJj6UQ8ggw,34190
|
|
13
|
-
gsim/palace/eigenmode.py,sha256=NIEEW7U8haD_JZyC3gSADV627jdzuae-19_NJ3TP5Pw,26341
|
|
14
|
-
gsim/palace/electrostatic.py,sha256=oeHg4B3RS3oPgh0Aa2yJX3ttKxkpQDN9CajZrkiLEis,20928
|
|
15
|
-
gsim/palace/mesh/__init__.py,sha256=vif960c46QbH1fkr4J9ydFh5ODcmxRS_Nx3D6JaVlMw,1207
|
|
16
|
-
gsim/palace/mesh/generator.py,sha256=uWIK4c5VkehYPUFjDb5rqQKyziaDR1SUm_1OT2pfkO8,36845
|
|
17
|
-
gsim/palace/mesh/gmsh_utils.py,sha256=G8JJUSlUL2Rr1tcM9G0M6F9UjxePFpWSUGfmJ-LWh8E,13801
|
|
18
|
-
gsim/palace/mesh/pipeline.py,sha256=cMGyuHuY6ZJYoT3cjf1Jneck2UZQTgGQQhG-D-0oz9Q,6695
|
|
19
|
-
gsim/palace/models/__init__.py,sha256=15of4sl3Q3qJ88BWWF0bldey5_Mijdkq-TyTuKghpPI,1592
|
|
20
|
-
gsim/palace/models/geometry.py,sha256=9jD2HKeJKYhyaBLLCNc4LyuW-OpIouX32WYiE2XP9wg,987
|
|
21
|
-
gsim/palace/models/mesh.py,sha256=vPFR5toiWLIpyYd0ZW2hN8oIOvBohJqDE5alFMpgiBc,3119
|
|
22
|
-
gsim/palace/models/numerical.py,sha256=fH57yFemH2myHWjj9Si5F7Op7jauleqaK2wbdkKf_Uw,1792
|
|
23
|
-
gsim/palace/models/ports.py,sha256=NpL3w1uwsMGOX8NsnmOj1mV87xUtDWXGn2VUOyODJVw,4550
|
|
24
|
-
gsim/palace/models/problems.py,sha256=mmWuXg-gU0BxXPB5oyOPTcV459gsyD4JK0FZu8sKLGY,6592
|
|
25
|
-
gsim/palace/models/results.py,sha256=clyHwLAGvKWWtfwm9yzv-OhaFLXhID130gShBDidwO4,5555
|
|
26
|
-
gsim/palace/models/stack.py,sha256=g3cw-YliXAoMqEoynMXYUY2Ys39llpN-9nPhRBQYfYU,1975
|
|
27
|
-
gsim/palace/ports/__init__.py,sha256=IoP11atw-Uf447AkZC5ixNcgqlNrC3GCnTGugjR_wgw,803
|
|
28
|
-
gsim/palace/ports/config.py,sha256=DK8TwspCsghQFl1uqKzu-YYEhjfu37rMDuHErOLPPgU,12289
|
|
29
|
-
gsim-0.0.2.dist-info/METADATA,sha256=1siJwZ2ue0Ipqk1dcI3fgsWG_5lHfqwtd1Dl8Ae20Ho,4300
|
|
30
|
-
gsim-0.0.2.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
|
|
31
|
-
gsim-0.0.2.dist-info/top_level.txt,sha256=USwf5QaCLsXq3JCR6ejGvHANZmIifvuQAAl7w-cUE0Y,5
|
|
32
|
-
gsim-0.0.2.dist-info/RECORD,,
|
|
File without changes
|