Skip to content

Commit 592817b

Browse files
committed
Addressing coverage
1 parent 1cbc02d commit 592817b

File tree

4 files changed

+117
-16
lines changed

4 files changed

+117
-16
lines changed

tests/test_components/test_heat.py

Lines changed: 78 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ def make_heat_mediums():
4040
heat_spec=SolidSpec(
4141
capacity=2,
4242
conductivity=3,
43+
density=1,
4344
),
4445
name="solid_medium",
4546
)
@@ -57,11 +58,24 @@ def test_heat_medium():
5758
_ = solid_medium.heat_spec.updated_copy(conductivity=-1)
5859

5960
# check we can create solid medium from SI units
60-
_ = td.SolidSpec.from_si_units(
61+
solid_from_si = td.SolidMedium.from_si_units(
6162
conductivity=1,
6263
capacity=1,
6364
density=1,
6465
)
66+
assert solid_from_si.conductivity == 1e-6
67+
assert solid_from_si.density == 1e-18
68+
69+
assert solid_from_si == solid_from_si.heat
70+
71+
with pytest.raises(ValueError):
72+
_ = solid_from_si.charge
73+
74+
with pytest.raises(ValueError):
75+
_ = solid_from_si.electrical
76+
77+
with pytest.raises(ValueError):
78+
_ = solid_from_si.optical
6579

6680

6781
def make_heat_structures():
@@ -639,8 +653,69 @@ def test_symmetry_expanded(zero_dim_axis):
639653
data_expanded_cart = mnt_data_cart_expanded.temperature
640654
data_expanded_ugrid = mnt_data_ugrid_expanded.temperature
641655

642-
print(data_expanded_ugrid.bounds)
643-
print(mnt_bounds)
656+
# print(data_expanded_ugrid.bounds)
657+
# print(mnt_bounds)
644658

645659
assert np.all(data_expanded_ugrid.bounds == mnt_bounds)
646660
assert data_expanded_cart.does_cover(mnt_bounds)
661+
662+
663+
def test_unsteady_setup():
664+
"""Test that unsteady setup works correctly."""
665+
666+
_, solid_medium = make_heat_mediums()
667+
solid_structure = td.Structure(
668+
geometry=td.Box(center=(0, 0, 0), size=(1, 1, 1)),
669+
medium=solid_medium,
670+
name="solid_structure",
671+
)
672+
673+
heat_sim = make_heat_sim(include_custom_source=False)
674+
unsteady_spec = td.UnsteadyHeatAnalysis(
675+
initial_temperature=300, unsteady_spec=td.UnsteadySpec(time_step=0.1, total_time_steps=100)
676+
)
677+
678+
temp_mnt = TemperatureMonitor(size=(1, 1, 1), name="mnt", unstructured=True)
679+
bc = HeatBoundarySpec(
680+
condition=td.TemperatureBC(temperature=300),
681+
placement=StructureBoundary(structure="solid_structure"),
682+
)
683+
684+
heat_sim = heat_sim.updated_copy(
685+
structures=[solid_structure],
686+
analysis_spec=unsteady_spec,
687+
monitors=[temp_mnt],
688+
boundary_spec=[bc],
689+
)
690+
691+
with pytest.raises(pd.ValidationError):
692+
solid_medium = td.MultiPhysicsMedium(
693+
heat=td.SolidMedium(
694+
conductivity=3,
695+
),
696+
name="solid_medium",
697+
)
698+
new_struct = solid_structure.updated_copy(medium=solid_medium)
699+
_ = heat_sim.updated_copy(structures=[new_struct])
700+
701+
with pytest.raises(pd.ValidationError):
702+
solid_medium = td.MultiPhysicsMedium(
703+
heat=td.SolidMedium(
704+
conductivity=3,
705+
capacity=2,
706+
),
707+
name="solid_medium",
708+
)
709+
new_struct = solid_structure.updated_copy(medium=solid_medium)
710+
_ = heat_sim.updated_copy(structures=[new_struct])
711+
712+
with pytest.raises(pd.ValidationError):
713+
solid_medium = td.MultiPhysicsMedium(
714+
heat=td.SolidMedium(
715+
conductivity=3,
716+
density=2,
717+
),
718+
name="solid_medium",
719+
)
720+
new_struct = solid_structure.updated_copy(medium=solid_medium)
721+
_ = heat_sim.updated_copy(structures=[new_struct])

tests/test_components/test_heat_charge.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -755,6 +755,11 @@ def test_monitor_crosses_medium(mediums, structures, heat_simulation, conduction
755755
medium=solid_no_heat, structures=[solid_struct_no_heat], monitors=[temp_monitor]
756756
)
757757

758+
# check error is raised in voltage monitor doesn't cross a conducting medium
759+
with pytest.raises(pd.ValidationError):
760+
volt_mnt = td.SteadyPotentialMonitor(center=(0, 0, 0), size=(0, td.inf, td.inf))
761+
_ = conduction_simulation.updated_copy(monitors=[volt_mnt])
762+
758763

759764
def test_heat_charge_mnt_data(
760765
temperature_monitor_data, voltage_monitor_data, capacitance_monitor_data
@@ -878,6 +883,26 @@ def test_sim_data_plotting(simulation_data):
878883
heat_sim_data.updated_copy(simulation=sim)
879884

880885

886+
def test_conduction_simulation_has_conductors(conduction_simulation, structures):
887+
"""Test whether error is raised if conduction simulation has no conductors."""
888+
889+
with pytest.raises(pd.ValidationError):
890+
_ = conduction_simulation.updated_copy(
891+
monitors=[],
892+
structures=[structures["insulator_structure"]],
893+
)
894+
895+
896+
def test_coupling_source(conduction_simulation, heat_simulation):
897+
"""Test whether the coupling source can be applied."""
898+
899+
with pytest.raises(pd.ValidationError):
900+
_ = conduction_simulation.updated_copy(sources=[td.HeatFromElectricSource()])
901+
902+
with pytest.raises(pd.ValidationError):
903+
_ = heat_simulation.updated_copy(sources=[td.HeatFromElectricSource()])
904+
905+
881906
# --------------------------
882907
# Test Classes with Fixtures
883908
# --------------------------
@@ -1051,6 +1076,13 @@ def test_charge_simulation(
10511076
)
10521077
_ = sim.updated_copy(boundary_spec=[bc_p, new_bc_n])
10531078

1079+
# test error is raised when more than one voltage array is provided
1080+
with pytest.raises(pd.ValidationError):
1081+
new_bc_p = bc_p.updated_copy(
1082+
condition=td.VoltageBC(source=td.DCVoltageSource(voltage=[1, 2]))
1083+
)
1084+
_ = sim.updated_copy(boundary_spec=[new_bc_p, bc_n])
1085+
10541086
def test_doping_distributions(self):
10551087
"""Test doping distributions."""
10561088
# Implementation needed

tidy3d/components/material/tcad/heat.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,15 @@ def heat(self):
3131

3232
@property
3333
def charge(self):
34-
return ValueError(f"A `charge` medium does not exist in this Medium definition: {self}")
34+
raise ValueError(f"A `charge` medium does not exist in this Medium definition: {self}")
3535

3636
@property
3737
def electrical(self):
38-
return ValueError(
39-
f"An `electrical` medium does not exist in this Medium definition: {self}"
40-
)
38+
raise ValueError(f"An `electrical` medium does not exist in this Medium definition: {self}")
4139

4240
@property
4341
def optical(self):
44-
return ValueError(f"An `optical` medium does not exist in this Medium definition: {self}")
42+
raise ValueError(f"An `optical` medium does not exist in this Medium definition: {self}")
4543

4644

4745
class FluidMedium(AbstractHeatMedium):

tidy3d/components/tcad/simulation/heat_charge.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -363,8 +363,7 @@ def _check_cross_solids(objs: Tuple[Box, ...], values: Dict) -> Tuple[int, ...]:
363363
isinstance(medium.heat_spec, SolidMedium) for medium in medium_set
364364
)
365365
crosses_elec_spec = any(
366-
any([isinstance(medium.charge, medium_i)] for medium_i in valid_electric_medium)
367-
for medium in medium_set
366+
isinstance(medium.charge, valid_electric_medium) for medium in medium_set
368367
)
369368
else:
370369
# approximate check for volumetric objects based on bounding boxes
@@ -377,10 +376,7 @@ def _check_cross_solids(objs: Tuple[Box, ...], values: Dict) -> Tuple[int, ...]:
377376
crosses_elec_spec = any(
378377
obj.intersects(structure.geometry)
379378
for structure in total_structures
380-
if any(
381-
[isinstance(structure.medium.charge, medium_i)]
382-
for medium_i in valid_electric_medium
383-
)
379+
if isinstance(structure.medium.charge, valid_electric_medium)
384380
)
385381

386382
if not crosses_solid:
@@ -395,8 +391,8 @@ def _check_cross_solids(objs: Tuple[Box, ...], values: Dict) -> Tuple[int, ...]:
395391
def _monitors_cross_solids(cls, val, values):
396392
"""Error if monitors does not cross any solid medium."""
397393

398-
if val is None:
399-
return val
394+
# if val is None:
395+
# return val
400396

401397
failed_solid_idx, failed_elect_idx = cls._check_cross_solids(val, values)
402398

0 commit comments

Comments
 (0)