Commit 20de1f15 authored by thopri's avatar thopri
Browse files

fixed phase issue on FES tide boundary generation

parent cab2180f
...@@ -46,7 +46,7 @@ logging.basicConfig(filename='nrct.log', level=logging.INFO) ...@@ -46,7 +46,7 @@ logging.basicConfig(filename='nrct.log', level=logging.INFO)
# TODO: add TPXO read and subset functionality currently only uses FES as "truth" # TODO: add TPXO read and subset functionality currently only uses FES as "truth"
def main(bdy_file='inputs/namelist_cmems.bdy',amplitude_threshold = 0.25,phase_threshold=10.00,model_res=1/16,model='fes'): def main(bdy_file='inputs/namelist_cmems.bdy',amplitude_threshold = 0.25,phase_threshold=15.00,model_res=1/16,model='fes'):
logger.info('============================================') logger.info('============================================')
logger.info('Start Tide Test Logging: ' + time.asctime()) logger.info('Start Tide Test Logging: ' + time.asctime())
logger.info('============================================') logger.info('============================================')
......
...@@ -21,16 +21,16 @@ class HcExtract(object): ...@@ -21,16 +21,16 @@ class HcExtract(object):
tide_model = 'fes' tide_model = 'fes'
if tide_model == 'fes': # Define stuff to generalise Tide model if tide_model == 'fes': # Define stuff to generalise Tide model
hRe_name = 'amp_stack' hRe_name = 'hRe'
hIm_name = 'pha_stack' hIm_name = 'hIm'
lon_z_name = 'lon_z' lon_z_name = 'lon_z'
lat_z_name = 'lat_z' lat_z_name = 'lat_z'
URe_name = 'amp_stack' URe_name = 'URe'
UIm_name = 'pha_stack' UIm_name = 'UIm'
lon_u_name = 'lon_u' lon_u_name = 'lon_u'
lat_u_name = 'lat_u' lat_u_name = 'lat_u'
VRe_name = 'amp_stack' VRe_name = 'VRe'
VIm_name = 'pha_stack' VIm_name = 'VIm'
lon_v_name = 'lon_v' lon_v_name = 'lon_v'
lat_v_name = 'lat_v' lat_v_name = 'lat_v'
mz_name = 'mask_z' mz_name = 'mask_z'
...@@ -60,18 +60,18 @@ class HcExtract(object): ...@@ -60,18 +60,18 @@ class HcExtract(object):
self.mask_dataset[mz_name] = mask_z self.mask_dataset[mz_name] = mask_z
mask_u = np.ma.MaskedArray.filled(np.flipud(np.rot90(Dataset(settings['tide_fes']+constituents[0]+'_U.nc').variables['Ua'][:]))) mask_u = np.ma.MaskedArray.filled(np.flipud(np.rot90(Dataset(settings['tide_fes']+constituents[0]+'_U.nc').variables['Ua'][:])))
mask_u[mask_u != 18446744073709551616.00000] = 1 mask_z[mask_z != 18446744073709551616.00000] = 1
mask_u[mask_u == 18446744073709551616.00000] = 0 mask_u[mask_u == 18446744073709551616.00000] = 0
self.mask_dataset[mu_name] = mask_u self.mask_dataset[mu_name] = mask_u
mask_v = np.ma.MaskedArray.filled(np.flipud(np.rot90(Dataset(settings['tide_fes']+constituents[0]+'_V.nc').variables['Va'][:]))) mask_v = np.ma.MaskedArray.filled(np.flipud(np.rot90(Dataset(settings['tide_fes']+constituents[0]+'_V.nc').variables['Va'][:])))
mask_v[mask_v != 18446744073709551616.00000] = 1 mask_z[mask_z != 18446744073709551616.00000] = 1
mask_v[mask_v == 18446744073709551616.00000] = 0 mask_v[mask_v == 18446744073709551616.00000] = 0
self.mask_dataset[mv_name] = mask_v self.mask_dataset[mv_name] = mask_v
#read and convert the height_dataset file to complex and store in dicts #read and convert the height_dataset file to complex and store in dicts
amp_stack = [] hRe = []
pha_stack = [] hIm = []
lat_z = np.array(Dataset(settings['tide_fes'] + constituents[0] + '_Z.nc').variables['lat'][:]) lat_z = np.array(Dataset(settings['tide_fes'] + constituents[0] + '_Z.nc').variables['lat'][:])
lon_z = np.array(Dataset(settings['tide_fes'] + constituents[0] + '_Z.nc').variables['lon'][:]) lon_z = np.array(Dataset(settings['tide_fes'] + constituents[0] + '_Z.nc').variables['lon'][:])
for ncon in range(len(constituents)): for ncon in range(len(constituents)):
...@@ -82,17 +82,15 @@ class HcExtract(object): ...@@ -82,17 +82,15 @@ class HcExtract(object):
amp = amp/100.00 amp = amp/100.00
phase = np.ma.MaskedArray.filled(np.flipud(np.rot90(Dataset(settings['tide_fes']+constituents[ncon]+'_Z.nc').variables['phase'][:]))) phase = np.ma.MaskedArray.filled(np.flipud(np.rot90(Dataset(settings['tide_fes']+constituents[ncon]+'_Z.nc').variables['phase'][:])))
phase[phase == 18446744073709551616.00000] = 0 phase[phase == 18446744073709551616.00000] = 0
# convert from -180-180 to 0-360 hRe.append(amp*np.cos(phase*(np.pi/180)))
phase[phase < 0.0] = phase[phase < 0.0] + 360.0 hIm.append(-amp*np.sin(phase*(np.pi/180)))
amp_stack.append(amp) hRe = np.stack(hRe)
pha_stack.append(phase) hIm = np.stack(hIm)
amp_stack = np.stack(amp_stack) self.height_dataset = [lon_z,lat_z,hRe,hIm]
pha_stack = np.stack(pha_stack)
self.height_dataset = [lon_z,lat_z,amp_stack,pha_stack]
#read and convert the velocity_dataset files to complex #read and convert the velocity_dataset files to complex
amp_stack = [] URe = []
pha_stack = [] UIm = []
lat_u = np.array(Dataset(settings['tide_fes'] + constituents[0] + '_U.nc').variables['lat'][:]) lat_u = np.array(Dataset(settings['tide_fes'] + constituents[0] + '_U.nc').variables['lat'][:])
lon_u = np.array(Dataset(settings['tide_fes'] + constituents[0] + '_U.nc').variables['lon'][:]) lon_u = np.array(Dataset(settings['tide_fes'] + constituents[0] + '_U.nc').variables['lon'][:])
for ncon in range(len(constituents)): for ncon in range(len(constituents)):
...@@ -103,15 +101,14 @@ class HcExtract(object): ...@@ -103,15 +101,14 @@ class HcExtract(object):
amp = amp/100.00 amp = amp/100.00
phase = np.ma.MaskedArray.filled(np.flipud(np.rot90(Dataset(settings['tide_fes']+constituents[ncon]+'_U.nc').variables['Ug'][:]))) phase = np.ma.MaskedArray.filled(np.flipud(np.rot90(Dataset(settings['tide_fes']+constituents[ncon]+'_U.nc').variables['Ug'][:])))
phase[phase == 18446744073709551616.00000] = 0 phase[phase == 18446744073709551616.00000] = 0
phase[phase < 0.0] = phase[phase < 0.0] + 360.0 URe.append(amp*np.cos(phase*(np.pi/180)))
amp_stack.append(amp) UIm.append(-amp*np.sin(phase*(np.pi/180)))
pha_stack.append(phase) URe = np.stack(URe)
amp_stack = np.stack(amp_stack) UIm = np.stack(UIm)
pha_stack = np.stack(pha_stack) self.Uvelocity_dataset = [lon_u,lat_u,URe,UIm]
self.Uvelocity_dataset = [lon_u,lat_u,amp_stack,pha_stack]
VRe = []
amp_stack = [] VIm = []
pha_stack = []
lat_v = np.array(Dataset(settings['tide_fes'] + constituents[ncon] + '_V.nc').variables['lat'][:]) lat_v = np.array(Dataset(settings['tide_fes'] + constituents[ncon] + '_V.nc').variables['lat'][:])
lon_v = np.array(Dataset(settings['tide_fes'] + constituents[ncon] + '_V.nc').variables['lon'][:]) lon_v = np.array(Dataset(settings['tide_fes'] + constituents[ncon] + '_V.nc').variables['lon'][:])
for ncon in range(len(constituents)): for ncon in range(len(constituents)):
...@@ -122,12 +119,11 @@ class HcExtract(object): ...@@ -122,12 +119,11 @@ class HcExtract(object):
amp = amp/100.00 amp = amp/100.00
phase = np.ma.MaskedArray.filled(np.flipud(np.rot90(Dataset(settings['tide_fes']+constituents[ncon]+'_V.nc').variables['Vg'][:]))) phase = np.ma.MaskedArray.filled(np.flipud(np.rot90(Dataset(settings['tide_fes']+constituents[ncon]+'_V.nc').variables['Vg'][:])))
phase[phase == 18446744073709551616.00000] = 0 phase[phase == 18446744073709551616.00000] = 0
phase[phase < 0.0] = phase[phase < 0.0] + 360.0 VRe.append(amp*np.cos(phase*(np.pi/180)))
amp_stack.append(amp) VIm.append(-amp*np.sin(phase*(np.pi/180)))
pha_stack.append(phase) VRe = np.stack(VRe)
amp_stack = np.stack(amp_stack) VIm = np.stack(VIm)
pha_stack = np.stack(pha_stack) self.Vvelocity_dataset = [lon_v,lat_v,VRe,VIm]
self.Vvelocity_dataset = [lon_v,lat_v,amp_stack,pha_stack]
# open grid variables these are resampled TPXO parameters so may not work correctly. # open grid variables these are resampled TPXO parameters so may not work correctly.
self.grid = Dataset(settings['tide_fes']+'grid_fes.nc') self.grid = Dataset(settings['tide_fes']+'grid_fes.nc')
...@@ -209,10 +205,9 @@ class HcExtract(object): ...@@ -209,10 +205,9 @@ class HcExtract(object):
amp = np.zeros((len(nc_dataset[2]), lon.shape[0])) amp = np.zeros((len(nc_dataset[2]), lon.shape[0]))
gph = np.zeros((len(nc_dataset[2]), lon.shape[0])) gph = np.zeros((len(nc_dataset[2]), lon.shape[0]))
data_amp = np.array(np.ravel(nc_dataset[2])) data = np.array(np.ravel(nc_dataset[2]), dtype=complex)
data_pha = np.array(np.ravel(nc_dataset[3])) data.imag = np.array(np.ravel(nc_dataset[3]))
data_amp = data_amp.reshape(nc_dataset[2].shape) data = data.reshape(nc_dataset[2].shape)
data_pha = data_pha.reshape(nc_dataset[2].shape)
#data = data.reshape(1,nc_dataset['M2'][real_var_name].shape) #data = data.reshape(1,nc_dataset['M2'][real_var_name].shape)
# data[data==0] = np.NaN # data[data==0] = np.NaN
...@@ -243,26 +238,29 @@ class HcExtract(object): ...@@ -243,26 +238,29 @@ class HcExtract(object):
#interpolate the mask values #interpolate the mask values
maskedpoints = interpolate.interpn((x_values, y_values), mask, lonlat) maskedpoints = interpolate.interpn((x_values, y_values), mask, lonlat)
data_temp_amp = np.zeros((data_amp.shape[0], lon.shape[0], 1, )) data_temp = np.zeros((data.shape[0], lon.shape[0], 2, ))
data_temp_pha = np.zeros((data_pha.shape[0], lon.shape[0], 1,)) for cons_index in range(data.shape[0]):
for cons_index in range(data_amp.shape[0]):
#interpolate real values #interpolate real values
data_temp_amp[cons_index, :, 0] = interpolate_data(x_values, y_values, data_temp[cons_index, :, 0] = interpolate_data(x_values, y_values,
data_amp[cons_index, :, :], data[cons_index, :, :].real,
maskedpoints, lonlat) maskedpoints, lonlat)
#interpolate imag values #interpolate imag values
data_temp_pha[cons_index, :, 0] = interpolate_data(x_values, y_values, data_temp[cons_index, :, 1] = interpolate_data(x_values, y_values,
data_pha[cons_index, :, :], data[cons_index, :, :].imag,
maskedpoints, lonlat) maskedpoints, lonlat)
#for velocity_dataset values #for velocity_dataset values
if height_data is not None: if height_data is not None:
data_temp_amp[cons_index, :, 0] = data_temp_amp[cons_index, :, 0]/height_data*100 data_temp[cons_index, :, 0] = data_temp[cons_index, :, 0]/height_data*100
data_temp_pha[cons_index, :, 0] = data_temp_pha[cons_index, :, 0]/height_data*100 data_temp[cons_index, :, 1] = data_temp[cons_index, :, 1]/height_data*100
amp[cons_index, :] = data_temp_amp[cons_index, :, 0] zcomplex = np.array(data_temp[cons_index, :, 0], dtype=complex)
gph[cons_index, :] = data_temp_pha[cons_index, :, 0] zcomplex.imag = data_temp[cons_index, :, 1]
amp[cons_index, :] = np.absolute(zcomplex)
gph[cons_index, :] = np.arctan2(-1*zcomplex.imag, zcomplex.real)
gph = gph*180.0/np.pi
gph[gph < 0] = gph[gph < 0]+360.0
return amp, gph return amp, gph
def interpolate_data(lon, lat, data, mask, lonlat): def interpolate_data(lon, lat, data, mask, lonlat):
......
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