gsim 0.0.2__py3-none-any.whl → 0.0.4__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.
@@ -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__ = [
@@ -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
- config = {
48
- "Order": self.order,
49
- "Solver": {
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
- config["Solver"]["Type"] = self.solver_type
53
+ solver_config["Type"] = self.solver_type
57
54
 
58
55
  if self.preconditioner != "Default":
59
- config["Solver"]["Preconditioner"] = self.preconditioner
56
+ solver_config["Preconditioner"] = self.preconditioner
60
57
 
61
- return config
58
+ return {
59
+ "Order": self.order,
60
+ "Solver": solver_config,
61
+ }
62
62
 
63
63
 
64
64
  __all__ = [
@@ -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
- if self.from_layer is None or self.to_layer is None:
52
- raise ValueError(
53
- "Via ports require both 'from_layer' and 'to_layer'"
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
 
@@ -74,7 +74,7 @@ class DrivenConfig(BaseModel):
74
74
  "SaveStep": 0,
75
75
  }
76
76
  ],
77
- "AdaptiveTol": self.adaptive_tol if self.adaptive_tol > 0 else 0,
77
+ "AdaptiveTol": max(0, self.adaptive_tol),
78
78
  }
79
79
 
80
80
 
@@ -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
- lines.append(
107
- f"Edge length: {edge.get('min', 0):.2f} - {edge.get('max', 0):.2f} µm"
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(f"SICN: {sicn.get('mean', 0):.3f} ({invalid} invalid!)")
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 # type: ignore[import-untyped]
11
- import pyvista as pv # type: ignore[import-untyped]
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 # type: ignore[import-untyped]
85
+ from IPython.display import Image, display
83
86
 
84
87
  display(Image(str(output)))
85
88
  except ImportError:
86
- print(f"Saved: {output}")
89
+ logger.info("Saved mesh plot to %s", output)
@@ -1,19 +1,20 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gsim
3
- Version: 0.0.2
4
- Author-email: flaport <floris.laporte@gmail.com>
3
+ Version: 0.0.4
4
+ Author-email: GDSFactory <contact@gdsfactory.com>
5
5
  Classifier: Programming Language :: Python :: 3.12
6
- Classifier: Programming Language :: Python :: 3.13
7
6
  Classifier: Operating System :: OS Independent
8
- Requires-Python: <3.14,>=3.12
7
+ Requires-Python: ~=3.12.0
9
8
  Description-Content-Type: text/markdown
10
9
  Requires-Dist: gdsfactory>=9.32.0
11
- Requires-Dist: gdsfactoryplus>=1.3.7
10
+ Requires-Dist: gdsfactoryplus>=1.4.0
12
11
  Requires-Dist: gmsh
13
12
  Requires-Dist: meshio>=5.0.0
14
13
  Requires-Dist: plotly
15
14
  Requires-Dist: pydantic>=2.10.6
16
15
  Requires-Dist: pyvista>=0.43.0
16
+ Requires-Dist: trame-vtk
17
+ Requires-Dist: trame-vuetify
17
18
  Provides-Extra: dev
18
19
  Requires-Dist: altair>=5.5.0; extra == "dev"
19
20
  Requires-Dist: build>=1.2.0; extra == "dev"
@@ -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.2
50
+ # Gsim 0.0.4
50
51
 
51
52
  > a GDSFactory Simulation Plugin
52
53
 
@@ -0,0 +1,35 @@
1
+ gsim/__init__.py,sha256=HLhyYxOI7hoQK7feYM4C56D2ASV923Toxk5Zy55taEg,288
2
+ gsim/gcloud.py,sha256=YgG0X0qUzlBatzdN0cAXND0VJajx3sWKjOWdgqPMIBc,7488
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.4.dist-info/METADATA,sha256=MWKf5zo4ZGs2wK-0T9ydmW9OA_92iFLcWtfchrtgPjQ,4300
33
+ gsim-0.0.4.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
34
+ gsim-0.0.4.dist-info/top_level.txt,sha256=USwf5QaCLsXq3JCR6ejGvHANZmIifvuQAAl7w-cUE0Y,5
35
+ gsim-0.0.4.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.10.1)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -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,,