mirror of
https://github.com/wassname/simpeg.git
synced 2026-06-29 10:28:26 +08:00
76 lines
2.5 KiB
Python
76 lines
2.5 KiB
Python
from SimPEG import Solver
|
|
from SimPEG.Problem import BaseTimeProblem
|
|
from simpegEM.Utils import Sources
|
|
from SurveyTDEM import FieldsTDEM, SurveyTDEM
|
|
from scipy.constants import mu_0
|
|
from SimPEG.Utils import sdiag, mkvc
|
|
from SimPEG import Utils, Mesh
|
|
from simpegEM.Base import BaseEMProblem
|
|
import numpy as np
|
|
|
|
|
|
class BaseTDEMProblem(BaseTimeProblem, BaseEMProblem):
|
|
"""docstring for ProblemTDEM1D"""
|
|
def __init__(self, mesh, mapping=None, **kwargs):
|
|
BaseTimeProblem.__init__(self, mesh, mapping=mapping, **kwargs)
|
|
|
|
surveyPair = SurveyTDEM
|
|
|
|
def calcFields(self, sol, tInd):
|
|
|
|
if self.solType == 'b':
|
|
b = sol
|
|
e = self.MeSigmaI*self.mesh.edgeCurl.T*self.MfMui*b
|
|
# Todo: implement non-zero js
|
|
else:
|
|
raise NotImplementedError('solType "%s" is not implemented in CalcFields.' % self.solType)
|
|
|
|
return {'b':b, 'e':e}
|
|
|
|
def fields(self, m):
|
|
self.curModel = m
|
|
# Create a fields storage object
|
|
F = FieldsTDEM(self.mesh, self.survey)
|
|
for tx in self.survey.txList:
|
|
# Set the initial conditions
|
|
F[tx,:,0] = tx.getInitialFields(self.mesh)
|
|
return self.forward(m, self.getRHS, self.calcFields, F=F)
|
|
|
|
|
|
def forward(self, m, RHS, CalcFields, F=None):
|
|
F = F or FieldsTDEM(self.mesh, self.survey)
|
|
|
|
dtFact = None
|
|
for tInd, dt in enumerate(self.timeSteps):
|
|
if dt != dtFact:
|
|
dtFact = dt
|
|
A = self.getA(tInd)
|
|
# print 'Factoring... (dt = ' + str(dt) + ')'
|
|
Asolve = self.Solver(A, **self.solverOpts)
|
|
# print 'Done'
|
|
rhs = RHS(tInd, F)
|
|
sol = Asolve.solve(rhs)
|
|
if sol.ndim == 1:
|
|
sol.shape = (sol.size,1)
|
|
F[:,:,tInd+1] = CalcFields(sol, tInd)
|
|
return F
|
|
|
|
def adjoint(self, m, RHS, CalcFields, F=None):
|
|
F = F or FieldsTDEM(self.mesh, self.survey)
|
|
|
|
dtFact = None
|
|
for tInd, dt in reversed(list(enumerate(self.timeSteps))):
|
|
if dt != dtFact:
|
|
dtFact = dt
|
|
A = self.getA(tInd)
|
|
# print 'Factoring... (dt = ' + str(dt) + ')'
|
|
Asolve = self.Solver(A, **self.solverOpts)
|
|
# print 'Done'
|
|
rhs = RHS(tInd, F)
|
|
sol = Asolve.solve(rhs)
|
|
if sol.ndim == 1:
|
|
sol.shape = (sol.size,1)
|
|
F[:,:,tInd+1] = CalcFields(sol, tInd)
|
|
return F
|
|
|