Untitled
Position TCunknown
plain_text
2 years ago
2.8 kB
7
Indexable
def position_TC(jour_TC, heure_TC, path, range_grid): nc_TC = NetCDFFile(path) date = jour_TC * 24 + heure_TC u = uwind[date, :, :] v = vwind[date, :, :] vor = vorticity[date, :, :] x = scipy.integrate.cumtrapz(v, lon, axis=1, initial=0) y = scipy.integrate.cumtrapz(u, lat, axis=0, initial=0) psi_vor = (y - x) psi_vor = psi_vor / np.min(psi_vor) + vor / np.min(vor) latitude = np.array(nc_TC.variables['latitude'][:]) longitude = np.array(nc_TC.variables['longitude'][:]) # On trouve la vorticité max à cette date, dans une certaine zone psi_vor = np.where(range_grid, psi_vor, float('nan')) a = np.unravel_index(np.nanargmin(psi_vor), psi_vor.shape) # Puis on envoie les coordonnées # print(f"(Lon,Lat) = {latitude[a[0]], longitude[a[1]]}") nc_TC.close() return latitude[a[0]], longitude[a[1]] def posTC_compute(t0, t_end, want_to_plot): # Ressort la position du TC en fonction du temps sur notre temps d'étude [t0,t_end] y_TC = [0 for t in range(0, t0, 1)] # Avant t0, la position du cyclone n'est pas définie x_TC = [0 for t in range(0, t0, 1)] # Nous allons utiliser les champs PSI et de Vorticité pour trouver l'emplacement du cyclone # A leur valeur maximale se trouve le cyclone. Cependant cela n'est pas toujours vrai, car la zone d'étude est grande, # d'autres perturbations peuvent s'apparenter un à un cyclone. # L'idée est d'utiliser une meshgrid pour afficher la recherche du point, à partir de l'emplacement du point # à l'instant précédent range_grid = np.ones(np.shape(np.meshgrid(lon, lat)))[0, :, :] # Grille pour filtrer la recherche du xy_TC if want_to_plot: plot_array(vorticity[t0 + 30, :, :], lon, lat) for t in range(t0, t_end, 1): # y_TC.append(deg_to_met(position_TC(0, t, data_path, range_grid)[0])) x_TC.append(deg_to_met(position_TC(0, t, data_path, range_grid)[1])) # Mise à jour de la grille de recherche range_lon = np.isclose(met_to_deg(lon), met_to_deg(x_TC[-1]), atol=2) range_lat = np.isclose(met_to_deg(lat), met_to_deg(y_TC[-1]), atol=2) range_grid = np.meshgrid(range_lon, range_lat) # Nous souhaitons les emplacements où les valeurs en lon ET en lat sont True range_grid = range_grid[0] * range_grid[1] if want_to_plot: plt.plot(met_to_deg(x_TC[-1]), met_to_deg(y_TC[-1]), ms=5, marker='x', markeredgecolor='red') plt.show(block=False) plt.pause(0.001) return x_TC, y_TC # En degrés x_TC, y_TC = posTC_compute(t0, tmax, want_to_plot=False) # En mètres jour = 24 heure = 0 t0 = jour * 24 + heure tmax = t0 + 7 * 24
Editor is loading...