Skip to content

Instantly share code, notes, and snippets.

@m1t9
Last active May 17, 2017 11:16
Show Gist options
  • Save m1t9/05d60e5e488b3eaea2baff7de062532c to your computer and use it in GitHub Desktop.
Save m1t9/05d60e5e488b3eaea2baff7de062532c to your computer and use it in GitHub Desktop.

create U- V- wind and pressure files for space varying distribution data

import sys
import numpy as np
from netCDF4 import Dataset

print('\nstart read .nc file\n')

# sys.stdout.write('-'+key+' ')
# nc_fileID = str(input('.nc file name (without format): ')) + '.nc'
# nc_fileID = 'dat_3.nc'
# nc_fileID = '_grib2netcdf-atls05-a562cefde8a29a7288fa0b8b7f9413f7-jKw4kM.nc'
# nc_fileID = '_grib2netcdf-atls03-a562cefde8a29a7288fa0b8b7f9413f7-s1Ek6X_for_REG.nc'
nc_fileID = '_grib2netcdf-atls14-a562cefde8a29a7288fa0b8b7f9413f7-smxfVS_REG2.nc'
nc_fileID = '_grib2netcdf-atls03-a562cefde8a29a7288fa0b8b7f9413f7-oeznjS_REG3.nc'
try:
    file_chk = open(nc_fileID)
except FileNotFoundError:
    sys.exit('\nERROR! file not found')

root = Dataset(nc_fileID)
print(root)
dims = root.dimensions
ndims = len(dims)

dic = {}
dic2 = {}
print('\navailable variables in selected .NC file:\n')
vars = root.variables
print(vars)
nvars = len(vars)
n = 0
for var in vars:
    # sys.stdout.write('-'+var+' ')
    print('#',n,'   ',var, vars[var].shape)
    dic[str(var)] = n
    l = vars[var].shape
    dic2[str(var)] = len(l)
    n += 1
print('\n')

nc_data = []
iter_var = []
iter_var.append(input('write the variables you want to read (through the gap): ').split(' '))
iter_var = iter_var[0]
try:
    for v in iter_var:
        dic[v]
except KeyError:
    sys.exit('\nvariable name error\n')

var_inter_n = {}
ni = 0
for i in iter_var:
    if (dic2[i] == 1):
        nc_data.append(np.array(root.variables[i][:], dtype=np.float32))
    if (dic2[i] == 2):
        nc_data.append(np.array(root.variables[i][:,:], dtype=np.float32))
    if (dic2[i] == 3):
        nc_data.append(np.array(root.variables[i][:,:,:], dtype=np.float32))
    var_inter_n[i] = ni
    ni += 1

print('\nread complete\n')

# grd2 = np.zeros((len(nc_data[var_inter_n['longitude']]) * len(nc_data[var_inter_n['latitude']]), 2))
chk = input('write wind grid? y/n ')
if (chk != 'n'):
    outfile2_name = 'uvsp_grd.dat'
    outfile2 = open(outfile2_name, 'w')
    for i in range((len(root.variables['longitude']))):
        for j in range(len(root.variables['latitude'])):
            outfile2.write(str(root.variables['longitude'][i])+'    '+str(root.variables['latitude'][j])+'\n')
    print('wind grid write complete')


check = input('start create .amu .amv .amp files? y/n ')
if (check == 'n'):
    sys.exit()

# for i in iter_var:
#     print(vars[i].shape[0])
# print(len(nc_data))
# print(var_inter_n)
# for i in iter_var:
#     for t in range(int(input('time to write '+i+': '))):
#         outfile_name = str(i)+'_t'+str(t)+'.dat'
#         outfile = open(outfile_name, 'w')
#         print(outfile)
#         np.savetxt(outfile, nc_data[var_inter_n[i]][t,:,:])
        # print(i, dic[i])

nodata_value = -999.000
grid_unit = 'degree' #  m or degree
longitude_name = 'longitude'
latitude_name = 'latitude'
time_name = 'time'
n_quantity = 1
fmt = '.dat'

for i in iter_var:
    if (i == 'u10'): fmt = '.amu'
    if (i == 'v10'): fmt = '.amv'
    if (i == 'sp'): fmt = '.amp'
    outfile_name = str(i)+fmt
    outfile = open(outfile_name, 'w')
    outfile.write('FileVersion = 1.03\n')
    outfile.write('filetype = meteo_on_equidistant_grid\n')
    outfile.write('NODATA_value = '+str(nodata_value)+'\n')
    n_cols = vars[i].shape[2]
    outfile.write('n_cols = '+str(n_cols)+'\n')
    n_rows = vars[i].shape[1]
    outfile.write('n_rows = '+str(n_rows)+'\n')
    outfile.write('grid_unit = '+str(grid_unit)+'\n')
    x_llcorner = root.variables[longitude_name][0]
    y_llcorner = root.variables[latitude_name][-1]
    outfile.write('x_llcorner = '+str(x_llcorner)+'\n')
    outfile.write('y_llcorner = '+str(y_llcorner)+'\n')
    dy = (root.variables[longitude_name][-1] - root.variables[longitude_name][0]) / (n_cols - 1)
    dx = (root.variables[latitude_name][0] - root.variables[latitude_name][-1]) / (n_rows - 1)
    outfile.write('dx = '+str(dx)+'\n')
    outfile.write('dy = '+str(dy)+'\n')
    outfile.write('n_quantity = '+str(n_quantity)+'\n')
    quantity1 = '???'
    unit1 = '???'
    if (i == 'u10'):
        quantity1 = 'x_wind'
        unit1 = 'm s-1'
    elif (i == 'v10'):
        quantity1 = 'y_wind'
        unit1 = 'm s-1'
    elif (i == 'sp'):
        quantity1 = 'air_pressure'
        unit1 = 'Pa'
    outfile.write('quantity1 = '+quantity1+'\n')
    outfile.write('unit1 = '+unit1+'\n')
    time1 = 0
    for t in range(int(input('time to write '+i+': '))):
        # time1 = root.variables[time_name][t]
        # outfile.write('TIME = ' + str(root.variables[time_name][t]) + ' hours since 1900-01-01 00:00:00 +00:00\n')
        outfile.write('TIME = ' + str(time1) + ' hours since 1996-01-01 00:00:00 +00:00\n')
        for n in range(int(vars[i].shape[1])):
            for m in range(int(vars[i].shape[2])):
                outfile.write(str(nc_data[var_inter_n[i]][t, n, m])+' ')
            outfile.write('\n')
        time1 += 6
    print('done')

chk = input('print stat wind? y/n ')
if (chk == 'n'):
    sys.exit()

stat_wind = 6.0

for i in iter_var:
    if (i == 'u10'): fmt = '.amu'
    if (i == 'v10'): fmt = '.amv'
    if (i == 'sp'): fmt = '.amp'
    outfile_name = str(i)+'_stat'+fmt
    outfile = open(outfile_name, 'w')
    outfile.write('FileVersion = 1.03\n')
    outfile.write('filetype = meteo_on_equidistant_grid\n')
    outfile.write('NODATA_value = '+str(nodata_value)+'\n')
    n_cols = vars[i].shape[1]
    outfile.write('n_cols = '+str(n_cols)+'\n')
    n_rows = vars[i].shape[2]
    outfile.write('n_rows = '+str(n_rows)+'\n')
    outfile.write('grid_unit = '+str(grid_unit)+'\n')
    x_llcorner = root.variables[longitude_name][0]
    y_llcorner = root.variables[latitude_name][-1]
    outfile.write('x_llcorner = '+str(x_llcorner)+'\n')
    outfile.write('y_llcorner = '+str(y_llcorner)+'\n')
    dy = (root.variables[longitude_name][-1] - root.variables[longitude_name][0]) / (n_rows - 1)
    dx = (root.variables[latitude_name][0] - root.variables[latitude_name][-1]) / (n_cols - 1)
    outfile.write('dx = '+str(dx)+'\n')
    outfile.write('dy = '+str(dy)+'\n')
    outfile.write('n_quantity = '+str(n_quantity)+'\n')
    quantity1 = '???'
    unit1 = '???'
    if (i == 'u10'):
        quantity1 = 'x_wind'
        unit1 = 'm s-1'
    elif (i == 'v10'):
        quantity1 = 'y_wind'
        unit1 = 'm s-1'
    elif (i == 'sp'):
        quantity1 = 'air_pressure'
        unit1 = 'Pa'
    outfile.write('quantity1 = '+quantity1+'\n')
    outfile.write('unit1 = '+unit1+'\n')
    time1 = 0
    for t in range(int(input('time to write '+i+': '))):
        # time1 = root.variables[time_name][t]
        # outfile.write('TIME = ' + str(root.variables[time_name][t]) + ' hours since 1900-01-01 00:00:00 +00:00\n')
        outfile.write('TIME = ' + str(time1) + ' hours since 1996-01-01 00:00:00 +00:00\n')
        for m in range(int(vars[i].shape[2])):
            for n in range(int(vars[i].shape[1])):
                outfile.write(str(stat_wind)+' ')
            outfile.write('\n')
        time1 += 6
    print('done')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment