Source code for pygimli.physics.em.mt1dmodelling

"""1D Magnetotelluric modelling classes."""
import numpy as np
import pygimli as pg
from pygimli.frameworks import Block1DModelling, MeshModelling


[docs] class MT1dBlockModelling(Block1DModelling): """MT 1d few-layer modelling with resistivity & thickness."""
[docs] def __init__(self, T=None, nLayers=3, verbose=True, **kwargs): """Set up class with periods.""" super().__init__(verbose=verbose, **kwargs) self.T = T self.nLayers = nLayers self.fwd = pg.core.MT1dModelling(self.T, nLayers, verbose=verbose)
[docs] def response(self, par): """Model response.""" return self.response_mt(par, 0)
[docs] def response_mt(self, par, i=0): """Multi-threading model response.""" nLayers = (len(par)+1) // 2 fop = pg.core.MT1dModelling(self.T, int(nLayers), verbose=self.verbose()) return fop.response(par)
[docs] def createStartModel(self, rhoa): """Create starting model.""" if self.nLayers == 0: pg.critical("Model space is not been initialized.") # layer thickness properties self.setRegionProperties(0, startModel=1000, trans='log') # resistivity properties self.setRegionProperties(1, startModel=np.median(rhoa), trans='log') return super().createStartModel()
[docs] def drawData(self, ax, data, **kwargs): """Draw MT sounding curves (app. resistivity & phase).""" rhoa, phase = np.split(data, 2) ax2 = pg.viewer.mpl.createTwinY(ax) kwargs.setdefault('marker', 'x') color = kwargs.pop('color', 'C0') kwargs.setdefault('label', 'rhoa') ax.loglog(rhoa, self.T, color=color, **kwargs) kwargs['label'] = 'phase' ax2.semilogy(np.rad2deg(phase), self.T, color="C1", **kwargs) ax.set_ylim(max(self.T), min(self.T)) ax.set_ylabel(r"$T$ [s]") ax.set_xlabel(r"$\rho_a$ [$\Omega$m]") ax2.set_xlabel(r"$\phi_a$ [°]") ax.legend() ax2.legend() ax.grid()
[docs] def drawModel(self, ax, model, **kwargs): """Draw model as 1D block model.""" kwargs.setdefault('plot', 'loglog') pg.viewer.mpl.drawModel1D(ax=ax, model=model, xlabel=r'Resistivity ($\Omega$m)', **kwargs) ax.set_ylabel('Depth in (m)') return ax, None # should return gci and not ax
[docs] class MT1dSmoothModelling(MeshModelling): """MT 1d few-layer modelling based on predefined thickness."""
[docs] def __init__(self, T=None, thk=None, verbose=True, **kwargs): """Set up class with periods.""" super().__init__(**kwargs) self.T = T self.thk = thk self.fwd = pg.core.MT1dRhoModelling(pg.Vector(self.T), pg.Vector(self.thk), verbose=verbose) self.mesh_ = pg.meshtools.createMesh1D(len(thk)+1) self.setMesh(self.mesh_)
[docs] def response(self, model): """Return forward response of model.""" return self.fwd.response(model)
[docs] def createStartModel(self, dataVals=None): """Create starting model.""" return pg.Vector(len(self.thk)+1, np.median(dataVals))
[docs] def drawModel(self, ax, model, **kwargs): """Draw model as 1D multi-layered model.""" kwargs.setdefault('plot', 'loglog') pg.viewer.mpl.drawModel1D(ax=ax, thickness=self.thk, values=model, xlabel=r'Resistivity ($\Omega$m)', **kwargs) ax.set_ylabel('Depth in (m)') return ax, None # should return gci and not ax
MT1dSmoothModelling.drawData = MT1dBlockModelling.drawData