@@ -341,6 +341,7 @@ def _far_fields_for_surface(
341
341
phi : ArrayLikeN2F ,
342
342
surface : FieldProjectionSurface ,
343
343
currents : xr .Dataset ,
344
+ medium : MediumType ,
344
345
):
345
346
"""Compute far fields at an angle in spherical coordinates
346
347
for a given set of surface currents and observation angles.
@@ -358,13 +359,14 @@ def _far_fields_for_surface(
358
359
:class:`FieldProjectionSurface` object to use as source of near field.
359
360
currents : xarray.Dataset
360
361
xarray Dataset containing surface currents associated with the surface monitor.
362
+ medium : :class:`.MediumType`
363
+ Background medium through which to project fields.
361
364
362
365
Returns
363
366
-------
364
367
tuple(numpy.ndarray[float], ...)
365
368
``Er``, ``Etheta``, ``Ephi``, ``Hr``, ``Htheta``, ``Hphi`` for the given surface.
366
369
"""
367
-
368
370
pts = [currents [name ].values for name in ["x" , "y" , "z" ]]
369
371
370
372
try :
@@ -393,7 +395,7 @@ def _far_fields_for_surface(
393
395
394
396
phase = [None ] * 3
395
397
propagation_factor = - 1j * AbstractFieldProjectionData .wavenumber (
396
- medium = self . medium , frequency = frequency
398
+ medium = medium , frequency = frequency
397
399
)
398
400
399
401
def integrate_for_one_theta (i_th : int ):
@@ -448,7 +450,7 @@ def integrate_for_one_theta(i_th: int):
448
450
# Lphi (8.34b)
449
451
Lphi = - M [0 ] * sin_phi [None , :] + M [1 ] * cos_phi [None , :]
450
452
451
- eta = ETA_0 / np .sqrt (self . medium .eps_model (frequency ))
453
+ eta = ETA_0 / np .sqrt (medium .eps_model (frequency ))
452
454
453
455
Etheta = - (Lphi + eta * Ntheta )
454
456
Ephi = Ltheta - eta * Nphi
@@ -546,7 +548,8 @@ def _project_fields_angular(
546
548
np .zeros ((1 , len (theta ), len (phi ), len (freqs )), dtype = complex ) for _ in field_names
547
549
]
548
550
549
- k = AbstractFieldProjectionData .wavenumber (medium = self .medium , frequency = freqs )
551
+ medium = monitor .medium if monitor .medium else self .medium
552
+ k = AbstractFieldProjectionData .wavenumber (medium = medium , frequency = freqs )
550
553
phase = np .atleast_1d (
551
554
AbstractFieldProjectionData .propagation_phase (dist = monitor .proj_distance , k = k )
552
555
)
@@ -564,6 +567,7 @@ def _project_fields_angular(
564
567
phi = phi ,
565
568
surface = surface ,
566
569
currents = currents ,
570
+ medium = medium ,
567
571
)
568
572
for field , _field in zip (fields , _fields ):
569
573
field [..., idx_f ] += _field * phase [idx_f ]
@@ -580,7 +584,7 @@ def _project_fields_angular(
580
584
):
581
585
_x , _y , _z = monitor .sph_2_car (monitor .proj_distance , _theta , _phi )
582
586
_fields = self ._fields_for_surface_exact (
583
- x = _x , y = _y , z = _z , surface = surface , currents = currents
587
+ x = _x , y = _y , z = _z , surface = surface , currents = currents , medium = medium
584
588
)
585
589
for field , _field in zip (fields , _fields ):
586
590
field [0 , i , j , :] += _field
@@ -591,7 +595,7 @@ def _project_fields_angular(
591
595
for name , field in zip (field_names , fields )
592
596
}
593
597
return FieldProjectionAngleData (
594
- monitor = monitor , projection_surfaces = self .surfaces , medium = self . medium , ** fields
598
+ monitor = monitor , projection_surfaces = self .surfaces , medium = medium , ** fields
595
599
)
596
600
597
601
def _project_fields_cartesian (
@@ -622,7 +626,8 @@ def _project_fields_cartesian(
622
626
np .zeros ((len (x ), len (y ), len (z ), len (freqs )), dtype = complex ) for _ in field_names
623
627
]
624
628
625
- wavenumber = AbstractFieldProjectionData .wavenumber (medium = self .medium , frequency = freqs )
629
+ medium = monitor .medium if monitor .medium else self .medium
630
+ wavenumber = AbstractFieldProjectionData .wavenumber (medium = medium , frequency = freqs )
626
631
627
632
# Zip together all combinations of observation points for better progress tracking
628
633
iter_coords = [
@@ -655,12 +660,13 @@ def _project_fields_cartesian(
655
660
phi = phi ,
656
661
surface = surface ,
657
662
currents = currents ,
663
+ medium = medium ,
658
664
)
659
665
for field , _field in zip (fields , _fields ):
660
666
field [i , j , k , idx_f ] += _field * phase [idx_f ]
661
667
else :
662
668
_fields = self ._fields_for_surface_exact (
663
- x = _x , y = _y , z = _z , surface = surface , currents = currents
669
+ x = _x , y = _y , z = _z , surface = surface , currents = currents , medium = medium
664
670
)
665
671
for field , _field in zip (fields , _fields ):
666
672
field [i , j , k , :] += _field
@@ -671,7 +677,7 @@ def _project_fields_cartesian(
671
677
for name , field in zip (field_names , fields )
672
678
}
673
679
return FieldProjectionCartesianData (
674
- monitor = monitor , projection_surfaces = self .surfaces , medium = self . medium , ** fields
680
+ monitor = monitor , projection_surfaces = self .surfaces , medium = medium , ** fields
675
681
)
676
682
677
683
def _project_fields_kspace (
@@ -698,7 +704,8 @@ def _project_fields_kspace(
698
704
field_names = ("Er" , "Etheta" , "Ephi" , "Hr" , "Htheta" , "Hphi" )
699
705
fields = [np .zeros ((len (ux ), len (uy ), 1 , len (freqs )), dtype = complex ) for _ in field_names ]
700
706
701
- k = AbstractFieldProjectionData .wavenumber (medium = self .medium , frequency = freqs )
707
+ medium = monitor .medium if monitor .medium else self .medium
708
+ k = AbstractFieldProjectionData .wavenumber (medium = medium , frequency = freqs )
702
709
phase = np .atleast_1d (
703
710
AbstractFieldProjectionData .propagation_phase (dist = monitor .proj_distance , k = k )
704
711
)
@@ -726,14 +733,15 @@ def _project_fields_kspace(
726
733
phi = phi ,
727
734
surface = surface ,
728
735
currents = currents ,
736
+ medium = medium ,
729
737
)
730
738
for field , _field in zip (fields , _fields ):
731
739
field [i , j , 0 , idx_f ] += _field * phase [idx_f ]
732
740
733
741
else :
734
742
_x , _y , _z = monitor .sph_2_car (monitor .proj_distance , theta , phi )
735
743
_fields = self ._fields_for_surface_exact (
736
- x = _x , y = _y , z = _z , surface = surface , currents = currents
744
+ x = _x , y = _y , z = _z , surface = surface , currents = currents , medium = medium
737
745
)
738
746
for field , _field in zip (fields , _fields ):
739
747
field [i , j , 0 , :] += _field
@@ -749,7 +757,7 @@ def _project_fields_kspace(
749
757
for name , field in zip (field_names , fields )
750
758
}
751
759
return FieldProjectionKSpaceData (
752
- monitor = monitor , projection_surfaces = self .surfaces , medium = self . medium , ** fields
760
+ monitor = monitor , projection_surfaces = self .surfaces , medium = medium , ** fields
753
761
)
754
762
755
763
"""Exact projections"""
@@ -761,6 +769,7 @@ def _fields_for_surface_exact(
761
769
z : float ,
762
770
surface : FieldProjectionSurface ,
763
771
currents : xr .Dataset ,
772
+ medium : MediumType ,
764
773
):
765
774
"""Compute projected fields in spherical coordinates at a given projection point on a
766
775
Cartesian grid for a given set of surface currents using the exact homogeneous medium
@@ -778,20 +787,21 @@ def _fields_for_surface_exact(
778
787
:class:`FieldProjectionSurface` object to use as source of near field.
779
788
currents : xarray.Dataset
780
789
xarray Dataset containing surface currents associated with the surface monitor.
790
+ medium : :class:`.MediumType`
791
+ Background medium through which to project fields.
781
792
782
793
Returns
783
794
-------
784
795
tuple(np.ndarray, np.ndarray, np.ndarray, np.ndarray, np.ndarray, np.ndarray)
785
796
``Er``, ``Etheta``, ``Ephi``, ``Hr``, ``Htheta``, ``Hphi`` projected fields for
786
797
each frequency.
787
798
"""
788
-
789
799
freqs = np .array (self .frequencies )
790
800
i_omega = 1j * 2.0 * np .pi * freqs [None , None , None , :]
791
- wavenumber = AbstractFieldProjectionData .wavenumber (frequency = freqs , medium = self . medium )
801
+ wavenumber = AbstractFieldProjectionData .wavenumber (frequency = freqs , medium = medium )
792
802
wavenumber = wavenumber [None , None , None , :] # add space dimensions
793
803
794
- eps_complex = self . medium .eps_model (frequency = freqs )
804
+ eps_complex = medium .eps_model (frequency = freqs )
795
805
epsilon = EPSILON_0 * eps_complex [None , None , None , :]
796
806
797
807
# source points
0 commit comments