Skip to content

Commit 0342793

Browse files
wip triangle mesh
1 parent afec6aa commit 0342793

File tree

3 files changed

+47
-18
lines changed

3 files changed

+47
-18
lines changed

tests/test_components/autograd/numerical/test_autograd_box_polyslab_numerical.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111

1212
import tidy3d as td
1313
import tidy3d.web as web
14+
from tidy3d import config
15+
16+
config.local_cache.enabled = True
1417

1518
WL_UM = 0.65
1619
FREQ0 = td.C_0 / WL_UM
@@ -293,17 +296,17 @@ def squeeze_dimension(array: np.ndarray, is_3d: bool, infinite_dim: int | None)
293296
return np.delete(squeezed, infinite_dim)
294297

295298

296-
@pytest.mark.numerical
299+
# @pytest.mark.numerical
297300
@pytest.mark.parametrize(
298301
"is_3d, infinite_dim_2d",
299302
[
300303
(True, 2),
301-
(False, 0),
302-
(False, 1),
303-
(False, 2),
304+
# (False, 0),
305+
# (False, 1),
306+
# (False, 2),
304307
],
305308
)
306-
@pytest.mark.parametrize("shift_box_center", (True, False))
309+
@pytest.mark.parametrize("shift_box_center", (True,))
307310
def test_box_and_polyslab_gradients_match(is_3d, infinite_dim_2d, shift_box_center, tmp_path):
308311
"""Test that the box and polyslab gradients match for rectangular slab geometries. Allow
309312
comparison as well to finite difference values."""
@@ -428,16 +431,25 @@ def angled_overlap_deg(v1, v2):
428431
print(f"PolySlab Finite Difference vs. Adjoint: {polyslab_fd_adj_overlap_deg}")
429432

430433
assert box_polyslab_overlap_deg < ANGLE_OVERLAP_THRESH_DEG, (
431-
"Autograd gradients for Box and PolySlab disagree"
434+
"Autograd gradients for Box and PolySlab disagree: "
435+
f"angle = {box_polyslab_overlap_deg:.2f} deg, "
436+
f"threshold = {ANGLE_OVERLAP_THRESH_DEG:.2f} deg"
432437
)
438+
433439
assert fd_overlap_deg < ANGLE_OVERLAP_THRESH_DEG, (
434-
"Finite-difference gradients for Box and PolySlab disagree"
440+
"Finite-difference gradients for Box and PolySlab disagree: "
441+
f"angle = {fd_overlap_deg:.2f} deg, "
442+
f"threshold = {ANGLE_OVERLAP_THRESH_DEG:.2f} deg"
435443
)
436444

437445
if COMPARE_TO_FINITE_DIFFERENCE:
438446
assert box_fd_adj_overlap_deg < ANGLE_OVERLAP_FD_ADJ_THRESH_DEG, (
439-
"Autograd and finite-difference gradients for the Box geometry disagree"
447+
"Autograd and finite-difference gradients for the Box geometry disagree: "
448+
f"angle = {box_fd_adj_overlap_deg:.2f} deg, "
449+
f"threshold = {ANGLE_OVERLAP_FD_ADJ_THRESH_DEG:.2f} deg"
440450
)
441451
assert polyslab_fd_adj_overlap_deg < ANGLE_OVERLAP_FD_ADJ_THRESH_DEG, (
442-
"Autograd and finite-difference gradients for the PolySlab geometry disagree"
452+
"Autograd and finite-difference gradients for the PolySlab geometry disagree: "
453+
f"angle = {polyslab_fd_adj_overlap_deg:.2f} deg, "
454+
f"threshold = {ANGLE_OVERLAP_FD_ADJ_THRESH_DEG:.2f} deg"
443455
)

tests/test_components/autograd/numerical/test_autograd_polyslab_trianglemesh_numerical.py

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
88
import numpy as np
99
import pytest
1010
from autograd import value_and_grad
11+
from autograd.builtins import dict as dict_ag
12+
from autograd.tracer import isbox
1113

1214
import tidy3d as td
1315
import tidy3d.web as web
1416
from tidy3d import config
15-
from tidy3d.components.autograd import get_static
17+
from tidy3d.components.autograd import TidyArrayBox, get_static, is_tidy_box
1618

1719
config.local_cache.enabled = True
1820
WL_UM = 0.65
@@ -205,15 +207,21 @@ def _triangles_from_params(params, box_center, xp):
205207
return vertices[xp.array(TRIANGLE_FACE_VERTEX_IDS)]
206208

207209

208-
def make_trianglemesh_geometry(params, box_center) -> td.TriangleMesh:
210+
def make_trianglemesh_geometry(params, box_center):
209211
params = anp.array(params)
210212
params_static = np.array(get_static(params))
211213
triangles_static = _triangles_from_params(params_static, box_center, np)
212214
mesh = td.TriangleMesh.from_triangles(triangles_static)
213215
triangles_traced = _triangles_from_params(params, box_center, anp)
214-
surface_mesh = mesh.mesh_dataset.surface_mesh.copy(deep=False, data=triangles_traced)
215-
mesh_dataset = mesh.mesh_dataset.copy(update={"surface_mesh": surface_mesh}, deep=True)
216-
return mesh.updated_copy(validate=False, mesh_dataset=mesh_dataset)
216+
traced_fields = None
217+
if isbox(triangles_traced):
218+
traced_data = triangles_traced
219+
if not is_tidy_box(traced_data):
220+
traced_data = TidyArrayBox.from_arraybox(traced_data)
221+
traced_fields = dict_ag(
222+
{("structures", 0, "geometry", "mesh_dataset", "surface_mesh"): traced_data}
223+
)
224+
return mesh, traced_fields
217225

218226

219227
def make_polyslab_geometry(params, box_center, axis: int) -> td.PolySlab:
@@ -247,13 +255,20 @@ def run_parameter_simulations(
247255
simulation_dict = {}
248256

249257
for idx, param_values in enumerate(parameter_sets):
250-
geometry = make_geometry(param_values, box_center)
258+
geometry_data = make_geometry(param_values, box_center)
259+
if isinstance(geometry_data, tuple):
260+
geometry, traced_fields = geometry_data
261+
else:
262+
geometry = geometry_data
263+
traced_fields = None
251264
structure = td.Structure(
252265
geometry=geometry,
253266
medium=td.Medium(permittivity=PERMITTIVITY),
254267
)
255268

256-
sim = base_sim.updated_copy(structures=[structure])
269+
sim = base_sim.updated_copy(structures=[structure], validate=False)
270+
if traced_fields is not None:
271+
sim = sim._insert_traced_fields(traced_fields)
257272
simulation_dict[f"sim_{idx}"] = sim
258273

259274
if len(simulation_dict) == 1:

tidy3d/components/geometry/mesh.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import numpy as np
99
import pydantic.v1 as pydantic
1010

11-
from tidy3d.components.autograd import AutogradFieldMap
11+
from tidy3d.components.autograd import AutogradFieldMap, get_static
1212
from tidy3d.components.autograd.derivative_utils import DerivativeInfo
1313
from tidy3d.components.base import cached_property
1414
from tidy3d.components.data.data_array import DATA_ARRAY_MAP, TriangleMeshDataArray
@@ -75,7 +75,9 @@ def _check_mesh(cls, val: TriangleMeshDataset) -> TriangleMeshDataset:
7575

7676
import trimesh
7777

78-
mesh = cls._triangles_to_trimesh(val.surface_mesh)
78+
surface_mesh = val.surface_mesh
79+
triangles = get_static(surface_mesh.data)
80+
mesh = cls._triangles_to_trimesh(triangles)
7981
if not all(np.array(mesh.area_faces) > AREA_SIZE_THRESHOLD):
8082
old_tol = trimesh.tol.merge
8183
trimesh.tol.merge = np.sqrt(2 * AREA_SIZE_THRESHOLD)

0 commit comments

Comments
 (0)