diff --git a/simpegEM/TDEM/BaseTDEM.py b/simpegEM/TDEM/BaseTDEM.py index 3ea68aa2..5aa92fac 100644 --- a/simpegEM/TDEM/BaseTDEM.py +++ b/simpegEM/TDEM/BaseTDEM.py @@ -1,5 +1,7 @@ from SimPEG import Utils from SimPEG.Data import BaseData +from SimPEG.Problem import BaseProblem +import numpy as np class DataTDEM1D(BaseData): @@ -16,3 +18,102 @@ class DataTDEM1D(BaseData): 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 + + diff --git a/simpegEM/TDEM/__init__.py b/simpegEM/TDEM/__init__.py index af6842f5..805e777d 100644 --- a/simpegEM/TDEM/__init__.py +++ b/simpegEM/TDEM/__init__.py @@ -1 +1 @@ -from BaseTDEM import DataTDEM1D \ No newline at end of file +from BaseTDEM import DataTDEM1D, ProblemTDEM1D \ No newline at end of file