Advertisement
GrinJ

Visibility

Aug 17th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.36 KB | None | 0 0
  1. def UPPVIS(forecast):
  2.  
  3.     # Get maximum values between 1 and 2nd model levels
  4.     value = {
  5.         "QCLOUD" : np.max([forecast["qcloud"], forecast["qcloud", 1]], axis=0),
  6.         "QVAPOR" : forecast["qvapor"],
  7.         "QRAIN" : np.max([forecast["qrain"], forecast["qrain", 1]], axis=0),
  8.         "QICE" : np.max([forecast["qice"], forecast["qice", 1]], axis=0),
  9.         "QSNOW" : np.max([forecast["qsnow"], forecast["qsnow", 1]], axis=0),
  10.         "rh" : np.max([forecast["rh"], forecast["rh", 1]], axis=0),
  11.         "RHO" : forecast["rho"]
  12.     }
  13.  
  14.     # Calculate the RUC visibility
  15.     min = np.full((forecast.size.lat, forecast.size.lon), 0.8)
  16.     zeros = np.full((forecast.size.lat, forecast.size.lon), 0.8)
  17.     qrh = np.max( [ zeros, np.min( [ min, ( value["rh"] / 100. - 0.15 ) ], axis=0 ) ], axis=0 )
  18.     visrh = 60. * np.exp( -2.5 * qrh )
  19.  
  20.     # Calculate SW99 visibility
  21.     vis = SW99VIS( value["QVAPOR"], value["QCLOUD"], value["QRAIN"], value["QICE"], value["QSNOW"], value["RHO"] ) / 1000.
  22.  
  23.     # Return the minimum value
  24.     return np.min([vis, visrh], axis=0)
  25.  
  26.  
  27. # Calculates visibility by SW99 method
  28. def SW99VIS(qv, qc, qr, qi, qs, rho, max = 24.135):
  29.     """
  30.    Calculates visibility based on the UPP algorithm.
  31.  
  32.    See documentation in UPPV2.2/src/unipost/CALVIS.f for the description of
  33.    input arguments and references.
  34.    """
  35.     Rd = 287.
  36.     COEFLC = 144.7
  37.     COEFLP = 2.24
  38.     COEFFC = 327.8
  39.     COEFFP = 10.36
  40.     EXPLC = 0.88
  41.     EXPLP = 0.75
  42.     EXPFC = 1.
  43.     EXPFP = 0.7776
  44.  
  45.     #Tv = T * (1 + 0.61 * qv)  # Virtual temperature
  46.  
  47.     #rhoa = p / (Rd * Tv)  # Air density [kg m^-3]
  48.     rhoa = rho
  49.     rhow = 1e3  # Water density [kg m^-3]
  50.     rhoi = 0.917e3  # Ice density [kg m^-3]
  51.  
  52.     vovmd = (1 + qv) / rhoa + (qc + qr) / rhow + (qi + qs) / rhoi
  53.  
  54.     conc_lc = 1e3 * qc / vovmd
  55.     conc_lp = 1e3 * qr / vovmd
  56.     conc_fc = 1e3 * qi / vovmd
  57.     conc_fp = 1e3 * qs / vovmd
  58.  
  59.     # Make sure all concentrations are positive
  60.     conc_lc[conc_lc < 0] = 0
  61.     conc_lp[conc_lp < 0] = 0
  62.     conc_fc[conc_fc < 0] = 0
  63.     conc_fp[conc_fp < 0] = 0
  64.  
  65.     betav = COEFFC * conc_fc ** EXPFC \
  66.             + COEFFP * conc_fp ** EXPFP \
  67.             + COEFLC * conc_lc ** EXPLC \
  68.             + COEFLP * conc_lp ** EXPLP + 1E-10
  69.  
  70.     vis = -numpy.log(0.02) / betav  # Visibility [km]
  71.     vis[vis > max] = max
  72.  
  73.     return 1000 * vis
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement