diff --git a/unit_tests/coord_gen.py b/unit_tests/coord_gen.py new file mode 100644 index 0000000000000000000000000000000000000000..2408da9baa522d63fdb982d346f7be69081820b9 --- /dev/null +++ b/unit_tests/coord_gen.py @@ -0,0 +1,377 @@ +# -*- coding: utf-8 -*- +""" +Created on Wed Mar 11 11:16:57 2020 + +example grid set up + +@author: jdha +""" + +import numpy as np +from netCDF4 import Dataset + +def set_hgrid(dx, dy, jpi, jpj, zoffx, zoffy): + # Set grid positions [km] + latt = np.zeros((jpi, jpj)) + lont = np.zeros((jpi, jpj)) + lonu = np.zeros((jpi, jpj)) + latu = np.zeros((jpi, jpj)) + lonv = np.zeros((jpi, jpj)) + latv = np.zeros((jpi, jpj)) + lonf = np.zeros((jpi, jpj)) + latf = np.zeros((jpi, jpj)) + + for i in range(0, jpi): + lont[i, :] = zoffx * dx * 1.e-3 + dx * 1.e-3 * np.float(i) + lonu[i, :] = zoffx * dx * 1.e-3 + dx * 1.e-3 * (np.float(i) + 0.5) + + for j in range(0, jpj): + latt[:, j] = zoffy * dy * 1.e-3 + dy * 1.e-3 * float(j) + latv[:, j] = zoffy * dy * 1.e-3 + dy * 1.e-3 * (float(j) + 0.5) + + lonv = lont + lonf = lonu + latu = latt + latf = latv + + e1t = np.ones((jpi, jpj)) * dx + e2t = np.ones((jpi, jpj)) * dy + e1u = np.ones((jpi, jpj)) * dx + e2u = np.ones((jpi, jpj)) * dy + e1v = np.ones((jpi, jpj)) * dx + e2v = np.ones((jpi, jpj)) * dy + e1f = np.ones((jpi, jpj)) * dx + e2f = np.ones((jpi, jpj)) * dy + + # Set bathymetry [m]: + batt = 500. + 0.5 * 1500. * (1.0 + np.tanh((lont - 40.) / 7.)) + + # Set surface mask: + ktop = np.zeros((jpi, jpj)) + #ktop[1:jpi - 1, nghost + 1:jpj - nghost - 1] = 1 + #batt = np.where((ktop == 0.), 0., batt) + + # Set coriolis parameter: + ff_t = np.zeros((jpi, jpj)) + ff_f = np.zeros((jpi, jpj)) + + grid_h = {'lont':lont, 'latt':latt, 'lonu':lonu, 'latu':latu, 'lonv':lonv, 'latv':latv, 'lonf':lonf, 'latf':latf, \ + 'e1t':e1t, 'e2t':e2t, 'e1u':e1u, 'e2u':e2u, 'e1v':e1v, 'e2v':e2v, 'e1f':e1f, 'e2f':e2f, 'batt':batt, \ + 'ktop':ktop, 'ff_f':ff_f, 'ff_t':ff_t,'jpi':jpi,'jpj':jpj,'dy':dy,'dx':dx} + + return grid_h + +def set_zgrid(grid_h,jpk,max_dep,min_dep,z_dim): + + jpi = grid_h['jpi'] + jpj = grid_h['jpj'] + + dept_1d = np.linspace(min_dep,max_dep,jpk) + e3t_1d = np.linspace(1.0,z_dim,jpk) + e3w_1d = np.linspace(1.0,z_dim,jpk) + + e3t = np.zeros((jpi, jpj, len(e3t_1d))) + e3u = np.zeros((jpi, jpj, len(e3t_1d))) + e3v = np.zeros((jpi, jpj, len(e3t_1d))) + e3w = np.zeros((jpi, jpj, len(e3w_1d))) + e3f = np.zeros((jpi, jpj, len(e3t_1d))) + e3uw = np.zeros((jpi, jpj, len(e3t_1d))) + e3vw = np.zeros((jpi, jpj, len(e3t_1d))) + + e3t[:] = e3t_1d + e3u[:] = e3t_1d + e3v[:] = e3t_1d + e3w[:] = e3w_1d + e3f[:] = e3t_1d + e3uw[:] = e3t_1d + e3vw[:] = e3t_1d + + grid_z = {'dept_1d':dept_1d,'e3t_1d':e3t_1d,'e3w_1d':e3w_1d,'e3t':e3t,'e3u':e3u,'e3v':e3v,'e3w':e3w,'e3f':e3f, \ + 'e3uw':e3uw,'e3vw':e3vw} + + return grid_z + +def write_coord_H(fileout, grid_h): + ''' + Writes out a NEMO formatted coordinates file. + + Args: + fileout (string): filename + lon[t/u/v/f](np.ndarray): longitude array at [t/u/v/f]-points (2D) + lat[t/u/v/f](np.ndarray): latitude array at [t/u/v/f]-points (2D) + e1[t/u/v/f] (np.ndarray): zonal scale factors at [t/u/v/f]-points + e2[t/u/v/f] (np.ndarray): meridional scale factors at [t/u/v/f]-points + + Returns: + ''' + + # Open pointer to netcdf file + dataset = Dataset(fileout, 'w', format='NETCDF4_CLASSIC') + + # Get input size and create appropriate dimensions + # TODO: add some sort of error handling + nx, ny = np.shape(grid_h['lont']) + dataset.createDimension('x', nx) + dataset.createDimension('y', ny) + + # Create Variables + nav_lon = dataset.createVariable('nav_lon', np.float32, ('y', 'x')) + nav_lat = dataset.createVariable('nav_lat', np.float32, ('y', 'x')) + + glamt = dataset.createVariable('glamt', np.float64, ('y', 'x')) + glamu = dataset.createVariable('glamu', np.float64, ('y', 'x')) + glamv = dataset.createVariable('glamv', np.float64, ('y', 'x')) + glamf = dataset.createVariable('glamf', np.float64, ('y', 'x')) + gphit = dataset.createVariable('gphit', np.float64, ('y', 'x')) + gphiu = dataset.createVariable('gphiu', np.float64, ('y', 'x')) + gphiv = dataset.createVariable('gphiv', np.float64, ('y', 'x')) + gphif = dataset.createVariable('gphif', np.float64, ('y', 'x')) + + ge1t = dataset.createVariable('e1t', np.float64, ('y', 'x')) + ge1u = dataset.createVariable('e1u', np.float64, ('y', 'x')) + ge1v = dataset.createVariable('e1v', np.float64, ('y', 'x')) + ge1f = dataset.createVariable('e1f', np.float64, ('y', 'x')) + ge2t = dataset.createVariable('e2t', np.float64, ('y', 'x')) + ge2u = dataset.createVariable('e2u', np.float64, ('y', 'x')) + ge2v = dataset.createVariable('e2v', np.float64, ('y', 'x')) + ge2f = dataset.createVariable('e2f', np.float64, ('y', 'x')) + + nav_lon.units, nav_lon.long_name = 'km', 'X' + nav_lat.units, nav_lat.long_name = 'km', 'Y' + + # Populate file with input data + # TODO: do we need to transpose? + nav_lon[:, :] = grid_h['lont'].T + nav_lat[:, :] = grid_h['latt'].T + + glamt[:, :] = grid_h['lont'].T + glamu[:, :] = grid_h['lonu'].T + glamv[:, :] = grid_h['lonv'].T + glamf[:, :] = grid_h['lonf'].T + gphit[:, :] = grid_h['latt'].T + gphiu[:, :] = grid_h['latu'].T + gphiv[:, :] = grid_h['latv'].T + gphif[:, :] = grid_h['latf'].T + + ge1t[:, :] = grid_h['e1t'].T + ge1u[:, :] = grid_h['e1u'].T + ge1v[:, :] = grid_h['e1v'].T + ge1f[:, :] = grid_h['e1f'].T + ge2t[:, :] = grid_h['e2t'].T + ge2u[:, :] = grid_h['e2u'].T + ge2v[:, :] = grid_h['e2v'].T + ge2f[:, :] = grid_h['e2f'].T + + # Close off pointer + dataset.close() + + return 0 + +def write_coord_Z(fileout, grid_h,grid_z): + ''' + Writes out a NEMO formatted coordinates file. + + Args: + + Returns: + ''' + + # Open pointer to netcdf file + dataset = Dataset(fileout, 'w', format='NETCDF4_CLASSIC') + + # Get input size and create appropriate dimensions + # TODO: add some sort of error handling + nx, ny, nz = np.shape(grid_z['e3t']) + dataset.createDimension('x', nx) + dataset.createDimension('y', ny) + dataset.createDimension('z', nz) + + + # Create Variables + nav_lon = dataset.createVariable('nav_lon', np.float32, ('y', 'x')) + nav_lat = dataset.createVariable('nav_lat', np.float32, ('y', 'x')) + nav_lev = dataset.createVariable('nav_lev', np.float32, 'z') + + ge3t1d = dataset.createVariable('e3t_1d', np.float64, 'z') + ge3w1d = dataset.createVariable('e3w_1d', np.float64, 'z') + gbat = dataset.createVariable('mbathy', np.float64, ('y', 'x')) + ge3t = dataset.createVariable('e3t', np.float64, ('z','y', 'x')) + ge3u = dataset.createVariable('e3u', np.float64, ('z','y', 'x')) + ge3v = dataset.createVariable('e3v', np.float64, ('z','y', 'x')) + ge3f = dataset.createVariable('e3f', np.float64, ('z','y', 'x')) + ge3uw = dataset.createVariable('e3uw', np.float64, ('z', 'y', 'x')) + ge3vw = dataset.createVariable('e3vw', np.float64, ('z', 'y', 'x')) + + nav_lon.units, nav_lon.long_name = 'km', 'X' + nav_lat.units, nav_lat.long_name = 'km', 'Y' + nav_lev.units, nav_lev.long_name = 'm', 'Z' + + # Populate file with input data + # TODO: do we need to transpose? + nav_lon[:, :] = grid_h['lont'].T + nav_lat[:, :] = grid_h['latt'].T + nav_lev[:] = grid_z['dept_1d'] + + ge3t[:, :, :] = grid_z['e3t'].T + ge3u[:, :, :] = grid_z['e3u'].T + ge3v[:, :, :] = grid_z['e3v'].T + ge3f[:, :, :] = grid_z['e3f'].T + ge3uw[:, :, :] = grid_z['e3uw'].T + ge3vw[:, :, :] = grid_z['e3vw'].T + + ge3t1d[:] = grid_z['e3t_1d'] + ge3w1d[:] = grid_z['e3w_1d'] + gbat[:,:] = grid_h['batt'].T + + + # Close off pointer + dataset.close() + + return 0 + +def write_domcfg(fileout, ln_zco, ln_zps, ln_sco, ln_isfcav, jperio, bat, + lont, latt, lonu, latu, lonv, latv, lonf, latf, + e1t, e2t, e1u, e2u, e1v, e2v, e1f, e2f, ff_f, ff_t, + dept_1d, e3t_1d, e3w_1d, e3t, e3u, e3v, e3f, e3w, e3uw, e3vw, + ktop, kbot): + ''' + Writes out a NEMO formatted domcfg file. + + Args: + fileout (string): filename + ln_zco (logical): vertical coordinate flag [z-level] + ln_zps (logical): vertical coordinate flag [z-partial-step] + ln_sco (logical): vertical coordinate flag [sigma] + ln_isfcav (logical): ice cavity flag + jperio (int): domain type + bat (np.ndarray): bathymetry array at t-points (2D) + lon[t/u/v/f](np.ndarray): longitude array at [t/u/v/f]-points (2D) + lat[t/u/v/f](np.ndarray): latitude array at [t/u/v/f]-points (2D) + e1[t/u/v/f] (np.ndarray): zonal scale factors at [t/u/v/f]-points + e2[t/u/v/f] (np.ndarray): meridional scale factors at [t/u/v/f]-points + ff_[f/t] (np.ndarray): coriolis parameter at [t/f]-points + dept_1d (np.ndarray): 1D depth levels at t-points + e3[t/w]_1d (np.ndarray): 1D vertical scale factors at [t/w]-points + e3[t/u/v/f] (np.ndarray): vertcal scale factors at [t/u/v/f]-points + e3[w/uw/vw] (np.ndarray): vertcal scale factors at [w/uw/vw]-points + ktop (np.ndarray): upper most wet point + kbot (np.ndarray): lower most wet point + + Returns: + ''' + + # Open pointer to netcdf file + dataset = Dataset(fileout, 'w', format='NETCDF4_CLASSIC') + + # Get input size and create appropriate dimensions + # TODO: add some sort of error handling + nx, ny, nz = np.shape(e3t) + dataset.createDimension('x', nx) + dataset.createDimension('y', ny) + dataset.createDimension('z', nz) + + # create Variables + nav_lon = dataset.createVariable('nav_lon', np.float32, ('y', 'x')) + nav_lat = dataset.createVariable('nav_lat', np.float32, ('y', 'x')) + nav_lev = dataset.createVariable('nav_lev', np.float32, 'z') + + giglo = dataset.createVariable('jpiglo', "i4") + gjglo = dataset.createVariable('jpjglo', "i4") + gkglo = dataset.createVariable('jpkglo', "i4") + + gperio = dataset.createVariable('jperio', "i4") + + gzco = dataset.createVariable('ln_zco', "i4") + gzps = dataset.createVariable('ln_zps', "i4") + gsco = dataset.createVariable('ln_sco', "i4") + gcav = dataset.createVariable('ln_isfcav', "i4") + + ge3t1d = dataset.createVariable('e3t_1d', np.float64, 'z') + ge3w1d = dataset.createVariable('e3w_1d', np.float64, 'z') + gitop = dataset.createVariable('top_level', "i4", ('y', 'x')) + gibot = dataset.createVariable('bottom_level', "i4", ('y', 'x')) + gbat = dataset.createVariable('Bathymetry', np.float64, ('y', 'x')) + glamt = dataset.createVariable('glamt', np.float64, ('y', 'x')) + glamu = dataset.createVariable('glamu', np.float64, ('y', 'x')) + glamv = dataset.createVariable('glamv', np.float64, ('y', 'x')) + glamf = dataset.createVariable('glamf', np.float64, ('y', 'x')) + gphit = dataset.createVariable('gphit', np.float64, ('y', 'x')) + gphiu = dataset.createVariable('gphiu', np.float64, ('y', 'x')) + gphiv = dataset.createVariable('gphiv', np.float64, ('y', 'x')) + gphif = dataset.createVariable('gphif', np.float64, ('y', 'x')) + ge1t = dataset.createVariable('e1t', np.float64, ('y', 'x')) + ge1u = dataset.createVariable('e1u', np.float64, ('y', 'x')) + ge1v = dataset.createVariable('e1v', np.float64, ('y', 'x')) + ge1f = dataset.createVariable('e1f', np.float64, ('y', 'x')) + ge2t = dataset.createVariable('e2t', np.float64, ('y', 'x')) + ge2u = dataset.createVariable('e2u', np.float64, ('y', 'x')) + ge2v = dataset.createVariable('e2v', np.float64, ('y', 'x')) + ge2f = dataset.createVariable('e2f', np.float64, ('y', 'x')) + gfff = dataset.createVariable('ff_f', np.float64, ('y', 'x')) + gfft = dataset.createVariable('ff_t', np.float64, ('y', 'x')) + ge3t = dataset.createVariable('e3t_0', np.float64, ('z', 'y', 'x')) + ge3w = dataset.createVariable('e3w_0', np.float64, ('z', 'y', 'x')) + ge3u = dataset.createVariable('e3u_0', np.float64, ('z', 'y', 'x')) + ge3v = dataset.createVariable('e3v_0', np.float64, ('z', 'y', 'x')) + ge3f = dataset.createVariable('e3f_0', np.float64, ('z', 'y', 'x')) + ge3uw = dataset.createVariable('e3uw_0', np.float64, ('z', 'y', 'x')) + ge3vw = dataset.createVariable('e3vw_0', np.float64, ('z', 'y', 'x')) + + nav_lon.units, nav_lon.long_name = 'km', 'X' + nav_lat.units, nav_lat.long_name = 'km', 'Y' + + # Populate file with input data + giglo[:] = nx + gjglo[:] = ny + gkglo[:] = nz + + gzco[:] = ln_zco + gzps[:] = ln_zps + gsco[:] = ln_sco + gcav[:] = ln_isfcav + + gperio[:] = jperio + + # TODO: do we need to transpose? + nav_lon[:, :] = lont.T + nav_lat[:, :] = latt.T + nav_lev[:] = dept_1d + + ge3t1d[:] = e3t_1d + ge3w1d[:] = e3w_1d + + gitop[:, :] = ktop.T + gibot[:, :] = kbot.T + + gbat[:, :] = bat.T + + glamt[:, :] = lont.T + glamu[:, :] = lonu.T + glamv[:, :] = lonv.T + glamf[:, :] = lonf.T + gphit[:, :] = latt.T + gphiu[:, :] = latu.T + gphiv[:, :] = latv.T + gphif[:, :] = latf.T + + ge1t[:, :] = e1t.T + ge1u[:, :] = e1u.T + ge1v[:, :] = e1v.T + ge1f[:, :] = e1f.T + ge2t[:, :] = e2t.T + ge2u[:, :] = e2u.T + ge2v[:, :] = e2v.T + ge2f[:, :] = e2f.T + gfff[:, :] = ff_f.T + gfft[:, :] = ff_t.T + + ge3t[:, :, :] = e3t.T + ge3w[:, :, :] = e3w.T + ge3u[:, :, :] = e3u.T + ge3v[:, :, :] = e3v.T + ge3f[:, :, :] = e3f.T + ge3uw[:, :, :] = e3uw.T + ge3vw[:, :, :] = e3vw.T + + # Close off pointer + dataset.close() diff --git a/unit_tests/rotate_pts.py b/unit_tests/rotate_pts.py index 3541b65cc9565b9786578330d4e66d9cdaad7b09..24882e71eddb08893e64ffeee7a90330c705e13e 100644 --- a/unit_tests/rotate_pts.py +++ b/unit_tests/rotate_pts.py @@ -6,6 +6,7 @@ occurs, the results are then plotted in a figure showing original (blue points) The source coordinate grid is also plotted (green). """ + from math import cos,sin,radians import numpy as np import xarray as xr @@ -13,6 +14,8 @@ import matplotlib.pyplot as plt import cartopy import cartopy.crs as ccrs +import unit_tests.coord_gen as cg + # TODO: add in auto max and min lat and lon # TODO: remove hard coded file names and directories. @@ -40,37 +43,37 @@ def rotate_around_point(lat_in,lon_in, radians , origin=(0, 0)): def plot_grids(lat_in,lon_in,new_lat,new_lon,src_lat,src_lon): # define lat and lon extents (define in future using input values?) - maxlat = 72 - minlat = 32 - maxlon = 18 - minlon = -28 + #maxlat = 72 + #minlat = 32 + #maxlon = 18 + #minlon = -28 plt.figure(figsize=[18, 8]) # a new figure window - ax = plt.subplot(121, projection=ccrs.PlateCarree()) # specify (nrows, ncols, axnum) - ax.set_extent([minlon,maxlon,minlat,maxlat],crs=ccrs.PlateCarree()) #set extent - ax.set_title('Original Grid', fontsize=20,y=1.05) #set title - ax.add_feature(cartopy.feature.LAND, zorder=0) # add land polygon - ax.add_feature(cartopy.feature.COASTLINE, zorder=10) # add coastline polyline - gl = ax.gridlines(crs=ccrs.PlateCarree(), linewidth=2, color='black', alpha=0.5, linestyle='--', draw_labels=True) + ax = plt.subplot(121)#, projection=ccrs.PlateCarree()) # specify (nrows, ncols, axnum) + #ax.set_extent([minlon,maxlon,minlat,maxlat],crs=ccrs.PlateCarree()) #set extent + #ax.set_title('Original Grid', fontsize=20,y=1.05) #set title + #ax.add_feature(cartopy.feature.LAND, zorder=0) # add land polygon + #ax.add_feature(cartopy.feature.COASTLINE, zorder=10) # add coastline polyline + #gl = ax.gridlines(crs=ccrs.PlateCarree(), linewidth=2, color='black', alpha=0.5, linestyle='--', draw_labels=True) - ax1 = plt.subplot(122, projection=ccrs.PlateCarree()) # specify (nrows, ncols, axnum) - ax1.set_extent([minlon,maxlon,minlat,maxlat],crs=ccrs.PlateCarree()) #set extent - ax1.set_title('Rotated Grid', fontsize=20,y=1.05) #set title - ax1.add_feature(cartopy.feature.LAND, zorder=0) # add land polygon - ax1.add_feature(cartopy.feature.COASTLINE, zorder=10) # add coastline polyline - gl1 = ax1.gridlines(crs=ccrs.PlateCarree(), linewidth=2, color='black', alpha=0.5, linestyle='--', draw_labels=True) + ax1 = plt.subplot(122)#, projection=ccrs.PlateCarree()) # specify (nrows, ncols, axnum) + #ax1.set_extent([minlon,maxlon,minlat,maxlat],crs=ccrs.PlateCarree()) #set extent + #ax1.set_title('Rotated Grid', fontsize=20,y=1.05) #set title + #ax1.add_feature(cartopy.feature.LAND, zorder=0) # add land polygon + #ax1.add_feature(cartopy.feature.COASTLINE, zorder=10) # add coastline polyline + #gl1 = ax1.gridlines(crs=ccrs.PlateCarree(), linewidth=2, color='black', alpha=0.5, linestyle='--', draw_labels=True) # tile 1D lat and lon to 2D arrays for plotting (src lat and lon only) - src_lon = np.tile(src_lon, (np.shape(src_lat)[0], 1)) - src_lat = np.tile(src_lat, (np.shape(src_lon)[1], 1)) - src_lat = np.rot90(src_lat) + #src_lon = np.tile(src_lon, (np.shape(src_lat)[0], 1)) + #src_lat = np.tile(src_lat, (np.shape(src_lon)[1], 1)) + #src_lat = np.rot90(src_lat) # plot lat and lon for all grids - ax.plot(lon_in, lat_in, color='blue', marker='.') - ax.plot(src_lon,src_lat, color='green', marker='.') - ax1.plot(new_lon,new_lat, color='red', marker='.') - ax1.plot(src_lon,src_lat, color='green',marker='.') + ax.plot(lon_in, lat_in, color='blue', marker='.', linestyle="") + ax.plot(src_lon,src_lat, color='green', marker='o', linestyle="") + ax1.plot(new_lon,new_lat, color='red', marker='.', linestyle="") + ax1.plot(src_lon,src_lat, color='green',marker='o',linestyle="") # tweak margins of subplots as tight layout doesn't work plt.subplots_adjust(left=0.01, right=1, top=0.9, bottom=0.05,wspace=0.01) @@ -78,24 +81,62 @@ def plot_grids(lat_in,lon_in,new_lat,new_lon,src_lat,src_lon): def _main(): - #open source (parent) and destination (child) grids - ds = xr.open_dataset('unit_tests/test_data/dst_hgr_zps.nc') - src = xr.open_dataset('unit_tests/test_data/src_coordinates.nc') + #Source Coords + dx = 2000 # units in km + dy = 2000 # units in Km + jpi = 10 + jpj = 10 + zoffx = 0 + zoffy = 0 + jpk = 10 + max_dep = 100 + min_dep = 10 + z_end_dim = 10.0 + h_fname = 'unit_tests/test_data/test_src__hgr_zps.nc' + z_fname = 'unit_tests/test_data/test_src_zgr_zps.nc' + grid_h1 = cg.set_hgrid(dx,dy,jpi,jpj,zoffx,zoffy) + grid_z1 = cg.set_zgrid(grid_h1,jpk,max_dep,min_dep,z_end_dim) + write_coord_H = cg.write_coord_H(h_fname,grid_h1) + write_coord_Z = cg.write_coord_Z(z_fname,grid_h1,grid_z1) + if write_coord_H + write_coord_Z == 0: + print("Success!") + + #Dst Coords + dx = 100 # units in km + dy = 100 # units in Km + jpi = 90 + jpj = 90 + zoffx = 0 + zoffy = 0 + jpk = 10 + max_dep = 100 + min_dep = 10 + z_end_dim = 10.0 + h_fname = 'unit_tests/test_data/test_dst_hgr_zps.nc' + z_fname = 'unit_tests/test_data/test_dst_zgr_zps.nc' + grid_h2 = cg.set_hgrid(dx,dy,jpi,jpj,zoffx,zoffy) + grid_z2 = cg.set_zgrid(grid_h2,jpk,max_dep,min_dep,z_end_dim) + write_coord_H = cg.write_coord_H(h_fname,grid_h2) + write_coord_Z = cg.write_coord_Z(z_fname,grid_h2,grid_z2) + if write_coord_H + write_coord_Z == 0: + print("Success!") + # set rotation and origin point rot = 45 theta = radians(rot) - origin = (54, -6) - # generate new lat and lon - new_lat,new_lon = rotate_around_point(ds.nav_lat.values[:],ds.nav_lon.values[:],theta,origin) + origin = (zoffx,zoffy) + + + new_lat,new_lon = rotate_around_point(grid_h2['latt'],grid_h2['lont'],theta,origin) # plot orginal, rotatated and source lat and lon - plot_grids(ds.nav_lat.values[:],ds.nav_lon.values[:],new_lat,new_lon,src.latitude.values[:],src.longitude.values[:]) + plot_grids(grid_h2['latt'],grid_h2['lont'],new_lat,new_lon,grid_h1['latt'],grid_h1['lont']) # save new lat lon to dataset - ds.nav_lat.values[:], ds.nav_lon.values[:] = new_lat,new_lon + #ds.nav_lat.values[:], ds.nav_lon.values[:] = new_lat,new_lon # save dataset to netcdf - ds.to_netcdf('unit_tests/test_data/rot_'+str(rot)+'_dst_hgr_zps.nc') + #ds.to_netcdf('unit_tests/test_data/rot_'+str(rot)+'_dst_hgr_zps.nc') # close data files - ds.close() - src.close() + #ds.close() + #src.close() if __name__ == '__main__': _main() \ No newline at end of file