123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- #!/usr/bin/env python
- #
- # L. Brodeau, Dec. 2015
- import sys
- import numpy as nmp
- from netCDF4 import Dataset
- import string
- from os.path import basename
- import barakuda_tool as bt
- import barakuda_thermo as bthermo
- cv_u='U10M'
- cv_v='V10M'
- cv_wm ='WIND_MOD_10M' ; # OUTPUT !
- cv_ke ='EKE'
- if len(sys.argv) < 2 and len(sys.argv) > 3:
- print 'Usage: '+sys.argv[0]+' <IN_FILE_U.nc> (Year)'
- sys.exit(0)
- cf_u = sys.argv[1]
- cf_v = string.replace(cf_u, cv_u, cv_v)
- cf_wm = basename(string.replace(cf_u, cv_u, cv_wm))
- if len(sys.argv) == 3:
- cvy = sys.argv[2]
- iyear = int(cvy)
- #print iyear ; sys.exit(0)
- # First need time length:
- bt.chck4f(cf_u) ; f_u_in = Dataset(cf_u)
- vlon = f_u_in.variables['lon'][:]
- cunt_lon = f_u_in.variables['lon'].units
- print 'LONGITUDE: ', cunt_lon
- # Extracting the longitude 1D array:
- vlat = f_u_in.variables['lat'][:]
- cunt_lat = f_u_in.variables['lat'].units
- print 'LATITUDE: ', cunt_lat
- # Extracting time 1D array:
- vtime = f_u_in.variables['time'][:] ; cunt_time = f_u_in.variables['time'].units
- print 'TIME: ', cunt_time, '\n'
- f_u_in.close()
- Nt = len(vtime)
- print 'Nt = ', Nt
- #ii = Nt/31
- for jt in range(Nt):
- #vtime[jt] = float(iyear) + 365./float(Nt) * float(jt)+0.5
- print ' *** jt = ', jt
-
-
- # U10M
- # ~~~~
- if jt == 0:
- bt.chck4f(cf_u)
- f_u_in = Dataset(cf_u)
- cunt_u = f_u_in.variables[cv_u].units
- xu = f_u_in.variables[cv_u][jt,:,:]
- if jt == Nt-1: f_u_in.close()
-
-
-
- # V10M
- # ~~~
- if jt == 0:
- bt.chck4f(cf_v)
- f_v_in = Dataset(cf_v)
- cunt_v = f_v_in.variables[cv_v].units
- xv = f_v_in.variables[cv_v][jt,:,:]
- if jt == Nt-1: f_v_in.close()
-
-
-
-
- # Checking dimensions
- # ~~~~~~~~~~~~~~~~~~~
- if jt == 0:
- dim_u = xu.shape ; dim_v = xv.shape
- if dim_u != dim_v:
- print 'Shape problem!!!'; print dim_u , dim_v
- print '\n'
- [ nj, ni ] = dim_u
- print 'ni, nj, nt = ', ni, nj, Nt
- xwm = nmp.zeros(nj*ni) ; xwm.shape = dim_u
- xke = nmp.zeros(nj*ni) ; xke.shape = dim_u
-
-
- # Building wm
- # ~~~~~~~~~~~
- xke = xu*xu + xv*xv
- xwm = nmp.sqrt(xke)
- xke = 0.5*xke
-
-
- # Creating output file
- # ~~~~~~~~~~~~~~~~~~~~
- if jt == 0:
- f_out = Dataset(cf_wm, 'w', format='NETCDF3_CLASSIC')
-
- # Dimensions:
- f_out.createDimension('lon', ni)
- f_out.createDimension('lat', nj)
- f_out.createDimension('time', None)
-
- # Variables
- id_lon = f_out.createVariable('lon','f4',('lon',))
- id_lat = f_out.createVariable('lat','f4',('lat',))
- id_tim = f_out.createVariable('time','f4',('time',))
- id_wm = f_out.createVariable(cv_wm,'f4',('time','lat','lon',))
- id_ke = f_out.createVariable(cv_ke,'f4',('time','lat','lon',))
-
- # Attributes
- id_tim.units = cunt_time
-
- #id_lat.long_name = clnm_lat
- id_lat.units = cunt_lat
- #id_lat.standard_name = csnm_lat
-
- #id_lon.long_name = clnm_lon
- id_lon.units = cunt_lon
- #id_lon.standard_name = csnm_lon
-
- id_tim.units = cunt_time
-
- #id_wm.long_name = 'Surface specific humidity at 2m, built from U10M, V10M and MSL'
- #id_wm.units = 'kg/kg'
- #id_wm.code = '133'
- #id_wm.table = '128'
-
- f_out.About = 'Created by L. Brodeau using MSL, U10M and V10M corresponding fields'
-
- # Filling variables:
- id_lat[:] = vlat[:]
- id_lon[:] = vlon[:]
-
- id_tim[jt] = vtime[jt]
- id_wm[jt,:,:] = xwm[:,:]
- id_ke[jt,:,:] = xke[:,:]
-
- if jt == Nt-1: f_out.close()
-
-
-
-
-
- print ' *** file '+cf_wm+' created !'
-
- print 'Bye!'
|