Skip to content
Snippets Groups Projects
misc_functions.py 7 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    """
    
    MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
    MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
    MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
    MNH_LIC for details. version 1.
    
    """
    import copy
    from scipy.interpolate import RectBivariateSpline
    import numpy as np
    import math
    
    
    def convert_date(datesince, time_in_sec):
    
        return str(time_in_sec) + datesince[:33]
    
    
            ny = var.shape[1]
            out = copy.deepcopy(var)
    
            for j in range(ny - 1):
                out[:, j, :] = (var[:, j, :] + var[:, j + 1, :]) * 0.5
    
            nx = var.shape[2]
            out = copy.deepcopy(var)
    
            for i in range(nx - 1):
                out[:, :, i] = (var[:, :, i] + var[:, :, i + 1]) * 0.5
    
            nz = var.shape[0]
            out = copy.deepcopy(var)
    
            for k in range(nz - 1):
                out[k, :, :] = (var[k, :, :] + var[k + 1, :, :]) * 0.5
    
    def windvec_verti_proj(u, v, level, angle):
        """Compute the projected horizontal wind vector on an axis with a given angle w.r.t. the x/ni axes (West-East)
    
        Parameters
        ----------
        u : array 3D
            U-wind component
    
        v : array 3D
            V-wind component
    
        level : array 1D
            level dimension array
    
        angle : float
            angle (radian) of the new axe w.r.t the x/ni axes (West-East). angle = 0 for (z,x) sections, angle=pi/2 for (z,y) sections
    
        projected_wind : array 3D
            a 3D wind component projected on the axe to be used with Panel_Plot.pvector as Lvar1
    
        projected_wind = copy.deepcopy(u)
        for k in range(len(level)):
    
            projected_wind[k, :, :] = u[k, :, :] * math.cos(angle) + v[k, :, :] * math.sin(angle)
    
    def oblique_proj(var, ni, nj, lvl, i_beg, j_beg, i_end, j_end):
    
        """Compute an oblique projection of a variable w.r.t. its axes
    
        var : array 3D or 2D
            the variable to project (e.g. THT, ZS)
    
        level : array 1D
            1D z-axe of the 3D dimension
    
        i_beg, j_beg : int
            coordinate of the begin point of the new axe
    
            coordinate of the end point of the new axe
    
    
         Returns
         -------
        angle_proj : float
            the angle (radian) of the new axe w.r.t the x/ni axes (West-East)
    
        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
        if var.ndim == 3:
            out_var = np.zeros((len(lvl), int(dist_seg) + 1))  # Initialisation du nouveau champs projeté dans la coupe (z,m)
    
            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)
    
        if var.ndim == 3:  # 3D variables to project
    
                a = RectBivariateSpline(nj, ni, var[k, :, :], kx=1, ky=1)
                for m in range(int(dist_seg) + 1):
                    # La fonction ev de RectBivariate retourne la valeur la plus proche du point considéré
                    out_var[k, m] = a.ev(axe_m_coord[m][1], axe_m_coord[m][0])
    
            a = RectBivariateSpline(nj, ni, var[:, :], kx=1, ky=1)
            for m in range(int(dist_seg) + 1):
                out_var[m] = a.ev(axe_m_coord[m][1], axe_m_coord[m][0])
    
        angle_proj = math.acos((ni[i_end] - ni[i_beg]) / axe_m[-1])
    
    def comp_altitude1DVar(oneVar2D, orography, ztop, level, n_xory):
    
        """Compute and returns an altitude and x or y grid mesh variable in 2D following the topography in 1D
        To be used with 2D simulations
    
        Parameters
        ----------
        oneVar2D : array 2D
            a 2D array (e.g. UT, THT)
    
        ztop : real
            scalar of the top height of the model (ZTOP)
    
        level : array 1D
            1D level variable (level or level_w)
    
            1D directionnal grid variable (ni_u, nj_u, ni_v or nj_v)
    
        Returns
        -------
        altitude
            a 2D altitude variable with topography taken into account
    
        n_xory_2D
            a 2D directionnal variable duplicated from n_xory
        """
        n_xory_2D = copy.deepcopy(oneVar2D)
    
            for j in range(len(n_xory)):
                for k in range(len(level)):
    
                    altitude[k, j] = orography[j] + level[k] * ((ztop - orography[j]) / ztop)
    
    def comp_altitude2DVar(oneVar3D, orography, ztop, level, n_y, n_x):
    
        """Compute and returns an altitude and x or y grid mesh variable in 3D following the topography in 2D
        To be used with 3D simulations
    
        Parameters
        ----------
        oneVar3D : array 3D
            a 3D array (e.g. UT, THT)
    
        ztop : real
            scalar of the top height of the model (ZTOP)
    
        level : array 1D
            1D level variable (level or level_w)
    
            1D directionnal grid variable along i (ni_u, or ni_v)
    
            1D directionnal grid variable along j (nj_u, or nj_v)
    
        Returns
        -------
        altitude
            a 3D altitude variable with topography taken into account
    
        n_x3D
            a 3D directionnal variable duplicated from n_x
    
        n_y3D
            a 3D directionnal variable duplicated from n_y
        """
        n_x3D = copy.deepcopy(oneVar3D)
        n_y3D = copy.deepcopy(oneVar3D)
    
        for i in range(oneVar3D.shape[2]):
            for j in range(oneVar3D.shape[1]):
    
                if ztop == 0:
                    altitude[:, i, j] = level[:]
    
                        altitude[k, j, i] = orography[j, i] + level[k] * ((ztop - orography[j, i]) / ztop)