loop#

empymod.model.loop(src, rec, depth, res, freqtime, signal=None, aniso=None, epermH=None, epermV=None, mpermH=None, mpermV=None, mrec=True, recpts=1, strength=0, **kwargs)[source]#

Return EM fields due to a magnetic source loop.

Calculate the electromagnetic frequency- or time-domain field due to an arbitrary rotated, magnetic source consisting of an electric loop, measured by arbitrary rotated, finite electric or magnetic bipole receivers or arbitrary rotated magnetic receivers consisting of electric loops. By default, the electromagnetic response is normalized to source loop area of 1 m2 and receiver length or area of 1 m or 1 m2, respectively, and source strength of 1 A.

A magnetic dipole, as used in dipole and bipole, has a moment of \(I^m ds\). However, if the magnetic dipole is generated by an electric-wire loop, this changes to \(I^m = i\omega\mu A I^e\), where A is the area of the loop. The same factor \(i\omega\mu A\), applies to the receiver, if it consists of an electric-wire loop.

The current implementation only handles loop sources and receivers in layers where \(\mu_r^h=\mu_r^v\); the horizontal magnetic permeability is used, and a warning is thrown if the vertical differs from the horizontal one.

Note that the kernel internally still calculates dipole sources and receivers, the moment is a factor that is multiplied in the frequency domain. The logs will therefore still inform about bipoles and dipoles.

Parameters:
src, reclist of floats or arrays

Source and receiver coordinates (m):

  • [x0, x1, y0, y1, z0, z1] (bipole of finite length)

  • [x, y, z, azimuth, dip] (dipole, infinitesimal small)

Dimensions:

  • The coordinates x, y, and z (dipole) or x0, x1, y0, y1, z0, and z1 (bipole) can be single values or arrays.

  • The variables x and y (dipole) or x0, x1, y0, and y1 (bipole) must have the same dimensions.

  • The variables z, azimuth, and dip (dipole) or z0 and z1 (bipole) must either be single values or having the same dimension as the other coordinates.

Angles (coordinate system is either left-handed with positive z down or right-handed with positive z up; East-North-Depth):

  • azimuth (°): horizontal deviation from x-axis, anti-clockwise.

  • +/-dip (°): vertical deviation from xy-plane down/up-wards.

Sources or receivers placed on a layer interface are considered in the upper layer.

depthlist

Absolute layer interfaces z (m); #depth = #res - 1 (excluding +/- infinity).

resarray_like

Horizontal resistivities rho_h (Ohm.m); #res = #depth + 1.

Alternatively, res can be a dictionary. See the main manual of empymod too see how to exploit this hook to re-calculate etaH, etaV, zetaH, and zetaV, which can be used to, for instance, use the Cole-Cole model for IP.

freqtimearray_like

Frequencies f (Hz) if signal==None, else times t (s); (f, t > 0).

signal{None, 0, 1, -1}, default: None

Source signal:

  • None: Frequency-domain response

  • -1 : Switch-off time-domain response

  • 0 : Impulse time-domain response

  • +1 : Switch-on time-domain response

anisoarray_like, default: ones

Anisotropies lambda = sqrt(rho_v/rho_h) (-); #aniso = #res.

epermH, epermVarray_like, default: ones

Relative horizontal/vertical electric permittivities epsilon_h/epsilon_v (-); #epermH = #epermV = #res. If epermH is provided but not epermV, isotropic behaviour is assumed.

mpermH, mpermVarray_like, default: ones

Relative horizontal/vertical magnetic permeabilities mu_h/mu_v (-); #mpermH = #mpermV = #res. If mpermH is provided but not mpermV, isotropic behaviour is assumed.

Note that the relative horizontal and vertical magnetic permeabilities in layers with loop sources or receivers will be set to 1.

mrecbool or string, default: True

Receiver options:

  • True: Magnetic dipole receiver;

  • False: Electric dipole receiver;

  • ‘loop’: Magnetic receiver consisting of an electric-wire loop.

recptsint, default: 1

Number of integration points for bipole receiver:

  • recpts < 3 : bipole, but calculated as dipole at centre

  • recpts >= 3 : bipole

Note that if mrec=’loop’, recpts will be set to 1.

strengthfloat, default: 0.0

Source strength (A):

  • If 0, output is normalized to source of 1 m2 area and receiver of 1 m length or 1 m2 area, and source strength of 1 A.

  • If != 0, output is returned for given source strength and receiver length (if mrec!=’loop’).

The strength is simply a multiplication factor. It can also be used to provide the source and receiver loop area, or also to multiply by :math:mu_0`, if you want the B-field instead of the H-field.

verb{0, 1, 2, 3, 4}, default: 2

Level of verbosity:

  • 0: Print nothing.

  • 1: Print warnings.

  • 2: Print additional runtime and kernel calls

  • 3: Print additional start/stop, condensed parameter information.

  • 4: Print additional full parameter information

ht, htarg, ft, ftarg, xdirect, loopsettings, optinal

See docstring of bipole for a description.

squeezebool, default: True

If True, the output is squeezed. If False, the output will always be of ndim=3, (nfreqtime, nrec, nsrc).

Returns:
EMEMArray, (nfreqtime, nrec, nsrc)

Frequency- or time-domain EM field (depending on signal):

  • If rec is electric, returns E [V/m].

  • If rec is magnetic, returns H [A/m].

EMArray is a subclassed ndarray with .pha and .amp attributes (only relevant for frequency-domain data).

See also

dipole

EM fields due to infinitesimal small EM dipoles.

bipole

EM fields due to arbitrary rotated, finite length EM dipoles.

Examples

In [1]: import empymod
   ...: import numpy as np
   ...: # z-directed loop source: x, y, z, azimuth, dip
   ...: src = [0, 0, 0, 0, 90]
   ...: # z-directed magn. dipole receiver-array: x, y, z, azimuth, dip
   ...: rec = [np.arange(1, 11)*500, np.zeros(10), 200, 0, 90]
   ...: # layer boundaries
   ...: depth = [0, 300, 500]
   ...: # layer resistivities
   ...: res = [2e14, 10, 500, 10]
   ...: # Frequency
   ...: freq = 1
   ...: # Calculate magnetic field due to a loop source at 1 Hz.
   ...: # [mrec = True (default)]
   ...: EMfield = empymod.loop(src, rec, depth, res, freq, verb=3)
   ...: 

:: empymod START  ::  v2.3.0

   depth       [m] :  0 300 500
   res     [Ohm.m] :  2E+14 10 500 10
   aniso       [-] :  1 1 1 1
   epermH      [-] :  1 1 1 1
   epermV      [-] :  1 1 1 1
   mpermH      [-] :  1 1 1 1
   mpermV      [-] :  1 1 1 1
   direct field    :  Comp. in wavenumber domain
   frequency  [Hz] :  1
   Hankel          :  DLF (Fast Hankel Transform)
     > Filter      :  key_201_2009
     > DLF type    :  Standard
   Loop over       :  None (all vectorized)
   Source(s)       :  1 dipole(s)
     > x       [m] :  0
     > y       [m] :  0
     > z       [m] :  0
     > azimuth [°] :  0
     > dip     [°] :  90
   Receiver(s)     :  10 dipole(s)
     > x       [m] :  500 - 5000 : 10  [min-max; #]
     > y       [m] :  0 - 0 : 10  [min-max; #]
     > z       [m] :  200
     > azimuth [°] :  0
     > dip     [°] :  90
   Required ab's   :  33

:: empymod END; runtime = 0:00:00.002329 :: 1 kernel call(s)


In [2]: EMfield[0]
Out[2]: (-3.054498478653836e-10-2.0037418529368025e-11j)