def BzAnalCircTCole(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. hzTD, f0 = transFilt(hz, wt, tbase, omega_int, t) return hzTD*mu_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