@@ -543,31 +543,15 @@ def vector_potential(self, xyz):
543543 >>> ax2.set_title('Imag component {} Hz'.format(frequency[f_ind]))
544544
545545 """
546- # r = self.distance(xyz)
547- # f = (
548- # (1j * self.omega * self.mu * self.moment) / (4 * np.pi * r) *
549- # np.exp(-1j * self.wavenumber * r)
550- # )
551- # f = np.kron(np.ones(1, 3), np.atleast_2d(f).T)
552- # return self.dot_orientation(f)
553-
554- n_freq = len (self .frequency )
555- n_loc = np .shape (xyz )[0 ]
556-
557- r = self .distance (xyz )
546+ xyz = check_xyz_dim (xyz )
547+ r = np .linalg .norm (xyz , axis = - 1 )
558548 k = self .wavenumber
559-
560- tile_r = np .tile (r .reshape ((1 , n_loc )), (n_freq , 1 ))
561- tile_w = np .tile (self .omega .reshape ((n_freq , 1 )), (1 , n_loc ))
562-
563- a = (1j * tile_w * self .mu * self .moment ) * (
564- 1 / (4 * np .pi * tile_r ) * np .exp (- 1j * np .outer (k , r ))
565- )
566-
567- v = self .orientation .reshape (1 , 1 , 3 )
568- a = a .reshape ((n_freq , n_loc , 1 ))
569-
570- return np .kron (v , a ).squeeze ()
549+ omega = self .omega
550+ for i in range (r .ndim ):
551+ k = k [..., None ]
552+ omega = omega [..., None ]
553+ f = 1j * omega * self .mu * self .moment / (4 * np .pi * r ) * np .exp (- 1j * k * r )
554+ return (f [..., None ] * self .orientation ).squeeze ()
571555
572556 def electric_field (self , xyz ):
573557 r"""Electric field for the harmonic magnetic dipole at a set of gridded locations.
@@ -650,42 +634,22 @@ def electric_field(self, xyz):
650634 >>> ax2.set_title('Imag component {} Hz'.format(frequency[f_ind]))
651635
652636 """
653- # dxyz = self.vector_distance(xyz)
654- # r = repeat_scalar(self.distance(xyz))
655- # kr = self.wavenumber*r
656- # ikr = 1j * kr
657-
658- # front_term = (
659- # (1j * self.omega * self.mu * self.moment) / (4. * np.pi * r**2) *
660- # (ikr + 1) * np.exp(-ikr)
661- # )
662- # return front_term * self.cross_orientation(dxyz) / r
663-
664- n_freq = len (self .frequency )
665- n_loc = np .shape (xyz )[0 ]
666-
637+ xyz = check_xyz_dim (xyz )
638+ dxyz = xyz - self .location
639+ r = np .linalg .norm (dxyz , axis = - 1 )
667640 k = self .wavenumber
668- r = self .distance (xyz )
669-
670- # (n_freq, n_loc)
671- tile_r = np .tile (r .reshape ((1 , n_loc )), (n_freq , 1 ))
672- tile_w = np .tile (self .omega .reshape ((n_freq , 1 )), (1 , n_loc ))
673- kr = np .outer (k , r )
641+ omega = self .omega
642+ for i in range (r .ndim ):
643+ k = k [..., None ]
644+ omega = omega [..., None ]
645+ kr = k * r
674646 ikr = 1j * kr
675647
676- first_term = (
677- (1j * tile_w * self .mu * self .moment ) *
678- (1 / (4 * np .pi * tile_r ** 2 ) * (ikr + 1 ) * np .exp (- ikr ))
679- ).reshape ((n_freq , n_loc , 1 ))
680- first_term = np .tile (first_term , (1 , 1 , 3 ))
681-
682- r = repeat_scalar (r )
683- dxyz = self .vector_distance (xyz )
684-
685- second_term = (self .cross_orientation (dxyz ) / r ).reshape ((1 , n_loc , 3 ))
686- second_term = np .tile (second_term , (n_freq , 1 , 1 ))
687-
688- return (first_term * second_term ).squeeze ()
648+ front_term = (
649+ (1j * omega * self .mu * self .moment ) / (4. * np .pi * r ** 2 ) *
650+ (ikr + 1 ) * np .exp (- ikr )
651+ ) / r
652+ return (front_term [..., None ] * np .cross (dxyz , self .orientation )).squeeze ()
689653
690654 def current_density (self , xyz ):
691655 r"""Current density for the harmonic magnetic dipole at a set of gridded locations.
@@ -852,53 +816,22 @@ def magnetic_field(self, xyz):
852816 >>> ax2.set_title('Imag component {} Hz'.format(frequency[f_ind]))
853817
854818 """
855- # dxyz = self.vector_distance(xyz)
856- # r = repeat_scalar(self.distance(xyz))
857- # kr = self.wavenumber*r
858- # ikr = 1j*kr
859-
860- # front_term = self.moment / (4. * np.pi * r**3) * np.exp(-ikr)
861- # symmetric_term = (
862- # repeat_scalar(self.dot_orientation(dxyz)) * dxyz *
863- # (-kr**2 + 3*ikr + 3) / r**2
864- # )
865- # oriented_term = (
866- # (kr**2 - ikr - 1) *
867- # np.kron(self.orientation, np.ones((dxyz.shape[0], 1)))
868- # )
869-
870- # return front_term * (symmetric_term + oriented_term)
871-
872- n_freq = len (self .frequency )
873- n_loc = np .shape (xyz )[0 ]
874-
819+ xyz = check_xyz_dim (xyz )
820+ dxyz = xyz - self .location
821+ r = np .linalg .norm (dxyz , axis = - 1 )
875822 k = self .wavenumber
876- r = self .distance (xyz )
877- dxyz = self .vector_distance (xyz )
878-
879- # (n_freq, n_loc)
880- kr = np .outer (k , r )
823+ for i in range (r .ndim ):
824+ k = k [..., None ]
825+ kr = k * r
881826 ikr = 1j * kr
882- tile_r = np .outer (np .ones (n_freq ), r )
883-
884- front_term = self .moment * (
885- 1 / (4 * np .pi * tile_r ** 3 ) * np .exp (- ikr )
886- ).reshape ((n_freq , n_loc , 1 ))
887- front_term = np .tile (front_term , (1 , 1 , 3 ))
888-
889- temp_1 = repeat_scalar (self .dot_orientation (dxyz )) * dxyz
890- temp_1 = np .tile (temp_1 .reshape ((1 , n_loc , 3 )), (n_freq , 1 , 1 ))
891- temp_2 = (- kr ** 2 + 3 * ikr + 3 ) / tile_r ** 2
892- temp_2 = np .tile (temp_2 .reshape ((n_freq , n_loc , 1 )), (1 , 1 , 3 ))
893- symmetric_term = temp_1 * temp_2
894-
895- temp_1 = (kr ** 2 - ikr - 1 )
896- temp_1 = np .tile (temp_1 .reshape ((n_freq , n_loc , 1 )), (1 , 1 , 3 ))
897- temp_2 = np .kron (self .orientation , np .ones ((dxyz .shape [0 ], 1 )))
898- temp_2 = np .tile (temp_2 .reshape ((1 , n_loc , 3 )), (n_freq , 1 , 1 ))
899- oriented_term = temp_1 * temp_2
900-
901- return (front_term * (symmetric_term + oriented_term )).squeeze ()
827+
828+ front_term = self .moment / (4. * np .pi * r ** 3 ) * np .exp (- ikr )
829+
830+ symmetric_term = (dxyz @ self .orientation )[None , ...]* ((- kr ** 2 + 3 * ikr + 3 ) / r ** 2 )
831+
832+ oriented_term = (kr ** 2 - ikr - 1 )[..., None ] * self .orientation
833+
834+ return (front_term [..., None ] * (symmetric_term [..., None ] * dxyz + oriented_term )).squeeze ()
902835
903836 def magnetic_flux_density (self , xyz ):
904837 r"""Magnetic flux density for the harmonic magnetic dipole at a set of gridded locations.
0 commit comments