Ejemplo n.º 1
0
    def ePrimary(self, prob):
        """
        Primary electric field

        :param BaseFDEMProblem prob: FDEM Problem
        :rtype: numpy.ndarray
        :return: primary electric field
        """
        if self._ePrimary is None:
            return Zero()
        return self._ePrimary
Ejemplo n.º 2
0
    def s_eDeriv(self, prob, v, adjoint=False):
        """
        Derivative of electric source term with respect to the inversion model

        :param BaseFDEMProblem prob: FDEM Problem
        :param numpy.ndarray v: vector to take product with
        :param bool adjoint: adjoint?
        :rtype: numpy.ndarray
        :return: product of electric source term derivative with a vector
        """
        return Zero()
Ejemplo n.º 3
0
    def bPrimary(self, prob):
        """
        Primary magnetic flux density

        :param BaseFDEMProblem prob: FDEM Problem
        :rtype: numpy.ndarray
        :return: primary magnetic flux density
        """
        if self._bPrimary is None:
            return Zero()
        return self._bPrimary
Ejemplo n.º 4
0
    def jPrimary(self, prob):
        """
        Primary current density

        :param BaseFDEMProblem prob: FDEM Problem
        :rtype: numpy.ndarray
        :return: primary current density
        """
        if self._jPrimary is None:
            return Zero()
        return self._jPrimary
Ejemplo n.º 5
0
    def ePrimaryDeriv(self, prob, v, adjoint=False):
        """
        Derivative of the primary electric field

        :param BaseFDEMProblem prob: FDEM Problem
        :param numpy.ndarray v: vector
        :param bool adjoint: adjoint?
        :rtype: numpy.ndarray
        :return: primary magnetic flux density
        """
        return Zero()
Ejemplo n.º 6
0
    def _bDeriv_m(self, src, v, adjoint=False):
        """
        Derivative of the magnetic flux density with respect to the inversion model.

        :param SimPEG.EM.FDEM.Src src: source
        :param numpy.ndarray v: vector to take product with
        :param bool adjoint: adjoint?
        :rtype: numpy.ndarray
        :return: product of the magnetic flux density derivative with respect to the inversion model with a vector
        """
        # Neither bPrimary nor bSeconary have model dependency => return Zero
        return Zero()
Ejemplo n.º 7
0
    def _phiInitialDeriv(self, prob, v, adjoint=False):
        if self.waveform.hasInitialFields:
            phi = self.phiInitial(prob)

            if adjoint is True:
                return -1. * prob.getAdcDeriv(phi, prob.Adcinv * v, adjoint=True)  # A is symmetric

            Adc_deriv = prob.getAdcDeriv(phi, v)
            return -1. * ( prob.Adcinv * Adc_deriv )

        else:
            return Zero()
Ejemplo n.º 8
0
    def _eDeriv_m(self, src, v, adjoint=False):
        """
        Partial derivative of the total electric field with respect to the inversion model. Here, we assume that the primary does not depend on the model. Note that this also includes derivative contributions from the sources.

        :param SimPEG.EM.FDEM.Src src: source
        :param numpy.ndarray v: vector to take product with
        :param bool adjoint: adjoint?
        :rtype: SimPEG.Utils.Zero
        :return: product of the electric field derivative with respect to the inversion model with a vector
        """

        # assuming primary does not depend on the model
        return Zero()
Ejemplo n.º 9
0
    def s_e(self, prob, time):
        C = prob.mesh.edgeCurl
        b = self._bSrc(prob)

        if prob._formulation == 'EB':

            MfMui = prob.MfMui

            if self.waveform.hasInitialFields is True and time < prob.timeSteps[
                    1]:
                # if time > 0.0:
                #     return Zero()
                if prob._fieldType == 'b':
                    return Zero()
                elif prob._fieldType == 'e':
                    # Compute s_e from vector potential
                    return C.T * (MfMui * b)
            else:
                # b = self._bfromVectorPotential(prob)
                return C.T * (MfMui * b) * self.waveform.eval(time)
        # return Zero()

        elif prob._formulation == 'HJ':

            h = 1. / self.mu * b

            if self.waveform.hasInitialFields is True and time < prob.timeSteps[
                    1]:
                # if time > 0.0:
                #     return Zero()
                if prob._fieldType == 'h':
                    return Zero()
                elif prob._fieldType == 'j':
                    # Compute s_e from vector potential
                    return C * h
            else:
                # b = self._bfromVectorPotential(prob)
                return C * h * self.waveform.eval(time)
Ejemplo n.º 10
0
 def eInitialDeriv(self, prob, v=None, adjoint=False, f=None):
     if self.waveform.hasInitialFields:
         edc = f[self, 'e', 0]
         Grad = prob.mesh.nodalGrad
         if adjoint is False:
             AdcDeriv_v = prob.getAdcDeriv(edc, v, adjoint=adjoint)
             edcDeriv = Grad * (prob.Adcinv * AdcDeriv_v)
             return edcDeriv
         elif adjoint is True:
             vec = prob.Adcinv * (Grad.T * v)
             edcDerivT = prob.getAdcDeriv(edc, vec, adjoint=adjoint)
             return edcDerivT
     else:
         return Zero()
Ejemplo n.º 11
0
    def _e_pyDeriv_m(self, src, v, adjoint=False):
        """
        Derivative of e_py wrt m

        :param SimPEG.NSEM.src src: The source of the problem
        :param numpy.ndarray v: vector to take product with Size (nE,) when adjoint=True, (nU,) when adjoint=False
        :param bool adjoint: adjoint?
        :rtype: numpy.ndarray
        :return: The calculated derivative, size (nU,) when adjoint=True (nE,) when adjoint=False


        """
        # e_py does not depend on the model
        return Zero()
Ejemplo n.º 12
0
    def bInitial(self, prob):

        if self.waveform.hasInitialFields is False:
            return Zero()

        if np.all(prob.mu == self.mu):
            return self._bSrc(prob)

        else:
            if prob._formulation == 'EB':
                hs = prob.mesh.faceDiv.T * self._phiSrc(prob)
                ht = self._hp + hs
                return prob.MfMuiI * ht
            else:
                raise NotImplementedError
Ejemplo n.º 13
0
    def jInitialDeriv(self, prob, v, adjoint=False):
        if prob._fieldType not in ['j', 'h']:
            raise NotImplementedError

        if self.waveform.hasInitialFields is False:
            return Zero()

        phi = self.phiInitial(prob)
        Div = Utils.sdiag(prob.mesh.vol) * prob.mesh.faceDiv

        if adjoint is True:
            return - (
                prob.MfRhoIDeriv(Div.T * phi, v=v, adjoint=True) +
                self._phiInitialDeriv(prob, Div * (prob.MfRhoI.T * v), adjoint=True)
            )
        phiDeriv = self._phiInitialDeriv(prob, v)
        return - (prob.MfRhoIDeriv(Div.T * phi, v=v) + prob.MfRhoI * (Div.T * phiDeriv))
Ejemplo n.º 14
0
    def s_e(self, prob, time):
        b = self._bfromVectorPotential(prob)
        MfMui = prob.MfMui
        C = prob.mesh.edgeCurl

        # print 'time ', time

        if self.waveform.hasInitialFields is True and time < prob.timeSteps[1]:
            # if time > 0.0:
            #     return Zero()
            if prob._fieldType == 'b':
                return Zero()
            elif prob._fieldType == 'e':
                # Compute s_e from vector potential
                return C.T * (MfMui * b)
        else:
            # b = self._bfromVectorPotential(prob)
            return C.T * (MfMui * b) * self.waveform.eval(time)
Ejemplo n.º 15
0
    def S_e(self, prob):
        """
        The electric source term

        :param Problem prob: FDEM problem
        :rtype: numpy.ndarray
        :return: primary magnetic field
        """
        if all(np.r_[self.mu] == np.r_[prob.curModel.mu]):
            return Zero()
        else:
            formulation = prob._formulation

            if formulation is 'EB':
                mui_s = prob.curModel.mui - 1. / self.mu
                MMui_s = prob.mesh.getFaceInnerProduct(mui_s)
                C = prob.mesh.edgeCurl
            elif formulation is 'HJ':
                mu_s = prob.curModel.mu - self.mu
                MMui_s = prob.mesh.getEdgeInnerProduct(mu_s, invMat=True)
                C = prob.mesh.edgeCurl.T

            return -C.T * (MMui_s * self.bPrimary(prob))
Ejemplo n.º 16
0
 def _jDeriv_m(self, tInd, src, v, adjoint=False):
     return Zero()  # assumes the source doesn't depend on the model
Ejemplo n.º 17
0
 def s_m(self, prob, time):
     if self.waveform.hasInitialFields is False:
         # raise NotImplementedError
         return Zero()
     return Zero()
Ejemplo n.º 18
0
 def eInitial(self, prob):
     # when solving for e, it is easier to work with an initial source than
     # initial fields
     # if self.waveform.hasInitialFields is False or prob._fieldType is 'e':
     return Zero()
Ejemplo n.º 19
0
    def bInitial(self, prob):

        if self.waveform.hasInitialFields is False:
            return Zero()

        return self._bfromVectorPotential(prob)
Ejemplo n.º 20
0
 def s_eDeriv(self, prob, time, v=None, adjoint=False):
     return Zero()
Ejemplo n.º 21
0
 def s_e(self, prob, time):
     return Zero()
Ejemplo n.º 22
0
 def _b_pyDeriv_m(self, src, v, adjoint=False):
     """ Derivative of b_py wrt m """
     # b_py does not depend on the model
     return Zero()
Ejemplo n.º 23
0
 def bInitial(self, prob):
     if self.waveform.eval(0) == 1.:
         raise Exception("Not implemetned for computing b!")
     else:
         return Zero()
Ejemplo n.º 24
0
    def hInitial(self, prob):

        if self.waveform.hasInitialFields is False:
            return Zero()

        return 1./self.mu * self._bSrc(prob)
Ejemplo n.º 25
0
 def eInitial(self, prob):
     return Zero()
Ejemplo n.º 26
0
 def test_both(self):
     z = Zero()
     o = Identity()
     assert o*z == 0
     assert o*z + o == 1
     assert o-z == 1
Ejemplo n.º 27
0
 def eInitialDeriv(self, prob, v=None, adjoint=False):
     return Zero()
Ejemplo n.º 28
0
 def _jDeriv_m(self, tInd, src, v, adjoint=False):
     return Zero()
Ejemplo n.º 29
0
 def test_mat_zero(self):
     z = Zero()
     S = sdiag(np.r_[2,3])
     assert S*z == 0
Ejemplo n.º 30
0
 def _b_pxDeriv_m(self, src, v, adjoint=False):
     ''' Derivative of b_px wrt m '''
     # b_px does not depend on the model
     return Zero()