mirror of
https://github.com/wassname/simpeg.git
synced 2026-07-13 17:45:30 +08:00
120 lines
3.1 KiB
Python
120 lines
3.1 KiB
Python
from SimPEG import Utils
|
|
from SimPEG.Data import BaseData
|
|
from SimPEG.Problem import BaseProblem
|
|
import numpy as np
|
|
|
|
|
|
class DataTDEM1D(BaseData):
|
|
"""
|
|
docstring for DataTDEM1D
|
|
"""
|
|
|
|
txLoc = None #: txLoc
|
|
txType = None #: txType
|
|
rxLoc = None #: rxLoc
|
|
rxType = None #: rxType
|
|
timeCh = None #: timeCh
|
|
|
|
def __init__(self, **kwargs):
|
|
BaseData.__init__(self, **kwargs)
|
|
Utils.setKwargs(self, **kwargs)
|
|
|
|
|
|
class MixinInitialFieldCalc(object):
|
|
"""docstring for MixinInitialFieldCalc"""
|
|
|
|
def getInitialFields(self):
|
|
pass
|
|
# return fields obj
|
|
|
|
|
|
class ProblemTDEM1D(MixinInitialFieldCalc, BaseProblem):
|
|
"""docstring for ProblemTDEM1D"""
|
|
def __init__(self, mesh, model, **kwargs):
|
|
BaseProblem.__init__(self, mesh, model, **kwargs)
|
|
|
|
|
|
# Time stuff ########################################
|
|
|
|
def dt():
|
|
doc = "Size of time steps"
|
|
def fget(self):
|
|
return self._dt
|
|
def fdel(self):
|
|
del self._dt
|
|
return locals()
|
|
dt = property(**dt())
|
|
|
|
def nsteps():
|
|
doc = "Number of steps to take"
|
|
def fget(self):
|
|
return self._nsteps
|
|
def fdel(self):
|
|
del self._nsteps
|
|
return locals()
|
|
nsteps = property(**nsteps())
|
|
|
|
def tCalc():
|
|
doc = "Modelling times"
|
|
def fget(self):
|
|
t = np.r_[1:self.nsteps[0]+1]*self.dt[0]
|
|
for i in range(1,self.dt.size):
|
|
t = np.r_[t, np.r_[1:self.nsteps[i]+1]*self.dt[i]+t[-1]]
|
|
return t
|
|
return locals()
|
|
tCalc = property(**tCalc())
|
|
|
|
def getDt(self, tInd):
|
|
return np.concatenate([self.dt[i].repeat(self.nsteps[i]) for i in range(self.dt.size)])[tInd]
|
|
|
|
def setTimes(self, dt, nsteps):
|
|
dt = np.array(dt)
|
|
nsteps = np.array(nsteps)
|
|
assert dt.size==nsteps.size, "dt, nsteps must be same length"
|
|
self._dt = dt
|
|
self._nsteps = nsteps
|
|
|
|
# End Time stuff ########################################
|
|
|
|
def field(self, m):
|
|
F = self.getInitialFields()
|
|
Asolve = None
|
|
for i, dt in enumerate(self.times):
|
|
A = self.getA(i, F)
|
|
rhs = self.getRHS(i, F)
|
|
if Asolve is None or redoSolver:
|
|
Asolve = Solver(A,options=self.solveOpts)
|
|
sol = Asolve.Solve(rhs)
|
|
self.updateField(sol, F)
|
|
|
|
return F
|
|
|
|
|
|
|
|
class FieldsTDEM(object):
|
|
|
|
phi0 = None #: Initial electric potential
|
|
A0 = None #: Initial magnetic vector potential
|
|
e0 = None #: Initial electric field
|
|
b0 = None #: Initial magnetic flux density
|
|
j0 = None #: Initial current density
|
|
h0 = None #: Initial magnetic field
|
|
|
|
phi = None #: Electric potential
|
|
A = None #: Magnetic vector potential
|
|
e = None #: Electric field
|
|
b = None #: Magnetic flux density
|
|
j = None #: Current density
|
|
h = None #: Magnetic field
|
|
|
|
"""docstring for FieldsTDEM"""
|
|
def __init__(self, mesh, nTimes, store):
|
|
|
|
self.nTimes = nTimes
|
|
self.nC = mesh.nC
|
|
self.nE = mesh.nE
|
|
self.nF = mesh.nF
|
|
self.nN = mesh.nN
|
|
|
|
|