mirror of
https://github.com/wassname/simpeg.git
synced 2026-07-07 20:14:30 +08:00
working tdem inversion example
This commit is contained in:
@@ -0,0 +1,124 @@
|
||||
from SimPEG import *
|
||||
import simpegEM as EM
|
||||
from simpegem1d import Utils1D
|
||||
from scipy.constants import mu_0
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
class TDEMinversion(object):
|
||||
""" Wrapper for TDEMinversion """
|
||||
opt = None
|
||||
survey = None
|
||||
prb = None
|
||||
obj = None
|
||||
regmesh = None
|
||||
m0 = None
|
||||
inv = None
|
||||
surveyinfo = None
|
||||
probleminfo = None
|
||||
|
||||
def __init__(self, regmesh, m0, **kwargs):
|
||||
|
||||
self.regmesh = regmesh
|
||||
self.m0 = m0
|
||||
|
||||
def setSurveyProb(self, **kwargs):
|
||||
self.surveyinfo = kwargs['surveyinfo']
|
||||
self.probleminfo = kwargs['probleminfo']
|
||||
rx = self.surveyinfo['rx']
|
||||
tx = self.surveyinfo['tx']
|
||||
mesh = self.probleminfo['mesh']
|
||||
mapping = self.probleminfo['mapping']
|
||||
timeSteps = self.probleminfo['timeSteps']
|
||||
self.survey = EM.TDEM.SurveyTDEM([tx])
|
||||
self.prb = EM.TDEM.ProblemTDEM_b(mesh, mapping=mapping)
|
||||
self.prb.pair(self.survey)
|
||||
self.prb.Solver = self.probleminfo['Solver']
|
||||
self.prb.timeSteps = timeSteps
|
||||
|
||||
def setInv(self, **kwargs):
|
||||
|
||||
self.opt = Optimization.InexactGaussNewton(**kwargs['opt'])
|
||||
self.beta = Parameters.BetaSchedule(**kwargs['beta'])
|
||||
self.reg = Regularization.Tikhonov(self.regmesh, **kwargs['reg'])
|
||||
self.obj = ObjFunction.BaseObjFunction(self.survey, self.reg, beta=self.beta)
|
||||
self.inv = Inversion.BaseInversion(self.obj, self.opt)
|
||||
|
||||
def setDobs(self, dobs, std, floor):
|
||||
|
||||
self.survey.dobs = dobs
|
||||
self.survey.std = std
|
||||
self.survey.floor = floor
|
||||
self.survey.Wd = 1/(abs(dobs)*std+floor)
|
||||
|
||||
def run(self):
|
||||
C = Utils.Counter()
|
||||
self.prb.counter = C
|
||||
self.opt.counter = C
|
||||
self.opt.LSshorten = 0.5
|
||||
self.opt.remember('xc')
|
||||
|
||||
return self.inv.run(self.m0)
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
cs, ncx, ncz, npad = 5., 25, 15, 15
|
||||
hx = [(cs,ncx), (cs,npad,1.3)]
|
||||
hz = [(cs,npad,-1.3), (cs,ncz), (cs,npad,1.3)]
|
||||
mesh = Mesh.CylMesh([hx,1,hz], '00C')
|
||||
|
||||
active = mesh.vectorCCz<0.
|
||||
layer = (mesh.vectorCCz<0.) & (mesh.vectorCCz>=-100.)
|
||||
actMap = Maps.ActiveCells(mesh, active, np.log(1e-8), nC=mesh.nCz)
|
||||
mapping = Maps.ComboMap(mesh, [Maps.ExpMap, Maps.Vertical1DMap, actMap])
|
||||
sig_half = 2e-3
|
||||
sig_air = 1e-8
|
||||
sig_layer = 1e-3
|
||||
sigma = np.ones(mesh.nCz)*sig_air
|
||||
sigma[active] = sig_half
|
||||
sigma[layer] = sig_layer
|
||||
mtrue = np.log(sigma[active])
|
||||
|
||||
rxOffset=1e-3
|
||||
rx = EM.TDEM.RxTDEM(np.array([[rxOffset, 0., 30]]), np.logspace(-5,-3, 31), 'bz')
|
||||
tx = EM.TDEM.TxTDEM(np.array([0., 0., 80]), 'VMD_MVP', [rx])
|
||||
survey = EM.TDEM.SurveyTDEM([tx])
|
||||
prb = EM.TDEM.ProblemTDEM_b(mesh, mapping=mapping)
|
||||
prb.Solver = Utils.SolverUtils.DSolverWrap(sp.linalg.splu, factorize=True)
|
||||
prb.timeSteps = [(1e-06, 20),(1e-05, 20), (0.0001, 20)]
|
||||
prb.pair(survey)
|
||||
dtrue = survey.dpred(mtrue)
|
||||
|
||||
alpha_s = 1e-2
|
||||
alpha_x = 1
|
||||
|
||||
surveyinfo = {'rx':rx, 'tx':tx}
|
||||
prbinfo = {'mesh': mesh, 'mapping': mapping, 'timeSteps':prb.timeSteps, 'Solver':prb.Solver}
|
||||
optinfo = {'maxIter':10}
|
||||
reginfo = {'alpha_s': alpha_s, 'alpha_x': alpha_x}
|
||||
betainfo = {'coolingFactor':5, 'coolingRate':2, 'beta0_ratio': 1e0}
|
||||
Invoptions = {'opt': optinfo, 'beta': betainfo, 'reg': reginfo}
|
||||
SurvProboptions = {'surveyinfo': surveyinfo, 'probleminfo': prbinfo}
|
||||
regMesh = Mesh.TensorMesh([mesh.hz[mapping.maps[-1].indActive]])
|
||||
|
||||
m0 = np.log(np.ones(mtrue.size)*sig_half)
|
||||
|
||||
std = 0.05
|
||||
floor = np.linalg.norm(dtrue)*1e-5
|
||||
noise = std*abs(dtrue)*np.random.randn(*dtrue.shape)+floor
|
||||
dobs = dtrue+noise
|
||||
|
||||
TDEMinversion = TDEMinversion(regMesh, m0)
|
||||
TDEMinversion.setSurveyProb(**SurvProboptions)
|
||||
TDEMinversion.setInv(**Invoptions)
|
||||
TDEMinversion.setDobs(dobs, std, floor)
|
||||
|
||||
mopt = TDEMinversion.run()
|
||||
|
||||
plt.semilogx(sigma[active], mesh.vectorCCz[active], 'b.-')
|
||||
plt.semilogx(np.exp(mopt), mesh.vectorCCz[active], 'r.-')
|
||||
plt.xlabel('Conductivity (S/m)', fontsize = 14)
|
||||
plt.ylim(-600, 0)
|
||||
plt.xlim(5e-4, 1e-2)
|
||||
plt.grid(color='k', alpha=0.5, linestyle='dashed', linewidth=0.5)
|
||||
plt.legend(('True', 'Pred'), loc=1, fontsize = 14)
|
||||
plt.show()
|
||||
Reference in New Issue
Block a user