Skip to content

Commit e33c7e4

Browse files
Gregory Robertsgroberts-flex
authored andcommitted
chore(autograd): update box gradients to use automatic permittivity detection
1 parent 425d39d commit e33c7e4

File tree

2 files changed

+37
-39
lines changed

2 files changed

+37
-39
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2525
- Fixed bug where an extra spatial coordinate could appear in `complex_flux` and `ImpedanceCalculator` results.
2626
- Fixed normal for `Box` shape gradient computation to always point outward from boundary which is needed for correct PEC handling.
2727
- Fixed `Box` gradients within `GeometryGroup` where the group intersection boundaries were forwarded.
28+
- Fixed `Box` gradients to use automatic permittivity detection for inside/outside permittivity.
2829

2930
## [2.10.0rc3] - 2025-11-26
3031

tidy3d/web/api/autograd/backward.py

Lines changed: 36 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -174,53 +174,50 @@ def postprocess_adj(
174174
else:
175175
eps_background = None
176176

177-
# auto permittivity detection for non-box geometries
178-
if not isinstance(structure.geometry, td.Box):
179-
sim_orig = sim_data_orig.simulation
180-
plane_eps = eps_fwd.monitor.geometry
181-
182-
sim_orig_grid_spec = td.components.grid.grid_spec.GridSpec.from_grid(sim_orig.grid)
183-
184-
# permittivity without this structure
185-
structs_no_struct = list(sim_orig.structures)
186-
structs_no_struct.pop(structure_index)
187-
sim_no_structure = sim_orig.updated_copy(
188-
structures=structs_no_struct, monitors=[], sources=[], grid_spec=sim_orig_grid_spec
177+
# auto permittivity detection
178+
sim_orig = sim_data_orig.simulation
179+
plane_eps = eps_fwd.monitor.geometry
180+
181+
sim_orig_grid_spec = td.components.grid.grid_spec.GridSpec.from_grid(sim_orig.grid)
182+
183+
# permittivity without this structure
184+
structs_no_struct = list(sim_orig.structures)
185+
structs_no_struct.pop(structure_index)
186+
sim_no_structure = sim_orig.updated_copy(
187+
structures=structs_no_struct, monitors=[], sources=[], grid_spec=sim_orig_grid_spec
188+
)
189+
190+
eps_no_structure_data = [
191+
sim_no_structure.epsilon(box=plane_eps, coord_key="centers", freq=f)
192+
for f in adjoint_frequencies
193+
]
194+
195+
eps_no_structure = xr.concat(eps_no_structure_data, dim="f").assign_coords(
196+
f=adjoint_frequencies
197+
)
198+
199+
if structure.medium.is_pec:
200+
eps_inf_structure = None
201+
else:
202+
# permittivity with infinite structure
203+
structs_inf_struct = list(sim_orig.structures)[structure_index + 1 :]
204+
sim_inf_structure = sim_orig.updated_copy(
205+
structures=structs_inf_struct,
206+
medium=structure.medium,
207+
monitors=[],
208+
sources=[],
209+
grid_spec=sim_orig_grid_spec,
189210
)
190211

191-
eps_no_structure_data = [
192-
sim_no_structure.epsilon(box=plane_eps, coord_key="centers", freq=f)
212+
eps_inf_structure_data = [
213+
sim_inf_structure.epsilon(box=plane_eps, coord_key="centers", freq=f)
193214
for f in adjoint_frequencies
194215
]
195216

196-
eps_no_structure = xr.concat(eps_no_structure_data, dim="f").assign_coords(
217+
eps_inf_structure = xr.concat(eps_inf_structure_data, dim="f").assign_coords(
197218
f=adjoint_frequencies
198219
)
199220

200-
if structure.medium.is_pec:
201-
eps_inf_structure = None
202-
else:
203-
# permittivity with infinite structure
204-
structs_inf_struct = list(sim_orig.structures)[structure_index + 1 :]
205-
sim_inf_structure = sim_orig.updated_copy(
206-
structures=structs_inf_struct,
207-
medium=structure.medium,
208-
monitors=[],
209-
sources=[],
210-
grid_spec=sim_orig_grid_spec,
211-
)
212-
213-
eps_inf_structure_data = [
214-
sim_inf_structure.epsilon(box=plane_eps, coord_key="centers", freq=f)
215-
for f in adjoint_frequencies
216-
]
217-
218-
eps_inf_structure = xr.concat(eps_inf_structure_data, dim="f").assign_coords(
219-
f=adjoint_frequencies
220-
)
221-
else:
222-
eps_no_structure = eps_inf_structure = None
223-
224221
# compute bounds intersection
225222
struct_bounds = rmin_struct, rmax_struct = structure.geometry.bounds
226223
rmin_sim, rmax_sim = sim_data_orig.simulation.bounds

0 commit comments

Comments
 (0)