def _create_nc_gr3(self, ncfile, var): data = cdms2.open(ncfile) lon = self.hgrid.longitude lat = self.hgrid.latitude src = fill2d(data[var][:], method='carg') time0 = [ t.torelative('days since 1-1-1').value for t in data['time'].asRelativeTime() ] tin = create_time(np.ones(len(lon)) * date2num(self.t0) + 1, units='days since 1-1-1') tb = grid2xy(src, xo=lon, yo=lat, method='linear', to=tin) if np.any(tb.mask == True): bad = (tb.mask == True).nonzero()[0] tin_bad = create_time(np.ones(len(bad)) * date2num(self.t0) + 1, units='days since 1-1-1') tb[bad] = grid2xy(src, xo=np.array(lon)[bad].tolist(), yo=np.array(lat)[bad].tolist(), method='nearest', to=tin_bad) self._create_constante_gr3(tb)
def create_mv2_gridder_xyzt(nx=8, ny=7, nz=6, nt=5, xmin=-6., xmax=-3, ymin=46, ymax=48, zmin=-200, zmax=0, tmin='2016', tmax='2016-02', tunits='days since 2016-01-01', rotate=0): """Create a MV2 array on a grid Return ------ MV2.array """ # Axes shape = () axes = [] if nt != 0: time = create_time(lindates(tmin, tmax, nt), tunits) axes.append(time) shape += nt, if nz != 0: dep = create_dep(N.linspace(zmin, zmax, nz)) axes.append(dep) shape += nz, if ny != 0: lat = create_lat(N.linspace(ymin, ymax, ny)) axes.append(lat) shape += ny, if nx != 0: lon = create_lon(N.linspace(xmin, xmax, nx)) axes.append(lon) shape += nx, # Array data = MV2.array(N.arange(N.multiply.reduce(shape)).reshape(shape), copy=False, axes=axes, id='temp', dtype='d') # Rotate grid if rotate: grid = data.getGrid() if grid is not None: grid = rotate_grid(grid, rotate) set_grid(data, grid) return data
def create_mv2_scattered_xyzt(np=10, nz=6, nt=5, xmin=-6., xmax=-3, ymin=46, ymax=48, zmin=-200, zmax=0, tmin='2016', tmax='2016-02', tunits='days since 2016-01-01'): """Create a VM2 array of scattered data Return ------ array: longitudes array: latitude MV2.array: data """ # Axes shape = () axes = [] if nt != 0: time = create_time(lindates(tmin, tmax, nt), tunits) shape += nt, axes.append(time) if nz != 0: dep = create_dep(N.linspace(zmin, zmax, nz)) axes.append(dep) shape += nz, shape += np, axes.append(create_axis((np, ))) # Array data = MV2.array(N.arange(N.multiply.reduce(shape)).reshape(shape), copy=False, axes=axes, id='temp', dtype='d') # Positiions lons = N.linspace(xmin, xmax, np) lats = N.linspace(ymin, ymax, np) return lons, lats, data
from vacumm.misc.grid._interp_ import cellerr1d from scipy.stats import linregress # Read data f = cdms2.open(data_sample('radial_speed.nc')) sp = f('speed') spe = f('speed_error') f.close() # Create hourly time axis taxi = sp.getTime() taxi.toRelativeTime('hours since 2000') ctimesi = taxi.asComponentTime() ct0 = round_date(ctimesi[0], 'hour') ct1 = round_date(ctimesi[-1], 'hour') taxo = create_time(lindates(ct0, ct1, 1, 'hour'), taxi.units) # Lag error # - estimation els = [] lags = N.arange(1, 6) for lag in lags: els.append(N.sqrt(((sp[lag:] - sp[:-lag])**2).mean())) els = N.array(els) a, b, _, _, _ = linregress(lags, els) # - plot P.figure(figsize=(6, 6)) P.subplot(211) P.plot(lags, els, 'o') P.plot([0, lags[-1]], [b, a * lags[-1] + b], 'g') P.axhline(b, color='0.8', ls='--')
from vacumm.misc.grid._interp_ import cellerr1d from scipy.stats import linregress # Read data f = cdms2.open(data_sample("radial_speed.nc")) sp = f("speed") spe = f("speed_error") f.close() # Create hourly time axis taxi = sp.getTime() taxi.toRelativeTime("hours since 2000") ctimesi = taxi.asComponentTime() ct0 = round_date(ctimesi[0], "hour") ct1 = round_date(ctimesi[-1], "hour") taxo = create_time(lindates(ct0, ct1, 1, "hour"), taxi.units) # Lag error # - estimation els = [] lags = N.arange(1, 6) for lag in lags: els.append(N.sqrt(((sp[lag:] - sp[:-lag]) ** 2).mean())) els = N.array(els) a, b, _, _, _ = linregress(lags, els) # - plot P.figure(figsize=(6, 6)) P.subplot(211) P.plot(lags, els, "o") P.plot([0, lags[-1]], [b, a * lags[-1] + b], "g") P.axhline(b, color="0.8", ls="--")
"""Test :func:`~vacumm.misc.plot.hov2` with a TZ variable""" # Imports from vcmq import N, MV2, create_dep, create_time, hov2, os, rc, code_file_name # Init data with z 1D nt = 10 nz = 8 var = N.dot(N.hanning(nt).reshape(nt, 1), N.hanning(nz).reshape(1, nz)) var = MV2.array(var) time = create_time((0., nt), units="days since 2000") z1d = create_dep((-nz+1, 1.)) var.setAxis(0, time) var.setAxis(1, z1d) z2d = N.resize(z1d, var.shape) z2d *= N.resize((N.arange(1., nt+1)/nt).reshape(1, nt), (nz, nt)).T # Plot with z 1D rc('font', size=8) kw = dict(show=False, bgcolor='0.5', date_fmt="%a") hov2(var, subplot=211, **kw) # Plot with z 2D figfile = code_file_name(ext='png') if os.path.exists(figfile): os.remove(figfile) hov2(var, xaxis=z2d, subplot=212, twin='x', savefig=figfile, close=True, **kw) # Unittest result = dict(files=figfile)
"""Test the :func:`~vacumm.misc.grid.regridding.regrid2d` function""" from vcmq import (P, N, MV2, code_file_name, os, add_grid, rotate_grid, set_grid, create_grid, rc, rcdefaults, plot2d, regrid2d, create_time) # Input grid and data nxi = 20 nyi = 15 nt = 5 # - rect xi = N.arange(nxi*1.) yi = N.arange(nyi*1.) ti = create_time((nt, ), 'years since 2000') gridri = create_grid(xi, yi) xxri, yyri = N.meshgrid(xi, yi) zzri = N.ma.resize(yyri, (nt, nyi, nxi)) zzri[:, int(nyi*0.3):int(nyi*0.6), int(nxi*0.3):int(nxi*0.6)] = N.ma.masked zzri[1] = N.ma.masked varri = MV2.asarray(zzri) varri.setAxis(0, ti) set_grid(varri, gridri) # - curv gridci = rotate_grid(gridri, 30) xxci = gridci.getLongitude().getValue() yyci = gridci.getLatitude().getValue() zzci = N.ma.resize(yyci, (nt, nyi, nxi)) zzci[:, int(nyi*0.3):int(nyi*0.6), int(nxi*0.3):int(nxi*0.6)] = N.ma.masked zzci[1] = N.ma.masked varci = MV2.asarray(zzci) varci.setAxis(0, ti) set_grid(varci, gridci)
lon0 = -5.4 lon1 = -4.7 lat0 = 48.1 lat1 = 48.6 time0 = "2008-08-15 07:00" time1 = "2008-08-15 16:00" splits = [None, 3, -3, (3, 'hour'), 3600*3.] # Imports from vcmq import (cdms2, data_sample, N, transect, stick2, code_file_name, os, transect_specs, add_map_lines, create_time, IterDates, P) # Read data f = cdms2.open(data_sample(ncfile)) u = f('u') v = f('v') f.close() # Transect specs tlons, tlats = transect_specs(u.getGrid(), lon0, lat0, lon1, lat1) ttimes = create_time(IterDates((time0, time1), len(tlons), closed=True)) # Compute reference transect tt = [transect(u, tlons, tlats, times=ttimes, split=split) for split in splits] # Unittest for ts in tt[1:]: N.testing.assert_allclose(tt[0], ts)
from vacumm.misc.grid._interp_ import cellerr1d from scipy.stats import linregress # Read data f = cdms2.open(data_sample('radial_speed.nc')) sp = f('speed') spe = f('speed_error') f.close() # Create hourly time axis taxi = sp.getTime() taxi.toRelativeTime('hours since 2000') ctimesi = taxi.asComponentTime() ct0 = round_date(ctimesi[0], 'hour') ct1 = round_date(ctimesi[-1], 'hour') taxo = create_time(lindates(ct0, ct1, 1, 'hour'), taxi.units) # Lag error # - estimation els = [] lags = N.arange(1, 6) for lag in lags: els.append(N.sqrt(((sp[lag:]-sp[:-lag])**2).mean())) els = N.array(els) a, b, _, _, _ = linregress(lags, els) # - plot P.figure(figsize=(6, 6)) P.subplot(211) P.plot(lags, els, 'o') P.plot([0, lags[-1]], [b, a*lags[-1]+b], 'g') P.axhline(b, color='0.8', ls='--')
def slice_gridded_var(var, member=None, time=None, depth=None, lat=None, lon=None): """Make slices of a variable and squeeze out singletons to reduce it The "member" axis is considered here as a generic name for the first axis of unkown type. .. warning:: All axes must be 1D """ # Check order var = var(squeeze=1) order = var.getOrder() # Unkown axis if '-' in order and member is not None: i = order.find('-') id = var.getAxisIds()[i] if isinstance(member, slice): kw = {id:member} var = var(**kw) else: axo = create_axis(member) cp_atts(var.getAxis(i), axo) var = regrid1d(var, axo, iaxi=i)(squeeze=N.isscalar(member)) # Time interpolation if 't' in order and time is not None: axi = var.getTime() if isinstance(time, slice): var = var(time=time) else: axo = create_time(time, axi.units) var = regrid1d(var, axo)(squeeze=N.isscalar(time)) # Depth interpolation if 'z' in order and depth is not None: if depth=='bottom': var = slice_bottom(var) else: if depth=='surf': depth = slice(-1, None) if isinstance(depth, slice): var = var(level=depth, squeeze=1) # z squeeze only? elif (N.isscalar(depth) and var.getLevel()[:].ndim==1 and depth in var.getLevel()): var = var(level=depth) else: axo = create_dep(depth) if axo[:].max()>10: sonat_warn('Interpolation depth is positive. Taking this opposite') axo[:] *=-1 var = regrid1d(var, axo)(squeeze=N.isscalar(depth)) # Point if (order.endswith('yx') and lon is not None and lat is not None and not isinstance(lat, slice) and not isinstance(lon, slice)): var = grid2xy(var, lon, lat)(squeeze=N.isscalar(lon)) else: # Latitude interpolation if 'y' in order and lat: if isinstance(lat, slice): var = var(lat=lat) else: axo = create_lat(lat) var = regrid1d(var, axo)(squeeze=N.isscalar(lat)) # Longitude interpolation if 'x' in order and lon: if isinstance(lon, slice): var = var(lon=lon) else: axo = create_lon(lon) var = regrid1d(var, axo)(squeeze=N.isscalar(lon)) return var
ne = 4 nez = 2 # Imports from vcmq import (N, MV2, code_file_name, os, P, create_lon, create_lat, create_dep, create_time, lindates, create_axis, reltime, grid2xy, comptime, set_grid, rotate_grid, add_grid) # Rectangular xyzt with 1d z data and coords # - data lon = create_lon(N.linspace(lon0, lon1, nx)) lat = create_lat(N.linspace(lat0, lat1, ny)) dep = create_dep(N.linspace(dep0, dep1, nz)) time = create_time(lindates(time0, time1, nt)) extra = create_axis(N.arange(ne), id='member') data = N.resize(lat[:], (ne, nt, nz, nx, ny)) # function of y data = N.moveaxis(data, -1, -2) #data = N.arange(nx*ny*nz*nt*ne, dtype='d').reshape(ne, nt, nz, ny, nx) vi = MV2.array(data, axes=[extra, time, dep, lat, lon], copy=False, fill_value=1e20) N.random.seed(0) xo = N.random.uniform(lon0, lon1, np) yo = N.random.uniform(lat0, lat1, np) zo = N.random.uniform(dep0, dep1, np) to = comptime(N.random.uniform(reltime(time0, time.units).value, reltime(time1, time.units).value, np), time.units)
"""Test :func:`~vacumm.misc.plot.hov2` with a TZ variable""" # Imports from vcmq import N, MV2, create_dep, create_time, hov2, os, rc, code_file_name # Init data with z 1D nt = 10 nz = 8 var = N.dot(N.hanning(nt).reshape(nt, 1), N.hanning(nz).reshape(1, nz)) var = MV2.array(var) time = create_time((0., nt), units="days since 2000") z1d = create_dep((-nz + 1, 1.)) var.setAxis(0, time) var.setAxis(1, z1d) z2d = N.resize(z1d, var.shape) z2d *= N.resize((N.arange(1., nt + 1) / nt).reshape(1, nt), (nz, nt)).T # Plot with z 1D rc('font', size=8) kw = dict(show=False, bgcolor='0.5', date_fmt="%a") hov2(var, subplot=211, **kw) # Plot with z 2D figfile = code_file_name(ext='png') if os.path.exists(figfile): os.remove(figfile) hov2(var, xaxis=z2d, subplot=212, twin='x', savefig=figfile, close=True, **kw) # Unittest result = dict(files=figfile)
# Inits ncfile = "mars2d.xyt.nc" lon0 = -5.4 lon1 = -4.7 lat0 = 48.1 lat1 = 48.6 time0 = "2008-08-15 07:00" time1 = "2008-08-15 16:00" splits = [None, 3, -3, (3, 'hour'), 3600 * 3.] # Imports from vcmq import (cdms2, data_sample, N, transect, stick2, code_file_name, os, transect_specs, add_map_lines, create_time, IterDates, P) # Read data f = cdms2.open(data_sample(ncfile)) u = f('u') v = f('v') f.close() # Transect specs tlons, tlats = transect_specs(u.getGrid(), lon0, lat0, lon1, lat1) ttimes = create_time(IterDates((time0, time1), len(tlons), closed=True)) # Compute reference transect tt = [transect(u, tlons, tlats, times=ttimes, split=split) for split in splits] # Unittest for ts in tt[1:]: N.testing.assert_allclose(tt[0], ts)
def create_Dthnc(self, fileout, TimeSeries): if '2D' in fileout: self.i23d = 2 else: self.i23d = 3 # create file if self.i23d == 3: Nlev = self.zz.shape[1] else: Nlev = 1 time_Series, nc = create_ncTH( fileout, len(self.llon), Nlev, self.ivs, np.round((TimeSeries - TimeSeries[0]) * 24 * 3600)) for n in range(0, len(TimeSeries)): tin = create_time(np.ones(len(self.llon) * Nlev) * (TimeSeries[n] + 1), units='days since 1-1-1') total = np.zeros(shape=(self.ivs, len(self.llon), Nlev)) # get tide if self.tidal: var = self.HC.keys() for i, v in enumerate(sorted(var)): # horizontal interpolation tmp = get_tide(self.constidx, self.tfreq, self.HC[v], np.array(TimeSeries[n]), self.lat0) if self.i23d > 2: # vertical interpolation tmp = vertical_extrapolation(tmp, self.zz, z0=self.z0) total[i, :, :] = total[i, :, :] + tmp if self.residual: var = self.res_vars for i, v in enumerate(sorted(var)): arri = self.res_file[v][:] if self.i23d > 2: dep = create_depth(arri.getAxis(1)[:]) extra = create_axis(N.arange(1), id='member') arri2 = np.tile(arri, [1, 1, 1, 1, 1]) arri3 = MV2.array(arri2, axes=[ extra, arri.getAxis(0), dep, arri.getAxis(2), arri.getAxis(3) ], copy=False, fill_value=1e20) zi = arri.getAxis(1)[:] if np.mean(zi) > 0: zi = zi * -1 tb = grid2xy(arri3, xo=np.tile(self.llon, [Nlev, 1]).T.flatten(), yo=np.tile(self.llat, [Nlev, 1]).T.flatten(), zo=self.zz.flatten(), method='linear', to=tin, zi=zi) else: tb = grid2xy(arri, xo=self.llon, yo=self.llat, method='linear', to=tin) if np.any(tb.mask == True): bad = tb.mask == True if len(bad.shape) > 1: bad = bad[0, :] tin_bad = create_time(np.ones(len(bad)) * (TimeSeries[n] + 1), units='days since 1-1-1') if self.i23d > 2: llon = np.tile(self.llon, [Nlev, 1]).T.flatten() llat = np.tile(self.llat, [Nlev, 1]).T.flatten() zz = self.zz.flatten() zi = arri.getAxis(1)[:] if np.mean(zi) > 0: zi = zi * -1 tb[0, bad] = grid2xy(arri3, xo=llon[bad], yo=llat[bad], zo=zz[bad], method='nearest', to=tin_bad, zi=zi) else: tb[bad] = grid2xy( arri, xo=np.array(self.llon)[bad].tolist(), yo=np.array(self.llat)[bad].tolist(), method='nearest', to=tin_bad) if np.any(tb.mask == True): print('probleme') total[i, :, :] = total[i, :, :] + np.reshape( tb, (len(self.llon), Nlev)) total = np.transpose(total, (1, 2, 0)) if np.isnan(total).any(): import pdb pdb.set_trace() if n % 100 == 0: self.logger.info( 'For timestep=%.f, max=%.4f, min=%.4f , max abs diff=%.4f' % (TimeSeries[n], total.max(), total.min(), abs(np.diff(total, n=1, axis=0)).max())) time_Series[n, :, :, :] = total nc.close()
# Add text m.add_text(0.1, 0.1, 'My text', color='r', shadow=True, weight='bold') m.add_text(-2, 50.5, 'My text with transform', transform='data', ha='center', bbox=dict(facecolor='y', alpha=.3)) m.add_lon_label(-8, 47.5, -8, va='center', ha='center', transform='data', fmt='%g') m.add_lat_label(-8, 47, 47, va='center', ha='center', transform='data') m.add_time_label(.1, .9, '2000') # Add place m.add_place(-2, 49, 'My place', text_family='monospace', text_size=15) # Add lines m.add_line([-8, 46, -1, 50], color='b') m.add_lines([-8, -1, -4, -8], [45, 45, 47, 45], color='r', linewidth=2, shadow=True) m.add_box([-8, 46, -1, 50], color='c') m.savefig(figfile%0) m.show() m.close() # Test with dates var = MV2.array([3, 6]) time = create_time(['2000', '2005'], units='years since 2000') var.setAxis(0, time) c = curve2(var, show=False) c.add_point('2001', 4, marker='+', size=100, linewidth=2) c.savefig(figfile%1) m.close()
-8, va='center', ha='center', transform='data', fmt='%g') m.add_lat_label(-8, 47, 47, va='center', ha='center', transform='data') m.add_time_label(.1, .9, '2000') # Add place m.add_place(-2, 49, 'My place', text_family='monospace', text_size=15) # Add lines m.add_line([-8, 46, -1, 50], color='b') m.add_lines([-8, -1, -4, -8], [45, 45, 47, 45], color='r', linewidth=2, shadow=True) m.add_box([-8, 46, -1, 50], color='c') m.savefig(figfile % 0) m.close() # Test with dates var = MV2.array([3, 6]) time = create_time(['2000', '2005'], units='years since 2000') var.setAxis(0, time) c = curve2(var, show=False) c.add_point('2001', 4, marker='+', size=100, linewidth=2) c.savefig(figfile % 1) m.close()
def get_file_interpolator(sourcefile, var_res, lonr, latr): sourcedata = Dataset(sourcefile, 'r') sourcedata_dms2 = cdms2.open(sourcefile) f_out = {} LONR = {} LATR = {} time0 = [ t.torelative('days since 1-1-1').value for t in sourcedata_dms2['time'].asRelativeTime() ] tres = np.array(time0) for varname in var_res: # arri = griddata(lat.ravel(),lon.ravel(), tempf[0,:,:].compressed(), tempf.getGrid(), method='nearest') lon, lat, arri = missing_interp(sourcedata_dms2[varname].getAxis(2)[:], sourcedata_dms2[varname].getAxis(1)[:], sourcedata_dms2[varname][:]) import pdb pdb.set_trace() tt = create_time(time0, units='days since 1-1-1') tb = grid2xy(arri, xo=lonr, yo=latr, method='nearest', to=tt) Res_val = np.ma.masked_where(tempf >= 1e36, tempf) if len(Res_val.shape) > 3: LONR[varname] = [] LATR[varname] = [] f_out[varname] = [] for all_l in range(0, Res_val.shape[1]): test = Res_val[:, all_l, :, :].reshape( Res_val.shape[0], Res_val.shape[2] * Res_val.shape[3]) gd_node = test[0, :].nonzero()[0] test = np.array(test) test = np.ma.masked_where(test == Res_val.fill_value, test) test = test[:, gd_node] if test.shape[1] > 0: gd_ts = test[:, int(test.shape[1] / 2)].nonzero()[0] f_out[varname].append( interp1d(tres[gd_ts], test[gd_ts], axis=0, fill_value=np.nan)) LONR[varname].append(lonr[gd_node]) LATR[varname].append(latr[gd_node]) else: test = Res_val[:, :, :].reshape( Res_val.shape[0], Res_val.shape[1] * Res_val.shape[2]) gd_node = test[0, :].nonzero()[0] test = np.array(test) test = np.ma.masked_where(test >= 1e20, test) test = test[:, gd_node] gd_ts = test[:, int(test.shape[1] / 2)].nonzero()[0] LONR[varname] = lonr[gd_node] LATR[varname] = latr[gd_node] f_out[varname] = interp1d(tres[gd_ts], test[gd_ts], axis=0, fill_value=np.nan) #'extrapolate') return f_out, LONR, LATR