Skip to content

Commit dc2b9db

Browse files
fix(tidy3d): fix empty dict deserialization for NonLinearSpec
1 parent 9706413 commit dc2b9db

3 files changed

Lines changed: 19 additions & 1 deletion

File tree

changelog.d/3329.fixed.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fixed loading of medium settings so empty `NonlinearSpec` inputs are ignored instead of unintentionally enabling nonlinearity.

tests/test_components/test_medium.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -791,6 +791,15 @@ def test_nonlinear_medium():
791791
_ = sim.updated_copy(medium=med, path="structures/0")
792792

793793

794+
def test_nonlinear_spec_empty_dict_is_ignored():
795+
assert td.Medium(nonlinear_spec=td.NonlinearSpec()).nonlinear_spec is not None
796+
797+
medium_dict = td.Medium().model_dump()
798+
medium_dict["nonlinear_spec"] = {}
799+
800+
assert td.Medium.model_validate(medium_dict).nonlinear_spec is None
801+
802+
794803
def test_custom_medium():
795804
Nx, Ny, Nz, Nf = 4, 3, 1, 1
796805
X = np.linspace(-1, 1, Nx)

tidy3d/components/medium.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import functools
66
from abc import ABC, abstractmethod
7-
from collections.abc import Sequence
7+
from collections.abc import Mapping, Sequence
88
from math import isclose
99
from typing import TYPE_CHECKING, Any, Callable, Literal, Optional, TypeVar, Union, get_args
1010

@@ -244,6 +244,14 @@ def _run_after_validators(self) -> Self:
244244
self._validate_modulation_spec_after()
245245
return self
246246

247+
@field_validator("nonlinear_spec", mode="before")
248+
@classmethod
249+
def _normalize_empty_nonlinear_spec_dict(cls, val: Any) -> Any:
250+
"""Treat an empty nonlinear spec mapping as a missing value."""
251+
if isinstance(val, Mapping) and not val:
252+
return None
253+
return val
254+
247255
def _validate_nonlinear_spec(self) -> Self:
248256
"""Check compatibility with nonlinear_spec."""
249257
if self.__class__.__name__ == "AnisotropicMedium" and any(

0 commit comments

Comments
 (0)