mirror of
https://github.com/wassname/simpeg.git
synced 2026-06-28 02:47:11 +08:00
94 lines
2.4 KiB
Python
94 lines
2.4 KiB
Python
from SimPEG import TensorMesh
|
|
from SimPEG.forward import Problem, SyntheticProblem
|
|
from SimPEG.utils import ModelBuilder
|
|
import numpy as np
|
|
import scipy.sparse.linalg as linalg
|
|
import DCutils
|
|
|
|
class DCProblem(Problem):
|
|
"""docstring for DCProblem"""
|
|
def __init__(self, mesh):
|
|
super(DCProblem, self).__init__(mesh)
|
|
self.mesh.setCellGradBC('neumann')
|
|
|
|
def createMatrix(self, m):
|
|
D = self.mesh.faceDiv
|
|
G = self.mesh.cellGrad
|
|
sigma = self.modelTransform(m)
|
|
Msig = self.mesh.getFaceMass(sigma)
|
|
A = D*Msig*G
|
|
return A.tocsc()
|
|
|
|
def field(self, m):
|
|
A = self.createMatrix(m)
|
|
solve = linalg.factorized(A)
|
|
|
|
nRHSs = self.RHS.shape[1] # Number of RHSs
|
|
phi = np.zeros((self.mesh.nC, nRHSs)) + np.nan
|
|
for ii in range(nRHSs):
|
|
phi[:,ii] = solve(self.RHS[:,ii])
|
|
|
|
return phi
|
|
|
|
def J(self, m, v, u=None, RHSii=0, solve=None):
|
|
P = self.P
|
|
D = self.mesh.faceDiv
|
|
G = self.mesh.cellGrad
|
|
A = self.createMatrix(m)
|
|
Av_dm = self.mesh.getFaceMassDeriv()
|
|
mT_dm = self.modelTransform(m)
|
|
|
|
dCdu = A
|
|
dCdm = - D * ( sdiag( G * u[:, RHSii] ) * ( Av_dm * ( mT_dm * v ) ) )
|
|
|
|
if solve is None:
|
|
solve = linalg.factorized(dCdu)
|
|
|
|
return - P * solve(dCdm)
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
# Create the mesh
|
|
h1 = np.ones(100)
|
|
h2 = np.ones(100)
|
|
mesh = TensorMesh([h1,h2])
|
|
|
|
# Create some parameters for the model
|
|
sig1 = 1
|
|
sig2 = 0.01
|
|
|
|
# Create a synthetic model from a block in a half-space
|
|
p0 = [20, 20]
|
|
p1 = [50, 50]
|
|
condVals = [sig1, sig2]
|
|
mSynth = ModelBuilder.defineBlockConductivity(p0,p1,mesh.gridCC,condVals)
|
|
mesh.plotImage(mSynth, showIt=False)
|
|
|
|
|
|
# Set up the projection
|
|
nelec = 50
|
|
spacelec = 2
|
|
surfloc = 0.5
|
|
elecini = 0.5
|
|
elecend = 0.5+spacelec*(nelec-1)
|
|
elecLocR = np.linspace(elecini, elecend, nelec)
|
|
rxmidLoc = (elecLocR[0:nelec-1]+elecLocR[1:nelec])*0.5
|
|
q, Q, rxmidloc = DCutils.genTxRxmat(nelec, spacelec, surfloc, elecini, mesh)
|
|
|
|
|
|
# Create some data
|
|
class syntheticDCProblem(DCProblem, SyntheticProblem):
|
|
pass
|
|
|
|
synthetic = syntheticDCProblem(mesh);
|
|
synthetic.P = Q.T
|
|
synthetic.RHS = q
|
|
dobs, Wd = synthetic.createData(mSynth)
|
|
|
|
# Now set up the problem to do some minimization
|
|
problem = DCProblem(mesh)
|
|
|
|
|
|
|