Source code for RCAIDE.Library.Methods.Noise.Common.generate_terrain_microphone_locations

# RCAIDE/Methods/Noise/Common/generate_microphone_locations.py
# 
# 
# Created:  Oct 2023, A. Molloy  

# ----------------------------------------------------------------------------------------------------------------------
#  IMPORT
# ---------------------------------------------------------------------------------------------------------------------- 
# RCAIDE imports  
from RCAIDE.Framework.Core import Units, Data
from RCAIDE.Framework.Analyses.Geodesics.Geodesics import Calculate_Distance

# package imports 
from scipy.interpolate import griddata
import numpy as np 
 
# ---------------------------------------------------------------------------------------------------------------------- 
#  generate_terrain_microphone_locations
# ----------------------------------------------------------------------------------------------------------------------  
[docs] def generate_terrain_microphone_locations(settings): """This computes the absolute microphone/observer locations on a defined topography Assumptions: topography_file is a text file obtained from https://topex.ucsd.edu/cgi-bin/get_data.cgi Source: N/A Inputs: topography_file - file of lattide, longitude and elevation points [-] origin_coordinates - coordinates of origin location [degrees] destination_coordinates - coordinates of destimation location [degrees] microphone_x_resolution - number of points on computational domain in latitudal direction [-] microphone_y_resolution - number of points on computational domain in longitidinal direction [-] ground_microphone_x_stencil - number of points in stencil in latitudal direction [-] adjusted_cruise_distance - distance used to modify cruise to ensure desired range is met [-] ground_microphone_y_stencil - number of points in stencil in in longitidinal direction [-] Outputs: topography_data. microphone_x_resolution - number of points on computational domain in latitudal direction [-] microphone_y_resolution - number of points on computational domain in longitidinal direction [-] ground_microphone_x_stencil - number of points in stencil in latitudal direction [-] ground_microphone_y_stencil - number of points in stencil in in longitidinal direction [-] microphone_min_x - x-location of start of computation domain [meters] microphone_max_x - x-location of end of computation domain [meters] microphone_min_y - y-location of start of computation domain [meters] microphone_max_y - y-location of end of computation domain [meters] cartesian_micrphone_locations - cartesian coordinates (x,y,z) of all microphones in domain [meters] latitude_longitude_micrphone_locations - latitude-longitude and elevation coordinates of all microphones in domain [deg,deg,m] Properties Used: N/A """ y_res = settings.microphone_y_resolution x_res = settings.microphone_x_resolution # extract data from file data = np.loadtxt(settings.topography_file) # settings.topography_file) CHANGED 10-15-2024 Long = data[:,0] Lat = data[:,1] Elev = data[:,2] x_min_coord = np.min(Lat) x_max_coord = np.max(Lat) y_min_coord = np.min(Long) y_max_coord = np.max(Long) if y_min_coord < 0: y_min_coord = 360 + y_min_coord if y_max_coord< 0: y_max_coord=360 + y_max_coord top_left_map_coords = np.array([x_max_coord,y_min_coord]) bottom_left_map_coords = np.array([x_min_coord,y_min_coord]) bottom_right_map_coords = np.array([x_min_coord,y_max_coord]) x_dist_max = Calculate_Distance(top_left_map_coords,bottom_left_map_coords) * Units.kilometers y_dist_max = Calculate_Distance(bottom_right_map_coords,bottom_left_map_coords) * Units.kilometers [y_pts,x_pts] = np.meshgrid(np.linspace(0,y_dist_max,y_res),np.linspace(0,x_dist_max,x_res)) [long_deg,lat_deg] = np.meshgrid(np.linspace(np.min(Long),np.max(Long),y_res),np.linspace(np.min(Lat),np.max(Lat),x_res)) z_deg = griddata((Lat,Long), Elev, (lat_deg, long_deg), method='linear') cartesian_pts = np.dstack((np.dstack((x_pts[:,:,None],y_pts[:,:,None] )),z_deg[:,:,None])).reshape(x_res*y_res,3) lat_long_pts = np.dstack((np.dstack((lat_deg[:,:,None],long_deg[:,:,None] )),z_deg[:,:,None])).reshape(x_res*y_res,3) return cartesian_pts , lat_long_pts