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')