diff --git a/.gitignore b/.gitignore index fc798cea..e1264b7d 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,4 @@ nosetests.xml *.sublime-workspace docs/_build/ Makefile +docs/warnings.txt diff --git a/SimPEG/DCIP/BaseDC.py b/SimPEG/DCIP/BaseDC.py index 475c621e..4eb4ca69 100644 --- a/SimPEG/DCIP/BaseDC.py +++ b/SimPEG/DCIP/BaseDC.py @@ -162,8 +162,8 @@ class ProblemDC_CC(Problem.BaseProblem): """ Makes the matrix A(m) for the DC resistivity problem. - :param numpy.array m: model - :rtype: scipy.csc_matrix + :param numpy.ndarray m: model + :rtype: scipy.sparse.csc_matrix :return: A(m) .. math:: diff --git a/SimPEG/DCIP/BaseIP.py b/SimPEG/DCIP/BaseIP.py index a18b5a47..bab3af3a 100644 --- a/SimPEG/DCIP/BaseIP.py +++ b/SimPEG/DCIP/BaseIP.py @@ -71,7 +71,7 @@ class ProblemIP(Problem.BaseProblem): Makes the matrix A(m) for the DC resistivity problem. :param numpy.array m: model - :rtype: scipy.csc_matrix + :rtype: scipy.sparse.csc_matrix :return: A(m) .. math:: diff --git a/SimPEG/Directives.py b/SimPEG/Directives.py index 93e51f62..a35f97c0 100644 --- a/SimPEG/Directives.py +++ b/SimPEG/Directives.py @@ -166,7 +166,7 @@ class TargetMisfit(InversionDirective): -class _SaveEveryIteration(InversionDirective): +class SaveEveryIteration(InversionDirective): @property def name(self): if getattr(self, '_name', None) is None: @@ -187,7 +187,7 @@ class _SaveEveryIteration(InversionDirective): self._fileName = value -class SaveModelEveryIteration(_SaveEveryIteration): +class SaveModelEveryIteration(SaveEveryIteration): """SaveModelEveryIteration""" def initialize(self): @@ -197,7 +197,7 @@ class SaveModelEveryIteration(_SaveEveryIteration): np.save('%03d-%s' % (self.opt.iter, self.fileName), self.opt.xc) -class SaveOutputEveryIteration(_SaveEveryIteration): +class SaveOutputEveryIteration(SaveEveryIteration): """SaveModelEveryIteration""" def initialize(self): @@ -211,7 +211,7 @@ class SaveOutputEveryIteration(_SaveEveryIteration): f.write(' %3d %1.4e %1.4e %1.4e %1.4e\n'%(self.opt.iter, self.invProb.beta, self.invProb.phi_d, self.invProb.phi_m, self.opt.f)) f.close() -class SaveOutputDictEveryIteration(_SaveEveryIteration): +class SaveOutputDictEveryIteration(SaveEveryIteration): """SaveOutputDictEveryIteration""" def initialize(self): diff --git a/SimPEG/EM/Base.py b/SimPEG/EM/Base.py index 2a2ce363..15a0ce60 100644 --- a/SimPEG/EM/Base.py +++ b/SimPEG/EM/Base.py @@ -20,10 +20,10 @@ class BaseEMProblem(Problem.BaseProblem): Problem.BaseProblem.__init__(self, mesh, **kwargs) - surveyPair = Survey.BaseSurvey - dataPair = Survey.Data + surveyPair = Survey.BaseSurvey #: The survey to pair with. + dataPair = Survey.Data #: The data to pair with. - PropMap = EMPropMap + PropMap = EMPropMap #: The property mapping Solver = SimpegSolver solverOpts = {} @@ -217,6 +217,7 @@ class BaseEMSurvey(Survey.BaseSurvey): def eval(self, f): """ Project fields to receiver locations + :param Fields u: fields object :rtype: numpy.ndarray :return: data diff --git a/SimPEG/EM/FDEM/FieldsFDEM.py b/SimPEG/EM/FDEM/FieldsFDEM.py index c2e4bfa6..e0f54be2 100644 --- a/SimPEG/EM/FDEM/FieldsFDEM.py +++ b/SimPEG/EM/FDEM/FieldsFDEM.py @@ -6,11 +6,11 @@ from SimPEG.EM.Utils import omega from SimPEG.Utils import Zero, Identity, sdiag -class Fields(SimPEG.Problem.Fields): +class FieldsFDEM(SimPEG.Problem.Fields): """ Fancy Field Storage for a FDEM survey. Only one field type is stored for - each problem, the rest are computed. The fields obejct acts like an array and is indexed by + each problem, the rest are computed. The fields object acts like an array and is indexed by .. code-block:: python @@ -92,7 +92,7 @@ class Fields(SimPEG.Problem.Fields): """ Total derivative of e with respect to the inversion model. Returns :math:`d\mathbf{e}/d\mathbf{m}` for forward and (:math:`d\mathbf{e}/d\mathbf{u}`, :math:`d\mathb{u}/d\mathbf{m}`) for the adjoint - :param Src src: sorce + :param SimPEG.EM.FDEM.SrcFDEM.BaseSrc src: source :param numpy.ndarray du_dm_v: derivative of the solution vector with respect to the model times a vector (is None for adjoint) :param numpy.ndarray v: vector to take sensitivity product with :param bool adjoint: adjoint? @@ -110,7 +110,7 @@ class Fields(SimPEG.Problem.Fields): """ Total derivative of b with respect to the inversion model. Returns :math:`d\mathbf{b}/d\mathbf{m}` for forward and (:math:`d\mathbf{b}/d\mathbf{u}`, :math:`d\mathb{u}/d\mathbf{m}`) for the adjoint - :param Src src: sorce + :param SimPEG.EM.FDEM.SrcFDEM.BaseSrc src: source :param numpy.ndarray du_dm_v: derivative of the solution vector with respect to the model times a vector (is None for adjoint) :param numpy.ndarray v: vector to take sensitivity product with :param bool adjoint: adjoint? @@ -128,7 +128,7 @@ class Fields(SimPEG.Problem.Fields): """ Total derivative of h with respect to the inversion model. Returns :math:`d\mathbf{h}/d\mathbf{m}` for forward and (:math:`d\mathbf{h}/d\mathbf{u}`, :math:`d\mathb{u}/d\mathbf{m}`) for the adjoint - :param Src src: sorce + :param SimPEG.EM.FDEM.SrcFDEM.BaseSrc src: source :param numpy.ndarray du_dm_v: derivative of the solution vector with respect to the model times a vector (is None for adjoint) :param numpy.ndarray v: vector to take sensitivity product with :param bool adjoint: adjoint? @@ -146,7 +146,7 @@ class Fields(SimPEG.Problem.Fields): """ Total derivative of j with respect to the inversion model. Returns :math:`d\mathbf{j}/d\mathbf{m}` for forward and (:math:`d\mathbf{j}/d\mathbf{u}`, :math:`d\mathb{u}/d\mathbf{m}`) for the adjoint - :param Src src: sorce + :param SimPEG.EM.FDEM.SrcFDEM.BaseSrc src: source :param numpy.ndarray du_dm_v: derivative of the solution vector with respect to the model times a vector (is None for adjoint) :param numpy.ndarray v: vector to take sensitivity product with :param bool adjoint: adjoint? @@ -160,11 +160,11 @@ class Fields(SimPEG.Problem.Fields): return self._jDeriv_u(src, v, adjoint), self._jDeriv_m(src, v, adjoint) return np.array(self._jDeriv_u(src, du_dm_v, adjoint) + self._jDeriv_m(src, v, adjoint), dtype = complex) -class Fields3D_e(Fields): +class Fields3D_e(FieldsFDEM): """ Fields object for Problem3D_e. - :param Mesh mesh: mesh + :param BaseMesh mesh: mesh :param SimPEG.EM.FDEM.SurveyFDEM.Survey survey: survey """ @@ -180,9 +180,6 @@ class Fields3D_e(Fields): 'h' : ['eSolution','CCV','_h'], } - def __init__(self, mesh, survey, **kwargs): - Fields.__init__(self, mesh, survey, **kwargs) - def startup(self): self.prob = self.survey.prob self._edgeCurl = self.survey.prob.mesh.edgeCurl @@ -426,11 +423,11 @@ class Fields3D_e(Fields): -class Fields3D_b(Fields): +class Fields3D_b(FieldsFDEM): """ Fields object for Problem3D_b. - :param Mesh mesh: mesh + :param BaseMesh mesh: mesh :param SimPEG.EM.FDEM.SurveyFDEM.Survey survey: survey """ @@ -446,9 +443,6 @@ class Fields3D_b(Fields): 'h' : ['bSolution','CCV','_h'], } - def __init__(self, mesh, survey, **kwargs): - Fields.__init__(self, mesh, survey, **kwargs) - def startup(self): self.prob = self.survey.prob self._edgeCurl = self.survey.prob.mesh.edgeCurl @@ -693,11 +687,11 @@ class Fields3D_b(Fields): return Zero() -class Fields3D_j(Fields): +class Fields3D_j(FieldsFDEM): """ Fields object for Problem3D_j. - :param Mesh mesh: mesh + :param BaseMesh mesh: mesh :param SimPEG.EM.FDEM.SurveyFDEM.Survey survey: survey """ @@ -713,9 +707,6 @@ class Fields3D_j(Fields): 'b' : ['jSolution','CCV','_b'], } - def __init__(self, mesh, survey, **kwargs): - Fields.__init__(self, mesh, survey, **kwargs) - def startup(self): self.prob = self.survey.prob self._edgeCurl = self.survey.prob.mesh.edgeCurl @@ -988,11 +979,11 @@ class Fields3D_j(Fields): return 1./(1j * omega(src.freq)) * VI * (self._aveE2CCV * ( s_mDeriv(v) - self._edgeCurl.T * ( self._MfRhoDeriv(jSolution) * v ) ) ) -class Fields3D_h(Fields): +class Fields3D_h(FieldsFDEM): """ Fields object for Problem3D_h. - :param Mesh mesh: mesh + :param BaseMesh mesh: mesh :param SimPEG.EM.FDEM.SurveyFDEM.Survey survey: survey """ @@ -1008,9 +999,6 @@ class Fields3D_h(Fields): 'b' : ['hSolution','CCV','_b'], } - def __init__(self, mesh, survey, **kwargs): - Fields.__init__(self, mesh, survey, **kwargs) - def startup(self): self.prob = self.survey.prob self._edgeCurl = self.survey.prob.mesh.edgeCurl diff --git a/SimPEG/EM/FDEM/ProblemFDEM.py b/SimPEG/EM/FDEM/ProblemFDEM.py index c4f24e15..cbc01b9e 100644 --- a/SimPEG/EM/FDEM/ProblemFDEM.py +++ b/SimPEG/EM/FDEM/ProblemFDEM.py @@ -1,7 +1,7 @@ from SimPEG import Problem, Utils, np, sp, Solver as SimpegSolver from scipy.constants import mu_0 from SurveyFDEM import Survey as SurveyFDEM -from FieldsFDEM import Fields, Fields3D_e, Fields3D_b, Fields3D_h, Fields3D_j +from FieldsFDEM import FieldsFDEM, Fields3D_e, Fields3D_b, Fields3D_h, Fields3D_j from SimPEG.EM.Base import BaseEMProblem from SimPEG.EM.Utils import omega @@ -35,7 +35,7 @@ class BaseFDEMProblem(BaseEMProblem): """ surveyPair = SurveyFDEM - fieldsPair = Fields + fieldsPair = FieldsFDEM def fields(self, m): """ @@ -65,7 +65,7 @@ class BaseFDEMProblem(BaseEMProblem): :param numpy.array m: inversion model (nP,) :param numpy.array v: vector which we take sensitivity product with (nP,) - :param SimPEG.EM.FDEM.Fields u: fields object + :param SimPEG.EM.FDEM.FieldsFDEM.FieldsFDEM u: fields object :rtype numpy.array: :return: Jv (ndata,) """ @@ -100,7 +100,7 @@ class BaseFDEMProblem(BaseEMProblem): :param numpy.array m: inversion model (nP,) :param numpy.array v: vector which we take adjoint product with (nP,) - :param SimPEG.EM.FDEM.Fields u: fields object + :param SimPEG.EM.FDEM.FieldsFDEM.FieldsFDEM u: fields object :rtype numpy.array: :return: Jv (ndata,) """ @@ -154,8 +154,8 @@ class BaseFDEMProblem(BaseEMProblem): 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) + :rtype: tuple + :return: (s_m, s_e) (nE or nF, nSrc) """ Srcs = self.survey.getSrcByFreq(freq) if self._formulation is 'EB': @@ -195,7 +195,7 @@ class Problem3D_e(BaseFDEMProblem): which we solve for :math:`\mathbf{e}`. - :param SimPEG.Mesh mesh: mesh + :param SimPEG.Mesh.BaseMesh.BaseMesh mesh: mesh """ _solutionType = 'eSolution' @@ -270,7 +270,7 @@ class Problem3D_e(BaseFDEMProblem): Derivative of the right hand side with respect to the model :param float freq: frequency - :param SimPEG.EM.FDEM.Src src: FDEM source + :param SimPEG.EM.FDEM.SrcFDEM.BaseSrc src: FDEM source :param numpy.ndarray v: vector to take product with :param bool adjoint: adjoint? :rtype: numpy.ndarray @@ -306,7 +306,7 @@ class Problem3D_b(BaseFDEMProblem): .. note :: The inverse problem will not work with full anisotropy - :param SimPEG.Mesh mesh: mesh + :param SimPEG.Mesh.BaseMesh.BaseMesh mesh: mesh """ _solutionType = 'bSolution' @@ -401,7 +401,7 @@ class Problem3D_b(BaseFDEMProblem): Derivative of the right hand side with respect to the model :param float freq: frequency - :param SimPEG.EM.FDEM.Src src: FDEM source + :param SimPEG.EM.FDEM.SrcFDEM.BaseSrc src: FDEM source :param numpy.ndarray v: vector to take product with :param bool adjoint: adjoint? :rtype: numpy.ndarray @@ -455,7 +455,7 @@ class Problem3D_j(BaseFDEMProblem): .. note:: This implementation does not yet work with full anisotropy!! - :param SimPEG.Mesh mesh: mesh + :param SimPEG.Mesh.BaseMesh.BaseMesh mesh: mesh """ _solutionType = 'jSolution' @@ -531,8 +531,8 @@ class Problem3D_j(BaseFDEMProblem): \mathbf{RHS} = \mathbf{C} \mathbf{M_{\mu}^e}^{-1}\mathbf{s_m} -i\omega \mathbf{s_e} :param float freq: Frequency - :rtype: numpy.ndarray (nE, nSrc) - :return: RHS + :rtype: numpy.ndarray + :return: RHS (nE, nSrc) """ s_m, s_e = self.getSourceTerm(freq) @@ -551,7 +551,7 @@ class Problem3D_j(BaseFDEMProblem): Derivative of the right hand side with respect to the model :param float freq: frequency - :param SimPEG.EM.FDEM.Src src: FDEM source + :param SimPEG.EM.FDEM.SrcFDEM.BaseSrc src: FDEM source :param numpy.ndarray v: vector to take product with :param bool adjoint: adjoint? :rtype: numpy.ndarray @@ -593,7 +593,7 @@ class Problem3D_h(BaseFDEMProblem): \\left(\mathbf{C}^{\\top} \mathbf{M_{\\rho}^f} \mathbf{C} + i \omega \mathbf{M_{\mu}^e}\\right) \mathbf{h} = \mathbf{M^e} \mathbf{s_m} + \mathbf{C}^{\\top} \mathbf{M_{\\rho}^f} \mathbf{s_e} - :param SimPEG.Mesh mesh: mesh + :param SimPEG.Mesh.BaseMesh.BaseMesh mesh: mesh """ _solutionType = 'hSolution' @@ -671,7 +671,7 @@ class Problem3D_h(BaseFDEMProblem): Derivative of the right hand side with respect to the model :param float freq: frequency - :param SimPEG.EM.FDEM.Src src: FDEM source + :param SimPEG.EM.FDEM.SrcFDEM.BaseSrc src: FDEM source :param numpy.ndarray v: vector to take product with :param bool adjoint: adjoint? :rtype: numpy.ndarray diff --git a/SimPEG/EM/FDEM/RxFDEM.py b/SimPEG/EM/FDEM/RxFDEM.py index 53d6c722..13e2f291 100644 --- a/SimPEG/EM/FDEM/RxFDEM.py +++ b/SimPEG/EM/FDEM/RxFDEM.py @@ -25,10 +25,10 @@ class BaseRx(SimPEG.Survey.BaseRx): def eval(self, src, mesh, f): """ - Project fields to recievers to get data. + Project fields to receivers to get data. - :param Source src: FDEM source - :param Mesh mesh: mesh used + :param SimPEG.EM.FDEM.SrcFDEM.BaseSrc src: FDEM source + :param BaseMesh mesh: mesh used :param Fields f: fields object :rtype: numpy.ndarray :return: fields projected to recievers @@ -44,8 +44,8 @@ class BaseRx(SimPEG.Survey.BaseRx): """ Derivative of projected fields with respect to the inversion model times a vector. - :param Source src: FDEM source - :param Mesh mesh: mesh used + :param SimPEG.EM.FDEM.SrcFDEM.BaseSrc src: FDEM source + :param BaseMesh mesh: mesh used :param Fields f: fields object :param numpy.ndarray v: vector to multiply :rtype: numpy.ndarray diff --git a/SimPEG/EM/FDEM/SrcFDEM.py b/SimPEG/EM/FDEM/SrcFDEM.py index e6c8f005..7557ada7 100644 --- a/SimPEG/EM/FDEM/SrcFDEM.py +++ b/SimPEG/EM/FDEM/SrcFDEM.py @@ -23,8 +23,8 @@ class BaseSrc(Survey.BaseSrc): - :math:`s_m` : magnetic source term - :math:`s_e` : electric source term - :param Problem prob: FDEM Problem - :rtype: (numpy.ndarray, numpy.ndarray) + :param BaseFDEMProblem prob: FDEM Problem + :rtype: tuple :return: tuple with magnetic source term and electric source term """ s_m = self.s_m(prob) @@ -37,10 +37,10 @@ class BaseSrc(Survey.BaseSrc): - :code:`s_mDeriv` : derivative of the magnetic source term - :code:`s_eDeriv` : derivative of the electric source term - :param Problem prob: FDEM Problem + :param BaseFDEMProblem prob: FDEM Problem :param numpy.ndarray v: vector to take product with :param bool adjoint: adjoint? - :rtype: (numpy.ndarray, numpy.ndarray) + :rtype: tuple :return: tuple with magnetic source term and electric source term derivatives times a vector """ if v is not None: @@ -52,7 +52,7 @@ class BaseSrc(Survey.BaseSrc): """ Primary magnetic flux density - :param Problem prob: FDEM Problem + :param BaseFDEMProblem prob: FDEM Problem :rtype: numpy.ndarray :return: primary magnetic flux density """ @@ -64,7 +64,7 @@ class BaseSrc(Survey.BaseSrc): """ Primary magnetic field - :param Problem prob: FDEM Problem + :param BaseFDEMProblem prob: FDEM Problem :rtype: numpy.ndarray :return: primary magnetic field """ @@ -76,7 +76,7 @@ class BaseSrc(Survey.BaseSrc): """ Primary electric field - :param Problem prob: FDEM Problem + :param BaseFDEMProblem prob: FDEM Problem :rtype: numpy.ndarray :return: primary electric field """ @@ -88,7 +88,7 @@ class BaseSrc(Survey.BaseSrc): """ Primary current density - :param Problem prob: FDEM Problem + :param BaseFDEMProblem prob: FDEM Problem :rtype: numpy.ndarray :return: primary current density """ @@ -100,7 +100,7 @@ class BaseSrc(Survey.BaseSrc): """ Magnetic source term - :param Problem prob: FDEM Problem + :param BaseFDEMProblem prob: FDEM Problem :rtype: numpy.ndarray :return: magnetic source term on mesh """ @@ -110,7 +110,7 @@ class BaseSrc(Survey.BaseSrc): """ Electric source term - :param Problem prob: FDEM Problem + :param BaseFDEMProblem prob: FDEM Problem :rtype: numpy.ndarray :return: electric source term on mesh """ @@ -120,7 +120,7 @@ class BaseSrc(Survey.BaseSrc): """ Derivative of magnetic source term with respect to the inversion model - :param Problem prob: FDEM Problem + :param BaseFDEMProblem prob: FDEM Problem :param numpy.ndarray v: vector to take product with :param bool adjoint: adjoint? :rtype: numpy.ndarray @@ -133,7 +133,7 @@ class BaseSrc(Survey.BaseSrc): """ Derivative of electric source term with respect to the inversion model - :param Problem prob: FDEM Problem + :param BaseFDEMProblem prob: FDEM Problem :param numpy.ndarray v: vector to take product with :param bool adjoint: adjoint? :rtype: numpy.ndarray @@ -162,7 +162,7 @@ class RawVec_e(BaseSrc): """ Electric source term - :param Problem prob: FDEM Problem + :param BaseFDEMProblem prob: FDEM Problem :rtype: numpy.ndarray :return: electric source term on mesh """ @@ -191,7 +191,7 @@ class RawVec_m(BaseSrc): """ Magnetic source term - :param Problem prob: FDEM Problem + :param BaseFDEMProblem prob: FDEM Problem :rtype: numpy.ndarray :return: magnetic source term on mesh """ @@ -220,7 +220,7 @@ class RawVec(BaseSrc): """ Magnetic source term - :param Problem prob: FDEM Problem + :param BaseFDEMProblem prob: FDEM Problem :rtype: numpy.ndarray :return: magnetic source term on mesh """ @@ -232,7 +232,7 @@ class RawVec(BaseSrc): """ Electric source term - :param Problem prob: FDEM Problem + :param BaseFDEMProblem prob: FDEM Problem :rtype: numpy.ndarray :return: electric source term on mesh """ @@ -301,7 +301,7 @@ class MagDipole(BaseSrc): """ The primary magnetic flux density from a magnetic vector potential - :param Problem prob: FDEM problem + :param BaseFDEMProblem prob: FDEM problem :rtype: numpy.ndarray :return: primary magnetic field """ @@ -339,7 +339,7 @@ class MagDipole(BaseSrc): """ The primary magnetic field from a magnetic vector potential - :param Problem prob: FDEM problem + :param BaseFDEMProblem prob: FDEM problem :rtype: numpy.ndarray :return: primary magnetic field """ @@ -350,7 +350,7 @@ class MagDipole(BaseSrc): """ The magnetic source term - :param Problem prob: FDEM problem + :param BaseFDEMProblem prob: FDEM problem :rtype: numpy.ndarray :return: primary magnetic field """ @@ -364,7 +364,7 @@ class MagDipole(BaseSrc): """ The electric source term - :param Problem prob: FDEM problem + :param BaseFDEMProblem prob: FDEM problem :rtype: numpy.ndarray :return: primary magnetic field """ @@ -416,7 +416,7 @@ class MagDipole_Bfield(BaseSrc): """ The primary magnetic flux density from the analytic solution for magnetic fields from a dipole - :param Problem prob: FDEM problem + :param BaseFDEMProblem prob: FDEM problem :rtype: numpy.ndarray :return: primary magnetic field """ @@ -455,7 +455,7 @@ class MagDipole_Bfield(BaseSrc): """ The primary magnetic field from a magnetic vector potential - :param Problem prob: FDEM problem + :param BaseFDEMProblem prob: FDEM problem :rtype: numpy.ndarray :return: primary magnetic field """ @@ -466,7 +466,7 @@ class MagDipole_Bfield(BaseSrc): """ The magnetic source term - :param Problem prob: FDEM problem + :param BaseFDEMProblem prob: FDEM problem :rtype: numpy.ndarray :return: primary magnetic field """ @@ -479,7 +479,7 @@ class MagDipole_Bfield(BaseSrc): """ The electric source term - :param Problem prob: FDEM problem + :param BaseFDEMProblem prob: FDEM problem :rtype: numpy.ndarray :return: primary magnetic field """ @@ -530,7 +530,7 @@ class CircularLoop(BaseSrc): """ The primary magnetic flux density from a magnetic vector potential - :param Problem prob: FDEM problem + :param BaseFDEMProblem prob: FDEM problem :rtype: numpy.ndarray :return: primary magnetic field """ @@ -567,7 +567,7 @@ class CircularLoop(BaseSrc): """ The primary magnetic field from a magnetic vector potential - :param Problem prob: FDEM problem + :param BaseFDEMProblem prob: FDEM problem :rtype: numpy.ndarray :return: primary magnetic field """ @@ -578,7 +578,7 @@ class CircularLoop(BaseSrc): """ The magnetic source term - :param Problem prob: FDEM problem + :param BaseFDEMProblem prob: FDEM problem :rtype: numpy.ndarray :return: primary magnetic field """ @@ -591,7 +591,7 @@ class CircularLoop(BaseSrc): """ The electric source term - :param Problem prob: FDEM problem + :param BaseFDEMProblem prob: FDEM problem :rtype: numpy.ndarray :return: primary magnetic field """ diff --git a/SimPEG/EM/TDEM/BaseTDEM.py b/SimPEG/EM/TDEM/BaseTDEM.py index 15fc19e3..cb93ab40 100644 --- a/SimPEG/EM/TDEM/BaseTDEM.py +++ b/SimPEG/EM/TDEM/BaseTDEM.py @@ -112,7 +112,7 @@ class BaseTDEMProblem(BaseTimeProblem, BaseEMProblem): """ :param numpy.array m: Conductivity model :param numpy.ndarray v: vector (model object) - :param simpegEM.TDEM.FieldsTDEM f: Fields resulting from m + :param FieldsTDEM f: Fields resulting from m :rtype: numpy.ndarray :return: w (data object) @@ -136,8 +136,8 @@ class BaseTDEMProblem(BaseTimeProblem, BaseEMProblem): def Jtvec(self, m, v, f=None): """ :param numpy.array m: Conductivity model - :param numpy.ndarray,SimPEG.Survey.Data v: vector (data object) - :param simpegEM.TDEM.FieldsTDEM u: Fields resulting from m + :param numpy.ndarray v: vector (or a :class:`SimPEG.Survey.Data` object) + :param FieldsTDEM u: Fields resulting from m :rtype: numpy.ndarray :return: w (model object) diff --git a/SimPEG/EM/TDEM/TDEM_b.py b/SimPEG/EM/TDEM/TDEM_b.py index cd38660c..f88066e0 100644 --- a/SimPEG/EM/TDEM/TDEM_b.py +++ b/SimPEG/EM/TDEM/TDEM_b.py @@ -87,8 +87,8 @@ class ProblemTDEM_b(BaseTDEMProblem): """ :param numpy.array m: Conductivity model :param numpy.array vec: vector (like a model) - :param simpegEM.TDEM.FieldsTDEM u: Fields resulting from m - :rtype: simpegEM.TDEM.FieldsTDEM + :param FieldsTDEM u: Fields resulting from m + :rtype: FieldsTDEM :return: f Multiply G by a vector @@ -125,9 +125,9 @@ class ProblemTDEM_b(BaseTDEMProblem): """ :param numpy.array m: Conductivity model :param numpy.array vec: vector (like a fields) - :param simpegEM.TDEM.FieldsTDEM u: Fields resulting from m - :rtype: np.ndarray (like a model) - :return: p + :param FieldsTDEM u: Fields resulting from m + :rtype: numpy.ndarray + :return: p (like a model) Multiply G.T by a vector """ @@ -153,8 +153,8 @@ class ProblemTDEM_b(BaseTDEMProblem): def solveAh(self, m, p): """ :param numpy.array m: Conductivity model - :param simpegEM.TDEM.FieldsTDEM p: Fields object - :rtype: simpegEM.TDEM.FieldsTDEM + :param FieldsTDEM p: Fields object + :rtype: FieldsTDEM :return: y Solve the block-matrix system \\\(\\\hat{A} \\\hat{y} = \\\hat{p}\\\): @@ -200,8 +200,8 @@ class ProblemTDEM_b(BaseTDEMProblem): def solveAht(self, m, p): """ :param numpy.array m: Conductivity model - :param simpegEM.TDEM.FieldsTDEM p: Fields object - :rtype: simpegEM.TDEM.FieldsTDEM + :param FieldsTDEM p: Fields object + :rtype: FieldsTDEM :return: y Solve the block-matrix system \\\(\\\hat{A}^\\\\top \\\hat{y} = \\\hat{p}\\\): @@ -270,8 +270,8 @@ class ProblemTDEM_b(BaseTDEMProblem): def _AhVec(self, m, vec): """ :param numpy.array m: Conductivity model - :param simpegEM.TDEM.FieldsTDEM vec: Fields object - :rtype: simpegEM.TDEM.FieldsTDEM + :param FieldsTDEM vec: Fields object + :rtype: FieldsTDEM :return: f Multiply the matrix \\\(\\\hat{A}\\\) by a fields vector where @@ -315,8 +315,8 @@ class ProblemTDEM_b(BaseTDEMProblem): def _AhtVec(self, m, vec): """ :param numpy.array m: Conductivity model - :param simpegEM.TDEM.FieldsTDEM vec: Fields object - :rtype: simpegEM.TDEM.FieldsTDEM + :param FieldsTDEM vec: Fields object + :rtype: FieldsTDEM :return: f Multiply the matrix \\\(\\\hat{A}\\\) by a fields vector where diff --git a/SimPEG/Examples/EM_Schenkel_Morrison_Casing.py b/SimPEG/Examples/EM_Schenkel_Morrison_Casing.py index c4306eb1..3e0b308c 100644 --- a/SimPEG/Examples/EM_Schenkel_Morrison_Casing.py +++ b/SimPEG/Examples/EM_Schenkel_Morrison_Casing.py @@ -19,10 +19,13 @@ def run(plotIt=True): Morrison Casing Model, and the results are used in a 2016 SEG abstract by Yang et al. - - Schenkel, C.J., and H.F. Morrison, 1990, Effects of well casing on potential field measurements using downhole current sources: Geophysical prospecting, 38, 663-686. + .. code-block:: text + + Schenkel, C.J., and H.F. Morrison, 1990, Effects of well casing on potential field measurements using downhole current sources: Geophysical prospecting, 38, 663-686. The model consists of: + - Air: Conductivity 1e-8 S/m, above z = 0 - Background: conductivity 1e-2 S/m, below z = 0 - Casing: conductivity 1e6 S/m diff --git a/SimPEG/FLOW/Richards/Empirical.py b/SimPEG/FLOW/Richards/Empirical.py index 1bb163b5..c6624e94 100644 --- a/SimPEG/FLOW/Richards/Empirical.py +++ b/SimPEG/FLOW/Richards/Empirical.py @@ -31,7 +31,7 @@ class NonLinearMap(object): """ :param numpy.array u: fields :param numpy.array m: model - :rtype: scipy.csr_matrix + :rtype: scipy.sparse.csr_matrix :return: derivative of transformed model The *transform* changes the model into the physical property. @@ -44,7 +44,7 @@ class NonLinearMap(object): """ :param numpy.array u: fields :param numpy.array m: model - :rtype: scipy.csr_matrix + :rtype: scipy.sparse.csr_matrix :return: derivative of transformed model The *transform* changes the model into the physical property. diff --git a/SimPEG/Mesh/BaseMesh.py b/SimPEG/Mesh/BaseMesh.py index ba2ce920..97394b68 100644 --- a/SimPEG/Mesh/BaseMesh.py +++ b/SimPEG/Mesh/BaseMesh.py @@ -34,7 +34,7 @@ class BaseMesh(object): """ Origin of the mesh - :rtype: numpy.array + :rtype: numpy.array :return: x0, (dim, ) """ return self._x0 @@ -116,7 +116,7 @@ class BaseMesh(object): """ Total number of edges in each direction - :rtype: numpy.array + :rtype: numpy.array :return: [nEx, nEy, nEz], (dim, ) .. plot:: @@ -200,7 +200,7 @@ class BaseMesh(object): """ Face Normals - :rtype: numpy.array + :rtype: numpy.array :return: normals, (sum(nF), dim) """ if self.dim == 2: @@ -218,7 +218,7 @@ class BaseMesh(object): """ Edge Tangents - :rtype: numpy.array + :rtype: numpy.array :return: normals, (sum(nE), dim) """ if self.dim == 2: @@ -297,7 +297,7 @@ class BaseRectangularMesh(BaseMesh): """ Total number of cells in each direction - :rtype: numpy.array (dim, ) + :rtype: numpy.array :return: [nCx, nCy, nCz] """ return np.array([x for x in [self.nCx, self.nCy, self.nCz] if not x is None]) @@ -337,7 +337,7 @@ class BaseRectangularMesh(BaseMesh): """ Total number of nodes in each direction - :rtype: numpy.array (dim, ) + :rtype: numpy.array :return: [nNx, nNy, nNz] """ return np.array([x for x in [self.nNx, self.nNy, self.nNz] if not x is None]) @@ -347,7 +347,7 @@ class BaseRectangularMesh(BaseMesh): """ Number of x-edges in each direction - :rtype: numpy.array (dim, ) + :rtype: numpy.array :return: vnEx """ return np.array([x for x in [self.nCx, self.nNy, self.nNz] if not x is None]) @@ -357,7 +357,7 @@ class BaseRectangularMesh(BaseMesh): """ Number of y-edges in each direction - :rtype: numpy.array (dim, ) + :rtype: numpy.array :return: vnEy or None if dim < 2 """ return None if self.dim < 2 else np.array([x for x in [self.nNx, self.nCy, self.nNz] if not x is None]) @@ -367,7 +367,7 @@ class BaseRectangularMesh(BaseMesh): """ Number of z-edges in each direction - :rtype: numpy.array (dim, ) + :rtype: numpy.array :return: vnEz or None if dim < 3 """ return None if self.dim < 3 else np.array([x for x in [self.nNx, self.nNy, self.nCz] if not x is None]) @@ -377,7 +377,7 @@ class BaseRectangularMesh(BaseMesh): """ Number of x-faces in each direction - :rtype: numpy.array (dim, ) + :rtype: numpy.array :return: vnFx """ return np.array([x for x in [self.nNx, self.nCy, self.nCz] if not x is None]) @@ -387,7 +387,7 @@ class BaseRectangularMesh(BaseMesh): """ Number of y-faces in each direction - :rtype: numpy.array (dim, ) + :rtype: numpy.array :return: vnFy or None if dim < 2 """ return None if self.dim < 2 else np.array([x for x in [self.nCx, self.nNy, self.nCz] if not x is None]) @@ -397,7 +397,7 @@ class BaseRectangularMesh(BaseMesh): """ Number of z-faces in each direction - :rtype: numpy.array (dim, ) + :rtype: numpy.array :return: vnFz or None if dim < 3 """ return None if self.dim < 3 else np.array([x for x in [self.nCx, self.nCy, self.nNz] if not x is None]) diff --git a/SimPEG/Mesh/InnerProducts.py b/SimPEG/Mesh/InnerProducts.py index 8415b7ad..0c08cdd3 100644 --- a/SimPEG/Mesh/InnerProducts.py +++ b/SimPEG/Mesh/InnerProducts.py @@ -115,12 +115,11 @@ class InnerProducts(object): :param bool doFast: do a faster implementation if available. :param bool invProp: inverts the material property :param bool invMat: inverts the matrix - :rtype: function :return: dMdmu(u), the derivative of the inner product matrix (u) Given u, dMdmu returns (nF, nC*nA) - :param np.ndarray u: vector that multiplies dMdmu + :param numpy.ndarray u: vector that multiplies dMdmu :rtype: scipy.sparse.csr_matrix :return: dMdmu, the derivative of the inner product matrix for a certain u """ diff --git a/SimPEG/Mesh/MeshIO.py b/SimPEG/Mesh/MeshIO.py index 1c042237..0810f973 100644 --- a/SimPEG/Mesh/MeshIO.py +++ b/SimPEG/Mesh/MeshIO.py @@ -6,13 +6,11 @@ class TensorMeshIO(object): @classmethod def readUBC(TensorMesh, fileName): """ - Read UBC GIF 3DTensor mesh and generate 3D Tensor mesh in simpegTD + Read UBC GIF 3D tensor mesh and generate 3D TensorMesh in SimPEG. - Input: - :param fileName, path to the UBC GIF mesh file - - Output: - :param SimPEG TensorMesh object + :param string fileName: path to the UBC GIF mesh file + :rtype: TensorMesh + :return: The tensor mesh for the fileName. """ # Interal function to read cell size lines for the UBC mesh files. @@ -48,11 +46,9 @@ class TensorMeshIO(object): Read VTK Rectilinear (vtr xml file) and return SimPEG Tensor mesh and model Input: - :param vtrFileName, path to the vtr model file to write to - - Output: - :return SimPEG TensorMesh object - :return SimPEG model dictionary + :param string fileName: path to the vtr model file to read + :rtype: tuple + :return: (TensorMesh, modelDictionary) """ # Import @@ -102,9 +98,8 @@ class TensorMeshIO(object): Makes and saves a VTK rectilinear file (vtr) for a simpeg Tensor mesh and model. Input: - :param str, path to the output vtk file - :param mesh, SimPEG TensorMesh object - mesh to be transfer to VTK - :param models, dictionary of numpy.array - Name('s) and array('s). Match number of cells + :param string fileName: path to the output vtk file + :param dict models: dictionary of numpy.array - Name('s) and array('s). Match number of cells """ # Import @@ -162,12 +157,9 @@ class TensorMeshIO(object): """ Read UBC 3DTensor mesh model and generate 3D Tensor mesh model in simpeg - Input: - :param fileName, path to the UBC GIF mesh file to read - :param mesh, TensorMesh object, mesh that coresponds to the model - - Output: - :return numpy array, model with TensorMesh ordered + :param string fileName: path to the UBC GIF mesh file to read + :rtype: numpy.ndarray + :return: model with TensorMesh ordered """ f = open(fileName, 'r') model = np.array(map(float, f.readlines())) @@ -183,8 +175,7 @@ class TensorMeshIO(object): Writes a model associated with a SimPEG TensorMesh to a UBC-GIF format model file. - :param str fileName: File to write to - :param simpeg.Mesh.TensorMesh mesh: The mesh + :param string fileName: File to write to :param numpy.ndarray model: The model """ @@ -201,8 +192,8 @@ class TensorMeshIO(object): """ Writes a SimPEG TensorMesh to a UBC-GIF format mesh file. - :param str fileName: File to write to - :param simpeg.Mesh.TensorMesh mesh: The mesh + :param string fileName: File to write to + :param dict models: A dictionary of the models """ assert mesh.dim == 3 @@ -231,9 +222,8 @@ class TreeMeshIO(object): """ Write UBC ocTree mesh and model files from a simpeg ocTree mesh and model. - :param str fileName: File to write to - :param simpeg.Mesh.TreeMesh mesh: The mesh - :param dictionary models: The models in a dictionary, where the keys is the name of the of the model file + :param string fileName: File to write to + :param dict models: The models in a dictionary, where the keys is the name of the of the model file """ # Calculate information to write in the file. @@ -286,10 +276,9 @@ class TreeMeshIO(object): Input: :param str meshFile: path to the UBC GIF OcTree mesh file to read + :rtype: SimPEG.Mesh.TreeMesh + :return: The octree mesh - Output: - :return SimPEG.Mesh.TreeMesh mesh: The octree mesh - :return list of ndarray's: models as a list of numpy array's """ ## Read the file lines @@ -335,11 +324,9 @@ class TreeMeshIO(object): """ Read UBC OcTree model and get vector - Input: - :param fileName, path to the UBC GIF model file to read - - Output: - :return numpy array, OcTree model + :param string fileName: path to the UBC GIF model file to read + :rtype: numpy.ndarray + :return: OcTree model """ if type(fileName) is list: diff --git a/SimPEG/Mesh/TensorMesh.py b/SimPEG/Mesh/TensorMesh.py index 1650b5cb..65b6d7e9 100644 --- a/SimPEG/Mesh/TensorMesh.py +++ b/SimPEG/Mesh/TensorMesh.py @@ -198,8 +198,8 @@ class BaseTensorMesh(BaseMesh): Determines if a set of points are inside a mesh. :param numpy.ndarray pts: Location of points to test - :rtype numpy.ndarray - :return inside, numpy array of booleans + :rtype numpy.ndarray: + :return: inside, numpy array of booleans """ pts = Utils.asArray_N_x_Dim(pts, self.dim) @@ -221,7 +221,7 @@ class BaseTensorMesh(BaseMesh): :param numpy.ndarray loc: Location of points to interpolate to :param str locType: What to interpolate (see below) - :rtype: scipy.sparse.csr.csr_matrix + :rtype: scipy.sparse.csr_matrix :return: M, the interpolation matrix locType can be:: @@ -289,7 +289,7 @@ class BaseTensorMesh(BaseMesh): :param bool returnP: returns the projection matrices :param bool invProp: inverts the material property :param bool invMat: inverts the matrix - :rtype: scipy.csr_matrix + :rtype: scipy.sparse.csr_matrix :return: M, the inner product matrix (nF, nF) """ assert projType in ['F', 'E'], "projType must be 'F' for faces or 'E' for edges" diff --git a/SimPEG/Mesh/View.py b/SimPEG/Mesh/View.py index 569e0392..fe062b1b 100644 --- a/SimPEG/Mesh/View.py +++ b/SimPEG/Mesh/View.py @@ -560,7 +560,7 @@ class CurvView(object): :include-source: from SimPEG import Mesh, Utils - X, Y = Utils.exampleCurvGird([3,3],'rotate') + X, Y = Utils.meshutils.exampleLrmGrid([3,3],'rotate') M = Mesh.CurvilinearMesh([X, Y]) M.plotGrid(showIt=True) diff --git a/SimPEG/Optimization.py b/SimPEG/Optimization.py index 77704733..706124c8 100644 --- a/SimPEG/Optimization.py +++ b/SimPEG/Optimization.py @@ -131,7 +131,7 @@ class Minimize(object): Minimizes the function (evalFunction) starting at the location x0. - :param def evalFunction: function handle that evaluates: f, g, H = F(x) + :param callable evalFunction: function handle that evaluates: f, g, H = F(x) :param numpy.ndarray x0: starting location :rtype: numpy.ndarray :return: x, the last iterate of the optimization algorithm @@ -372,8 +372,8 @@ class Minimize(object): Else, a modifySearchDirectionBreak call is preformed. :param numpy.ndarray p: searchDirection - :rtype: numpy.ndarray,bool - :return: (xt, passLS) + :rtype: tuple + :return: (xt, passLS) numpy.ndarray, bool """ # Projected Armijo linesearch self._LS_t = 1 @@ -408,8 +408,8 @@ class Minimize(object): evalFunction returns a False indicating the break was not caught. :param numpy.ndarray p: searchDirection - :rtype: numpy.ndarray,bool - :return: (xt, breakCaught) + :rtype: tuple + :return: (xt, breakCaught) numpy.ndarray, bool """ self.printDone(inLS=True) print 'The linesearch got broken. Boo.' diff --git a/SimPEG/PropMaps.py b/SimPEG/PropMaps.py index e4f65973..34cad863 100644 --- a/SimPEG/PropMaps.py +++ b/SimPEG/PropMaps.py @@ -187,7 +187,7 @@ class _PropMapMetaClass(type): attrs[attr + 'Model'] = prop._getModelProperty() attrs[attr + 'Deriv'] = prop._getModelDerivProperty() - return type(name.replace('PropMap', 'PropModel'), (PropModel, ), attrs) + return type('PropModel', (PropModel, ), attrs) class PropMap(object): diff --git a/SimPEG/Regularization.py b/SimPEG/Regularization.py index fc101a61..96beabcb 100644 --- a/SimPEG/Regularization.py +++ b/SimPEG/Regularization.py @@ -8,7 +8,7 @@ class RegularizationMesh(object): are not necessarily true differential operators, but are constructed from a SimPEG Mesh. - :param Mesh mesh: problem mesh + :param BaseMesh mesh: problem mesh :param numpy.array indActive: bool array, size nC, that is True where we have active cells. Used to reduce the operators so we regularize only on active cells """ @@ -381,8 +381,8 @@ class BaseRegularization(object): :param numpy.array m: geophysical model :param numpy.array v: vector to multiply - :rtype: scipy.sparse.csr_matrix or numpy.ndarray - :return: WtW or WtW*v + :rtype: scipy.sparse.csr_matrix + :return: WtW, or if v is supplied WtW*v (numpy.ndarray) The regularization is: @@ -417,8 +417,8 @@ class Tikhonov(BaseRegularization): Note if the key word argument `mrefInSmooth` is False, then mref is not included in the smoothness contribution. - :param Mesh mesh: SimPEG mesh - :param Maps mapping: regularization mapping, takes the model from model space to the thing you want to regularize + :param BaseMesh mesh: SimPEG mesh + :param IdentityMap mapping: regularization mapping, takes the model from model space to the thing you want to regularize :param numpy.ndarray indActive: active cell indices for reducing the size of differential operators in the definition of a regularization mesh :param bool mrefInSmooth: (default = False) put mref in the smoothness component? :param float alpha_s: (default 1e-6) smallness weight @@ -438,7 +438,7 @@ class Tikhonov(BaseRegularization): alpha_yy = Utils.dependentProperty('_alpha_yy', 0.0, ['_W', '_Wyy'], "Weight for the second derivative in the y direction") alpha_zz = Utils.dependentProperty('_alpha_zz', 0.0, ['_W', '_Wzz'], "Weight for the second derivative in the z direction") - def __init__(self, mesh, mapping=None, indActive = None, **kwargs): + def __init__(self, mesh, mapping=None, indActive=None, **kwargs): BaseRegularization.__init__(self, mesh, mapping=mapping, indActive=indActive, **kwargs) @property diff --git a/SimPEG/Tests.py b/SimPEG/Tests.py index 804ca6b8..ea7a74e1 100644 --- a/SimPEG/Tests.py +++ b/SimPEG/Tests.py @@ -237,7 +237,7 @@ def checkDerivative(fctn, x0, num=7, plotIt=True, dx=None, expectedOrder=2, tole Compares error decay of 0th and 1st order Taylor approximation at point x0 for a randomized search direction. - :param lambda fctn: function handle + :param callable fctn: function handle :param numpy.array x0: point at which to check derivative :param int num: number of times to reduce step length, h :param bool plotIt: if you would like to plot diff --git a/SimPEG/Utils/ModelBuilder.py b/SimPEG/Utils/ModelBuilder.py index 1b868fe5..1f4aa47f 100644 --- a/SimPEG/Utils/ModelBuilder.py +++ b/SimPEG/Utils/ModelBuilder.py @@ -7,11 +7,11 @@ def addBlock(gridCC, modelCC, p0, p1, blockProp): """ Add a block to an exsisting cell centered model, modelCC - :param numpy.array, gridCC: mesh.gridCC is the cell centered grid - :param numpy.array, modelCC: cell centered model - :param numpy.array, p0: bottom, southwest corner of block - :param numpy.array, p1: top, northeast corner of block - :blockProp float, blockProp: property to assign to the model + :param numpy.array gridCC: mesh.gridCC is the cell centered grid + :param numpy.array modelCC: cell centered model + :param numpy.array p0: bottom, southwest corner of block + :param numpy.array p1: top, northeast corner of block + :blockProp float blockProp: property to assign to the model :return numpy.array, modelBlock: model with block """ @@ -147,7 +147,7 @@ def getIndicesSphere(center,radius,ccMesh): if dimMesh == 1: # Define the reference points - + ind = np.abs(center[0] - ccMesh[:,0]) < radius elif dimMesh == 2: @@ -222,14 +222,14 @@ def layeredModel(ccMesh, layerTops, layerValues): :param numpy.array ccMesh: cell-centered mesh :param numpy.array layerTops: z-locations of the tops of each layer - :param numpy.array layerValue: values of the property to assign for each layer (starting at the top) + :param numpy.array layerValue: values of the property to assign for each layer (starting at the top) :rtype: numpy.array - :return: M, layered model on the mesh + :return: M, layered model on the mesh """ descending = np.linalg.norm(sorted(layerTops, reverse=True) - layerTops) < 1e-20 - # TODO: put an error check to make sure that there is an ordering... needs to work with inf elts + # TODO: put an error check to make sure that there is an ordering... needs to work with inf elts # assert ascending or descending, "Layers must be listed in either ascending or descending order" # start from bottom up @@ -253,10 +253,10 @@ def layeredModel(ccMesh, layerTops, layerValues): model = np.zeros(ccMesh.shape[0]) for i, top in enumerate(layerTops): - zind = z <= top + zind = z <= top model[zind] = layerValues[i] - return model + return model @@ -265,9 +265,9 @@ def randomModel(shape, seed=None, anisotropy=None, its=100, bounds=None): Create a random model by convolving a kernel with a uniformly distributed model. - :param int,tuple shape: shape of the model. + :param tuple shape: shape of the model. :param int seed: pick which model to produce, prints the seed if you don't choose. - :param numpy.ndarray,list anisotropy: this is the (3 x n) blurring kernel that is used. + :param numpy.ndarray anisotropy: this is the (3 x n) blurring kernel that is used. :param int its: number of smoothing iterations :param list bounds: bounds on the model, len(list) == 2 :rtype: numpy.ndarray diff --git a/SimPEG/Utils/SolverUtils.py b/SimPEG/Utils/SolverUtils.py index 47c899d3..28a1159d 100644 --- a/SimPEG/Utils/SolverUtils.py +++ b/SimPEG/Utils/SolverUtils.py @@ -13,7 +13,7 @@ def _checkAccuracy(A, b, X, accuracyTol): warnings.warn(msg, RuntimeWarning) -def SolverWrapD(fun, factorize=True, checkAccuracy=True, accuracyTol=1e-6): +def SolverWrapD(fun, factorize=True, checkAccuracy=True, accuracyTol=1e-6, name=None): """ Wraps a direct Solver. @@ -72,11 +72,11 @@ def SolverWrapD(fun, factorize=True, checkAccuracy=True, accuracyTol=1e-6): if factorize and hasattr(self.solver, 'clean'): return self.solver.clean() - return type(fun.__name__+'_Wrapped', (object,), {"__init__": __init__, "clean": clean, "__mul__": __mul__}) + return type(name if name is not None else fun.__name__, (object,), {"__init__": __init__, "clean": clean, "__mul__": __mul__}) -def SolverWrapI(fun, checkAccuracy=True, accuracyTol=1e-5): +def SolverWrapI(fun, checkAccuracy=True, accuracyTol=1e-5, name=None): """ Wraps an iterative Solver. @@ -128,13 +128,13 @@ def SolverWrapI(fun, checkAccuracy=True, accuracyTol=1e-5): def clean(self): pass - return type(fun.__name__+'_Wrapped', (object,), {"__init__": __init__, "clean": clean, "__mul__": __mul__}) + return type(name if name is not None else fun.__name__, (object,), {"__init__": __init__, "clean": clean, "__mul__": __mul__}) from scipy.sparse import linalg -Solver = SolverWrapD(linalg.spsolve, factorize=False) -SolverLU = SolverWrapD(linalg.splu, factorize=True) -SolverCG = SolverWrapI(linalg.cg) +Solver = SolverWrapD(linalg.spsolve, factorize=False, name="Solver") +SolverLU = SolverWrapD(linalg.splu, factorize=True, name="SolverLU") +SolverCG = SolverWrapI(linalg.cg, name="SolverCG") class SolverDiag(object): diff --git a/SimPEG/Utils/interputils.py b/SimPEG/Utils/interputils.py index 17b9b469..16c7bf5e 100644 --- a/SimPEG/Utils/interputils.py +++ b/SimPEG/Utils/interputils.py @@ -25,7 +25,7 @@ def interpmat(locs, x, y=None, z=None): :param numpy.ndarray x: Tensor vector of 1st dimension of grid. :param numpy.ndarray y: Tensor vector of 2nd dimension of grid. None by default. :param numpy.ndarray z: Tensor vector of 3rd dimension of grid. None by default. - :rtype: scipy.sparse.csr.csr_matrix + :rtype: scipy.sparse.csr_matrix :return: Interpolation matrix .. plot:: diff --git a/SimPEG/Utils/matutils.py b/SimPEG/Utils/matutils.py index 3a6030fa..73f414b3 100644 --- a/SimPEG/Utils/matutils.py +++ b/SimPEG/Utils/matutils.py @@ -27,7 +27,7 @@ def mkvc(x, numDims=1): if isinstance(x, Zero): return x - + assert isinstance(x, np.ndarray), "Vector must be a numpy array" if numDims == 1: @@ -355,9 +355,9 @@ def diagEst(matFun, n, k=None, approach='Probing'): 2. Ones : random +/- 1 entries 3. Random : random vectors - :param lambda (numpy.array) matFun: matrix to estimate the diagonal of - :param int64 n: size of the vector that should be used to compute matFun(v) - :param int64 k: number of vectors to be used to estimate the diagonal + :param callable matFun: takes a (numpy.array) and multiplies it by a matrix to estimate the diagonal + :param int n: size of the vector that should be used to compute matFun(v) + :param int k: number of vectors to be used to estimate the diagonal :param str approach: approach to be used for getting vectors :rtype: numpy.array :return: est_diag(A) @@ -422,9 +422,9 @@ class Zero(object): def __ge__(self, v):return 0 >= v def __gt__(self, v):return 0 > v - @property + @property def transpose(self): return Zero() - + @property def T(self): return Zero() diff --git a/SimPEG/Utils/meshutils.py b/SimPEG/Utils/meshutils.py index 53cda719..c7ec1efd 100644 --- a/SimPEG/Utils/meshutils.py +++ b/SimPEG/Utils/meshutils.py @@ -83,7 +83,7 @@ def closestPoints(mesh, pts, gridLoc='CC'): """ Move a list of points to the closest points on a grid. - :param simpeg.Mesh.BaseMesh mesh: The mesh + :param BaseMesh mesh: The mesh :param numpy.ndarray pts: Points to move :param string gridLoc: ['CC', 'N', 'Fx', 'Fy', 'Fz', 'Ex', 'Ex', 'Ey', 'Ez'] :rtype: numpy.ndarray @@ -107,7 +107,7 @@ def ExtractCoreMesh(xyzlim, mesh, meshType='tensor'): Extracts Core Mesh from Global mesh :param numpy.ndarray xyzlim: 2D array [ndim x 2] - :param simpeg.Mesh.BaseMesh mesh: The mesh + :param BaseMesh mesh: The mesh This function ouputs:: diff --git a/docs/Makefile b/docs/Makefile index bee80244..6d8d03df 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -2,7 +2,7 @@ # # You can set these variables from the command line. -SPHINXOPTS = +SPHINXOPTS = -n -w warnings.txt SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build diff --git a/docs/api_ForwardProblem.rst b/docs/api_ForwardProblem.rst index efefedc9..250a3618 100644 --- a/docs/api_ForwardProblem.rst +++ b/docs/api_ForwardProblem.rst @@ -67,13 +67,45 @@ The API Problem ------- -.. autoclass:: SimPEG.Problem + +.. autoclass:: SimPEG.Problem.BaseProblem + :members: + :undoc-members: + +.. autoclass:: SimPEG.Problem.BaseTimeProblem + :members: + :undoc-members: + +Fields +------ + +.. autoclass:: SimPEG.Fields.Fields + :members: + :undoc-members: + +.. autoclass:: SimPEG.Fields.TimeFields :members: :undoc-members: Survey ------ -.. autoclass:: SimPEG.Survey + +.. autoclass:: SimPEG.Survey.BaseSurvey :members: :undoc-members: +.. autoclass:: SimPEG.Survey.BaseSrc + :members: + :undoc-members: + +.. autoclass:: SimPEG.Survey.BaseRx + :members: + :undoc-members: + +.. autoclass:: SimPEG.Survey.BaseTimeRx + :members: + :undoc-members: + +.. autoclass:: SimPEG.Survey.Data + :members: + :undoc-members: diff --git a/docs/api_InnerProducts.rst b/docs/api_InnerProducts.rst index a57a4c91..13d532eb 100644 --- a/docs/api_InnerProducts.rst +++ b/docs/api_InnerProducts.rst @@ -266,6 +266,6 @@ These are computed for each of the 8 projections, horizontally concatenated, and The API ------- -.. autoclass:: SimPEG.Mesh.InnerProducts +.. autoclass:: SimPEG.Mesh.InnerProducts.InnerProducts :members: :undoc-members: diff --git a/docs/api_Inversion.rst b/docs/api_Inversion.rst index ec98ba0d..a20924cc 100644 --- a/docs/api_Inversion.rst +++ b/docs/api_Inversion.rst @@ -3,7 +3,7 @@ InvProblem ********** -.. autoclass:: SimPEG.InvProblem +.. autoclass:: SimPEG.InvProblem.BaseInvProblem :show-inheritance: :members: :undoc-members: @@ -12,7 +12,7 @@ InvProblem Inversion ********* -.. autoclass:: SimPEG.Inversion +.. autoclass:: SimPEG.Inversion.BaseInversion :show-inheritance: :members: :undoc-members: @@ -20,7 +20,7 @@ Inversion Directives ********** -.. autoclass:: SimPEG.Directives +.. automodule:: SimPEG.Directives :show-inheritance: :members: :undoc-members: diff --git a/docs/api_Maps.rst b/docs/api_Maps.rst index 887f42ef..a5de8a2f 100644 --- a/docs/api_Maps.rst +++ b/docs/api_Maps.rst @@ -124,6 +124,8 @@ When these are used in the inverse problem, this is extremely important!! The API ======= +The :code:`IdentityMap` is the base class for all mappings, and it does absolutely nothing. + .. autoclass:: SimPEG.Maps.IdentityMap :members: :undoc-members: @@ -132,7 +134,6 @@ The API Common Maps =========== - Exponential Map --------------- @@ -198,8 +199,8 @@ Mesh to Mesh Map :undoc-members: -Some Extras -=========== +Under the Hood +============== Combo Map --------- diff --git a/docs/api_Mesh.rst b/docs/api_Mesh.rst index 1043703b..93767ee2 100644 --- a/docs/api_Mesh.rst +++ b/docs/api_Mesh.rst @@ -188,6 +188,6 @@ other types of meshes in this SimPEG framework. The API ======= -.. autoclass:: SimPEG.Mesh.BaseMesh +.. autoclass:: SimPEG.Mesh.BaseMesh.BaseMesh :members: :undoc-members: diff --git a/docs/api_MeshCode.rst b/docs/api_MeshCode.rst index aab8a849..39f168a1 100644 --- a/docs/api_MeshCode.rst +++ b/docs/api_MeshCode.rst @@ -19,7 +19,7 @@ Cylindrical Mesh Tree Mesh ========= -.. autoclass:: SimPEG.Mesh.TreeMesh.TreeMesh +.. autoclass:: SimPEG.Mesh.TreeMesh :members: :undoc-members: :show-inheritance: @@ -30,4 +30,39 @@ Curvilinear Mesh .. autoclass:: SimPEG.Mesh.CurvilinearMesh :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: + + +Base Rectangular Mesh +===================== + +.. autoclass:: SimPEG.Mesh.BaseMesh.BaseRectangularMesh + :members: + :undoc-members: + :show-inheritance: + +Base Tensor Mesh +================ + +.. autoclass:: SimPEG.Mesh.TensorMesh.BaseTensorMesh + :members: + :undoc-members: + :show-inheritance: + + +Mesh IO +======= + +.. automodule:: SimPEG.Mesh.MeshIO + :members: + :undoc-members: + :show-inheritance: + + +Mesh Viewing +============ + +.. automodule:: SimPEG.Mesh.View + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api_PropMaps.rst b/docs/api_PropMaps.rst new file mode 100644 index 00000000..1d0f951d --- /dev/null +++ b/docs/api_PropMaps.rst @@ -0,0 +1,29 @@ +SimPEG PropMaps +*************** + +The API +======= + +Property +-------- + +.. autoclass:: SimPEG.PropMaps.Property + :members: + :undoc-members: + + +PropMap +------- + +.. autoclass:: SimPEG.PropMaps.PropMap + :members: + :undoc-members: + + +PropModel +--------- + +.. autoclass:: SimPEG.PropMaps.PropModel + :members: + :undoc-members: + diff --git a/docs/api_Utilities.rst b/docs/api_Utilities.rst index c3a08b30..2f03c54e 100644 --- a/docs/api_Utilities.rst +++ b/docs/api_Utilities.rst @@ -6,5 +6,6 @@ Utilities api_Solver api_Maps + api_PropMaps api_Utils api_Tests diff --git a/docs/api_bigPicture.rst b/docs/api_bigPicture.rst index 90266650..e24037ab 100644 --- a/docs/api_bigPicture.rst +++ b/docs/api_bigPicture.rst @@ -51,9 +51,9 @@ There are an overwhelming amount of choices to be made as one works through the :alt: Framework :align: center -The process of obtaining an acceptable model from an inversion generally requires the geophysicist to perform several iterations of the inversion workflow, rethinking and redesigning each piece of the framework to ensure it is appropriate in the current context. Inversions are experimental and empirical by nature and our software package is designed to facilitate this iterative process. To accomplish this, we have divided the inversion methodology into eight major components (See figure above). The (:class:`SimPEG.Mesh.BaseMesh`) class handles the discretization of the earth and also provides numerical operators. The forward simulation is split into two classes, the (:class:`SimPEG.Survey.BaseSurvey`) and the (:class:`SimPEG.Problem.BaseProblem`). The (:class:`SimPEG.Survey.BaseSurvey`) class handles the geometry of a geophysical problem as well as sources. The (:class:`SimPEG.Problem.BaseProblem`) class handles the simulation of the physics for the geophysical problem of interest. Although created independently, these two classes must be paired to form all of the components necessary for a geophysical forward simulation and calculation of the sensitivity. The (:class:`SimPEG.Problem.BaseProblem`) creates geophysical fields given a source from the (:class:`SimPEG.Survey.BaseSurvey`). The (:class:`SimPEG.Survey.BaseSurvey`) interpolates these fields to the receiver locations and converts them to the appropriate data type, for example, by selecting only the measured components of the field. Each of these operations may have associated derivatives with respect to the model and the computed field; these are included in the calculation of the sensitivity. For the inversion, a (:class:`SimPEG.DataMisfit.BaseDataMisfit`) is chosen to capture the goodness of fit of the predicted data and a (:class:`SimPEG.Regularization.BaseRegularization`) is chosen to handle the non-uniqueness. These inversion elements and an Optimization routine are combined into an inverse problem class (:class:`SimPEG.InvProblem.BaseInvProblem`). (:class:`SimPEG.InvProblem.BaseInvProblem`) is the mathematical statement that will be numerically solved by running an Inversion. The (:class:`SimPEG.Inversion.BaseInversion`) class handles organization and dispatch of directives between all of the various pieces of the framework. +The process of obtaining an acceptable model from an inversion generally requires the geophysicist to perform several iterations of the inversion workflow, rethinking and redesigning each piece of the framework to ensure it is appropriate in the current context. Inversions are experimental and empirical by nature and our software package is designed to facilitate this iterative process. To accomplish this, we have divided the inversion methodology into eight major components (See figure above). The :class:`SimPEG.Mesh.BaseMesh.BaseMesh` class handles the discretization of the earth and also provides numerical operators. The forward simulation is split into two classes, the :class:`SimPEG.Survey.BaseSurvey` and the :class:`SimPEG.Problem.BaseProblem`. The :class:`SimPEG.Survey.BaseSurvey` class handles the geometry of a geophysical problem as well as sources. The :class:`SimPEG.Problem.BaseProblem` class handles the simulation of the physics for the geophysical problem of interest. Although created independently, these two classes must be paired to form all of the components necessary for a geophysical forward simulation and calculation of the sensitivity. The :class:`SimPEG.Problem.BaseProblem` creates geophysical fields given a source from the :class:`SimPEG.Survey.BaseSurvey`. The :class:`SimPEG.Survey.BaseSurvey` interpolates these fields to the receiver locations and converts them to the appropriate data type, for example, by selecting only the measured components of the field. Each of these operations may have associated derivatives with respect to the model and the computed field; these are included in the calculation of the sensitivity. For the inversion, a :class:`SimPEG.DataMisfit.BaseDataMisfit` is chosen to capture the goodness of fit of the predicted data and a :class:`SimPEG.Regularization.BaseRegularization` is chosen to handle the non-uniqueness. These inversion elements and an Optimization routine are combined into an inverse problem class :class:`SimPEG.InvProblem.BaseInvProblem`. :class:`SimPEG.InvProblem.BaseInvProblem` is the mathematical statement that will be numerically solved by running an Inversion. The :class:`SimPEG.Inversion.BaseInversion` class handles organization and dispatch of directives between all of the various pieces of the framework. -The arrows in the figure above indicate what each class takes as a primary argument. For example, both the (:class:`SimPEG.Problem.BaseProblem`) and (:class:`SimPEG.Regularization.BaseRegularization`) classes take a (:class:`SimPEG.Mesh.BaseMesh`) class as an argument. The diagram does not show class inheritance, as each of the base classes outlined have many subtypes that can be interchanged. The (:class:`SimPEG.Mesh.BaseMesh`) class, for example, could be a regular Cartesian mesh (:class:`SimPEG.Mesh.TensorMesh`) or a cylindrical coordinate mesh (:class:`SimPEG.Mesh.CylMesh`), which have many properties in common. These common features, such as both meshes being created from tensor products, can be exploited through inheritance of base classes, and differences can be expressed through subtype polymorphism. Please look at the documentation here for more in-depth information. +The arrows in the figure above indicate what each class takes as a primary argument. For example, both the :class:`SimPEG.Problem.BaseProblem` and :class:`SimPEG.Regularization.BaseRegularization` classes take a :class:`SimPEG.Mesh.BaseMesh.BaseMesh` class as an argument. The diagram does not show class inheritance, as each of the base classes outlined have many subtypes that can be interchanged. The :class:`SimPEG.Mesh.BaseMesh.BaseMesh` class, for example, could be a regular Cartesian mesh :class:`SimPEG.Mesh.TensorMesh` or a cylindrical coordinate mesh :class:`SimPEG.Mesh.CylMesh`, which have many properties in common. These common features, such as both meshes being created from tensor products, can be exploited through inheritance of base classes, and differences can be expressed through subtype polymorphism. Please look at the documentation here for more in-depth information. .. include:: ../CITATION.rst diff --git a/docs/conf.py b/docs/conf.py index d9bcfae7..2db771bf 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -269,3 +269,24 @@ def _supress_nonlocal_image_warn(self, msg, node): self._warnfunc(msg, '%s:%s' % get_source_line(node)) supress_nonlocal_image_warn() + + +nitpick_ignore = [ + ('py:class', 'IdentityMap'), + ('py:class', 'BaseSurvey'), + ('py:class', 'BaseSrc'), + ('py:class', 'BaseRx'), + ('py:class', 'Survey'), + ('py:class', 'FieldsFDEM'), + ('py:class', 'Fields3D_e'), + ('py:class', 'Fields3D_b'), + ('py:class', 'Fields3D_j'), + ('py:class', 'Fields3D_h'), + ('py:class', 'SurveyTDEM'), + ('py:class', 'SrcTDEM'), + ('py:class', 'EMPropMap'), + ('py:class', 'Data'), + ('py:class', 'SurveyDC'), + ('py:class', 'BaseMTFields'), + ('py:class', 'SolverLU'), +] diff --git a/docs/em/api_TDEM.rst b/docs/em/api_TDEM.rst index fe3dc613..4944ca52 100644 --- a/docs/em/api_TDEM.rst +++ b/docs/em/api_TDEM.rst @@ -359,7 +359,7 @@ TDEM - B formulation Field Storage ============= -.. autoclass:: SimPEG.EM.TDEM.SurveyTDEM.FieldsTDEM +.. autoclass:: SimPEG.EM.TDEM.BaseTDEM.FieldsTDEM :show-inheritance: :members: :undoc-members: diff --git a/docs/em/api_basic.rst b/docs/em/api_basic.rst new file mode 100644 index 00000000..1113108c --- /dev/null +++ b/docs/em/api_basic.rst @@ -0,0 +1,33 @@ +Overview of Electromagnetics in SimPEG +************************************** + + +The API +======= + +Physical Properties +------------------- + +.. autoclass:: SimPEG.EM.Base.EMPropMap + :show-inheritance: + :members: + :undoc-members: + +Problem +------- + +.. autoclass:: SimPEG.EM.Base.BaseEMProblem + :show-inheritance: + :members: + :undoc-members: + + +Survey +------ + +.. autoclass:: SimPEG.EM.Base.BaseEMSurvey + :show-inheritance: + :members: + :undoc-members: + + diff --git a/docs/em/index.rst b/docs/em/index.rst index a86ebb69..4f95a339 100644 --- a/docs/em/index.rst +++ b/docs/em/index.rst @@ -3,13 +3,13 @@ Electromagnetics ================ `SimPEG.EM` uses SimPEG as the framework for the forward and inverse -electromagnetics geophysical problems. +electromagnetics geophysical problems. To solve for predicted data, we follow the framework shown below. The model is what we invert for. This is mapped to a physical property on the simulation mesh. A source which is used to excite the system is specified. Having a model and a source, we can solve Maxwell's equations for fields. We sample these -fields with recievers to give us predicted data. +fields with recievers to give us predicted data. .. image:: ../images/simpegEM_noMath.png @@ -19,6 +19,7 @@ fields with recievers to give us predicted data. .. toctree:: :maxdepth: 2 + api_basic api_FDEM api_TDEM api_Utils diff --git a/docs/examples/EM_Schenkel_Morrison_Casing.rst b/docs/examples/EM_Schenkel_Morrison_Casing.rst index 55f00168..5ff3432e 100644 --- a/docs/examples/EM_Schenkel_Morrison_Casing.rst +++ b/docs/examples/EM_Schenkel_Morrison_Casing.rst @@ -17,10 +17,13 @@ current inside a steel-cased. The model is based on the Schenkel and Morrison Casing Model, and the results are used in a 2016 SEG abstract by Yang et al. -- Schenkel, C.J., and H.F. Morrison, 1990, Effects of well casing on potential field measurements using downhole current sources: Geophysical prospecting, 38, 663-686. +.. code-block:: text + + Schenkel, C.J., and H.F. Morrison, 1990, Effects of well casing on potential field measurements using downhole current sources: Geophysical prospecting, 38, 663-686. The model consists of: + - Air: Conductivity 1e-8 S/m, above z = 0 - Background: conductivity 1e-2 S/m, below z = 0 - Casing: conductivity 1e6 S/m diff --git a/tests/docs/test_docs.py b/tests/docs/test_docs.py index 4bd10d6c..9b986632 100644 --- a/tests/docs/test_docs.py +++ b/tests/docs/test_docs.py @@ -13,9 +13,9 @@ class Doc_Test(unittest.TestCase): doctrees_path = os.path.sep.join(self.path_to_docs.split(os.path.sep) + ['_build']+['doctrees']) html_path = os.path.sep.join(self.path_to_docs.split(os.path.sep) + ['_build']+['html']) - check = subprocess.call(["sphinx-build", "-nW", "-b", "html", "-d", - "%s"%(doctrees_path) , - "%s"%(self.path_to_docs), + check = subprocess.call(["sphinx-build", "-nW", "-b", "html", "-d", + "%s"%(doctrees_path) , + "%s"%(self.path_to_docs), "%s"%(html_path)]) assert check == 0 @@ -23,9 +23,9 @@ class Doc_Test(unittest.TestCase): # doctrees_path = os.path.sep.join(self.path_to_docs.split(os.path.sep) + ['_build']+['doctrees']) # latex_path = os.path.sep.join(self.path_to_docs.split(os.path.sep) + ['_build']+['latex']) - # check = subprocess.call(["sphinx-build", "-nW", "-b", "latex", "-d", - # "%s"%(doctrees_path), - # "%s"%(self.path_to_docs), + # check = subprocess.call(["sphinx-build", "-nW", "-b", "latex", "-d", + # "%s"%(doctrees_path), + # "%s"%(self.path_to_docs), # "%s"%(latex_path)]) # assert check == 0 @@ -33,11 +33,11 @@ class Doc_Test(unittest.TestCase): # doctrees_path = os.path.sep.join(self.path_to_docs.split(os.path.sep) + ['_build']+['doctrees']) # link_path = os.path.sep.join(self.path_to_docs.split(os.path.sep) + ['_build']) - # check = subprocess.call(["sphinx-build", "-nW", "-b", "linkcheck", "-d", - # "%s"%(doctrees_path), - # "%s"%(self.path_to_docs), + # check = subprocess.call(["sphinx-build", "-nW", "-b", "linkcheck", "-d", + # "%s"%(doctrees_path), + # "%s"%(self.path_to_docs), # "%s"%(link_path)]) - # assert check == 0 + # assert check == 0 if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main()