Skip to content

Commit fc00fb5

Browse files
Further refactoring
1 parent 7ea7e1e commit fc00fb5

File tree

3 files changed

+125
-131
lines changed

3 files changed

+125
-131
lines changed

tidy3d/plugins/smatrix/component_modelers/terminal.py

Lines changed: 89 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -302,16 +302,29 @@ def run(self, path_dir: str = DEFAULT_DATA_DIR):
302302
return TerminalComponentModelerData(simulation=self, data=smatrix_data)
303303

304304
##### Backwards compatibility methods #####
305+
@staticmethod
306+
def _check_port_impedance_sign(Z_numpy: np.ndarray):
307+
from tidy3d.plugins.smatrix.utils import _check_port_impedance_sign
305308

306-
def compute_power_wave_amplitudes_at_each_port(
307-
self, port_reference_impedances: PortDataArray, sim_data: SimulationData
308-
) -> tuple[PortDataArray, PortDataArray]:
309-
from tidy3d.plugins.smatrix.run import compute_power_wave_amplitudes_at_each_port
309+
return _check_port_impedance_sign(Z_numpy)
310310

311-
data = compute_power_wave_amplitudes_at_each_port(
312-
simulation=self, port_reference_impedances=port_reference_impedances, sim_data=sim_data
313-
)
314-
return data
311+
@staticmethod
312+
def _compute_F(Z_numpy: np.array):
313+
"""Helper to convert port impedance matrix to F, which is used for
314+
computing generalized scattering parameters."""
315+
from tidy3d.plugins.smatrix.utils import _compute_F
316+
317+
return _compute_F(Z_numpy)
318+
319+
def _construct_smatrix(self) -> TerminalPortDataArray:
320+
from tidy3d.plugins.smatrix.run import construct_smatrix
321+
322+
return construct_smatrix(self)
323+
324+
def _internal_construct_smatrix(self, batch_data: typing.Any = None) -> TerminalPortDataArray:
325+
from tidy3d.plugins.smatrix.run import construct_smatrix
326+
327+
return construct_smatrix(self)
315328

316329
def _monitor_data_at_port_amplitude(
317330
self,
@@ -333,11 +346,7 @@ def _monitor_data_at_port_amplitude(
333346
)
334347
return data
335348

336-
def get_antenna_metrics_data(
337-
self,
338-
port_amplitudes: Optional[dict[str, complex]] = None,
339-
monitor_name: Optional[str] = None,
340-
) -> AntennaMetricsData:
349+
def _port_reference_impedances(self, batch_data) -> PortDataArray:
341350
from tidy3d.plugins.smatrix.data.data import (
342351
MicrowaveSMatrixData,
343352
TerminalComponentModelerData,
@@ -346,55 +355,33 @@ def get_antenna_metrics_data(
346355
smatrix_data = MicrowaveSMatrixData(data=self._construct_smatrix())
347356
data = TerminalComponentModelerData(
348357
simulation=self, data=smatrix_data
349-
).get_antenna_metrics_data(port_amplitudes=port_amplitudes, monitor_name=monitor_name)
358+
).port_reference_impedances
350359
return data
351360

352-
@staticmethod
353-
def _check_port_impedance_sign(Z_numpy: np.ndarray):
354-
from tidy3d.plugins.smatrix.utils import _check_port_impedance_sign
355-
356-
return _check_port_impedance_sign(Z_numpy)
357-
358-
@staticmethod
359-
def _compute_F(Z_numpy: np.array):
360-
"""Helper to convert port impedance matrix to F, which is used for
361-
computing generalized scattering parameters."""
362-
from tidy3d.plugins.smatrix.utils import _compute_F
363-
364-
return _compute_F(Z_numpy)
365-
366361
@cached_property
367-
def port_reference_impedances(self) -> PortDataArray:
368-
from tidy3d.plugins.smatrix.data.data import (
369-
MicrowaveSMatrixData,
370-
TerminalComponentModelerData,
371-
)
372-
373-
smatrix_data = MicrowaveSMatrixData(data=self._construct_smatrix())
374-
data = TerminalComponentModelerData(
375-
simulation=self, data=smatrix_data
376-
).port_reference_impedances
377-
return data
362+
def _terminal_modeler_path(self) -> str:
363+
"""Where we store the for this :class:`TerminalComponentModeler` instance after the run."""
364+
return os.path.join(self.path_dir, "tcp_" + str(hash(self)) + ".hdf5")
378365

379-
def _port_reference_impedances(self, batch_data) -> PortDataArray:
380-
from tidy3d.plugins.smatrix.data.data import (
381-
MicrowaveSMatrixData,
382-
TerminalComponentModelerData,
383-
)
366+
def _upload_terminal_modeler(self):
367+
# TODO properly refactor, plugins data types should not have web methods.
368+
from tidy3d.web.api.container import Job
384369

385-
smatrix_data = MicrowaveSMatrixData(data=self._construct_smatrix())
386-
data = TerminalComponentModelerData(
387-
simulation=self, data=smatrix_data
388-
).port_reference_impedances
389-
return data
370+
# first try loading the terminal_component_modeler from file, if it exists
371+
terminal_modeler_path = self._terminal_modeler_path
390372

391-
@staticmethod
392-
def s_to_z(
393-
s_matrix: TerminalPortDataArray, reference: Union[complex, PortDataArray]
394-
) -> DataArray:
395-
from tidy3d.plugins.smatrix.utils import s_to_z
373+
if os.path.exists(terminal_modeler_path):
374+
return Job.from_file(fname=terminal_modeler_path)
396375

397-
return s_to_z(s_matrix=s_matrix, reference=reference)
376+
return Job(
377+
simulation=self,
378+
task_name=self.name,
379+
folder_name=self.folder_name,
380+
callback_url=self.callback_url,
381+
verbose=self.verbose,
382+
solver_version=self.solver_version,
383+
simulation_type="microwave",
384+
)
398385

399386
@staticmethod
400387
def ab_to_s(
@@ -404,6 +391,24 @@ def ab_to_s(
404391

405392
return ab_to_s(a_matrix=a_matrix, b_matrix=b_matrix)
406393

394+
@staticmethod
395+
def compute_port_VI(
396+
port_out: TerminalPortType, sim_data: SimulationData
397+
) -> tuple[FreqDataArray, FreqDataArray]:
398+
from tidy3d.plugins.smatrix.utils import compute_port_VI
399+
400+
return compute_port_VI(port_out=port_out, sim_data=sim_data)
401+
402+
def compute_power_wave_amplitudes_at_each_port(
403+
self, port_reference_impedances: PortDataArray, sim_data: SimulationData
404+
) -> tuple[PortDataArray, PortDataArray]:
405+
from tidy3d.plugins.smatrix.run import compute_power_wave_amplitudes_at_each_port
406+
407+
data = compute_power_wave_amplitudes_at_each_port(
408+
simulation=self, port_reference_impedances=port_reference_impedances, sim_data=sim_data
409+
)
410+
return data
411+
407412
@staticmethod
408413
def compute_power_delivered_by_port(
409414
port: Union[LumpedPort, CoaxialLumpedPort], sim_data: SimulationData
@@ -420,45 +425,39 @@ def compute_power_wave_amplitudes(
420425

421426
return compute_power_wave_amplitudes(port=port, sim_data=sim_data)
422427

423-
@staticmethod
424-
def compute_port_VI(
425-
port_out: TerminalPortType, sim_data: SimulationData
426-
) -> tuple[FreqDataArray, FreqDataArray]:
427-
from tidy3d.plugins.smatrix.utils import compute_port_VI
428+
def get_antenna_metrics_data(
429+
self,
430+
port_amplitudes: Optional[dict[str, complex]] = None,
431+
monitor_name: Optional[str] = None,
432+
) -> AntennaMetricsData:
433+
from tidy3d.plugins.smatrix.data.data import (
434+
MicrowaveSMatrixData,
435+
TerminalComponentModelerData,
436+
)
428437

429-
return compute_port_VI(port_out=port_out, sim_data=sim_data)
438+
smatrix_data = MicrowaveSMatrixData(data=self._construct_smatrix())
439+
data = TerminalComponentModelerData(
440+
simulation=self, data=smatrix_data
441+
).get_antenna_metrics_data(port_amplitudes=port_amplitudes, monitor_name=monitor_name)
442+
return data
430443

431444
@cached_property
432-
def _terminal_modeler_path(self) -> str:
433-
"""Where we store the for this :class:`TerminalComponentModeler` instance after the run."""
434-
return os.path.join(self.path_dir, "tcp_" + str(hash(self)) + ".hdf5")
435-
436-
def _upload_terminal_modeler(self):
437-
# TODO properly refactor, plugins data types should not have web methods.
438-
from tidy3d.web.api.container import Job
439-
440-
# first try loading the terminal_component_modeler from file, if it exists
441-
terminal_modeler_path = self._terminal_modeler_path
442-
443-
if os.path.exists(terminal_modeler_path):
444-
return Job.from_file(fname=terminal_modeler_path)
445-
446-
return Job(
447-
simulation=self,
448-
task_name=self.name,
449-
folder_name=self.folder_name,
450-
callback_url=self.callback_url,
451-
verbose=self.verbose,
452-
solver_version=self.solver_version,
453-
simulation_type="microwave",
445+
def port_reference_impedances(self) -> PortDataArray:
446+
from tidy3d.plugins.smatrix.data.data import (
447+
MicrowaveSMatrixData,
448+
TerminalComponentModelerData,
454449
)
455450

456-
def _construct_smatrix(self) -> TerminalPortDataArray:
457-
from tidy3d.plugins.smatrix.run import _construct_smatrix
458-
459-
return _construct_smatrix(self)
451+
smatrix_data = MicrowaveSMatrixData(data=self._construct_smatrix())
452+
data = TerminalComponentModelerData(
453+
simulation=self, data=smatrix_data
454+
).port_reference_impedances
455+
return data
460456

461-
def _internal_construct_smatrix(self, batch_data: typing.Any = None) -> TerminalPortDataArray:
462-
from tidy3d.plugins.smatrix.run import _construct_smatrix
457+
@staticmethod
458+
def s_to_z(
459+
s_matrix: TerminalPortDataArray, reference: Union[complex, PortDataArray]
460+
) -> DataArray:
461+
from tidy3d.plugins.smatrix.utils import s_to_z
463462

464-
return _construct_smatrix(self)
463+
return s_to_z(s_matrix=s_matrix, reference=reference)

tidy3d/plugins/smatrix/data/data.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,9 @@ def get_antenna_metrics_data(
179179
@cached_property
180180
def port_reference_impedances(self) -> PortDataArray:
181181
"""The reference impedance used at each port for definining power wave amplitudes."""
182-
from tidy3d.plugins.smatrix.run import _port_reference_impedances
182+
from tidy3d.plugins.smatrix.run import port_reference_impedances
183183

184-
return _port_reference_impedances(self.simulation)
184+
return port_reference_impedances(self.simulation)
185185

186186
def compute_power_wave_amplitudes_at_each_port(
187187
self, port_reference_impedances: PortDataArray, sim_data: SimulationData

tidy3d/plugins/smatrix/run.py

Lines changed: 34 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,43 @@
1212
from tidy3d.plugins.smatrix.utils import _check_port_impedance_sign, _compute_F, compute_port_VI
1313

1414

15-
def _construct_smatrix(simulation) -> TerminalPortDataArray:
15+
def construct_smatrix(simulation, batch_data: typing.Any = None) -> TerminalPortDataArray:
1616
"""Post process :class:`.BatchData` to generate scattering matrix."""
17-
return _internal_construct_smatrix(simulation=simulation)
17+
if batch_data is None:
18+
batch_data = simulation.batch_data
19+
20+
from tidy3d.plugins.smatrix.utils import ab_to_s
21+
22+
port_names = [port.name for port in simulation.ports]
23+
24+
values = np.zeros(
25+
(len(simulation.freqs), len(port_names), len(port_names)),
26+
dtype=complex,
27+
)
28+
coords = {
29+
"f": np.array(simulation.freqs),
30+
"port_out": port_names,
31+
"port_in": port_names,
32+
}
33+
a_matrix = TerminalPortDataArray(values, coords=coords)
34+
b_matrix = a_matrix.copy(deep=True)
35+
36+
# Tabulate the reference impedances at each port and frequency
37+
port_impedances = port_reference_impedances(simulation=simulation)
38+
39+
# loop through source ports
40+
for port_in in simulation.ports:
41+
sim_data = batch_data[simulation._task_name(port=port_in)]
42+
a, b = compute_power_wave_amplitudes_at_each_port(simulation, port_impedances, sim_data)
43+
indexer = {"f": a.f, "port_in": port_in.name, "port_out": a.port}
44+
a_matrix.loc[indexer] = a
45+
b_matrix.loc[indexer] = b
1846

47+
s_matrix = ab_to_s(a_matrix, b_matrix)
48+
return s_matrix
1949

20-
def _port_reference_impedances(simulation) -> PortDataArray:
50+
51+
def port_reference_impedances(simulation) -> PortDataArray:
2152
"""Tabulates the reference impedance of each port at each frequency using the
2253
supplied :class:`.BatchData`.
2354
"""
@@ -109,39 +140,3 @@ def compute_power_wave_amplitudes_at_each_port(
109140
b.values = F_numpy * (V_numpy - np.conj(Z_numpy) * I_numpy)
110141

111142
return a, b
112-
113-
114-
def _internal_construct_smatrix(simulation, batch_data: typing.Any = None) -> TerminalPortDataArray:
115-
"""Post process :class:`.BatchData` to generate scattering matrix, for internal use only."""
116-
if batch_data is None:
117-
batch_data = simulation.batch_data
118-
119-
from tidy3d.plugins.smatrix.utils import ab_to_s
120-
121-
port_names = [port.name for port in simulation.ports]
122-
123-
values = np.zeros(
124-
(len(simulation.freqs), len(port_names), len(port_names)),
125-
dtype=complex,
126-
)
127-
coords = {
128-
"f": np.array(simulation.freqs),
129-
"port_out": port_names,
130-
"port_in": port_names,
131-
}
132-
a_matrix = TerminalPortDataArray(values, coords=coords)
133-
b_matrix = a_matrix.copy(deep=True)
134-
135-
# Tabulate the reference impedances at each port and frequency
136-
port_impedances = _port_reference_impedances(simulation=simulation)
137-
138-
# loop through source ports
139-
for port_in in simulation.ports:
140-
sim_data = batch_data[simulation._task_name(port=port_in)]
141-
a, b = compute_power_wave_amplitudes_at_each_port(simulation, port_impedances, sim_data)
142-
indexer = {"f": a.f, "port_in": port_in.name, "port_out": a.port}
143-
a_matrix.loc[indexer] = a
144-
b_matrix.loc[indexer] = b
145-
146-
s_matrix = ab_to_s(a_matrix, b_matrix)
147-
return s_matrix

0 commit comments

Comments
 (0)