mirror of
https://github.com/wassname/simpeg.git
synced 2026-07-03 21:31:22 +08:00
start of using PropMaps for EB formulation
This commit is contained in:
+93
-72
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user