Skip to content

Commit 74da0bd

Browse files
authored
Merge pull request #671 from gronniger/gr/cleanup_meep_geometry
cleanup `get_meep_geometry_from_component()`
2 parents 4ac2c45 + 6403815 commit 74da0bd

2 files changed

Lines changed: 35 additions & 53 deletions

File tree

gplugins/gmeep/get_meep_geometry.py

Lines changed: 31 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,11 @@
33
import gdsfactory as gf
44
import meep as mp
55
import numpy as np
6-
from kfactory import LayerEnum
7-
from typing import cast
8-
import shapely
9-
from gdsfactory.pdk import get_layer_stack, get_layer, get_layer_name
10-
from gdsfactory.technology import LayerStack
11-
from gdsfactory.technology import DerivedLayer, LayerStack, LayerViews, LogicalLayer
6+
7+
from gdsfactory.pdk import get_layer_stack, get_layer
8+
from gdsfactory.technology import DerivedLayer, LayerStack, LogicalLayer
129
from gdsfactory.typings import ComponentSpec, CrossSectionSpec, LayerSpecs
1310

14-
from gplugins.common.utils.parse_layer_stack import order_layer_stack
1511
from gplugins.gmeep.get_material import get_material
1612

1713

@@ -34,26 +30,21 @@ def get_meep_geometry_from_component(
3430
wavelength: in um.
3531
is_3d: renders in 3D.
3632
dispersive: add dispersion.
33+
exclude_layers: these layers are ignored during geometry creation.
3734
kwargs: settings.
3835
"""
3936
component = gf.get_component(component=component, **kwargs)
40-
polygons_per_layer = component.get_polygons_points(merge=True)
41-
42-
4337
layer_stack = layer_stack or get_layer_stack()
44-
45-
layer_to_thickness = layer_stack.get_layer_to_thickness()
46-
layer_to_material = layer_stack.get_layer_to_material()
47-
layer_to_zmin = layer_stack.get_layer_to_zmin()
48-
layer_to_sidewall_angle = layer_stack.get_layer_to_sidewall_angle()
4938
component_with_booleans = layer_stack.get_component_with_derived_layers(component)
39+
polygons_per_layer = component_with_booleans.get_polygons_points(merge=True)
5040

5141
geometry = []
52-
exclude_layers = exclude_layers or []
53-
layer_to_polygons = component_with_booleans.get_polygons_points()
54-
55-
# ordered_layer_stack_keys = order_layer_stack(layer_stack)[::-1]
42+
if exclude_layers is None:
43+
exclude_layers = []
44+
else:
45+
exclude_layers = [get_layer(l) for l in exclude_layers]
5646

47+
# TODO: currently ignores width_to_z, z_to_bias, bias, mesh_order of level
5748
for level in layer_stack.layers.values():
5849
layer = level.layer
5950

@@ -66,45 +57,32 @@ def get_meep_geometry_from_component(
6657
layer_tuple = layer
6758
else:
6859
raise ValueError(f"Layer {layer!r} is not a DerivedLayer, LogicalLayer, or tuple")
69-
7060
layer_index = int(get_layer(layer_tuple))
7161

72-
if layer_index in exclude_layers:
73-
continue
74-
75-
if layer_index not in polygons_per_layer:
62+
if layer_index in exclude_layers or layer_index not in polygons_per_layer:
7663
continue
7764

78-
zmin = level.zmin
79-
zmin_um = layer_to_zmin[layer] if is_3d else 0
80-
if zmin is not None:
81-
has_polygons = True
82-
polygons = polygons_per_layer[layer_index]
83-
height = level.thickness
84-
for polygon in polygons:
85-
p = shapely.geometry.Polygon(polygon)
86-
vertices = [mp.Vector3(p[0], p[1], zmin_um) for p in polygon]
87-
material_name = layer_to_material[layer]
88-
89-
if material_name:
90-
material = get_material(
91-
name=material_name,
92-
dispersive=dispersive,
93-
material_name_to_meep=material_name_to_meep,
94-
wavelength=wavelength,
95-
)
96-
geometry.append(
97-
mp.Prism(
98-
vertices=vertices,
99-
height=height,
100-
sidewall_angle=np.pi * layer_to_sidewall_angle[layer] / 180
101-
if is_3d
102-
else 0,
103-
material=material,
104-
# center=center
105-
)
65+
zmin_um = level.zmin if is_3d else 0
66+
sw_angle = np.pi * level.sidewall_angle / 180 if is_3d else 0
67+
for polygon in polygons_per_layer[layer_index]:
68+
vertices = [mp.Vector3(p[0], p[1], zmin_um) for p in polygon]
69+
material_name = level.material
70+
71+
if material_name:
72+
material = get_material(
73+
name=material_name,
74+
dispersive=dispersive,
75+
material_name_to_meep=material_name_to_meep,
76+
wavelength=wavelength,
77+
)
78+
geometry.append(
79+
mp.Prism(
80+
vertices=vertices,
81+
height=level.thickness,
82+
sidewall_angle=sw_angle,
83+
material=material,
10684
)
107-
85+
)
10886
return geometry
10987

11088

gplugins/gmeep/get_simulation.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from gdsfactory.component import Component
1313
from gdsfactory.pdk import get_layer_stack
1414
from gdsfactory.technology import LayerStack
15+
from gdsfactory.typings import LayerSpecs
1516

1617
from gplugins.common.base_models.component import move_polar_rad_copy
1718
from gplugins.gmeep.get_material import get_material
@@ -48,6 +49,7 @@ def get_simulation(
4849
dispersive: bool = False,
4950
material_name_to_meep: dict[str, str | float] | None = None,
5051
continuous_source: bool = False,
52+
exclude_layers: LayerSpecs | None = None,
5153
**settings,
5254
) -> dict[str, Any]:
5355
r"""Returns Simulation dict from gdsfactory Component.
@@ -117,6 +119,7 @@ def get_simulation(
117119
material_name_to_meep: map layer_stack names with meep material database name
118120
or refractive index. dispersive materials have a wavelength dependent index.
119121
continuous_source: if True, defines a continuous source at (wavelength_start + wavelength_stop)/2 instead of the ramped source
122+
exclude_layers: these layers will be ignored in geometry generation.
120123
121124
Keyword Args:
122125
settings: extra simulation settings (resolution, symmetries, etc.)
@@ -203,6 +206,7 @@ def get_simulation(
203206
wavelength=wavelength,
204207
is_3d=is_3d,
205208
dispersive=dispersive,
209+
exclude_layers=exclude_layers,
206210
)
207211

208212
freqs = 1 / wavelengths

0 commit comments

Comments
 (0)