diff --git a/simpegEM/Tests/test_TDEM_inversion.py b/simpegEM/Tests/test_TDEM_inversion.py new file mode 100644 index 00000000..aca1e06c --- /dev/null +++ b/simpegEM/Tests/test_TDEM_inversion.py @@ -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()