From 1c8bc91856db64d4a82b09b635568600cb88c9f2 Mon Sep 17 00:00:00 2001 From: Water drinker Date: Fri, 24 Apr 2026 10:31:15 -0400 Subject: [PATCH 1/8] Add eps_parameters kwargs --- python/visualization.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/python/visualization.py b/python/visualization.py index 55c8a04e8..b2cb719d7 100644 --- a/python/visualization.py +++ b/python/visualization.py @@ -1089,7 +1089,7 @@ def plot2D( CELL_EDGE_COLOR_3D: tuple[float, float, float, float] = (0.75, 0.75, 0.75, 1) # gray -def plot3D(sim, save_to_image: bool = False, image_name: str = "sim.png", **kwargs): +def plot3D(sim: mp.Simulation, save_to_image: bool = False, image_name: str = "sim.png", **kwargs): from vispy.scene.visuals import Box, Mesh from vispy.scene import SceneCanvas, transforms @@ -1112,7 +1112,14 @@ def plot3D(sim, save_to_image: bool = False, image_name: str = "sim.png", **kwar sim_center, sim_size, sim.is_cylindrical ) - grid_resolution = sim.resolution + # Get eps parameters or use default + eps_parameters = kwargs.get("eps_parameters") + if eps_parameters: + grid_resolution = eps_parameters.get("resolution", sim.resolution) + frequency = eps_parameters.get("frequency", 0) + else: + grid_resolution = sim.resolution + frequency = 0 Nx = int((xmax - xmin) * grid_resolution + 1) Ny = int((ymax - ymin) * grid_resolution + 1) @@ -1123,12 +1130,13 @@ def plot3D(sim, save_to_image: bool = False, image_name: str = "sim.png", **kwar ztics = np.linspace(zmin, zmax, Nz) # Get eps for geometry - eps_data = np.round(np.real(sim.get_epsilon_grid(xtics, ytics, ztics)), 2) - unique = np.unique(np.abs(eps_data)).tolist() + eps_data = np.round(np.real(sim.get_epsilon_grid(xtics, ytics, ztics, frequency)), 2) + + unique = np.unique((eps_data)).tolist() # Remove background material - unique.remove(np.round(np.abs(np.asarray(sim.default_material.epsilon_diag)), 2)[0]) + unique.remove(np.round((np.asarray(sim.default_material.epsilon_diag)), 2)[0]) mesh_midpoint = (sim_size[0] / 2, sim_size[1] / 2, sim_size[2] / 2) From 4c0fb3ed2aff89da4ac7435ed364b909eb1bba8b Mon Sep 17 00:00:00 2001 From: Water drinker Date: Fri, 24 Apr 2026 10:39:01 -0400 Subject: [PATCH 2/8] Update docstring to include eps_parameters --- python/simulation.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/python/simulation.py b/python/simulation.py index 42e257a61..819f9ac4f 100644 --- a/python/simulation.py +++ b/python/simulation.py @@ -4932,6 +4932,13 @@ def plot3D( scale_factor: float, camera zoom factor azimuth: float, azimuthal angle in degrees elevation: float, elevation angle in degrees + eps_parameters: Parameters to plot epsilon: + frequency: for materials with a [frequency-dependent + permittivity](Materials.md#material-dispersion) $\\varepsilon(f)$, specifies the + frequency $f$ (in Meep units) of the real part of the permittivity to use in the + plot. Defaults to 0. + resolution: the resolution of the $\\varepsilon$ grid. Defaults to the + `resolution` of the `Simulation` object. """ import meep.visualization as vis From 7cbdadb01a5d62c6da45c4f805621681bc041a8e Mon Sep 17 00:00:00 2001 From: Water drinker Date: Fri, 24 Apr 2026 11:16:50 -0400 Subject: [PATCH 3/8] Update visualization.py --- python/visualization.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/python/visualization.py b/python/visualization.py index b2cb719d7..8e9860ca1 100644 --- a/python/visualization.py +++ b/python/visualization.py @@ -1089,7 +1089,7 @@ def plot2D( CELL_EDGE_COLOR_3D: tuple[float, float, float, float] = (0.75, 0.75, 0.75, 1) # gray -def plot3D(sim: mp.Simulation, save_to_image: bool = False, image_name: str = "sim.png", **kwargs): +def plot3D(sim: mp.Simulation, save_to_image: bool = False, image_name: str = "sim.png", eps_frequency: float = 0, resolution: float | None = None, **kwargs): from vispy.scene.visuals import Box, Mesh from vispy.scene import SceneCanvas, transforms @@ -1113,13 +1113,7 @@ def plot3D(sim: mp.Simulation, save_to_image: bool = False, image_name: str = "s ) # Get eps parameters or use default - eps_parameters = kwargs.get("eps_parameters") - if eps_parameters: - grid_resolution = eps_parameters.get("resolution", sim.resolution) - frequency = eps_parameters.get("frequency", 0) - else: - grid_resolution = sim.resolution - frequency = 0 + grid_resolution = resolution or sim.resolution Nx = int((xmax - xmin) * grid_resolution + 1) Ny = int((ymax - ymin) * grid_resolution + 1) @@ -1131,7 +1125,7 @@ def plot3D(sim: mp.Simulation, save_to_image: bool = False, image_name: str = "s # Get eps for geometry - eps_data = np.round(np.real(sim.get_epsilon_grid(xtics, ytics, ztics, frequency)), 2) + eps_data = np.round(np.real(sim.get_epsilon_grid(xtics, ytics, ztics, eos_frequency)), 2) unique = np.unique((eps_data)).tolist() From 7d0c878d587404801ce974629102f031cc03b6e1 Mon Sep 17 00:00:00 2001 From: Water drinker Date: Fri, 24 Apr 2026 11:17:00 -0400 Subject: [PATCH 4/8] Update docstring --- python/simulation.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/python/simulation.py b/python/simulation.py index 819f9ac4f..9afcdb94c 100644 --- a/python/simulation.py +++ b/python/simulation.py @@ -4918,7 +4918,7 @@ def plot_fields(self, **kwargs): return vis.plot_fields(self, **kwargs) def plot3D( - self, save_to_image: bool = False, image_name: str = "sim.png", **kwargs + self, save_to_image: bool = False, image_name: str = "sim.png", eps_frequency: float = 0., resolution: float | None = None, **kwargs ): """ Uses vispy to render a 3D scene of the simulation object. The simulation object must be 3D. @@ -4932,17 +4932,16 @@ def plot3D( scale_factor: float, camera zoom factor azimuth: float, azimuthal angle in degrees elevation: float, elevation angle in degrees - eps_parameters: Parameters to plot epsilon: - frequency: for materials with a [frequency-dependent - permittivity](Materials.md#material-dispersion) $\\varepsilon(f)$, specifies the - frequency $f$ (in Meep units) of the real part of the permittivity to use in the - plot. Defaults to 0. - resolution: the resolution of the $\\varepsilon$ grid. Defaults to the - `resolution` of the `Simulation` object. + eps_frequency: for materials with a [frequency-dependent + permittivity](Materials.md#material-dispersion) $\\varepsilon(f)$, specifies the + frequency $f$ (in Meep units) of the real part of the permittivity to use in the + plot. Defaults to 0. + resolution: the resolution used for plotting. Defaults to the + `resolution` of the `Simulation` object. """ import meep.visualization as vis - return vis.plot3D(self, save_to_image, image_name, **kwargs) + return vis.plot3D(self, save_to_image, image_name, eps_frequency, resolution, **kwargs) def visualize_chunks(self): """ From ab7d3d83d1667b48e4e1d2c8263df5971c6cc3df Mon Sep 17 00:00:00 2001 From: "Steven G. Johnson" Date: Fri, 24 Apr 2026 12:23:52 -0400 Subject: [PATCH 5/8] Apply suggestion from @stevengj --- python/visualization.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/visualization.py b/python/visualization.py index 8e9860ca1..8dba47465 100644 --- a/python/visualization.py +++ b/python/visualization.py @@ -1125,7 +1125,7 @@ def plot3D(sim: mp.Simulation, save_to_image: bool = False, image_name: str = "s # Get eps for geometry - eps_data = np.round(np.real(sim.get_epsilon_grid(xtics, ytics, ztics, eos_frequency)), 2) + eps_data = np.round(np.real(sim.get_epsilon_grid(xtics, ytics, ztics, eps_frequency)), 2) unique = np.unique((eps_data)).tolist() From a0e5741a21a50af2e092774d3d59c8d4808007b3 Mon Sep 17 00:00:00 2001 From: "Steven G. Johnson" Date: Fri, 24 Apr 2026 12:24:40 -0400 Subject: [PATCH 6/8] Apply suggestion from @stevengj --- python/visualization.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/visualization.py b/python/visualization.py index 8dba47465..54453b988 100644 --- a/python/visualization.py +++ b/python/visualization.py @@ -1130,7 +1130,7 @@ def plot3D(sim: mp.Simulation, save_to_image: bool = False, image_name: str = "s unique = np.unique((eps_data)).tolist() # Remove background material - unique.remove(np.round((np.asarray(sim.default_material.epsilon_diag)), 2)[0]) + unique.remove(np.round(np.asarray(sim.default_material.epsilon_diag), 2)[0]) mesh_midpoint = (sim_size[0] / 2, sim_size[1] / 2, sim_size[2] / 2) From 8b0d449f37b04dd5282ebdb63fad615ef5a3af67 Mon Sep 17 00:00:00 2001 From: SkandanC <97717818+drinwater@users.noreply.github.com> Date: Fri, 24 Apr 2026 12:31:07 -0400 Subject: [PATCH 7/8] Update python/visualization.py Co-authored-by: Steven G. Johnson --- python/visualization.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/visualization.py b/python/visualization.py index 54453b988..3f91e7089 100644 --- a/python/visualization.py +++ b/python/visualization.py @@ -1127,7 +1127,7 @@ def plot3D(sim: mp.Simulation, save_to_image: bool = False, image_name: str = "s eps_data = np.round(np.real(sim.get_epsilon_grid(xtics, ytics, ztics, eps_frequency)), 2) - unique = np.unique((eps_data)).tolist() + unique = np.unique(eps_data).tolist() # Remove background material unique.remove(np.round(np.asarray(sim.default_material.epsilon_diag), 2)[0]) From 49ad5a4139dcdae6af902b1571c12d200aa5d321 Mon Sep 17 00:00:00 2001 From: Water drinker Date: Fri, 24 Apr 2026 12:36:53 -0400 Subject: [PATCH 8/8] Remove rounding since vispy works without it now --- python/visualization.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/visualization.py b/python/visualization.py index 3f91e7089..df83af882 100644 --- a/python/visualization.py +++ b/python/visualization.py @@ -1125,12 +1125,12 @@ def plot3D(sim: mp.Simulation, save_to_image: bool = False, image_name: str = "s # Get eps for geometry - eps_data = np.round(np.real(sim.get_epsilon_grid(xtics, ytics, ztics, eps_frequency)), 2) + eps_data = np.real(sim.get_epsilon_grid(xtics, ytics, ztics, eps_frequency)) unique = np.unique(eps_data).tolist() # Remove background material - unique.remove(np.round(np.asarray(sim.default_material.epsilon_diag), 2)[0]) + unique.remove(np.asarray(sim.default_material.epsilon_diag)[0]) mesh_midpoint = (sim_size[0] / 2, sim_size[1] / 2, sim_size[2] / 2)