def test_sphericalInclusions(self): mesh = Mesh.TensorMesh([4, 5, 3]) mapping = Maps.SelfConsistentEffectiveMedium( mesh, sigma0=1e-1, sigma1=1. ) m = np.abs(np.random.rand(mesh.nC)) mapping.test(m=m, dx=0.05, num=3)
def test_spheroidalInclusions(self): mesh = Mesh.TensorMesh([4, 3, 2]) mapping = Maps.SelfConsistentEffectiveMedium( mesh, sigma0=1e-1, sigma1=1., alpha0=0.8, alpha1=0.9, rel_tol=1e-8 ) m = np.abs(np.random.rand(mesh.nC)) mapping.test(m=m, dx=0.05, num=3)
def run(plotIt=True): nC = 40 de = 1. h = np.ones(nC) * de / nC M = Mesh.TensorMesh([h, h]) y = np.linspace(M.vectorCCy[0], M.vectorCCx[-1], int(np.floor(nC / 4))) rlocs = np.c_[0 * y + M.vectorCCx[-1], y] rx = StraightRay.Rx(rlocs, None) srcList = [ StraightRay.Src(loc=np.r_[M.vectorCCx[0], yi], rxList=[rx]) for yi in y ] # phi model phi0 = 0 phi1 = 0.65 phitrue = Utils.ModelBuilder.defineBlock(M.gridCC, [0.4, 0.6], [0.6, 0.4], [phi1, phi0]) knownVolume = np.sum(phitrue * M.vol) print('True Volume: {}'.format(knownVolume)) # Set up true conductivity model and plot the model transform sigma0 = np.exp(1) sigma1 = 1e4 if plotIt: fig, ax = plt.subplots(1, 1) sigmaMapTest = Maps.SelfConsistentEffectiveMedium(nP=1000, sigma0=sigma0, sigma1=sigma1, rel_tol=1e-1, maxIter=150) testphis = np.linspace(0., 1., 1000) sigetest = sigmaMapTest * testphis ax.semilogy(testphis, sigetest) ax.set_title('Model Transform') ax.set_xlabel('$\\varphi$') ax.set_ylabel('$\sigma$') sigmaMap = Maps.SelfConsistentEffectiveMedium(M, sigma0=sigma0, sigma1=sigma1) # scale the slowness so it is on a ~linear scale slownessMap = Maps.LogMap(M) * sigmaMap # set up the true sig model and log model dobs sigtrue = sigmaMap * phitrue # modt = Model.BaseModel(M); slownesstrue = slownessMap * phitrue # true model (m = log(sigma)) # set up the problem and survey survey = StraightRay.Survey(srcList) problem = StraightRay.Problem(M, slownessMap=slownessMap) problem.pair(survey) if plotIt: fig, ax = plt.subplots(1, 1) cb = plt.colorbar(M.plotImage(phitrue, ax=ax)[0], ax=ax) survey.plot(ax=ax) cb.set_label('$\\varphi$') # get observed data dobs = survey.makeSyntheticData(phitrue, std=0.03, force=True) dpred = survey.dpred(np.zeros(M.nC)) # objective function pieces reg = Regularization.Tikhonov(M) dmis = DataMisfit.l2_DataMisfit(survey) dmisVol = Volume(mesh=M, knownVolume=knownVolume) beta = 0.25 maxIter = 15 # without the volume regularization opt = Optimization.ProjectedGNCG(maxIter=maxIter, lower=0.0, upper=1.0) opt.remember('xc') invProb = InvProblem.BaseInvProblem(dmis, reg, opt, beta=beta) inv = Inversion.BaseInversion(invProb) mopt1 = inv.run(np.zeros(M.nC) + 1e-16) print('\nTotal recovered volume (no vol misfit term in inversion): ' '{}'.format(dmisVol(mopt1))) # with the volume regularization vol_multiplier = 9e4 reg2 = reg dmis2 = dmis + vol_multiplier * dmisVol opt2 = Optimization.ProjectedGNCG(maxIter=maxIter, lower=0.0, upper=1.0) opt2.remember('xc') invProb2 = InvProblem.BaseInvProblem(dmis2, reg2, opt2, beta=beta) inv2 = Inversion.BaseInversion(invProb2) mopt2 = inv2.run(np.zeros(M.nC) + 1e-16) print('\nTotal volume (vol misfit term in inversion): {}'.format( dmisVol(mopt2))) # plot results if plotIt: fig, ax = plt.subplots(1, 1) ax.plot(dobs) ax.plot(dpred) ax.plot(survey.dpred(mopt1), 'o') ax.plot(survey.dpred(mopt2), 's') ax.legend(['dobs', 'dpred0', 'dpred w/o Vol', 'dpred with Vol']) fig, ax = plt.subplots(1, 3, figsize=(16, 4)) cb0 = plt.colorbar(M.plotImage(phitrue, ax=ax[0])[0], ax=ax[0]) cb1 = plt.colorbar(M.plotImage(mopt1, ax=ax[1])[0], ax=ax[1]) cb2 = plt.colorbar(M.plotImage(mopt2, ax=ax[2])[0], ax=ax[2]) for cb in [cb0, cb1, cb2]: cb.set_clim([0., phi1]) ax[0].set_title('true, vol: {:1.3e}'.format(knownVolume)) ax[1].set_title('recovered(no Volume term), vol: {:1.3e} '.format( dmisVol(mopt1))) ax[2].set_title('recovered(with Volume term), vol: {:1.3e} '.format( dmisVol(mopt2))) plt.tight_layout()
# sigma_fluid = 3 sigma1 = np.logspace(1, 5, 5) # look at a range of particle conductivities phi = np.linspace(0.0, 1, 1000) # vary the volume of particles ############################################################################### # Construct the Mapping # --------------------- # # We set the conductivity of the phase-0 material to the conductivity of the # fluid. The mapping will then take a concentration (by volume), of phase-1 # material and compute the effective conductivity # scemt = Maps.SelfConsistentEffectiveMedium(sigma0=sigma_fluid, sigma1=1) ############################################################################### # Loop over a range of particle conductivities # -------------------------------------------- # # We loop over the values defined as `sigma1` and compute the effective # conductivity of the mixture for each concentration in the `phi` vector # sige = np.zeros([phi.size, sigma1.size]) for i, s in enumerate(sigma1): scemt.sigma1 = s sige[:, i] = scemt * phi