Commit 163d475a authored by James Harle's avatar James Harle
Browse files

Start of tidy up and transition to Python3

parent c99779e3
#
# The loop from nemo_bdy_extr_tm3
#
#
#
from calendar import monthrange
from datetime import datetime
from netCDF4 import Dataset, netcdftime
class Enter:
def __init__(self, settings, sc_time, dir_list, dst_cal_type, year, month):
var_nam = ['votemper', 'vosaline']
sc_fields = source_fields
#self.setup = settings # dict
# define src/dst cals
sf, ed = cal_trans(sc_time, dst_cal_type, year, month)
# W
DstCal = utime('seconds since %d-1-1' %year, dst_cal_type)
dst_start = DstCal.date2num(datetime(year, month, 1))
dst_end = DstCal.date2num(datetime(year, month, ed, 23, 59, 59))
self.S_cal = utime(sc_time[0]['units'], sc_time[0]['calendar'])
self.D_cal = utime('seconds since %d-1-1' %settings['year_000'],
settings['dst_calendar'])
for date in sc_time:
date['date_num'] = DstCal.date2num(date['date']) * sf
# Get first and last date within range
first_date, last_date = None, None
rev_seq = range(len_sc_time)
rev_seq.reverse()
# Multiple values.. might be broken..
for date in rev_seq:
if sc_time[date]['date_num'] < dst_start:
first_date = date #number..
break
for date in range(len_sc_time):
if sc_time[date]['date_num'] > dst_end:
last_date = date
break
for date in range(first_date, last_date + 1):
nc = Dataset(sc_time[date], 'r')
if key_vec:
pass
#nc_2 = Dataset
# FIX ME
# We shouldnt have to worry about counters
sc_bdy = np.zeros(nvar, sc_z_len, source_ind['ind'].shape[0],
source_ind['ind'].shape[1])
ind_vec = {}
# distinctive variable name since it gets lost in the huge loop
for shoggoth in range(nvar):
varid = nc.variables[var_nam[shoggoth]]
i, ii = source_ind['imin'], source_ind['imax']
j, jj = source_ind['jmin'], source_ind['jmax']
sc_arrays = []
col_sc_arrays = []
if key_vec:
varid_2 = nc_2.variables[var_nam[shoggoth + 1]]
if not isslab and not key_vec:
# NOTE: 0 v 1 indexing may problemate
sc_arrays.append(varid[i-1:ii, j-1:jj, :sc_z_len, :1])
elif key_vec:
sc_arrays.append(varid[i-2:ii, j-1:jj, :sc_z_len, :1])
sc_arrays.append(varid_2[i-1:ii, j-2:jj, :sc_z_len, :1])
for x in 0,1:
# tidy up src array - replace missing val
for y in 'mv', 'fv':
if not np.isnan(sc_fields[y][x]):
ind_vec[y] = sc_arrays[x] == sc_fields[y][x]
sc_arrays[x][ind_vec[y]] = 0
else:
sc_arrays[x][np.isnan(scarr)] = 0
# Adjust for scaling or offsets
if not np.isnan(sc_fields['sf'][x]):
sc_arrays[x] *= sc_fields['sf'][x]
if not np.isnan(sc_fields['os'][x]):
sc_arrays[x] += sc_fields['os'][x]
# Colocate velocity points on T grid prior to rotation
axis = [1, None]
col = 0.5 * (sc_arrays[x][:-axis[0],:-axis[1],:] +
sc_arrays[x][axis[0]:,axis[1]:,:])
col[col == 0] = np.NaN
col_sc_arrays.append(col)
axis.reverse()
# This is a slab
else:
sc_arrays.append(varid[i-1:ii, j-1:jj, :1])
#query var names
if msk and first and shoggoth==0:
pass
# Open another magic file and do stuff
nc3 = Dataset(source_mask, 'r')
varid_3 = nc3.variables['tmaskutil']
msk_array = varid_3[i-1:ii, j-1:jj, :1]
if msk: #must be true for msk array ??...
sc_arrays[0][msk_array == 0] = np.NaN
# Finished reading Source data
#for depth_val in range(sc_z_len):
# tmp_arrays = []
# if not key_vec:
# tmp_arrays.append(sc_arrays[0][:,:depth_val]
def _fv_mv_to_zero(self, scarr, indvec, sc_fields, pos):
for x in 'mv', 'fv':
if not np.isnan(sc_fields[x][pos]):
ind_vec[x] = scarr == sc_fields[x][pos]
scarr[ind_vec[x]] = 0
else:
scarr[np.isnan(scarr)] = 0
return scarr, indvec
# Convert numeric date from source to dest
def convert_date(self, date):
val = self.S_cal.num2date(date)
return self.D_cal.date2num(val)
def cal_trans(self, source, dest, year, month):
vals = {'gregorian': [monthrange(year, month)[1], 31], 'noleap':
[365., 31],'360_day': [360., 30]}
if source not in vals.keys():
raise ValueError('Unknown calendar type: %s' %source)
sf = val[source][0] / val[dest][0]
return sf, vals[dest][1]
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment