Source code for crtomo.analytical_solution
r"""Analytical potential distribution over a half-space
For a homogeneous full space, the potential distribution over a point source is
given as:
:math:`\varphi(r) = I \frac{1}{4 \pi \sigma r}`
"""
import numpy as np
[docs]
def pot_ana(r, rho):
"""Return the analytical potential in distance r over a homogeneous
half-space
"""
current = 1.0
sigma = 1.0 / rho
old_err_state = np.seterr(divide='ignore')
phi = np.divide(current, (2.0 * np.pi * sigma * r))
np.seterr(**old_err_state)
return phi
[docs]
def compute_potentials_analytical_hs(grid, configs_raw, rho):
"""Compute the potential superpositions of each current dipole in the
configurations, using the provided resistivity
Parameters
----------
grid:
crt_grid object with loaded FE grid. Used for the electrode positions
configs_raw: numpy.ndarray
Nx4 array containing N four-point spreads
rho: float
resistivity of half-space
Returns
-------
potentials: list
List containing N arrays, each of size M (nr of grid nodes)
"""
assert isinstance(rho, (float, int))
potentials = []
# nodes_sorted = grid.nodes['presort']
nodes_raw = grid.nodes['presort']
for config in configs_raw - 1:
print('CONFIG', config)
# determine distance of all nodes to both electrodes
# e1_node = grid.get_electrode_node(config[0])
# electrode1 = nodes_sorted[e1_node][1:3]
electrode1 = grid.electrodes[config[0], 1:3]
# electrode1 = nodes_sorted[config[0]][1:3]
r1 = np.sqrt(
(nodes_raw[:, 1] - electrode1[0]) ** 2 +
(nodes_raw[:, 2] - electrode1[1]) ** 2
)
# electrode2 = nodes_sorted[config[1]][1:3]
# e2_node = grid.get_electrode_node(config[1])
# electrode2 = nodes_sorted[e2_node][1:3]
electrode2 = grid.electrodes[config[1], 1:3]
r2 = np.sqrt(
(nodes_raw[:, 1] - electrode2[0]) ** 2 +
(nodes_raw[:, 2] - electrode2[1]) ** 2
)
pot1 = pot_ana(r1, rho)
pot2 = - pot_ana(r2, rho)
pot12 = pot1 + pot2
potentials.append(pot12)
return potentials
[docs]
def compute_voltages(grid, configs_raw, potentials_raw):
"""Given a list of potential distribution and corresponding four-point
spreads, compute the voltages
Parameters
----------
grid:
crt_grid object the grid is used to infer electrode positions
configs_raw: Nx4 array
containing the measurement configs (1-indexed)
potentials_raw: list with N entries
corresponding to each measurement, containing the node potentials of
each injection dipole.
"""
# we operate on 0-indexed arrays, config holds 1-indexed values
# configs = configs_raw - 1
voltages = []
for config, potentials in zip(configs_raw - 1, potentials_raw):
print('CONFIG AAA ', config)
e3_node = int(grid.electrodes[config[2], 0])
e4_node = int(grid.electrodes[config[3], 0])
# e3_node = grid.get_electrode_node(config[2])
# e4_node = grid.get_electrode_node(config[3])
voltage = potentials[e3_node] - potentials[e4_node]
voltages.append(voltage)
return voltages