diff --git a/simpegEM/Base.py b/simpegEM/Base.py index 7f938bf6..9e213825 100644 --- a/simpegEM/Base.py +++ b/simpegEM/Base.py @@ -1,6 +1,16 @@ -from SimPEG import Survey, Problem, Utils, Models, np, sp, Solver as SimpegSolver +from SimPEG import Survey, Problem, Utils, Models, Maps, PropMaps, np, sp, Solver as SimpegSolver from scipy.constants import mu_0 +class EMPropMap(Maps.PropMap): + sigma = Maps.Property("Electrical Conductivity", defaultInvProp = True) + mui = Maps.Property("Inverse Magnetic Permeability", defaultVal = 1./mu_0) + + # rho = Maps.Property("Electrical Resistivity") + # mu = Maps.Property("Inverse Magnetic Permeability", defaultVal = 1./mu_0) + + # Do some error checking: only 1 of sigma, rho can be InvProp similar story with mu and mui + # Also ensure that sigma and rho are reciprocals of one another "" + class BaseEMProblem(Problem.BaseProblem): def __init__(self, mesh, **kwargs): @@ -9,6 +19,8 @@ class BaseEMProblem(Problem.BaseProblem): surveyPair = Survey.BaseSurvey dataPair = Survey.Data + + PropMap = EMPropMap Solver = SimpegSolver solverOpts = {} @@ -29,89 +41,98 @@ class BaseEMProblem(Problem.BaseProblem): #################################################### # Mu - @property - def mu(self): - if getattr(self, '_mu', None) is None: - # if getattr(self, '_mui', None) is not None: - # self._mu = sel - self._mu = mu_0 - return self._mu - @mu.setter - def mu(self, value): - if getattr(self, '_MfMui', None) is not None: - del self._MfMui - if getattr(self, '_MfMuiI', None) is not None: - del self._MfMuiI - if getattr(self, '_MeMu', None) is not None: - del delf._MeMu - if getattr(self, '_MeMuI', None) is not None: - del self._MeMuI - self._mu = value + # @property + # def mu(self): + # if getattr(self, '_mu', None) is None: + # # if getattr(self, '_mui', None) is not None: + # # self._mu = sel + # self._mu = mu_0 + # return self._mu + # @mu.setter + # def mu(self, value): + # if getattr(self, '_MfMui', None) is not None: + # del self._MfMui + # if getattr(self, '_MfMuiI', None) is not None: + # del self._MfMuiI + # if getattr(self, '_MeMu', None) is not None: + # del delf._MeMu + # if getattr(self, '_MeMuI', None) is not None: + # del self._MeMuI + # self._mu = value # TODO: hardcoded to assume diagonal mu - @property - def mui(self): - if getattr(self, '_mui', None) is None: - self._mui = 1./mu_0 - return self._mui - @mui.setter - def mui(self, value): - if getattr(self, '_MfMui', None) is not None: - del self._MfMui - if getattr(self, '_MfMuiI', None) is not None: - del self._MfMuiI - if getattr(self, '_MeMu', None) is not None: - del delf._MeMu - if getattr(self, '_MeMuI', None) is not None: - del self._MeMuI - self._mui = value + # @property + # def mui(self): + # if getattr(self, '_mui', None) is None: + # self._mui = 1./mu_0 + # return self._mui + # @mui.setter + # def mui(self, value): + # if getattr(self, '_MfMui', None) is not None: + # del self._MfMui + # if getattr(self, '_MfMuiI', None) is not None: + # del self._MfMuiI + # if getattr(self, '_MeMu', None) is not None: + # del delf._MeMu + # if getattr(self, '_MeMuI', None) is not None: + # del self._MeMuI + # self._mui = value # Sigma - # deleteTheseOnModelUpdate = ['_MeSigma', '_MeSigmaI','_MfSigmai','_MfSigmaiI'] - @property - def sigma(self): - if getattr(self, '_sigma', None) is None: - self._sigma = self.curModel.transform - return self._sigma - @sigma.setter - def sigma(self, value): - if getattr(self, '_MeSigma', None) is not None: - del self._MeSigma - if getattr(self, '_MeSigmaI', None) is not None: - del self._MeSigmaI - if getattr(self, '_MfSigmai', None) is not None: - del delf._MfSigmai - if getattr(self, '_MfSigmaiI', None) is not None: - del self._MfSigmaiI - self._sigma = value + # @property + # def sigma(self): + # if getattr(self, '_sigma', None) is None: + # self._sigma = self.curModel.transform + # return self._sigma + # @sigma.setter + # def sigma(self, value): + # if getattr(self, '_MeSigma', None) is not None: + # del self._MeSigma + # if getattr(self, '_MeSigmaI', None) is not None: + # del self._MeSigmaI + # if getattr(self, '_MfSigmai', None) is not None: + # del delf._MfSigmai + # if getattr(self, '_MfSigmaiI', None) is not None: + # del self._MfSigmaiI + # self._sigma = value # def dsigma_dm(self): # return self.curModel.transformDeriv # TODO: hardcoded to assume diagonal sigma - @property - def sigmai(self): - if getattr(self, '_sigmai', None) is None: - self._sigmai = 1./self.curModel.transform - return self._sigmai - @sigmai.setter - def sigmai(self, value): - if getattr(self, '_MeSigma', None) is not None: - del self._MeSigma - if getattr(self, '_MeSigmaI', None) is not None: - del self._MeSigmaI - if getattr(self, '_MfSigmai', None) is not None: - del delf._MfSigmai - if getattr(self, '_MfSigmaiI', None) is not None: - del self._MfSigmaiI - self._sigma = value + # @property + # def sigmai(self): + # if getattr(self, '_sigmai', None) is None: + # self._sigmai = 1./self.curModel.transform + # return self._sigmai + # @sigmai.setter + # def sigmai(self, value): + # if getattr(self, '_MeSigma', None) is not None: + # del self._MeSigma + # if getattr(self, '_MeSigmaI', None) is not None: + # del self._MeSigmaI + # if getattr(self, '_MfSigmai', None) is not None: + # del delf._MfSigmai + # if getattr(self, '_MfSigmaiI', None) is not None: + # del self._MfSigmaiI + # self._sigma = value #################################################### # Mass Matrices #################################################### + # TODO: Link to EMPropMap + # if Prop + # deleteTheseOnModelUpdate = ['_MeSigma', '_MeSigmaI','_MfSigmai','_MfSigmaiI'] + @property + def deleteTheseOnModelUpdate(self): + toDelete = [] + if self.mapping.sigmaMap is not None: + toDelete += ['_MeSigma', '_MeSigmaI','_MfSigmai','_MfSigmaiI'] + return toDelete + @property def Me(self): if getattr(self, '_Me', None) is None: @@ -129,13 +150,13 @@ class BaseEMProblem(Problem.BaseProblem): @property def MfMui(self): if getattr(self, '_MfMui', None) is None: - self._MfMui = self.mesh.getFaceInnerProduct(self.mui) + self._MfMui = self.mesh.getFaceInnerProduct(self.curModel.mui) return self._MfMui @property def MfMuiI(self): if getattr(self, '_MfMuiI', None) is None: - self._MfMuiI = self.mesh.getFaceInnerProduct(self.mui, invMat=True) + self._MfMuiI = self.mesh.getFaceInnerProduct(self.curModel.mui, invMat=True) return self._MfMuiI @property @@ -155,7 +176,7 @@ class BaseEMProblem(Problem.BaseProblem): @property def MeSigma(self): if getattr(self, '_MeSigma', None) is None: - self._MeSigma = self.mesh.getEdgeInnerProduct(self.sigma) + self._MeSigma = self.mesh.getEdgeInnerProduct(self.curModel.sigma) return self._MeSigma # def dMeSigma_dsigma(self, u): @@ -164,7 +185,7 @@ class BaseEMProblem(Problem.BaseProblem): @property def MeSigmaI(self): if getattr(self, '_MeSigmaI', None) is None: - self._MeSigmaI = self.mesh.getEdgeInnerProduct(self.sigma, invMat=True) + self._MeSigmaI = self.mesh.getEdgeInnerProduct(self.curModel.sigma, invMat=True) return self._MeSigmaI # def dMeSigmaI_dsigma(self,u)