def pointfind2(plat, plon, lat, lon, pdif=1): """ return indeces and values of the grid point closest to lat/lon point the same as pointfind but could be faster Usage: pointfind(plat, plon, lat, lon, pdif = 0.5) Input: plat - latitude of the point plon - longitude of the point lat - 2d array of latutudes lon - 2d array of longitudes pdif - we don't need it but leave it to have the same input as pointfind Output: indeces and values of the points that fulfil conditions """ dist_min = 1000000. for i in range(lon.shape[0]): for j in range(lon.shape[1]): dist = Ngl.gc_dist(plat,plon,lat[i,j],lon[i,j]) if dist_min > dist: dist_min = dist i_min = i j_min = j lat_min = lat[i,j] lon_min = lon[i,j] print(i_min,j_min,lat_min,lon_min) gg1 = i_min, j_min return(gg1, lat_min, lon_min)
def pointfind2(plat, plon, lat, lon, pdif=1): """ return indeces and values of the grid point closest to lat/lon point the same as pointfind but could be faster Usage: pointfind(plat, plon, lat, lon, pdif = 0.5) Input: plat - latitude of the point plon - longitude of the point lat - 2d array of latutudes lon - 2d array of longitudes pdif - we don't need it but leave it to have the same input as pointfind Output: indeces and values of the points that fulfil conditions """ dist_min = 1000000. for i in range(lon.shape[0]): for j in range(lon.shape[1]): dist = Ngl.gc_dist(plat, plon, lat[i, j], lon[i, j]) if dist_min > dist: dist_min = dist i_min = i j_min = j lat_min = lat[i, j] lon_min = lon[i, j] print(i_min, j_min, lat_min, lon_min) gg1 = i_min, j_min return (gg1, lat_min, lon_min)
def find_closest(lats, lons, lat, lon, mask=None): mindist = 1e20 if mask == None: mask = np.zeros([len(lats), len(lons)], dtype=np.bool) for i in range(len(lons)): for j in range(len(lats)): if not mask[j, i]: dist = Ngl.gc_dist(lons[i], lats[j], lon, lat) if dist < mindist: closest_i = i closest_j = j mindist = dist return closest_i, closest_j
def find_closest(lats, lons, lat, lon, mask=None): mindist = 1e20 if mask == None: mask = np.zeros([len(lats), len(lons)], dtype=np.bool) for i in range(len(lons)): for j in range(len(lats)): if not mask[j,i]: dist = Ngl.gc_dist(lons[i], lats[j], lon, lat) if dist < mindist: closest_i = i closest_j = j mindist = dist return closest_i, closest_j
def find_distances(x1, y1, x2, y2): """ generalization of Ngl.gc_dist that can take arrays of lat and lon as input and return a ndarray of distances. """ narrays = 0 size_output = [] order_input = [] if isinstance(x1, np.ndarray): IM1 = x1.size narrays = narrays + 1 size_output.append(IM1) order_input.append(0) if isinstance(y1, np.ndarray): JM1 = y1.size narrays = narrays + 1 size_output.append(JM1) order_input.append(1) if isinstance(x2, np.ndarray): IM2 = x2.size narrays = narrays + 1 size_output.append(IM2) order_input.append(2) if isinstance(y2, np.ndarray): JM2 = y2.size narrays = narrays + 1 size_output.append(JM2) order_input.append(3) if narrays == 0: output = Ngl.gc_dist(x1, y1, x2, y2) else: output = np.zeros(size_output) if narrays == 1: if order_input[0] == 0: for i in range(0, IM1): output[i] = Ngl.gc_dist(x1[i], y1, x2, y2) if order_input[0] == 1: for i in range(0, JM1): output[i] = Ngl.gc_dist(x1, y1[i], x2, y2) if order_input[0] == 2: for i in range(0, IM2): output[i] = Ngl.gc_dist(x1, y1, x2[i], y2) if order_input[0] == 3: for i in range(0, JM2): output[i] = Ngl.gc_dist(x1, y1, x2, y2[i]) if narrays == 2: if order_input[0] == 0: if order_input[1] == 1: for i in range(0, IM1): for j in range(0, JM1): output[i, j] = Ngl.gc_dist(x1[i], y1[j], x2, y2) if order_input[1] == 2: for i in range(0, IM1): for j in range(0, IM2): output[i, j] = Ngl.gc_dist(x1[i], y1, x2[j], y2) if order_input[1] == 3: for i in range(0, IM1): for j in range(0, JM2): output[i, j] = Ngl.gc_dist(x1[i], y1, x2, y2[j]) if order_input[0] == 1: if order_input[1] == 2: for i in range(0, JM1): for j in range(0, IM2): output[i, j] = Ngl.gc_dist(x1, y1[i], x2[j], y2) if order_input[1] == 3: for i in range(0, JM1): for j in range(0, JM2): output[i, j] = Ngl.gc_dist(x1, y1[i], x2, y2[j]) if order_input[0] == 2: if order_input[1] == 3: for i in range(0, IM2): for j in range(0, JM2): output[i, j] = Ngl.gc_dist(x1, y1, x2[i], y2[j]) if narrays == 3: raise NotImplementedError if narrays == 4: for i in range(0, IM1): for j in range(0, JM1): for k in range(0, IM2): for l in range(0, JM2): output[i, j, k, l] = Ngl.gc_dist(x1[i], y1[j], x2[k], y2[l]) return output
def get_transect(lat, lon, data, lat1, lon1, lat2, lon2, npoints = 10, pdif = 1, norep=False): plat, plon = Ngl.gc_interp(lat1,lon1,lat2,lon2,npoints) m_grid = numpy.zeros((plon.shape[0])) n_grid = numpy.zeros((plat.shape[0])) grid_lats = numpy.zeros((plat.shape[0])) grid_lons = numpy.zeros((plat.shape[0])) for k in range(plon.shape[0]): coord, trash1, trash1 = pointfind2(plat[k], plon[k], lat, lon, pdif) m_grid[k] = coord[0] n_grid[k] = coord[1] grid_lats[k] = lat[m_grid[k],n_grid[k]] grid_lons[k] = lon[m_grid[k],n_grid[k]] if len(data.shape) == 4: data = data[0,:,:,:] elif len(data.shape) == 5: data = data[0,0,:,:,:] data_prof = numpy.zeros(([data.shape[0],npoints])) for j in range(data_prof.shape[1]): data_prof[:,j] = data[:,m_grid[j],n_grid[j]] x_kilometers = numpy.zeros((grid_lats.shape[0])) for j in range(grid_lats.shape[0] - 1): angle = Ngl.gc_dist(grid_lats[j], grid_lons[j], grid_lats[j+1], grid_lons[j+1] ) x_kilometers[j+1] = Ngl.gc_convert(angle, 2) + x_kilometers[j] numpy.savez("outfile.npz", data_prof, x_kilometers) if norep == True: data_prof_norep = numpy.zeros(([data_prof.shape[0],1])) x_kilometers_norep = numpy.array(([])) m_grid_norep = numpy.array(([])) n_grid_norep = numpy.array(([])) present_location = -999999.999 for k in range(x_kilometers.shape[0]): if int(x_kilometers[k]) != int(present_location): present_location = x_kilometers[k] data_prof_norep = numpy.hstack((data_prof_norep, data_prof[:,k:k+1])) x_kilometers_norep = numpy.append(x_kilometers_norep, x_kilometers[k:k+1]) m_grid_norep = numpy.append(m_grid_norep, m_grid[k:k+1]) n_grid_norep = numpy.append(n_grid_norep, n_grid[k:k+1]) data_prof_norep = data_prof_norep[:,1:] data_prof = data_prof_norep x_kilometers = x_kilometers_norep m_grid = m_grid_norep n_grid = n_grid_norep print(x_kilometers) print(m_grid) print(n_grid) return(data_prof, x_kilometers, m_grid, n_grid )
def get_transect(lat, lon, data, lat1, lon1, lat2, lon2, npoints=10, pdif=1, norep=False): plat, plon = Ngl.gc_interp(lat1, lon1, lat2, lon2, npoints) m_grid = numpy.zeros((plon.shape[0])) n_grid = numpy.zeros((plat.shape[0])) grid_lats = numpy.zeros((plat.shape[0])) grid_lons = numpy.zeros((plat.shape[0])) for k in range(plon.shape[0]): coord, trash1, trash1 = pointfind2(plat[k], plon[k], lat, lon, pdif) m_grid[k] = coord[0] n_grid[k] = coord[1] grid_lats[k] = lat[m_grid[k], n_grid[k]] grid_lons[k] = lon[m_grid[k], n_grid[k]] if len(data.shape) == 4: data = data[0, :, :, :] elif len(data.shape) == 5: data = data[0, 0, :, :, :] data_prof = numpy.zeros(([data.shape[0], npoints])) for j in range(data_prof.shape[1]): data_prof[:, j] = data[:, m_grid[j], n_grid[j]] x_kilometers = numpy.zeros((grid_lats.shape[0])) for j in range(grid_lats.shape[0] - 1): angle = Ngl.gc_dist(grid_lats[j], grid_lons[j], grid_lats[j + 1], grid_lons[j + 1]) x_kilometers[j + 1] = Ngl.gc_convert(angle, 2) + x_kilometers[j] numpy.savez("outfile.npz", data_prof, x_kilometers) if norep == True: data_prof_norep = numpy.zeros(([data_prof.shape[0], 1])) x_kilometers_norep = numpy.array(([])) m_grid_norep = numpy.array(([])) n_grid_norep = numpy.array(([])) present_location = -999999.999 for k in range(x_kilometers.shape[0]): if int(x_kilometers[k]) != int(present_location): present_location = x_kilometers[k] data_prof_norep = numpy.hstack( (data_prof_norep, data_prof[:, k:k + 1])) x_kilometers_norep = numpy.append(x_kilometers_norep, x_kilometers[k:k + 1]) m_grid_norep = numpy.append(m_grid_norep, m_grid[k:k + 1]) n_grid_norep = numpy.append(n_grid_norep, n_grid[k:k + 1]) data_prof_norep = data_prof_norep[:, 1:] data_prof = data_prof_norep x_kilometers = x_kilometers_norep m_grid = m_grid_norep n_grid = n_grid_norep print(x_kilometers) print(m_grid) print(n_grid) return (data_prof, x_kilometers, m_grid, n_grid)
def find_distances(x1, y1, x2, y2): """ generalization of Ngl.gc_dist that can take arrays of lat and lon as input and return a ndarray of distances. """ narrays = 0 size_output = [] order_input = [] if isinstance(x1, np.ndarray): IM1 = x1.size narrays = narrays+1 size_output.append(IM1) order_input.append(0) if isinstance(y1, np.ndarray): JM1 = y1.size narrays = narrays+1 size_output.append(JM1) order_input.append(1) if isinstance(x2, np.ndarray): IM2 = x2.size narrays = narrays+1 size_output.append(IM2) order_input.append(2) if isinstance(y2, np.ndarray): JM2 = y2.size narrays = narrays+1 size_output.append(JM2) order_input.append(3) if narrays == 0: output = Ngl.gc_dist(x1, y1, x2, y2) else: output = np.zeros(size_output) if narrays == 1: if order_input[0] == 0: for i in range(0,IM1): output[i] = Ngl.gc_dist(x1[i], y1, x2, y2) if order_input[0] == 1: for i in range(0,JM1): output[i] = Ngl.gc_dist(x1, y1[i], x2, y2) if order_input[0] == 2: for i in range(0,IM2): output[i] = Ngl.gc_dist(x1, y1, x2[i], y2) if order_input[0] == 3: for i in range(0,JM2): output[i] = Ngl.gc_dist(x1, y1, x2, y2[i]) if narrays == 2: if order_input[0] == 0: if order_input[1] == 1: for i in range(0,IM1): for j in range(0,JM1): output[i,j] = Ngl.gc_dist(x1[i], y1[j], x2, y2) if order_input[1] == 2: for i in range(0,IM1): for j in range(0,IM2): output[i,j] = Ngl.gc_dist(x1[i], y1, x2[j], y2) if order_input[1] == 3: for i in range(0,IM1): for j in range(0,JM2): output[i,j] = Ngl.gc_dist(x1[i], y1, x2, y2[j]) if order_input[0] == 1: if order_input[1] == 2: for i in range(0,JM1): for j in range(0,IM2): output[i,j] = Ngl.gc_dist(x1, y1[i], x2[j], y2) if order_input[1] == 3: for i in range(0,JM1): for j in range(0,JM2): output[i,j] = Ngl.gc_dist(x1, y1[i], x2, y2[j]) if order_input[0] == 2: if order_input[1] == 3: for i in range(0,IM2): for j in range(0,JM2): output[i,j] = Ngl.gc_dist(x1, y1, x2[i], y2[j]) if narrays == 3: raise NotImplementedError if narrays == 4: for i in range(0,IM1): for j in range(0,JM1): for k in range(0,IM2): for l in range(0,JM2): output[i,j,k,l] = Ngl.gc_dist(x1[i], y1[j], x2[k], y2[l]) return output