|
2 | 2 |
|
3 | 3 | from __future__ import annotations
|
4 | 4 |
|
5 |
| -import os |
6 | 5 | from typing import Optional, Union
|
7 | 6 |
|
8 | 7 | import numpy as np
|
9 | 8 | import pydantic.v1 as pd
|
10 | 9 |
|
11 | 10 | from tidy3d.components.base import cached_property
|
| 11 | +from tidy3d.components.data.data_array import DataArray, FreqDataArray |
| 12 | +from tidy3d.components.data.monitor_data import MonitorData |
| 13 | +from tidy3d.components.data.sim_data import SimulationData |
12 | 14 | from tidy3d.components.geometry.utils_2d import snap_coordinate_to_grid
|
| 15 | +from tidy3d.components.microwave.data.monitor_data import AntennaMetricsData |
13 | 16 | from tidy3d.components.monitor import DirectivityMonitor
|
14 | 17 | from tidy3d.components.simulation import Simulation
|
15 | 18 | from tidy3d.components.source.time import GaussianPulse
|
@@ -323,32 +326,131 @@ def run(self, path_dir: str = DEFAULT_DATA_DIR):
|
323 | 326 | from tidy3d.plugins.smatrix.data.data import SMatrixData, TerminalComponentModelerData
|
324 | 327 |
|
325 | 328 | _ = self.get_path_dir(path_dir)
|
326 |
| - _ = self._upload_terminal_modeler() |
| 329 | + # _ = self._upload_terminal_modeler() |
327 | 330 | batch_data = self._construct_smatrix()
|
328 | 331 | smatrix_data = SMatrixData(batch_data=batch_data)
|
329 | 332 | return TerminalComponentModelerData(simulation=self, data=(smatrix_data,))
|
330 | 333 |
|
331 |
| - @cached_property |
332 |
| - def _terminal_modeler_path(self) -> str: |
333 |
| - """Where we store the for this :class:`TerminalComponentModeler` instance after the run.""" |
334 |
| - return os.path.join(self.path_dir, "tcp_" + str(hash(self)) + ".hdf5") |
335 |
| - |
336 |
| - def _upload_terminal_modeler(self): |
337 |
| - # TODO properly refactor, plugins data types should not have web methods. |
338 |
| - from tidy3d.web.api.container import Job |
339 |
| - |
340 |
| - # first try loading the terminal_component_modeler from file, if it exists |
341 |
| - terminal_modeler_path = self._terminal_modeler_path |
342 |
| - |
343 |
| - if os.path.exists(terminal_modeler_path): |
344 |
| - return Job.from_file(fname=terminal_modeler_path) |
345 |
| - |
346 |
| - return Job( |
347 |
| - simulation=self, |
348 |
| - task_name=self.name, |
349 |
| - folder_name=self.folder_name, |
350 |
| - callback_url=self.callback_url, |
351 |
| - verbose=self.verbose, |
352 |
| - solver_version=self.solver_version, |
353 |
| - simulation_type="microwave", |
| 334 | + ##### Backwards compatibility methods ##### |
| 335 | + |
| 336 | + def compute_power_wave_amplitudes_at_each_port( |
| 337 | + self, port_reference_impedances: PortDataArray, sim_data: SimulationData |
| 338 | + ) -> tuple[PortDataArray, PortDataArray]: |
| 339 | + from tidy3d.plugins.smatrix.data.data import SMatrixData, TerminalComponentModelerData |
| 340 | + |
| 341 | + a = SMatrixData(a=self.batch_data) |
| 342 | + data = TerminalComponentModelerData( |
| 343 | + simulation=self, data=a |
| 344 | + ).compute_power_wave_amplitudes_at_each_port( |
| 345 | + port_reference_impedances=port_reference_impedances, sim_data=sim_data |
| 346 | + ) |
| 347 | + return data |
| 348 | + |
| 349 | + def _monitor_data_at_port_amplitude( |
| 350 | + self, |
| 351 | + port: TerminalPortType, |
| 352 | + sim_data: SimulationData, |
| 353 | + monitor_data: MonitorData, |
| 354 | + a_port: Union[FreqDataArray, complex], |
| 355 | + ) -> MonitorData: |
| 356 | + from tidy3d.plugins.smatrix.data.data import SMatrixData, TerminalComponentModelerData |
| 357 | + |
| 358 | + a = SMatrixData(a=self.batch_data) |
| 359 | + data = TerminalComponentModelerData( |
| 360 | + simulation=self, data=a |
| 361 | + )._monitor_data_at_port_amplitude( |
| 362 | + port=port, sim_data=sim_data, monitor_data=monitor_data, a_port=a_port |
354 | 363 | )
|
| 364 | + return data |
| 365 | + |
| 366 | + def get_antenna_metrics_data( |
| 367 | + self, |
| 368 | + port_amplitudes: Optional[dict[str, complex]] = None, |
| 369 | + monitor_name: Optional[str] = None, |
| 370 | + ) -> AntennaMetricsData: |
| 371 | + from tidy3d.plugins.smatrix.data.data import SMatrixData, TerminalComponentModelerData |
| 372 | + |
| 373 | + a = SMatrixData(a=self.batch_data) |
| 374 | + data = TerminalComponentModelerData(simulation=self, data=a).get_antenna_metrics_data( |
| 375 | + port_amplitudes=port_amplitudes, monitor_name=monitor_name |
| 376 | + ) |
| 377 | + return data |
| 378 | + |
| 379 | + @staticmethod |
| 380 | + def _check_port_impedance_sign(Z_numpy: np.ndarray): |
| 381 | + from tidy3d.plugins.smatrix.utils import _check_port_impedance_sign |
| 382 | + |
| 383 | + return _check_port_impedance_sign(Z_numpy) |
| 384 | + |
| 385 | + @cached_property |
| 386 | + def port_reference_impedances(self) -> PortDataArray: |
| 387 | + from tidy3d.plugins.smatrix.data.data import SMatrixData, TerminalComponentModelerData |
| 388 | + |
| 389 | + a = SMatrixData(a=self.batch_data) |
| 390 | + data = TerminalComponentModelerData(simulation=self, data=a).port_reference_impedances |
| 391 | + return data |
| 392 | + |
| 393 | + @staticmethod |
| 394 | + def s_to_z( |
| 395 | + s_matrix: TerminalPortDataArray, reference: Union[complex, PortDataArray] |
| 396 | + ) -> DataArray: |
| 397 | + from tidy3d.plugins.smatrix.utils import s_to_z |
| 398 | + |
| 399 | + return s_to_z(s_matrix=s_matrix, reference=reference) |
| 400 | + |
| 401 | + @staticmethod |
| 402 | + def ab_to_s( |
| 403 | + a_matrix: TerminalPortDataArray, b_matrix: TerminalPortDataArray |
| 404 | + ) -> TerminalPortDataArray: |
| 405 | + from tidy3d.plugins.smatrix.utils import ab_to_s |
| 406 | + |
| 407 | + return ab_to_s(a_matrix=a_matrix, b_matrix=b_matrix) |
| 408 | + |
| 409 | + @staticmethod |
| 410 | + def compute_power_delivered_by_port( |
| 411 | + port: Union[LumpedPort, CoaxialLumpedPort], sim_data: SimulationData |
| 412 | + ) -> FreqDataArray: |
| 413 | + from tidy3d.plugins.smatrix.utils import compute_power_delivered_by_port |
| 414 | + |
| 415 | + return compute_power_delivered_by_port(port=port, sim_data=sim_data) |
| 416 | + |
| 417 | + @staticmethod |
| 418 | + def compute_power_wave_amplitudes( |
| 419 | + port: Union[LumpedPort, CoaxialLumpedPort], sim_data: SimulationData |
| 420 | + ) -> tuple[FreqDataArray, FreqDataArray]: |
| 421 | + from tidy3d.plugins.smatrix.utils import compute_power_wave_amplitudes |
| 422 | + |
| 423 | + return compute_power_wave_amplitudes(port=port, sim_data=sim_data) |
| 424 | + |
| 425 | + @staticmethod |
| 426 | + def compute_port_VI( |
| 427 | + port_out: TerminalPortType, sim_data: SimulationData |
| 428 | + ) -> tuple[FreqDataArray, FreqDataArray]: |
| 429 | + from tidy3d.plugins.smatrix.utils import compute_port_VI |
| 430 | + |
| 431 | + return compute_port_VI(port_out=port_out, sim_data=sim_data) |
| 432 | + |
| 433 | + # @cached_property |
| 434 | + # def _terminal_modeler_path(self) -> str: |
| 435 | + # """Where we store the for this :class:`TerminalComponentModeler` instance after the run.""" |
| 436 | + # return os.path.join(self.path_dir, "tcp_" + str(hash(self)) + ".hdf5") |
| 437 | + # |
| 438 | + # def _upload_terminal_modeler(self): |
| 439 | + # # TODO properly refactor, plugins data types should not have web methods. |
| 440 | + # from tidy3d.web.api.container import Job |
| 441 | + # |
| 442 | + # # first try loading the terminal_component_modeler from file, if it exists |
| 443 | + # terminal_modeler_path = self._terminal_modeler_path |
| 444 | + # |
| 445 | + # if os.path.exists(terminal_modeler_path): |
| 446 | + # return Job.from_file(fname=terminal_modeler_path) |
| 447 | + # |
| 448 | + # return Job( |
| 449 | + # simulation=self, |
| 450 | + # task_name=self.name, |
| 451 | + # folder_name=self.folder_name, |
| 452 | + # callback_url=self.callback_url, |
| 453 | + # verbose=self.verbose, |
| 454 | + # solver_version=self.solver_version, |
| 455 | + # simulation_type="microwave", |
| 456 | + # ) |
0 commit comments