def from_netCDF(cls, filename=None, dataset=None, grid_topology=None, units=None, time=None, ice_concentration=None, grid=None, grid_file=None, data_file=None, **kwargs): if filename is not None: data_file = filename grid_file = filename if grid is None: grid = PyGrid.from_netCDF(grid_file, grid_topology=grid_topology) if ice_concentration is None: ice_concentration = (IceConcentration.from_netCDF( filename=filename, dataset=dataset, data_file=data_file, grid_file=grid_file, time=time, grid=grid, **kwargs)) return cls(ice_concentration=ice_concentration, **kwargs)
def test_construction(self, sg_data, sg_topology): filename = sg_data[0] dataset = sg_data[1] grid_topology = sg_topology sg = Grid_S.from_netCDF(filename, dataset, grid_topology=grid_topology) assert sg.filename == filename sg2 = Grid_S.from_netCDF(filename) assert sg2.filename == filename sg3 = PyGrid.from_netCDF(filename, dataset, grid_topology=grid_topology) print sg3.shape assert sg == sg3 sg4 = PyGrid.from_netCDF(filename) print sg4.shape assert sg2 == sg4
def test_construction(self, ug_data, ug_topology): filename = ug_data[0] dataset = ug_data[1] grid_topology = ug_topology ug = Grid_U.from_netCDF(filename, dataset, grid_topology=grid_topology) # assert ug.filename == filename # assert isinstance(ug.node_lon, nc.Variable) # assert ug.node_lon.name == 'lonc' ug2 = Grid_U.from_netCDF(filename) assert ug2.filename == filename # assert isinstance(ug2.node_lon, nc.Variable) # assert ug2.node_lon.name == 'lon' ug3 = PyGrid.from_netCDF(filename, dataset, grid_topology=grid_topology) ug4 = PyGrid.from_netCDF(filename) print ug3.shape print ug4.shape assert ug == ug3 assert ug2 == ug4
def test_construction(self): data = sinusoid['u'][:] grid = PyGrid.from_netCDF(dataset=sinusoid) time = None u = Variable(name='u', units='m/s', data=data, grid=grid, time=time, data_file='staggered_sine_channel.nc', grid_file='staggered_sine_channel.nc') curr_file = os.path.join(s_data, 'staggered_sine_channel.nc') k = Variable.from_netCDF(filename=curr_file, varname='u', name='u') assert k.name == u.name assert k.units == 'm/s' # fixme: this was failing # assert k.time == u.time assert k.data[0, 0] == u.data[0, 0]
def gen_vortex_3D(filename=None): x, y = np.mgrid[-30:30:61j, -30:30:61j] y = np.ascontiguousarray(y.T) x = np.ascontiguousarray(x.T) x_size = 61 y_size = 61 g = Grid_S(node_lon=x, node_lat=y) g.build_celltree() lin_nodes = g._cell_trees['node'][1] lin_faces = np.array([ np.array([([lx, lx + x_size + 1, lx + 1 ], [lx, lx + x_size, lx + x_size + 1]) for lx in range(0, x_size - 1, 1)]) + ly * x_size for ly in range(0, y_size - 1) ]) lin_faces = lin_faces.reshape(-1, 3) # y += np.sin(x) / 1 # x += np.sin(x) / 5 t0 = datetime(2001, 1, 1, 0, 0) tarr = [t0 + timedelta(hours=i) for i in range(0, 11)] angs = -np.arctan2(y, x) mag = np.sqrt(x**2 + y**2) vx = np.cos(angs) * mag vy = np.sin(angs) * mag vx = vx[np.newaxis, :] * 20 vy = vy[np.newaxis, :] * 20 vw = -0.001 d_scale = [1, 0.5, 0, -0.5, -1] t_scale = np.linspace(0, 1, 11) tvx = np.array([vx * t for t in t_scale]).squeeze() tvy = np.array([vy * t for t in t_scale]).squeeze() dvx = np.array([vx * s for s in d_scale]).squeeze() dvy = np.array([vy * s for s in d_scale]).squeeze() tdvx = np.array([dvx * t for t in t_scale]).squeeze() tdvy = np.array([dvy * t for t in t_scale]).squeeze() lin_vx = vx.reshape(-1) lin_vy = vy.reshape(-1) lin_tvx = np.array([lin_vx * t for t in t_scale]) lin_tvy = np.array([lin_vy * t for t in t_scale]) lin_dvx = np.array([lin_vx * s for s in d_scale]) lin_dvy = np.array([lin_vy * s for s in d_scale]) lin_tdvx = np.array([lin_dvx * t for t in t_scale]) lin_tdvy = np.array([lin_dvy * t for t in t_scale]) ds = None if filename is not None: ds = nc4.Dataset(filename, 'w', diskless=True, persist=True) ds.createDimension('y', y.shape[0]) ds.createDimension('x', x.shape[1]) ds.createDimension('time', len(tarr)) ds.createDimension('depth', len(d_scale)) ds.createVariable('x', 'f8', dimensions=('x', 'y')) ds['x'][:] = x ds.createVariable('y', 'f8', dimensions=('x', 'y')) ds['y'][:] = y ds.createVariable('time', 'f8', dimensions=('time')) ds['time'][:] = nc4.date2num(tarr, 'hours since {0}'.format(t0)) ds['time'].setncattr('units', 'hours since {0}'.format(t0)) ds.createVariable('vx', 'f8', dimensions=('x', 'y')) ds.createVariable('vy', 'f8', dimensions=('x', 'y')) ds['vx'][:] = vx ds['vy'][:] = vy ds.createVariable('tvx', 'f8', dimensions=('time', 'x', 'y')) ds.createVariable('tvy', 'f8', dimensions=('time', 'x', 'y')) ds['tvx'][:] = tvx ds['tvy'][:] = tvy ds.createVariable('dvx', 'f8', dimensions=('depth', 'x', 'y')) ds.createVariable('dvy', 'f8', dimensions=('depth', 'x', 'y')) ds['dvx'][:] = dvx ds['dvy'][:] = dvy ds.createVariable('tdvx', 'f8', dimensions=('time', 'depth', 'x', 'y')) ds.createVariable('tdvy', 'f8', dimensions=('time', 'depth', 'x', 'y')) ds['tdvx'][:] = tdvx ds['tdvy'][:] = tdvy for v in ds.variables: if 'v' in v: ds[v].units = 'm/s' ds.createDimension('nv', lin_nodes.shape[0]) ds.createDimension('nele', lin_faces.shape[0]) ds.createDimension('two', 2) ds.createDimension('three', 3) ds.createVariable('nodes', 'f8', dimensions=('nv', 'two')) ds.createVariable('faces', 'f8', dimensions=('nele', 'three')) ds.createVariable('lin_vx', 'f8', dimensions=('nv')) ds.createVariable('lin_vy', 'f8', dimensions=('nv')) ds.createVariable('lin_tvx', 'f8', dimensions=('time', 'nv')) ds.createVariable('lin_tvy', 'f8', dimensions=('time', 'nv')) ds.createVariable('lin_dvx', 'f8', dimensions=('depth', 'nv')) ds.createVariable('lin_dvy', 'f8', dimensions=('depth', 'nv')) ds.createVariable('lin_tdvx', 'f8', dimensions=('time', 'depth', 'nv')) ds.createVariable('lin_tdvy', 'f8', dimensions=('time', 'depth', 'nv')) for k, v in { 'nodes': lin_nodes, 'faces': lin_faces, 'lin_vx': lin_vx, 'lin_vy': lin_vy, 'lin_tvx': lin_tvx, 'lin_tvy': lin_tvy, 'lin_dvx': lin_dvx, 'lin_dvy': lin_dvy, 'lin_tdvx': lin_tdvx, 'lin_tdvy': lin_tdvy }.items(): ds[k][:] = v if 'lin' in k: ds[k].units = 'm/s' PyGrid._get_grid_type(ds, grid_topology={ 'node_lon': 'x', 'node_lat': 'y' }) PyGrid._get_grid_type(ds) ds.setncattr('grid_type', 'sgrid') if ds is not None: # Need to test the dataset... sgt = {'node_lon': 'x', 'node_lat': 'y'} _sg = PyGrid.from_netCDF(dataset=ds, grid_topology=sgt, grid_type='sgrid') _sgc1 = GridCurrent.from_netCDF(dataset=ds, varnames=['vx', 'vy'], grid_topology=sgt) _sgc2 = GridCurrent.from_netCDF(dataset=ds, varnames=['tvx', 'tvy'], grid_topology=sgt) _sgc3 = GridCurrent.from_netCDF(dataset=ds, varnames=['dvx', 'dvy'], grid_topology=sgt) _sgc4 = GridCurrent.from_netCDF(dataset=ds, varnames=['tdvx', 'tdvy'], grid_topology=sgt) ugt = {'nodes': 'nodes', 'faces': 'faces'} # ug = PyGrid_U(nodes=ds['nodes'][:], faces=ds['faces'][:]) _ugc1 = GridCurrent.from_netCDF(dataset=ds, varnames=['lin_vx', 'lin_vy'], grid_topology=ugt) _ugc2 = GridCurrent.from_netCDF(dataset=ds, varnames=['lin_tvx', 'lin_tvy'], grid_topology=ugt) _ugc3 = GridCurrent.from_netCDF(dataset=ds, varnames=['lin_dvx', 'lin_dvy'], grid_topology=ugt) _ugc4 = GridCurrent.from_netCDF(dataset=ds, varnames=['lin_tdvx', 'lin_tdvy'], grid_topology=ugt) ds.close() return { 'sgrid': (x, y), 'sgrid_vel': (dvx, dvy), 'sgrid_depth_vel': (tdvx, tdvy), 'ugrid': (lin_nodes, lin_faces), 'ugrid_depth_vel': (lin_tdvx, lin_tdvy) }
def ug(ug_data, ug_topology): return PyGrid.from_netCDF(ug_data[0], ug_data[1], grid_topology=ug_topology)
def sg(sg_data, sg_topology): return PyGrid.from_netCDF(sg_data[0], sg_data[1], grid_topology=sg_topology)
def gen_vortex_3D(filename=None): x, y = np.mgrid[-30:30:61j, -30:30:61j] y = np.ascontiguousarray(y.T) x = np.ascontiguousarray(x.T) x_size = 61 y_size = 61 g = Grid_S(node_lon=x, node_lat=y) g.build_celltree() lin_nodes = g._cell_trees['node'][1] lin_faces = np.array([np.array([([lx, lx + x_size + 1, lx + 1], [lx, lx + x_size, lx + x_size + 1]) for lx in range(0, x_size - 1, 1)]) + ly * x_size for ly in range(0, y_size - 1)]) lin_faces = lin_faces.reshape(-1, 3) # y += np.sin(x) / 1 # x += np.sin(x) / 5 t0 = datetime(2001, 1, 1, 0, 0) tarr = [t0 + timedelta(hours=i) for i in range(0, 11)] angs = -np.arctan2(y, x) mag = np.sqrt(x ** 2 + y ** 2) vx = np.cos(angs) * mag vy = np.sin(angs) * mag vx = vx[np.newaxis, :] * 20 vy = vy[np.newaxis, :] * 20 vw = -0.001 d_scale = [1, 0.5, 0, -0.5, -1] t_scale = np.linspace(0, 1, 11) tvx = np.array([vx * t for t in t_scale]).squeeze() tvy = np.array([vy * t for t in t_scale]).squeeze() dvx = np.array([vx * s for s in d_scale]).squeeze() dvy = np.array([vy * s for s in d_scale]).squeeze() tdvx = np.array([dvx * t for t in t_scale]).squeeze() tdvy = np.array([dvy * t for t in t_scale]).squeeze() lin_vx = vx.reshape(-1) lin_vy = vy.reshape(-1) lin_tvx = np.array([lin_vx * t for t in t_scale]) lin_tvy = np.array([lin_vy * t for t in t_scale]) lin_dvx = np.array([lin_vx * s for s in d_scale]) lin_dvy = np.array([lin_vy * s for s in d_scale]) lin_tdvx = np.array([lin_dvx * t for t in t_scale]) lin_tdvy = np.array([lin_dvy * t for t in t_scale]) ds = None if filename is not None: ds = nc4.Dataset(filename, 'w', diskless=True, persist=True) ds.createDimension('y', y.shape[0]) ds.createDimension('x', x.shape[1]) ds.createDimension('time', len(tarr)) ds.createDimension('depth', len(d_scale)) ds.createVariable('x', 'f8', dimensions=('x', 'y')) ds['x'][:] = x ds.createVariable('y', 'f8', dimensions=('x', 'y')) ds['y'][:] = y ds.createVariable('time', 'f8', dimensions=('time')) ds['time'][:] = nc4.date2num(tarr, 'hours since {0}'.format(t0)) ds['time'].setncattr('units', 'hours since {0}'.format(t0)) ds.createVariable('vx', 'f8', dimensions=('x', 'y')) ds.createVariable('vy', 'f8', dimensions=('x', 'y')) ds['vx'][:] = vx ds['vy'][:] = vy ds.createVariable('tvx', 'f8', dimensions=('time', 'x', 'y')) ds.createVariable('tvy', 'f8', dimensions=('time', 'x', 'y')) ds['tvx'][:] = tvx ds['tvy'][:] = tvy ds.createVariable('dvx', 'f8', dimensions=('depth', 'x', 'y')) ds.createVariable('dvy', 'f8', dimensions=('depth', 'x', 'y')) ds['dvx'][:] = dvx ds['dvy'][:] = dvy ds.createVariable('tdvx', 'f8', dimensions=('time', 'depth', 'x', 'y')) ds.createVariable('tdvy', 'f8', dimensions=('time', 'depth', 'x', 'y')) ds['tdvx'][:] = tdvx ds['tdvy'][:] = tdvy for v in ds.variables: if 'v' in v: ds[v].units = 'm/s' ds.createDimension('nv', lin_nodes.shape[0]) ds.createDimension('nele', lin_faces.shape[0]) ds.createDimension('two', 2) ds.createDimension('three', 3) ds.createVariable('nodes', 'f8', dimensions=('nv', 'two')) ds.createVariable('faces', 'f8', dimensions=('nele', 'three')) ds.createVariable('lin_vx', 'f8', dimensions=('nv')) ds.createVariable('lin_vy', 'f8', dimensions=('nv')) ds.createVariable('lin_tvx', 'f8', dimensions=('time', 'nv')) ds.createVariable('lin_tvy', 'f8', dimensions=('time', 'nv')) ds.createVariable('lin_dvx', 'f8', dimensions=('depth', 'nv')) ds.createVariable('lin_dvy', 'f8', dimensions=('depth', 'nv')) ds.createVariable('lin_tdvx', 'f8', dimensions=('time', 'depth', 'nv')) ds.createVariable('lin_tdvy', 'f8', dimensions=('time', 'depth', 'nv')) for k, v in {'nodes': lin_nodes, 'faces': lin_faces, 'lin_vx': lin_vx, 'lin_vy': lin_vy, 'lin_tvx': lin_tvx, 'lin_tvy': lin_tvy, 'lin_dvx': lin_dvx, 'lin_dvy': lin_dvy, 'lin_tdvx': lin_tdvx, 'lin_tdvy': lin_tdvy }.items(): ds[k][:] = v if 'lin' in k: ds[k].units = 'm/s' PyGrid._get_grid_type(ds, grid_topology={'node_lon': 'x', 'node_lat': 'y'}) PyGrid._get_grid_type(ds) ds.setncattr('grid_type', 'sgrid') if ds is not None: # Need to test the dataset... sgt = {'node_lon': 'x', 'node_lat': 'y'} _sg = PyGrid.from_netCDF(dataset=ds, grid_topology=sgt, grid_type='sgrid') _sgc1 = GridCurrent.from_netCDF(dataset=ds, varnames=['vx', 'vy'], grid_topology=sgt) _sgc2 = GridCurrent.from_netCDF(dataset=ds, varnames=['tvx', 'tvy'], grid_topology=sgt) _sgc3 = GridCurrent.from_netCDF(dataset=ds, varnames=['dvx', 'dvy'], grid_topology=sgt) _sgc4 = GridCurrent.from_netCDF(dataset=ds, varnames=['tdvx', 'tdvy'], grid_topology=sgt) ugt = {'nodes': 'nodes', 'faces': 'faces'} # ug = PyGrid_U(nodes=ds['nodes'][:], faces=ds['faces'][:]) _ugc1 = GridCurrent.from_netCDF(dataset=ds, varnames=['lin_vx', 'lin_vy'], grid_topology=ugt) _ugc2 = GridCurrent.from_netCDF(dataset=ds, varnames=['lin_tvx', 'lin_tvy'], grid_topology=ugt) _ugc3 = GridCurrent.from_netCDF(dataset=ds, varnames=['lin_dvx', 'lin_dvy'], grid_topology=ugt) _ugc4 = GridCurrent.from_netCDF(dataset=ds, varnames=['lin_tdvx', 'lin_tdvy'], grid_topology=ugt) ds.close() return {'sgrid': (x, y), 'sgrid_vel': (dvx, dvy), 'sgrid_depth_vel': (tdvx, tdvy), 'ugrid': (lin_nodes, lin_faces), 'ugrid_depth_vel': (lin_tdvx, lin_tdvy)}