pygimli.physics.ert

Direct current electromagnetics

This package contains tools, modelling operators, and managers for:

  • Electrical Resistivity Tomography (ERT) / Induced polarization (IP)

  • Vertical Electric Sounding (VES)

Overview

Functions

createERTData(elecs[, schemeName])

Simple data creator for compatibility (advanced version in BERT).

createGeometricFactors(*args, **kwargs)

load(fileName[, verbose])

Shortcut to load ERT data.

show(data[, vals])

Plot ERT data as pseudosection matrix (position over separation).

showERTData(data[, vals])

Plot ERT data as pseudosection matrix (position over separation).

simulate(mesh, scheme, res[, sr, useBert, …])

Convenience function to use the ERT modelling operator.

Classes

ERTManager([data])

ERT Manager.

ERTModelling([sr, verbose])

Forward operator for Electrical Resistivty Tomography

ERTModellingReference(**kwargs)

Reference implementation for 2.5D Electrical Resistivity Tomography.

VESCModelling(**kwargs)

Vertical Electrical Sounding (VES) forward operator.

VESManager(**kwargs)

Vertical electrical sounding (VES) manager class.

VESModelling([ab2, mn2])

Vertical Electrical Sounding (VES) forward operator.

Functions

createERTData

pygimli.physics.ert.createERTData(elecs, schemeName='none', **kwargs)[source]

Simple data creator for compatibility (advanced version in BERT).

Parameters

sounding (bool [False]) – Create a 1D VES Schlumberger configuration. elecs need to be an array with elecs[0] = mn/2 and elecs[1:] = ab/2.

Examples using pygimli.physics.ert.createERTData

createGeometricFactors

pygimli.physics.ert.createGeometricFactors(*args, **kwargs)

Examples using pygimli.physics.ert.createGeometricFactors

load

pygimli.physics.ert.load(fileName, verbose=False, **kwargs)[source]

Shortcut to load ERT data.

Import Data and try to assume the file format. Use pybert importer if installed.

Parameters

fileName (str) –

Returns

data

Return type

pg.DataContainer

show

pygimli.physics.ert.show(data, vals=None, **kwargs)

Plot ERT data as pseudosection matrix (position over separation).

Creates figure, axis and draw a pseudosection.

Parameters
  • data (BERT::DataContainerERT) –

  • **kwargs

    • axesmatplotlib.axes

      Axes to plot into. Default is None and a new figure and axes are created.

    • valsArray[nData]

      Values to be plotted. Default is data(‘rhoa’).

Examples using pygimli.physics.ert.show

showERTData

pygimli.physics.ert.showERTData(data, vals=None, **kwargs)[source]

Plot ERT data as pseudosection matrix (position over separation).

Creates figure, axis and draw a pseudosection.

Parameters
  • data (BERT::DataContainerERT) –

  • **kwargs

    • axesmatplotlib.axes

      Axes to plot into. Default is None and a new figure and axes are created.

    • valsArray[nData]

      Values to be plotted. Default is data(‘rhoa’).

Examples using pygimli.physics.ert.showERTData

simulate

pygimli.physics.ert.simulate(mesh, scheme, res, sr=True, useBert=True, verbose=False, **kwargs)[source]

Convenience function to use the ERT modelling operator.

Convenience function to use the ERT modelling operator if you like static functions.

See pygimli.ert.ERTManager.simulate for description of the arguments.

Parameters
  • mesh (GIMLI::Mesh | str) – Modelling domain. Mesh can be a file name here.

  • scheme (GIMLI::DataContainerERT | str) – Data configuration. Scheme can be a file name here.

  • res (see pygimli.ert.ERTManager.simulate) – Resistivity distribution.

  • sr (bool [True]) – Use singularity removal technique.

  • useBert (bool [True]) – Use Bert forward operator instead of the reference implementation.

  • **kwargs – Forwarded to pygimli.ert.ERTManager.simulate

Examples using pygimli.physics.ert.simulate

Classes

ERTManager

class pygimli.physics.ert.ERTManager(data=None, **kwargs)[source]

Bases: pygimli.frameworks.methodManager.MeshMethodManager

ERT Manager.

Method Manager for Electrical Resistivity Tomography (ERT)

__init__(data=None, **kwargs)[source]

Create ERT Manager instance.

Parameters

data (GIMLI::DataContainerERT | str) – You can initialize the Manager with data or give them a dataset when calling the inversion.

Other Parameters
  • * useBert (bool [True]) – Use Bert forward operator instead of the reference implementation.

  • * sr (bool [True]) – Calculate with singularity removal technique. Recommended but needs the primary potential. For flat earth cases the primary potential will be calculated analytical. For domains with topography the primary potential will be calculated numerical using a p2 refined mesh or you provide primary potentials with setPrimPot.

checkData(data)[source]

Return data from container. THINKABOUT: Data will be changed, or should the manager keeps an own copy?

checkErrors(err, dataVals)[source]

Return relative error. Default we assume ‘err’ are relative vales.

coverage()[source]

Return coverage vector considering the logarithmic transformation.

createForwardOperator(**kwargs)[source]

Create and choose forward operator.

createMesh(data=None, **kwargs)[source]

Create default inversion mesh

Forwarded to pygimli.physics.ert.createInversionMesh

estimateError(data, absoluteError=0.001, relativeError=0.03, absoluteUError=None, absoluteCurrent=0.1)[source]

Estimate error composed of an absolute and a relative part. This is a static method and will not alter any member of the Manager

Parameters
  • absoluteError (float [0.001]) – Absolute data error in Ohm m. Need ‘rhoa’ values in data.

  • relativeError (float [0.03]) – relative error level in %/100

  • absoluteUError (float [0.001]) – Absolute potential error in V. Need ‘u’ values in data. Or calculate them from ‘rhoa’, ‘k’ and absoluteCurrent if no ‘i’ is given

  • absoluteCurrent (float [0.1]) – Current level in A for reconstruction for absolute potential V

Returns

error

Return type

Array

load(fileName)[source]

Load ERT data.

Forwarded to pygimli.physics.ert.load

Parameters

fileName (str) – Filename for the data.

Returns

data

Return type

GIMLI::DataContainerERT

setPrimPot(pot)[source]
setSingularityRemoval(sr=True)[source]

Turn singularity removal on or off.

simulate(mesh, scheme, res, **kwargs)[source]

Simulate an ERT measurement.

Perform the forward task for a given mesh, a resistivity distribution (per cell), a measurement scheme and will return data (apparent resistivity) or potential fields.

This function can also operate on complex resistivity models, thereby computing complex apparent resistivities.

The forward operator itself only calculate potential values for the given scheme file. To calculate apparent resistivities, geometric factors (k) are needed. If there are no values k in the DataContainerERT scheme, then we will try to calculate them, either analytic or by using a p2-refined version of the given mesh.

Parameters
  • mesh (GIMLI::Mesh) – 2D or 3D Mesh to calculate for.

  • res (float, array(mesh.cellCount()) | array(N, mesh.cellCount()) | list) –

    Resistivity distribution for the given mesh cells can be: . float for homogeneous resistivity . single array of length mesh.cellCount() . matrix of N resistivity distributions of length mesh.cellCount() . resistivity map as [[regionMarker0, res0],

    [regionMarker0, res1], …]

  • scheme (GIMLI::DataContainerERT) – Data measurement scheme.

Keyword Arguments
  • verbose (bool[False]) – Be verbose. Will override class settings.

  • calcOnly (bool [False]) – Use fop.calculate instead of fop.response. Useful if you want to force the calculation of impedances for homogeneous models. No noise handling. Solution is put as token ‘u’ in the returned DataContainerERT.

  • noiseLevel (float [0.0]) – add normally distributed noise based on scheme(‘err’) or on noiseLevel if scheme did not contain ‘err’

  • noiseAbs (float [0.0]) – Absolute voltage error in V

  • returnArray (bool [False]) – Returns an array of apparent resistivities instead of a DataContainerERT

  • returnFields (bool [False]) – Returns a matrix of all potential values (per mesh nodes) for each injection electrodes.

Returns

  • DataContainerERT | array(N, data.size()) | array(N, data.size()) |

  • array(N, data.size()) – Data container with resulting apparent resistivity data and errors (if noiseLevel or noiseAbs is set). Optional returns a Matrix of rhoa values (for returnArray==True forces noiseLevel=0). In case of a complex valued resistivity model, phase values will be returned in the DataContainerERT (see example below), or as an additional returned array.

Examples

# TODO: Remove pybert dependencies # >>> import pybert as pb # >>> import pygimli as pg # >>> import pygimli.meshtools as mt # >>> world = mt.createWorld(start=[-50, 0], end=[50, -50], # … layers=[-1, -5], worldMarker=True) # >>> scheme = pb.createData( # … elecs=pg.utils.grange(start=-10, end=10, n=21), # … schemeName=’dd’) # >>> for pos in scheme.sensorPositions(): # … _= world.createNode(pos) # … _= world.createNode(pos + [0.0, -0.1]) # >>> mesh = mt.createMesh(world, quality=34) # >>> rhomap = [ # … [1, 100. + 0j], # … [2, 50. + 0j], # … [3, 10.+ 0j], # … ] # >>> ert = pb.ERTManager() # >>> data = ert.simulate(mesh, res=rhomap, scheme=scheme, verbose=True) # >>> rhoa = data.get(‘rhoa’).array() # >>> phia = data.get(‘phia’).array()

standardizedCoverage(threshhold=0.01)[source]

Return standardized coverage vector (0|1) using thresholding.

ERTModelling

class pygimli.physics.ert.ERTModelling(sr=True, verbose=False)[source]

Bases: pygimli.physics.ert.ert.ERTModellingBase

Forward operator for Electrical Resistivty Tomography

Note

Convention for complex resistiviy inversion: We want to use logarithm transformation for the imaginary part of model so we need the startmodel to have positive imaginary parts. The sign is flipped back to physical correct assumption before we call the response function. The Jacobian is calculated with negative imaginary parts and will be a conjugated complex block matrix for further calulations.

__init__(sr=True, verbose=False)[source]

Constructor, optional with data container and mesh.

createJacobian(mod)[source]
createStartModel(dataVals)[source]

Create Starting model for ERT inversion.

flipImagPart(v)[source]
response(mod)[source]
setDataPost(data)[source]
setDefaultBackground()[source]
setMeshPost(mesh)[source]

ERTModellingReference

class pygimli.physics.ert.ERTModellingReference(**kwargs)[source]

Bases: pygimli.physics.ert.ert.ERTModellingBase

Reference implementation for 2.5D Electrical Resistivity Tomography.

__init__(**kwargs)[source]

“Constructor, optional with data container and mesh.

calcGeometricFactor(data)[source]

Calculate geometry factors for a given dataset.

createJacobian(model)[source]

TODO WRITEME.

createRHS(mesh, elecs)[source]

TODO WRITEME.

getIntegrationWeights(rMin, rMax)[source]

TODO WRITEME.

mixedBC(boundary, userData)[source]

Apply mixed boundary conditions.

pointSource(cell, f, userData)[source]

Define function for the current source term.

\(\delta(x-pos), \int f(x) \delta(x-pos)=f(pos)=N(pos)\)

Right hand side entries will be shape functions(pos)

response(model)[source]

Solve forward task.

Create apparent resistivity values for a given resistivity distribution for self.mesh.

uAnalytical(p, sourcePos, k)[source]

Calculate analytical potential for homogeneous halfspace.

For sigma = 1 [S m]

VESCModelling

class pygimli.physics.ert.VESCModelling(**kwargs)[source]

Bases: pygimli.physics.ert.ves.VESModelling

Vertical Electrical Sounding (VES) forward operator. (complex)

Vertical Electrical Sounding (VES) forward operator for complex resistivity values. see: pygimli.physics.ert.VESModelling

__init__(**kwargs)[source]

Constructor

createStartModel(rhoa)[source]
drawData(ax, data, error=None, labels=None, ab2=None, mn2=None, **kwargs)[source]

Draw modeled apparent resistivity and apparent phase data.

Parameters
  • ax (axes) – Matplotlib axes object to draw into.

  • data (iterable) – Apparent resistivity values to draw. [rhoa phia].

  • error (iterable [None]) – Rhoa in Ohm m and phia in radiand. Adds an error bar if you have error values. [err_rhoas err_phia] The error of amplitudes are assumed to be relative and the error of the phases is assumed to be absolute in mrad.

  • labels (str [r'$varrho_a$', r'$varphi_a$']) – Set legend labels for amplitude and phase.

  • parameters (Other) –

  • -----------------

  • ab2 (iterable) – Override ab2 that fits data size.

  • mn2 (iterable) – Override mn2 that fits data size.

  • plot (function name) – Matplotlib plot function, e.g., plot, loglog, semilogx or semilogy

drawModel(ax, model, **kwargs)[source]

Draw 1D VESC Modell.

phaseModel(model)[source]

Return the current phase model values.

resModel(model)[source]

Return the resistivity model values.

response_mt(par, i=0)[source]

Multithread response for parametrization.

Returns [|rhoa|, +phi(rad)] for [thicks, res, phi(rad)]

VESManager

class pygimli.physics.ert.VESManager(**kwargs)[source]

Bases: pygimli.frameworks.methodManager.MethodManager1d

Vertical electrical sounding (VES) manager class.

>>> import numpy as np
>>> import pygimli as pg
>>> from pygimli.physics import VESManager
>>> ab2 = np.logspace(np.log10(1.5), np.log10(100), 32)
>>> mn2 = 1.0
>>> # 3 layer with 100, 500 and 20 Ohmm
>>> # and layer thickness of 4, 6, 10 m
>>> # over a Halfspace of 800 Ohmm
>>> synthModel = pg.cat([4., 6., 10.], [100., 5., 20., 800.])
>>> ves = VESManager()
>>> ra, err = ves.simulate(synthModel, ab2=ab2, mn2=mn2, noiseLevel=0.01)
>>> ax = ves.showData(ra, error=err)
>>> # _= ves.invert(ra, err, nLayer=4, showProgress=0, verbose=0)
>>> # ax = ves.showModel(synthModel)
>>> # ax = ves.showResult(ax=ax)
>>> pg.wait()

(png, pdf)

../../_images/pygimli-physics-ert-1.png
__init__(**kwargs)[source]

Constructor

Parameters

complex (bool) – Accept complex resistivities.

Variables

complex (bool) – Accept complex resistivities.

property complex
createForwardOperator(**kwargs)[source]

Create Forward Operator.

Create Forward Operator based on complex attribute.

exportData(fileName, data=None, error=None)[source]

Export data into simple ascii matrix.

Usefull?

invert(data=None, err=None, ab2=None, mn2=None, **kwargs)[source]

Invert measured data.

Keyword Arguments

**kwargs – Additional kwargs inherited from %(MethodManager1d.invert) and %(Inversion.run)

Returns

model – inversion result

Return type

pg.Vector

loadData(fileName, **kwargs)[source]

Load simple data matrix

preErrorCheck(err, dataVals=None)[source]

Called before the validity check of the error values.

simulate(model, ab2=None, mn2=None, **kwargs)[source]

Simulate measurement data.

VESModelling

class pygimli.physics.ert.VESModelling(ab2=None, mn2=None, **kwargs)[source]

Bases: pygimli.frameworks.modelling.Block1DModelling

Vertical Electrical Sounding (VES) forward operator.

Variables
  • am – Part of data basis. Distances between A and M electrodes. A is first power, M is first potential electrode.

  • bm – Part of data basis. Distances between B and M electrodes. B is second power, M is first potential electrode.

  • an – Part of data basis. Distances between A and N electrodes. A is first power, N is second potential electrode.

  • bn – Part of data basis. Distances between B and N electrodes. B is second power, N is second potential electrode.

  • ab2 – Half distance between A and B.

  • mn2 – Half distance between A and B. Only used for input (feeding am etc.).

__init__(ab2=None, mn2=None, **kwargs)[source]

Constructor

createStartModel(rhoa)[source]
drawData(ax, data, error=None, label=None, **kwargs)[source]

Draw modeled apparent resistivity data.

Parameters
  • ax (axes) – Matplotlib axes object to draw into.

  • data (iterable) – Apparent resistivity values to draw.

  • error (iterable [None]) – Adds an error bar if you have error values.

  • label (str ['$varrho_a$']) – Set legend label for the amplitude.

Other Parameters
  • ab2 (iterable) – Override ab2 that fits data size.

  • mn2 (iterable) – Override mn2 that fits data size.

  • plot (function name) – Matplotlib plot function, e.g., plot, loglog, semilogx or semilogy

drawModel(ax, model, **kwargs)[source]
response((object)arg1, (object)model) → object :[source]
C++ signature :

GIMLI::Vector<double> response(GIMLI::ModellingBase {lvalue},GIMLI::Vector<double>)

response( (object)arg1, (object)model) -> object :

C++ signature :

GIMLI::Vector<double> response(ModellingBase_wrapper {lvalue},GIMLI::Vector<double>)

response_mt((object)arg1, (object)model[, (object)i=0]) → object :[source]
C++ signature :

GIMLI::Vector<double> response_mt(GIMLI::ModellingBase {lvalue},GIMLI::Vector<double> [,unsigned long=0])

response_mt( (object)arg1, (object)model [, (object)i=0]) -> object :

C++ signature :

GIMLI::Vector<double> response_mt(ModellingBase_wrapper {lvalue},GIMLI::Vector<double> [,unsigned long=0])

setDataSpace(ab2=None, mn2=None, am=None, bm=None, an=None, bn=None, **kwargs)[source]

Set data basis, i.e., arrays for all am, an, bm, bn distances.