Exemplo n.º 1
0
def dBzdtAnalCircTCole(a, t, sigma):

    wt, tbase, omega_int = setFrequency(t)
    hz = HzanalCirc(sigma, omega_int/2/np.pi, 1., a, 'secondary')
    # Treatment for inaccuracy in analytic solutions
    ind = omega_int < 0.2
    hz[ind] = 0.

    dhzdtTD = -transFiltImpulse(hz, wt, tbase, omega_int, t)

    return dhzdtTD*mu_0
Exemplo n.º 2
0
    def projectFields(self, u):
        """
            Transform frequency domain responses to time domain responses
        """
        # Case1: Compute frequency domain reponses right at filter coefficient values
        if self.switchInterp == False:
            # Tx waveform: Step-off
            if self.waveType == 'stepoff':
                if self.rxType == 'Bz':
                    # Compute EM responses
                    if u.size == self.Nfreq:
                        resp, f0 = transFilt(Utils.mkvc(u), self.wt,self.tbase, self.frequency*2*np.pi, self.time)
                    # Compute EM sensitivities
                    else:
                        resp = np.zeros((self.Nch, self.nlay))
                        for i in range (self.nlay):
                            resp[:,i], f0 = transFilt(u[:,i], self.wt,self.tbase, self.frequency*2*np.pi, self.time)

                elif self.rxType == 'dBzdt':
                    # Compute EM responses
                    if u.size == self.Nfreq:
                        resp = -transFiltImpulse(u, self.wt,self.tbase, self.frequency*2*np.pi, self.time)
                    # Compute EM sensitivities
                    else:
                        resp = np.zeros((self.Nch, self.nlay))
                        for i in range (self.nlay):
                            resp[:,i] = -transFiltImpulse(u[:,i], self.wt,self.tbase, self.frequency*2*np.pi, self.time)

            # Tx waveform: General (it can be any waveform)
            # We evaluate this with time convolution
            elif self.waveType == 'general':
                # Compute EM responses
                if u.size == self.Nfreq:
                    # TODO: write small code which compute f at t = 0
                    f, f0 = transFilt(Utils.mkvc(u), self.wt, self.tbase, self.frequency*2*np.pi, self.tconv)
                    fDeriv = -transFiltImpulse(Utils.mkvc(u), self.wt,self.tbase, self.frequency*2*np.pi, self.tconv)

                    if self.rxType == 'Bz':

                        waveConvfDeriv = CausalConv(self.waveform, fDeriv, self.tconv)
                        resp1 = (self.waveform*self.hp*(1-f0[1]/self.hp)) - waveConvfDeriv
                        respint = interp1d(self.tconv, resp1, 'linear')

                        # TODO: make it as an opition #2
                        # waveDerivConvf = CausalConv(self.waveformDeriv, f, self.tconv)
                        # resp2 = (self.waveform*self.hp) - waveDerivConvf
                        # respint = interp1d(self.tconv, resp2, 'linear')

                        resp = respint(self.time)

                    if self.rxType == 'dBzdt':
                        waveDerivConvfDeriv = CausalConv(self.waveformDeriv, fDeriv, self.tconv)
                        resp1 = self.hp*self.waveformDeriv*(1-f0[1]/self.hp) - waveDerivConvfDeriv
                        respint = interp1d(self.tconv, resp1, 'linear')
                        resp = respint(self.time)

                # Compute EM sensitivities
                else:

                    resp = np.zeros((self.Nch, self.nlay))
                    for i in range (self.nlay):

                        f, f0 = transFilt(u[:,i], self.wt, self.tbase, self.frequency*2*np.pi, self.tconv)
                        fDeriv = -transFiltImpulse(u[:,i], self.wt,self.tbase, self.frequency*2*np.pi, self.tconv)

                        if self.rxType == 'Bz':

                            waveConvfDeriv = CausalConv(self.waveform, fDeriv, self.tconv)
                            resp1 = (self.waveform*self.hp*(1-f0[1]/self.hp)) - waveConvfDeriv
                            respint = interp1d(self.tconv, resp1, 'linear')

                            # TODO: make it as an opition #2
                            # waveDerivConvf = CausalConv(self.waveformDeriv, f, self.tconv)
                            # resp2 = (self.waveform*self.hp) - waveDerivConvf
                            # respint = interp1d(self.tconv, resp2, 'linear')

                            resp[:,i] = respint(self.time)

                        if self.rxType == 'dBzdt':
                            waveDerivConvfDeriv = CausalConv(self.waveformDeriv, fDeriv, self.tconv)
                            resp1 = self.hp*self.waveformDeriv*(1-f0[1]/self.hp) - waveDerivConvfDeriv
                            respint = interp1d(self.tconv, resp1, 'linear')
                            resp[:,i] = respint(self.time)

        # Case2: Compute frequency domain reponses in logarithmic then intepolate
        if self.switchInterp == True:
            # Tx waveform: Step-off
            if self.waveType == 'stepoff':
                if self.rxType == 'Bz':
                    # Compute EM responses
                    if u.size == self.Nfreq:
                        resp, f0 = transFiltInterp(Utils.mkvc(u), self.wt,self.tbase, self.frequency*2*np.pi, self.omega_int, self.time)
                    # Compute EM sensitivities
                    else:
                        resp = np.zeros((self.Nch, self.nlay))
                        for i in range (self.nlay):
                            resp[:,i], f0 = transFiltInterp(u[:,i], self.wt,self.tbase, self.frequency*2*np.pi, self.omega_int, self.time)

                elif self.rxType == 'dBzdt':
                    # Compute EM responses
                    if u.size == self.Nfreq:
                        resp = -transFiltImpulseInterp(Utils.mkvc(u), self.wt,self.tbase, self.frequency*2*np.pi, self.omega_int, self.time)
                    # Compute EM sensitivities
                    else:
                        resp = np.zeros((self.Nch, self.nlay))
                        for i in range (self.nlay):
                            resp[:,i] = -transFiltImpulseInterp(u[:,i], self.wt,self.tbase, self.frequency*2*np.pi, self.omega_int, self.time)

            # Tx waveform: General (it can be any waveform)
            # We evaluate this with time convolution
            elif self.waveType == 'general':
                # Compute EM responses
                if u.size == self.Nfreq:
                    # TODO: write small code which compute f at t = 0
                    f, f0 = transFiltInterp(Utils.mkvc(u), self.wt, self.tbase, self.frequency*2*np.pi, self.omega_int, self.tconv)
                    fDeriv = -transFiltImpulseInterp(Utils.mkvc(u), self.wt,self.tbase, self.frequency*2*np.pi, self.omega_int, self.tconv)

                    if self.rxType == 'Bz':

                        waveConvfDeriv = CausalConv(self.waveform, fDeriv, self.tconv)
                        resp1 = (self.waveform*self.hp*(1-f0[1]/self.hp)) - waveConvfDeriv
                        respint = interp1d(self.tconv, resp1, 'linear')

                        # TODO: make it as an opition #2
                        # waveDerivConvf = CausalConv(self.waveformDeriv, f, self.tconv)
                        # resp2 = (self.waveform*self.hp) - waveDerivConvf
                        # respint = interp1d(self.tconv, resp2, 'linear')

                        resp = respint(self.time)

                    if self.rxType == 'dBzdt':
                        waveDerivConvfDeriv = CausalConv(self.waveformDeriv, fDeriv, self.tconv)
                        resp1 = self.hp*self.waveformDeriv*(1-f0[1]/self.hp) - waveDerivConvfDeriv
                        respint = interp1d(self.tconv, resp1, 'linear')
                        resp = respint(self.time)

                # Compute EM sensitivities
                else:

                    resp = np.zeros((self.Nch, self.nlay))
                    for i in range (self.nlay):

                        f, f0 = transFiltInterp(u[:,i], self.wt, self.tbase, self.frequency*2*np.pi, self.omega_int, self.tconv)
                        fDeriv = -transFiltImpulseInterp(u[:,i], self.wt,self.tbase, self.frequency*2*np.pi, self.omega_int, self.tconv)

                        if self.rxType == 'Bz':

                            waveConvfDeriv = CausalConv(self.waveform, fDeriv, self.tconv)
                            resp1 = (self.waveform*self.hp*(1-f0[1]/self.hp)) - waveConvfDeriv
                            respint = interp1d(self.tconv, resp1, 'linear')

                            # TODO: make it as an opition #2
                            # waveDerivConvf = CausalConv(self.waveformDeriv, f, self.tconv)
                            # resp2 = (self.waveform*self.hp) - waveDerivConvf
                            # respint = interp1d(self.tconv, resp2, 'linear')

                            resp[:,i] = respint(self.time)

                        if self.rxType == 'dBzdt':
                            waveDerivConvfDeriv = CausalConv(self.waveformDeriv, fDeriv, self.tconv)
                            resp1 = self.hp*self.waveformDeriv*(1-f0[1]/self.hp) - waveDerivConvfDeriv
                            respint = interp1d(self.tconv, resp1, 'linear')
                            resp[:,i] = respint(self.time)

        return mu_0*resp