def uz_mult(self,): # Loop the receivers self.uz_s = [] uz_rec = np.zeros((self.receivers.coord.shape[0], len(self.controls.freq)), dtype = complex) for jrec, r_coord in enumerate(self.receivers.coord): for jel, el in enumerate(self.theta): material_m = PorousAbsorber(self.air, self.controls) material_m.miki(resistivity=self.material.resistivity) material_m.layer_over_rigid(thickness = self.material.thickness, theta = el) for jf, k0 in enumerate(self.controls.k0): kx, ky, kz = sph2cart(k0, np.pi/2-el, self.phi[jel]) k_veci = np.array([kx, ky, kz]) k_vecr = np.array([kx, ky, -kz]) uz_rec[jrec, jf] += (kz/k0) * (np.exp(1j * np.dot(k_veci, r_coord)) -\ material_m.Vp[jf] * np.exp(1j * np.dot(k_vecr, r_coord))) self.uz_s.append(uz_rec)
def p_fps(self,): # Loop the receivers self.pres_s = [] pres_rec = np.zeros((self.receivers.coord.shape[0], len(self.controls.freq)), dtype = complex) for jrec, r_coord in enumerate(self.receivers.coord): # r = np.linalg.norm(r_coord) # distance source-receiver for jf, k0 in enumerate(self.controls.k0): # kx = k0 * np.cos(self.phi) * np.sin(self.theta) # ky = k0 * np.sin(self.phi) * np.sin(self.theta) # kz = k0 * np.cos(self.theta) kx, ky, kz = sph2cart(k0, np.pi/2-self.theta, self.phi) k_veci = np.array([-kx, -ky, -kz]) k_vecr = np.array([-kx, -ky, kz]) # print('Incident wave: ({})'.format(k_veci/k0)) # print('Reflected wave: ({})'.format(k_vecr/k0)) pres_rec[jrec, jf] = np.exp(-1j * np.dot(k_veci, r_coord)) +\ self.material.Vp[jf] * np.exp(-1j * np.dot(k_vecr, r_coord)) self.pres_s.append(pres_rec)
def uz_fps(self,): # Loop the receivers self.uz_s = [] uz_rec = np.zeros((self.receivers.coord.shape[0], len(self.controls.freq)), dtype = complex) for jrec, r_coord in enumerate(self.receivers.coord): # r = np.linalg.norm(r_coord) # distance source-receiver for jf, k0 in enumerate(self.controls.k0): # kx = k0 * np.cos(self.phi) * np.sin(self.theta) # ky = k0 * np.sin(self.phi) * np.sin(self.theta) # kz = k0 * np.cos(self.theta) kx, ky, kz = sph2cart(k0, np.pi/2-self.theta, self.phi) k_veci = np.array([kx, ky, -kz]) k_vecr = np.array([kx, ky, kz]) uz_rec[jrec, jf] = (-kz/k0) * (np.exp(-1j * np.dot(k_veci, r_coord)) -\ self.material.Vp[jf] * np.exp(-1j * np.dot(k_vecr, r_coord))) # uz_rec[jrec, jf] = (kz/k0) *(np.exp(1j * k_vec[2] * r_coord[2]) -\ # self.material.Vp[jf] * np.exp(-1j * k_vec[2] * r_coord[2]))*\ # (np.exp(1j * k_vec[0] * r_coord[0]))*\ # (np.exp(1j * k_vec[1] * r_coord[1])) self.uz_s.append(uz_rec)
def pev_fps(self, kx_e = [0], ky_e = [0], Ae = [0]): ''' Method calculates the pressure field due to a propagating incident, a progating reflected and a set of evanescent plane waves specified by the vectors kx_e, ky_e and Ae ''' # Loop the receivers self.pres_s = [] pres_rec = np.zeros((self.receivers.coord.shape[0], len(self.controls.freq)), dtype = complex) for jrec, r_coord in enumerate(self.receivers.coord): # r = np.linalg.norm(r_coord) # distance source-receiver for jf, k0 in enumerate(self.controls.k0): # Calculate propagating wave-numbers kx, ky, kz = sph2cart(k0, np.pi/2-self.theta, self.phi) k_veci_p = np.array([kx, ky, kz]) k_vecr_p = np.array([kx, ky, -kz]) # Evanescent wave-numbers kz_e = (kx_e**2 + ky_e**2 - k0**2)**0.5 p_ev = np.sum(Ae * (np.exp(-kz_e * r_coord[2])) * (np.exp(1j * (kx_e * r_coord[0] + ky_e * r_coord[1])))) pres_rec[jrec, jf] = np.exp(1j * np.dot(k_veci_p, r_coord)) +\ self.material.Vp[jf] * np.exp(1j * np.dot(k_vecr_p, r_coord)) + p_ev self.pres_s.append(pres_rec)
def arc(self, radii=20.0, n_recs=36): """" Initializes a receiver arc. The method will overwrite self.coord to be a matrix where each line gives a 3D coordinate for each receiver Inputs: radii - radius of the receiver n_recs - number of receivers in the arc Parameters ---------- radii : float radius of the arc of receivers n_recs : int number of receivers in the arc """ # angles thetas = np.linspace(0, np.pi, n_recs) # initialize receiver list in memory self.coord = np.zeros((n_recs, 3), dtype=np.float32) self.coord[:, 0], self.coord[:, 1], self.coord[:, 2] =\ sph2cart(radii, thetas, 0)