In [ ]:
from geoscilabs.em.DipoleWidgetFD import DipoleWidgetFD, InteractiveDipoleProfile
from geoscilabs.em.VolumeWidget import InteractivePlanes, plotObj3D
from IPython.display import YouTubeVideo

Electrical Dipole in a Whole-space (frequency-domain)

In [ ]:
YouTubeVideo("tTQOm096Oq4", width=600, height=400)


By using an analytic solution electromagnetic (EM) fields from electrical dipole in a Whole-space, we present some fundamentals of EM responses in the context of crosswell EM survey.

Set up

For frequency domain EM method using galvanic source, we inject sinusoidal currents to the earth through electrodes.

Crosswell EM geometry

Here, we choose geometric parameters for a crosswell EM set-up having two boreholes for Tx and Rx. In the Tx hole, a VED source is located at (0m, 0m, 0m), and it is fixed. Horizontal location of the Rx hole is fixed to 50m apart from the source location in x-direction.

In [ ]:
ax = plotObj3D()


When using crosswell electromagnetic (EM) survey, we inject DC or sinusoidal currents to the earth using (+) and (-) current electrodes, and measure voltages between potential electrodes. A common goal here is imaging conductivity structure of the earth by interpreting measured voltages. However, to accomplish that task well, we first need to understand physical behavior of EM responses for the given survey set-up.

Assuming length of the current elecrodes are small enough, this can be assumed as electrical dipole (ED). For a croswell set-up, let we have a vertical electic dipole (VED) source in a homogeneous earth with sinusodal currents, then we can have analytic solution of EM fields in frequency domain (WH1988). Solution of of arbitrary EM fields, $\mathbf{F}$, will be a function of

$$ \mathbf{F} (x, y, z; \sigma, f),$$

where $\sigma$ is conductivity of homogenous earth (S/m), and $f$ is transmitting frequency (Hz). Here $\mathbf{F}$ can be electic ($\mathbf{E}$) or magnetic field ($\mathbf{H}$), or current density ($\mathbf{J}$). Now, you will explore how EM responses behaves as a function of space, $\sigma$, and $f$ for the given crosswell EM set-up .

Geometry app

Choose an plane of interest and the number of receivers.


  • plane: Choose either "XZ" or "YZ" plane
  • offset: Offset from a source plane (m)
  • nRx: The number of receivers in the Rx hole

Chosen geometric parameters will be used in the Electric Dipole widget below.

In [ ]:
Q0 = InteractivePlanes(planevalue="XZ", offsetvalue=0.)

Electric Dipole app

Explore behavior of EM fields, $\mathbf{F} (x, y, z; \sigma, f)$ on 2D plane chosen in the above app. And also at the receiver locations.


  • Field: Type of EM fields ("E": electric field, "H": magnetic field, "J": current density)
  • AmpDir: Type of the vectoral EM fields

    None: $F_x$ or $F_y$ or $F_z$

    Amp: $\mathbf{F} \cdot \mathbf{F}^* = |\mathbf{F}|^2$

    Dir: Real part of a vectoral EM fields, $\Re[\mathbf{F}]$

  • Comp.: Direction of $\mathbf{F}$ at Rx locations

  • ComplexNumber: Type of complex data ("Re", "Im", "Amp", "Phase")
  • $f$: Transmitting frequency (Hz)
  • $\sigma$: Conductivity of homogeneous earth (S/m)
  • Offset: Offset from a source plane
  • Scale: Choose "log" or "linear" scale
  • Slider: When it is checked, it activates "flog" and "siglog" sliders above.
  • FreqLog: A float slider for log10 frequency (only activated when slider is checked)
  • SigLog: A float slider for log10 conductivity (only activated when slider is checked)
In [ ]:
dwidget = DipoleWidgetFD()
Q1 = dwidget.InteractiveDipoleBH(nRx=Q0.kwargs["nRx"], plane=Q0.kwargs["Plane"], offset_plane=Q0.kwargs["Offset"])

Proflie app

Here we focuson data, which can be measured at receiver locations. We limit our attention to three different profile shown in Geometry app: Rxhole (red), Txhole (black), TxProfile (blue).


  • Comp.: Direction of $\mathbf{F}$ at Rx locations
  • ComplexNumber: Type of complex data ("Re", "Im", "Amp", "Phase")
  • $f_1$: Freuency (Hz)
  • $f_2$: Freuency (Hz)
  • $f_3$: Freuency (Hz)
  • Profile: Type of profile line ("Rxhole", "Txhole", "TxProfile")
  • Scale: Choose "log" or "linear" scale
In [ ]:
Q2 = InteractiveDipoleProfile(dwidget, Q1.kwargs["Sigma"], Q1.kwargs["Field"], Q1.kwargs["Scale"])
In [ ]: