diff --git a/src/LIB/Python/misc_functions.py b/src/LIB/Python/misc_functions.py index aa91aa7a311dc721c17f3f28cc7a8fd4f78df5b1..efc0916e04a60a7ee3cd2a276d1bb1eba3de0182 100644 --- a/src/LIB/Python/misc_functions.py +++ b/src/LIB/Python/misc_functions.py @@ -67,12 +67,12 @@ def windvec_verti_proj(u, v, level, angle): return projected_wind def oblique_proj(var, ni, nj, lvl, i_beg, j_beg, i_end, j_end): - """Compute an oblique projection of a 3D variable w.r.t. its axes + """Compute an oblique projection of a variable w.r.t. its axes Parameters ---------- - var : array 3D - the 3D variable to project (e.g. THT) + var : array 3D or 2D + the variable to project (e.g. THT, ZS) ni : array 1D 1D x-axis of the 3D dimension @@ -94,27 +94,37 @@ def oblique_proj(var, ni, nj, lvl, i_beg, j_beg, i_end, j_end): angle_proj : float the angle (radian) of the new axe w.r.t the x/ni axes (West-East) - out_var : array 2D - a 2D (z,m) variable projected on the oblique axe + out_var : array 2D or 1D + a 2D (z,m) or 1D (m) variable projected on the oblique axe axe_m : array 1D a 1D m new axe (distance from the beggining point) """ - dist_seg=np.sqrt((i_end-i_beg)**2.0 + (j_end-j_beg)**2.0) # Distance de la section oblique m - out_var = np.zeros((len(lvl),int(dist_seg)+1)) # Initialisation du nouveau champs projeté dans la coupe (z,m) - axe_m = np.zeros(int(dist_seg)+1) #Axe des abscisses qui sera tracé selon la coupe - axe_m_coord = [] #Coordonnées x,y des points qui composent l'axe - axe_m_coord.append( (ni[i_beg],nj[j_beg]) ) #Le premier point est celui donné par l'utilisateur - for m in range(int(dist_seg)): #Discrétisation selon distance de la coupe / int(distance_de_la_coupe) + dist_seg=np.sqrt((i_end-i_beg)**2.0 + (j_end-j_beg)**2.0) # Distance de la section oblique m + if var.ndim ==3: + out_var = np.zeros((len(lvl),int(dist_seg)+1)) # Initialisation du nouveau champs projeté dans la coupe (z,m) + else: # 2D + out_var = np.zeros(int(dist_seg)+1) # Initialisation du nouveau champs projeté dans la coupe (m) + + axe_m = np.zeros(int(dist_seg)+1) # Axe des abscisses qui sera tracé selon la coupe + axe_m_coord = [] # Coordonnées x,y des points qui composent l'axe + axe_m_coord.append( (ni[i_beg],nj[j_beg]) ) # Le premier point est celui donné par l'utilisateur + + for m in range(int(dist_seg)): # Discrétisation selon distance de la coupe / int(distance_de_la_coupe) axe_m_coord.append( (axe_m_coord[0][0] + (ni[i_end]-ni[i_beg])/(int(dist_seg))*(m+1), axe_m_coord[0][1] + (nj[j_end]-nj[j_beg])/(int(dist_seg))*(m+1) )) axe_m[m+1] = np.sqrt((ni[i_beg]-axe_m_coord[m+1][0])**2 + (nj[j_beg]-axe_m_coord[m+1][1])**2) - - for k in range(len(lvl)): - a=RectBivariateSpline(ni, nj,var[k,:,:],kx=1,ky=1) #Interpolation par niveau à l'ordre 1 pour éviter des valeurs négatives de champs strictement > 0 + + if var.ndim ==3: # 3D variables to project + for k in range(len(lvl)): + a=RectBivariateSpline(ni, nj,var[k,:,:],kx=1,ky=1) # Interpolation par niveau à l'ordre 1 pour éviter des valeurs négatives de champs strictement > 0 + for m in range(int(dist_seg)+1): + out_var[k,m] = a.ev(axe_m_coord[m][0],axe_m_coord[m][1]) # La fonction ev de RectBivariate retourne la valeur la plus proche du point considéré + else: # 2D variables to project + a=RectBivariateSpline(ni, nj,var[:,:],kx=1,ky=1) for m in range(int(dist_seg)+1): - out_var[k,m] = a.ev(axe_m_coord[m][0],axe_m_coord[m][1]) # La fonction ev de RectBivariate retourne la valeur la plus proche du point considéré + out_var[m] = a.ev(axe_m_coord[m][0],axe_m_coord[m][1]) angle_proj = math.acos((ni[i_end]-ni[i_beg])/axe_m[-1]) return angle_proj, out_var, axe_m @@ -206,4 +216,4 @@ def comp_altitude2DVar(oneVar3D, orography, ztop, level, n_y, n_x): else: for k in range(len(level)): altitude[k,j,i] = orography[j,i] + level[k]*((ztop-orography[j,i])/ztop) - return altitude, n_x3D, n_y3D \ No newline at end of file + return altitude, n_x3D, n_y3D