mirror of
https://github.com/wassname/simpeg.git
synced 2026-09-14 11:35:32 +08:00
Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
39ddec8702 | ||
|
|
2fb0f3fbbb |
+13
-26
@@ -253,7 +253,8 @@ class SaveOutputDictEveryIteration(_SaveEveryIteration):
|
|||||||
class Update_IRLS(InversionDirective):
|
class Update_IRLS(InversionDirective):
|
||||||
|
|
||||||
eps_min = None
|
eps_min = None
|
||||||
eps = None
|
eps_p = None
|
||||||
|
eps_q = None
|
||||||
norms = [2.,2.,2.,2.]
|
norms = [2.,2.,2.,2.]
|
||||||
factor = None
|
factor = None
|
||||||
gamma = None
|
gamma = None
|
||||||
@@ -262,7 +263,6 @@ class Update_IRLS(InversionDirective):
|
|||||||
f_old = None
|
f_old = None
|
||||||
f_min_change = 1e-2
|
f_min_change = 1e-2
|
||||||
beta_tol = 5e-2
|
beta_tol = 5e-2
|
||||||
prctile = 95
|
|
||||||
|
|
||||||
# Solving parameter for IRLS (mode:2)
|
# Solving parameter for IRLS (mode:2)
|
||||||
IRLSiter = 0
|
IRLSiter = 0
|
||||||
@@ -297,22 +297,9 @@ class Update_IRLS(InversionDirective):
|
|||||||
print "Convergence with smooth l2-norm regularization: Start IRLS steps..."
|
print "Convergence with smooth l2-norm regularization: Start IRLS steps..."
|
||||||
|
|
||||||
self.mode = 2
|
self.mode = 2
|
||||||
|
print self.eps_p, self.eps_q, self.norms
|
||||||
# Either use the supplied epsilon, or fix base on distribution of
|
self.reg.eps_p = self.eps_p
|
||||||
# model values
|
self.reg.eps_q = self.eps_q
|
||||||
if getattr(self, 'reg.eps', None) is None:
|
|
||||||
self.reg.eps_p = np.percentile(np.abs(self.invProb.curModel),self.prctile)
|
|
||||||
else:
|
|
||||||
self.reg.eps_p = self.eps[0]
|
|
||||||
|
|
||||||
if getattr(self, 'reg.eps', None) is None:
|
|
||||||
self.reg.eps_q = np.percentile(np.abs(self.reg.regmesh.cellDiffxStencil*(self.reg.mapping * self.invProb.curModel)),self.prctile)
|
|
||||||
else:
|
|
||||||
self.reg.eps_q = self.eps[1]
|
|
||||||
|
|
||||||
print "L[p qx qy qz]-norm : " + str(self.reg.norms)
|
|
||||||
print "eps_p: " + str(self.reg.eps_p) + " eps_q: " + str(self.reg.eps_q)
|
|
||||||
|
|
||||||
self.reg.norms = self.norms
|
self.reg.norms = self.norms
|
||||||
self.coolingFactor = 1.
|
self.coolingFactor = 1.
|
||||||
self.coolingRate = 1
|
self.coolingRate = 1
|
||||||
@@ -356,14 +343,14 @@ class Update_IRLS(InversionDirective):
|
|||||||
else:
|
else:
|
||||||
self.f_old = phim_new
|
self.f_old = phim_new
|
||||||
|
|
||||||
# # Cool the threshold parameter if required
|
# Cool the threshold parameter if required
|
||||||
# if getattr(self, 'factor', None) is not None:
|
if getattr(self, 'factor', None) is not None:
|
||||||
# eps = self.reg.eps / self.factor
|
eps = self.reg.eps / self.factor
|
||||||
#
|
|
||||||
# if getattr(self, 'eps_min', None) is not None:
|
if getattr(self, 'eps_min', None) is not None:
|
||||||
# self.reg.eps = np.max([self.eps_min,eps])
|
self.reg.eps = np.max([self.eps_min,eps])
|
||||||
# else:
|
else:
|
||||||
# self.reg.eps = eps
|
self.reg.eps = eps
|
||||||
|
|
||||||
# Get phi_m at the end of current iteration
|
# Get phi_m at the end of current iteration
|
||||||
self.phi_m_last = self.invProb.phi_m_last
|
self.phi_m_last = self.invProb.phi_m_last
|
||||||
|
|||||||
@@ -60,6 +60,20 @@ class Fields(SimPEG.Problem.Fields):
|
|||||||
|
|
||||||
return self._bPrimary(solution, srcList) + self._bSecondary(solution, srcList)
|
return self._bPrimary(solution, srcList) + self._bSecondary(solution, srcList)
|
||||||
|
|
||||||
|
def _bSecondary(self, solution, srcList):
|
||||||
|
"""
|
||||||
|
Total magnetic flux density is sum of primary and secondary
|
||||||
|
|
||||||
|
:param numpy.ndarray solution: field we solved for
|
||||||
|
:param list srcList: list of sources
|
||||||
|
:rtype: numpy.ndarray
|
||||||
|
:return: total magnetic flux density
|
||||||
|
"""
|
||||||
|
if getattr(self, '_bSecondary', None) is None:
|
||||||
|
raise NotImplementedError ('Getting b from %s is not implemented' %self.knownFields.keys()[0])
|
||||||
|
|
||||||
|
return self._bSecondary(solution, srcList)
|
||||||
|
|
||||||
def _h(self, solution, srcList):
|
def _h(self, solution, srcList):
|
||||||
"""
|
"""
|
||||||
Total magnetic field is sum of primary and secondary
|
Total magnetic field is sum of primary and secondary
|
||||||
@@ -124,6 +138,21 @@ class Fields(SimPEG.Problem.Fields):
|
|||||||
return self._bDeriv_u(src, v, adjoint), self._bDeriv_m(src, v, adjoint)
|
return self._bDeriv_u(src, v, adjoint), self._bDeriv_m(src, v, adjoint)
|
||||||
return np.array(self._bDeriv_u(src, du_dm_v, adjoint) + self._bDeriv_m(src, v, adjoint), dtype = complex)
|
return np.array(self._bDeriv_u(src, du_dm_v, adjoint) + self._bDeriv_m(src, v, adjoint), dtype = complex)
|
||||||
|
|
||||||
|
def _bSecondaryDeriv(self, src, du_dm_v, v, adjoint = False):
|
||||||
|
"""
|
||||||
|
Total derivative of b with respect to the inversion model. Returns :math:`d\mathbf{b}/d\mathbf{m}` for forward and (:math:`d\mathbf{b}/d\mathbf{u}`, :math:`d\mathb{u}/d\mathbf{m}`) for the adjoint
|
||||||
|
|
||||||
|
:param Src src: sorce
|
||||||
|
:param numpy.ndarray du_dm_v: derivative of the solution vector with respect to the model times a vector (is None for adjoint)
|
||||||
|
:param numpy.ndarray v: vector to take sensitivity product with
|
||||||
|
:param bool adjoint: adjoint?
|
||||||
|
:rtype: numpy.ndarray
|
||||||
|
:return: derivative times a vector (or tuple for adjoint)
|
||||||
|
"""
|
||||||
|
# TODO: modify when primary field is dependent on m
|
||||||
|
|
||||||
|
return self._bDeriv(src, du_dm_v, v, adjoint = adjoint)
|
||||||
|
|
||||||
def _hDeriv(self, src, du_dm_v, v, adjoint = False):
|
def _hDeriv(self, src, du_dm_v, v, adjoint = False):
|
||||||
"""
|
"""
|
||||||
Total derivative of h with respect to the inversion model. Returns :math:`d\mathbf{h}/d\mathbf{m}` for forward and (:math:`d\mathbf{h}/d\mathbf{u}`, :math:`d\mathb{u}/d\mathbf{m}`) for the adjoint
|
Total derivative of h with respect to the inversion model. Returns :math:`d\mathbf{h}/d\mathbf{m}` for forward and (:math:`d\mathbf{h}/d\mathbf{u}`, :math:`d\mathb{u}/d\mathbf{m}`) for the adjoint
|
||||||
@@ -471,6 +500,8 @@ class Fields3D_b(Fields):
|
|||||||
return 'E'
|
return 'E'
|
||||||
elif fieldType == 'b':
|
elif fieldType == 'b':
|
||||||
return 'F'
|
return 'F'
|
||||||
|
elif fieldType == 'bSecondary':
|
||||||
|
return 'F'
|
||||||
elif (fieldType == 'h') or (fieldType == 'j'):
|
elif (fieldType == 'h') or (fieldType == 'j'):
|
||||||
return'CCV'
|
return'CCV'
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -97,6 +97,19 @@ class Point_b(BaseRx):
|
|||||||
self.projField = 'b'
|
self.projField = 'b'
|
||||||
super(Point_b, self).__init__(locs, orientation, component)
|
super(Point_b, self).__init__(locs, orientation, component)
|
||||||
|
|
||||||
|
class Point_bSecondary(BaseRx):
|
||||||
|
"""
|
||||||
|
Magnetic flux FDEM receiver
|
||||||
|
|
||||||
|
:param numpy.ndarray locs: receiver locations (ie. :code:`np.r_[x,y,z]`)
|
||||||
|
:param string orientation: receiver orientation 'x', 'y' or 'z'
|
||||||
|
:param string component: real or imaginary component 'real' or 'imag'
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, locs, orientation=None, component=None):
|
||||||
|
self.projField = 'bSecondary'
|
||||||
|
super(Point_bSecondary, self).__init__(locs, orientation, component)
|
||||||
|
|
||||||
|
|
||||||
class Point_h(BaseRx):
|
class Point_h(BaseRx):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -42,33 +42,55 @@ def run(N=100, plotIt=True):
|
|||||||
survey = Survey.LinearSurvey()
|
survey = Survey.LinearSurvey()
|
||||||
survey.pair(prob)
|
survey.pair(prob)
|
||||||
survey.dobs = prob.fields(mtrue) + std_noise * np.random.randn(nk)
|
survey.dobs = prob.fields(mtrue) + std_noise * np.random.randn(nk)
|
||||||
|
#survey.makeSyntheticData(mtrue, std=std_noise)
|
||||||
|
|
||||||
wd = np.ones(nk) * std_noise
|
wd = np.ones(nk) * std_noise
|
||||||
|
|
||||||
|
#print survey.std[0]
|
||||||
|
#M = prob.mesh
|
||||||
# Distance weighting
|
# Distance weighting
|
||||||
wr = np.sum(prob.G**2.,axis=0)**0.5
|
wr = np.sum(prob.G**2.,axis=0)**0.5
|
||||||
wr = ( wr/np.max(wr) )
|
wr = ( wr/np.max(wr) )
|
||||||
|
|
||||||
|
# reg = Regularization.Simple(mesh)
|
||||||
|
# reg.mref = mref
|
||||||
|
# reg.cell_weights = wr
|
||||||
|
#
|
||||||
dmis = DataMisfit.l2_DataMisfit(survey)
|
dmis = DataMisfit.l2_DataMisfit(survey)
|
||||||
dmis.Wd = 1./wd
|
dmis.Wd = 1./wd
|
||||||
|
#
|
||||||
|
# opt = Optimization.ProjectedGNCG(maxIter=20,lower=-2.,upper=2., maxIterCG= 10, tolCG = 1e-4)
|
||||||
|
# invProb = InvProblem.BaseInvProblem(dmis, reg, opt)
|
||||||
|
# invProb.curModel = m0
|
||||||
|
#
|
||||||
|
# beta = Directives.BetaSchedule(coolingFactor=2, coolingRate=1)
|
||||||
|
# target = Directives.TargetMisfit()
|
||||||
|
#
|
||||||
betaest = Directives.BetaEstimate_ByEig()
|
betaest = Directives.BetaEstimate_ByEig()
|
||||||
|
# inv = Inversion.BaseInversion(invProb, directiveList=[beta, betaest, target])
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# mrec = inv.run(m0)
|
||||||
|
# ml2 = mrec
|
||||||
|
# print "Final misfit:" + str(invProb.dmisfit.eval(mrec))
|
||||||
|
#
|
||||||
|
# # Switch regularization to sparse
|
||||||
|
# phim = invProb.phi_m_last
|
||||||
|
# phid = invProb.phi_d
|
||||||
|
|
||||||
reg = Regularization.Sparse(mesh)
|
reg = Regularization.Sparse(mesh)
|
||||||
reg.mref = mref
|
reg.mref = mref
|
||||||
reg.cell_weights = wr
|
reg.cell_weights = wr
|
||||||
|
|
||||||
reg.mref = np.zeros(mesh.nC)
|
reg.mref = np.zeros(mesh.nC)
|
||||||
|
eps_p = 5e-2
|
||||||
|
eps_q = 5e-2
|
||||||
|
norms = [0., 0., 2., 2.]
|
||||||
|
|
||||||
opt = Optimization.ProjectedGNCG(maxIter=100 ,lower=-2.,upper=2., maxIterLS = 20, maxIterCG= 10, tolCG = 1e-3)
|
opt = Optimization.ProjectedGNCG(maxIter=100 ,lower=-2.,upper=2., maxIterLS = 20, maxIterCG= 10, tolCG = 1e-3)
|
||||||
invProb = InvProblem.BaseInvProblem(dmis, reg, opt)
|
invProb = InvProblem.BaseInvProblem(dmis, reg, opt)
|
||||||
update_Jacobi = Directives.Update_lin_PreCond()
|
update_Jacobi = Directives.Update_lin_PreCond()
|
||||||
|
IRLS = Directives.Update_IRLS( norms=norms, eps_p=eps_p, eps_q=eps_q)
|
||||||
# Set the IRLS directive, penalize the lowest 25 percentile of model values
|
|
||||||
# Start with an l2-l2, then switch to lp-norms
|
|
||||||
norms = [0., 0., 2., 2.]
|
|
||||||
IRLS = Directives.Update_IRLS( norms=norms, prctile = 25, maxIRLSiter = 15, minGNiter=3)
|
|
||||||
|
|
||||||
inv = Inversion.BaseInversion(invProb, directiveList=[IRLS,betaest,update_Jacobi])
|
inv = Inversion.BaseInversion(invProb, directiveList=[IRLS,betaest,update_Jacobi])
|
||||||
|
|
||||||
|
|||||||
+1
-3
@@ -502,9 +502,7 @@ class InjectActiveCells(IdentityMap):
|
|||||||
if Utils.isScalar(valInactive):
|
if Utils.isScalar(valInactive):
|
||||||
self.valInactive = np.ones(self.nC)*float(valInactive)
|
self.valInactive = np.ones(self.nC)*float(valInactive)
|
||||||
else:
|
else:
|
||||||
self.valInactive = np.ones(self.nC)
|
self.valInactive = valInactive.copy()
|
||||||
self.valInactive[self.indInactive] = valInactive.copy()
|
|
||||||
|
|
||||||
self.valInactive[self.indActive] = 0
|
self.valInactive[self.indActive] = 0
|
||||||
|
|
||||||
inds = np.nonzero(self.indActive)[0]
|
inds = np.nonzero(self.indActive)[0]
|
||||||
|
|||||||
Reference in New Issue
Block a user