Files
simpeg/SimPEG/EM/Static/DC/ProblemDC.py
T
2016-04-22 23:09:31 -07:00

168 lines
4.0 KiB
Python

from SimPEG import Problem
from SimPEG.EM.Base import BaseEMProblem
from SurveyDC import Survey
from FieldsDC import Fields, Fields_CC, Fields_N
from SimPEG.Utils import sdiag
import numpy as np
class BaseDCProblem(BaseEMProblem):
surveyPair = Survey
fieldsPair = Fields
def fields(self, m):
self.curModel = m
f = self.fieldsPair(self.mesh, self.survey)
A = self.getA()
self.Ainv = self.Solver(A, **self.solverOpts)
RHS = self.getRHS()
u = self.Ainv * RHS
Srcs = self.survey.srcList
f[Srcs, self._solutionType] = u
return f
def Jvec(self, m, v, f=None):
raise NotImplementedError
def Jtvec(self, m, v, f=None):
raise NotImplementedError
def getSourceTerm(self):
"""
takes concept of source and turns it into a matrix
"""
"""
Evaluates the sources for a given frequency and puts them in matrix form
:param float freq: Frequency
:rtype: (numpy.ndarray, numpy.ndarray)
:return: s_m, s_e (nE or nF, nSrc)
"""
Srcs = self.survey.srcList
if self._formulation is 'EB':
n = self.mesh.nN
# return NotImplementedError
elif self._formulation is 'HJ':
n = self.mesh.nC
q = np.zeros((n, len(Srcs)))
for i, src in enumerate(Srcs):
q[:,i] = src.eval(self)
return q
class Problem3D_N(BaseDCProblem):
_solutionType = 'phiSolution'
_formulation = 'EB' # N potentials means B is on faces
fieldsPair = Fields_N
def __init__(self, mesh, **kwargs):
BaseDCProblem.__init__(self, mesh, **kwargs)
def getA(self):
"""
Make the A matrix for the cell centered DC resistivity problem
A = D MfRhoI D^\\top V
"""
# TODO: this won't work for full anisotropy
MeSigma = self.MeSigma
Grad = self.mesh.nodalGrad
A = Grad.T * MeSigma * Grad
# if self._makeASymmetric is True:
# return V.T * A
return A
def getADeriv(self, u, v, adoint=False):
"""
Product of the derivative of our system matrix with respect to the model and a vector
"""
return Div*self.MfRhoIDeriv(Div.T*u)
def getRHS(self):
"""
RHS for the DC problem
q
"""
RHS = self.getSourceTerm()
# if self._makeASymmetric is True:
# return self.Vol.T * RHS
return RHS
def getRHSDeriv(self, src, v, adjoint=False):
"""
Derivative of the right hand side with respect to the model
"""
qDeriv = src.evalDeriv(self, adjoint=adjoint)
return qDeriv
class Problem3D_CC(BaseDCProblem):
_solutionType = 'phiSolution'
_formulation = 'HJ' # CC potentials means J is on faces
fieldsPair = Fields_CC
def __init__(self, mesh, **kwargs):
BaseDCProblem.__init__(self, mesh, **kwargs)
def getA(self):
"""
Make the A matrix for the cell centered DC resistivity problem
A = D MfRhoI D^\\top V
"""
# TODO: this won't work for full anisotropy
# V = self.Vol
# Div = V*self.mesh.faceDiv
MfRhoI = self.MfRhoI
A = self.Div * MfRhoI * self.Div.T
# if self._makeASymmetric is True:
# return V.T * A
return A
def getADeriv(self, u, v, adoint=False):
"""
Product of the derivative of our system matrix with respect to the model and a vector
"""
return Div*self.MfRhoIDeriv(Div.T*u)
def getRHS(self):
"""
RHS for the DC problem
q
"""
RHS = self.getSourceTerm()
# if self._makeASymmetric is True:
# return self.Vol.T * RHS
return RHS
def getRHSDeriv(self, src, v, adjoint=False):
"""
Derivative of the right hand side with respect to the model
"""
qDeriv = src.evalDeriv(self, adjoint=adjoint)
return qDeriv