23
23
from tidy3d .components .geometry .bound_ops import bounds_contains
24
24
from tidy3d .components .types import Axis , Bound
25
25
from tidy3d .constants import (
26
+ AMP ,
26
27
HERTZ ,
27
28
MICROMETER ,
29
+ OHM ,
28
30
PICOSECOND_PER_NANOMETER_PER_KILOMETER ,
29
31
RADIAN ,
30
32
SECOND ,
33
+ VOLT ,
31
34
WATT ,
32
35
)
33
36
from tidy3d .exceptions import DataError , FileError
@@ -1309,6 +1312,165 @@ class PerturbationCoefficientDataArray(DataArray):
1309
1312
_dims = ("wvl" , "coeff" )
1310
1313
1311
1314
1315
+ class VoltageArray (DataArray ):
1316
+ # Always set __slots__ = () to avoid xarray warnings
1317
+ __slots__ = ()
1318
+ _data_attrs = {"units" : VOLT , "long_name" : "voltage" }
1319
+
1320
+
1321
+ class CurrentArray (DataArray ):
1322
+ # Always set __slots__ = () to avoid xarray warnings
1323
+ __slots__ = ()
1324
+ _data_attrs = {"units" : AMP , "long_name" : "current" }
1325
+
1326
+
1327
+ class ImpedanceArray (DataArray ):
1328
+ # Always set __slots__ = () to avoid xarray warnings
1329
+ __slots__ = ()
1330
+ _data_attrs = {"units" : OHM , "long_name" : "impedance" }
1331
+
1332
+
1333
+ # Voltage arrays
1334
+ class VoltageFreqDataArray (VoltageArray , FreqDataArray ):
1335
+ """Voltage data array in frequency domain.
1336
+
1337
+ Example
1338
+ -------
1339
+ >>> import numpy as np
1340
+ >>> f = [2e9, 3e9, 4e9]
1341
+ >>> coords = dict(f=f)
1342
+ >>> data = np.random.random(3) + 1j * np.random.random(3)
1343
+ >>> vfd = VoltageFreqDataArray(data, coords=coords)
1344
+ """
1345
+
1346
+ __slots__ = ()
1347
+
1348
+
1349
+ class VoltageTimeDataArray (VoltageArray , TimeDataArray ):
1350
+ """Voltage data array in time domain.
1351
+
1352
+ Example
1353
+ -------
1354
+ >>> import numpy as np
1355
+ >>> t = [0, 1e-9, 2e-9, 3e-9]
1356
+ >>> coords = dict(t=t)
1357
+ >>> data = np.sin(2 * np.pi * 1e9 * np.array(t))
1358
+ >>> vtd = VoltageTimeDataArray(data, coords=coords)
1359
+ """
1360
+
1361
+ __slots__ = ()
1362
+
1363
+
1364
+ class VoltageFreqModeDataArray (VoltageArray , FreqModeDataArray ):
1365
+ """Voltage data array in frequency-mode domain.
1366
+
1367
+ Example
1368
+ -------
1369
+ >>> import numpy as np
1370
+ >>> f = [2e9, 3e9]
1371
+ >>> mode_index = [0, 1]
1372
+ >>> coords = dict(f=f, mode_index=mode_index)
1373
+ >>> data = np.random.random((2, 2)) + 1j * np.random.random((2, 2))
1374
+ >>> vfmd = VoltageFreqModeDataArray(data, coords=coords)
1375
+ """
1376
+
1377
+ __slots__ = ()
1378
+
1379
+
1380
+ # Current arrays
1381
+ class CurrentFreqDataArray (CurrentArray , FreqDataArray ):
1382
+ """Current data array in frequency domain.
1383
+
1384
+ Example
1385
+ -------
1386
+ >>> import numpy as np
1387
+ >>> f = [2e9, 3e9, 4e9]
1388
+ >>> coords = dict(f=f)
1389
+ >>> data = np.random.random(3) + 1j * np.random.random(3)
1390
+ >>> cfd = CurrentFreqDataArray(data, coords=coords)
1391
+ """
1392
+
1393
+ __slots__ = ()
1394
+
1395
+
1396
+ class CurrentTimeDataArray (CurrentArray , TimeDataArray ):
1397
+ """Current data array in time domain.
1398
+
1399
+ Example
1400
+ -------
1401
+ >>> import numpy as np
1402
+ >>> t = [0, 1e-9, 2e-9, 3e-9]
1403
+ >>> coords = dict(t=t)
1404
+ >>> data = np.cos(2 * np.pi * 1e9 * np.array(t))
1405
+ >>> ctd = CurrentTimeDataArray(data, coords=coords)
1406
+ """
1407
+
1408
+ __slots__ = ()
1409
+
1410
+
1411
+ class CurrentFreqModeDataArray (CurrentArray , FreqModeDataArray ):
1412
+ """Current data array in frequency-mode domain.
1413
+
1414
+ Example
1415
+ -------
1416
+ >>> import numpy as np
1417
+ >>> f = [2e9, 3e9]
1418
+ >>> mode_index = [0, 1]
1419
+ >>> coords = dict(f=f, mode_index=mode_index)
1420
+ >>> data = np.random.random((2, 2)) + 1j * np.random.random((2, 2))
1421
+ >>> cfmd = CurrentFreqModeDataArray(data, coords=coords)
1422
+ """
1423
+
1424
+ __slots__ = ()
1425
+
1426
+
1427
+ # Impedance arrays
1428
+ class ImpedanceFreqDataArray (ImpedanceArray , FreqDataArray ):
1429
+ """Impedance data array in frequency domain.
1430
+
1431
+ Example
1432
+ -------
1433
+ >>> import numpy as np
1434
+ >>> f = [2e9, 3e9, 4e9]
1435
+ >>> coords = dict(f=f)
1436
+ >>> data = 50.0 + 1j * np.random.random(3)
1437
+ >>> zfd = ImpedanceFreqDataArray(data, coords=coords)
1438
+ """
1439
+
1440
+ __slots__ = ()
1441
+
1442
+
1443
+ class ImpedanceTimeDataArray (ImpedanceArray , TimeDataArray ):
1444
+ """Impedance data array in time domain.
1445
+
1446
+ Example
1447
+ -------
1448
+ >>> import numpy as np
1449
+ >>> t = [0, 1e-9, 2e-9, 3e-9]
1450
+ >>> coords = dict(t=t)
1451
+ >>> data = 50.0 * np.ones_like(t)
1452
+ >>> ztd = ImpedanceTimeDataArray(data, coords=coords)
1453
+ """
1454
+
1455
+ __slots__ = ()
1456
+
1457
+
1458
+ class ImpedanceFreqModeDataArray (ImpedanceArray , FreqModeDataArray ):
1459
+ """Impedance data array in frequency-mode domain.
1460
+
1461
+ Example
1462
+ -------
1463
+ >>> import numpy as np
1464
+ >>> f = [2e9, 3e9]
1465
+ >>> mode_index = [0, 1]
1466
+ >>> coords = dict(f=f, mode_index=mode_index)
1467
+ >>> data = 50.0 + 10.0 * np.random.random((2, 2))
1468
+ >>> zfmd = ImpedanceFreqModeDataArray(data, coords=coords)
1469
+ """
1470
+
1471
+ __slots__ = ()
1472
+
1473
+
1312
1474
DATA_ARRAY_TYPES = [
1313
1475
SpatialDataArray ,
1314
1476
ScalarFieldDataArray ,
@@ -1346,6 +1508,15 @@ class PerturbationCoefficientDataArray(DataArray):
1346
1508
SpatialVoltageDataArray ,
1347
1509
PerturbationCoefficientDataArray ,
1348
1510
IndexedTimeDataArray ,
1511
+ VoltageFreqDataArray ,
1512
+ VoltageTimeDataArray ,
1513
+ VoltageFreqModeDataArray ,
1514
+ CurrentFreqDataArray ,
1515
+ CurrentTimeDataArray ,
1516
+ CurrentFreqModeDataArray ,
1517
+ ImpedanceFreqDataArray ,
1518
+ ImpedanceTimeDataArray ,
1519
+ ImpedanceFreqModeDataArray ,
1349
1520
]
1350
1521
DATA_ARRAY_MAP = {data_array .__name__ : data_array for data_array in DATA_ARRAY_TYPES }
1351
1522
@@ -1356,3 +1527,14 @@ class PerturbationCoefficientDataArray(DataArray):
1356
1527
IndexedFieldVoltageDataArray ,
1357
1528
PointDataArray ,
1358
1529
]
1530
+
1531
+ IntegralResultTypes = Union [FreqDataArray , FreqModeDataArray , TimeDataArray ]
1532
+ VoltageIntegralResultTypes = Union [
1533
+ VoltageFreqDataArray , VoltageFreqModeDataArray , VoltageTimeDataArray
1534
+ ]
1535
+ CurrentIntegralResultTypes = Union [
1536
+ CurrentFreqDataArray , CurrentFreqModeDataArray , CurrentTimeDataArray
1537
+ ]
1538
+ ImpedanceResultTypes = Union [
1539
+ ImpedanceFreqDataArray , ImpedanceFreqModeDataArray , ImpedanceTimeDataArray
1540
+ ]
0 commit comments