@@ -302,110 +302,6 @@ def ensure_member_exists(self, member_name: str):
302
302
303
303
""" Subclasses of MonitorData and CollectionData """
304
304
305
- class FreqData (MonitorData , ABC ):
306
- """Stores frequency-domain data using an ``f`` dimension for frequency in Hz."""
307
-
308
- f : Array [float ]
309
-
310
- @abstractmethod
311
- def normalize (self , source_freq_amps : Array [complex ]) -> None :
312
- """Normalize values of frequency-domain data by source amplitude spectrum."""
313
-
314
-
315
- class TimeData (MonitorData , ABC ):
316
- """Stores time-domain data using a ``t`` attribute for time in seconds."""
317
-
318
- t : Array [float ]
319
-
320
-
321
- class AbstractScalarFieldData (MonitorData , ABC ):
322
- """Stores a single, scalar field as a function of spatial coordinates x,y,z."""
323
-
324
- x : Array [float ]
325
- y : Array [float ]
326
- z : Array [float ]
327
-
328
-
329
- class PlanarData (MonitorData , ABC ):
330
- """Stores data that must be found via a planar monitor."""
331
-
332
-
333
- class AbstractFluxData (PlanarData , ABC ):
334
- """Stores electromagnetic flux through a plane."""
335
-
336
-
337
- """ usable monitors """
338
-
339
-
340
- class ScalarFieldData (AbstractScalarFieldData , FreqData ):
341
- """Stores a single scalar field in frequency-domain.
342
-
343
- Parameters
344
- ----------
345
- x : numpy.ndarray
346
- Data coordinates in x direction (um).
347
- y : numpy.ndarray
348
- Data coordinates in y direction (um).
349
- z : numpy.ndarray
350
- Data coordinates in z direction (um).
351
- f : numpy.ndarray
352
- Frequency coordinates (Hz).
353
- values : numpy.ndarray
354
- Complex-valued array of shape ``(len(x), len(y), len(z), len(f))`` storing field values.
355
-
356
- Example
357
- -------
358
- >>> f = np.linspace(1e14, 2e14, 1001)
359
- >>> x = np.linspace(-1, 1, 10)
360
- >>> y = np.linspace(-2, 2, 20)
361
- >>> z = np.linspace(0, 0, 1)
362
- >>> values = (1+1j) * np.random.random((len(x), len(y), len(z), len(f)))
363
- >>> data = ScalarFieldData(values=values, x=x, y=y, z=z, f=f)
364
- """
365
-
366
- values : Array [complex ]
367
- data_attrs : Dict [str , str ] = None # {'units': '[E] = V/um, [H] = A/um'}
368
- type : Literal ["ScalarFieldData" ] = "ScalarFieldData"
369
-
370
- _dims = ("x" , "y" , "z" , "f" )
371
-
372
- def normalize (self , source_freq_amps : Array [complex ]) -> None :
373
- """normalize the values by the amplitude of the source."""
374
- self .values /= 1j * source_freq_amps # pylint: disable=no-member
375
-
376
-
377
- class ScalarFieldTimeData (AbstractScalarFieldData , TimeData ):
378
- """stores a single scalar field in time domain
379
-
380
- Parameters
381
- ----------
382
- x : numpy.ndarray
383
- Data coordinates in x direction (um).
384
- y : numpy.ndarray
385
- Data coordinates in y direction (um).
386
- z : numpy.ndarray
387
- Data coordinates in z direction (um).
388
- t : numpy.ndarray
389
- Time coordinates (sec).
390
- values : numpy.ndarray
391
- Real-valued array of shape ``(len(x), len(y), len(z), len(t))`` storing field values.
392
-
393
- Example
394
- -------
395
- >>> t = np.linspace(0, 1e-12, 1001)
396
- >>> x = np.linspace(-1, 1, 10)
397
- >>> y = np.linspace(-2, 2, 20)
398
- >>> z = np.linspace(0, 0, 1)
399
- >>> values = np.random.random((len(x), len(y), len(z), len(t)))
400
- >>> data = ScalarFieldTimeData(values=values, x=x, y=y, z=z, t=t)
401
- """
402
-
403
- values : Array [float ]
404
- data_attrs : Dict [str , str ] = None # {'units': '[E] = V/m, [H] = A/m'}
405
- type : Literal ["ScalarFieldTimeData" ] = "ScalarFieldTimeData"
406
-
407
- _dims = ("x" , "y" , "z" , "t" )
408
-
409
305
410
306
class AbstractFieldData (CollectionData , ABC ):
411
307
"""Sores a collection of EM fields either in freq or time domain."""
@@ -502,6 +398,7 @@ def colocate(self, x, y, z) -> xr.Dataset:
502
398
# import pdb; pdb.set_trace()
503
399
return xr .Dataset (centered_data_dict )
504
400
401
+ # pylint:disable=too-many-locals
505
402
def apply_syms (self , new_grid : YeeGrid , sym_center : Coordinate , symmetry : Symmetry ):
506
403
"""Create a new AbstractFieldData subclass by interpolating on the supplied ``new_grid``,
507
404
using symmetries as defined by ``sym_center`` and ``symmetry``."""
@@ -520,7 +417,7 @@ def apply_syms(self, new_grid: YeeGrid, sym_center: Coordinate, symmetry: Symmet
520
417
521
418
for field , scalar_data in self .data_dict .items ():
522
419
new_data = scalar_data .data
523
-
420
+
524
421
# Get new grid locations
525
422
yee_coords = yee_grid_dict [field ].to_list
526
423
@@ -544,11 +441,116 @@ def apply_syms(self, new_grid: YeeGrid, sym_center: Coordinate, symmetry: Symmet
544
441
# Apply the correct +/-1 for the field component
545
442
new_data [{dim_name : flip_inds }] *= sym * component_sym_dict [field ][dim ]
546
443
547
- new_data_dict [field ] = ScalarFieldData (values = new_data .values , ** new_data .coords )
444
+ new_data_dict [field ] = type ( scalar_data ) (values = new_data .values , ** new_data .coords )
548
445
549
446
return type (self )(data_dict = new_data_dict )
550
447
551
448
449
+ class FreqData (MonitorData , ABC ):
450
+ """Stores frequency-domain data using an ``f`` dimension for frequency in Hz."""
451
+
452
+ f : Array [float ]
453
+
454
+ @abstractmethod
455
+ def normalize (self , source_freq_amps : Array [complex ]) -> None :
456
+ """Normalize values of frequency-domain data by source amplitude spectrum."""
457
+
458
+
459
+ class TimeData (MonitorData , ABC ):
460
+ """Stores time-domain data using a ``t`` attribute for time in seconds."""
461
+
462
+ t : Array [float ]
463
+
464
+
465
+ class AbstractScalarFieldData (MonitorData , ABC ):
466
+ """Stores a single, scalar field as a function of spatial coordinates x,y,z."""
467
+
468
+ x : Array [float ]
469
+ y : Array [float ]
470
+ z : Array [float ]
471
+
472
+
473
+ class PlanarData (MonitorData , ABC ):
474
+ """Stores data that must be found via a planar monitor."""
475
+
476
+
477
+ class AbstractFluxData (PlanarData , ABC ):
478
+ """Stores electromagnetic flux through a plane."""
479
+
480
+
481
+ """ usable monitors """
482
+
483
+
484
+ class ScalarFieldData (AbstractScalarFieldData , FreqData ):
485
+ """Stores a single scalar field in frequency-domain.
486
+
487
+ Parameters
488
+ ----------
489
+ x : numpy.ndarray
490
+ Data coordinates in x direction (um).
491
+ y : numpy.ndarray
492
+ Data coordinates in y direction (um).
493
+ z : numpy.ndarray
494
+ Data coordinates in z direction (um).
495
+ f : numpy.ndarray
496
+ Frequency coordinates (Hz).
497
+ values : numpy.ndarray
498
+ Complex-valued array of shape ``(len(x), len(y), len(z), len(f))`` storing field values.
499
+
500
+ Example
501
+ -------
502
+ >>> f = np.linspace(1e14, 2e14, 1001)
503
+ >>> x = np.linspace(-1, 1, 10)
504
+ >>> y = np.linspace(-2, 2, 20)
505
+ >>> z = np.linspace(0, 0, 1)
506
+ >>> values = (1+1j) * np.random.random((len(x), len(y), len(z), len(f)))
507
+ >>> data = ScalarFieldData(values=values, x=x, y=y, z=z, f=f)
508
+ """
509
+
510
+ values : Array [complex ]
511
+ data_attrs : Dict [str , str ] = None # {'units': '[E] = V/um, [H] = A/um'}
512
+ type : Literal ["ScalarFieldData" ] = "ScalarFieldData"
513
+
514
+ _dims = ("x" , "y" , "z" , "f" )
515
+
516
+ def normalize (self , source_freq_amps : Array [complex ]) -> None :
517
+ """normalize the values by the amplitude of the source."""
518
+ self .values /= 1j * source_freq_amps # pylint: disable=no-member
519
+
520
+
521
+ class ScalarFieldTimeData (AbstractScalarFieldData , TimeData ):
522
+ """stores a single scalar field in time domain
523
+
524
+ Parameters
525
+ ----------
526
+ x : numpy.ndarray
527
+ Data coordinates in x direction (um).
528
+ y : numpy.ndarray
529
+ Data coordinates in y direction (um).
530
+ z : numpy.ndarray
531
+ Data coordinates in z direction (um).
532
+ t : numpy.ndarray
533
+ Time coordinates (sec).
534
+ values : numpy.ndarray
535
+ Real-valued array of shape ``(len(x), len(y), len(z), len(t))`` storing field values.
536
+
537
+ Example
538
+ -------
539
+ >>> t = np.linspace(0, 1e-12, 1001)
540
+ >>> x = np.linspace(-1, 1, 10)
541
+ >>> y = np.linspace(-2, 2, 20)
542
+ >>> z = np.linspace(0, 0, 1)
543
+ >>> values = np.random.random((len(x), len(y), len(z), len(t)))
544
+ >>> data = ScalarFieldTimeData(values=values, x=x, y=y, z=z, t=t)
545
+ """
546
+
547
+ values : Array [float ]
548
+ data_attrs : Dict [str , str ] = None # {'units': '[E] = V/m, [H] = A/m'}
549
+ type : Literal ["ScalarFieldTimeData" ] = "ScalarFieldTimeData"
550
+
551
+ _dims = ("x" , "y" , "z" , "t" )
552
+
553
+
552
554
class FieldData (AbstractFieldData ):
553
555
"""Stores a collection of scalar fields in the frequency domain from a :class:`FieldMonitor`.
554
556
0 commit comments