Skip to content

Commit 2bf599a

Browse files
authored
Merge pull request #61 from jcapriot/B_field_fix
B field fix for magnetic prism
2 parents 1754d53 + 27d7de4 commit 2bf599a

File tree

2 files changed

+44
-103
lines changed

2 files changed

+44
-103
lines changed

geoana/em/fdem/wholespace.py

Lines changed: 35 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -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.

geoana/em/static/freespace.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,15 @@ def magnetic_flux_density(self, xyz):
322322
(..., 3) numpy.ndarray
323323
Magnetic flux density or prism at location xyz in units :math:`T`.
324324
"""
325-
return mu_0 * self.magnetic_field(xyz)
325+
xyz = check_xyz_dim(xyz)
326+
H = self.magnetic_field(xyz)
327+
is_inside = (
328+
np.all(xyz >= self.min_location, axis=-1)
329+
& np.all(xyz <= self.max_location, axis=-1)
330+
)
331+
H[is_inside] = H[is_inside] + self.magnetization
332+
333+
return mu_0 * H
326334

327335
def magnetic_field_gradient(self, xyz):
328336
"""

0 commit comments

Comments
 (0)