Example #1
0
def f(time):
    '''
    time: float index
    '''
    vels = interpolated_velocities(
        sgrid,
        points,
        timeobj,
        time,
        sgrid.u,
        sgrid.v,
        # u_alphas,
        # v_alphas,
        # u_ind,
        # v_ind,
    )

    u_rot = vels[:, 0]
    v_rot = vels[:, 1]
    u_rot, v_rot = rotate_vectors(u_rot, v_rot, angles)
    u_rot = u_rot.reshape(600, -1)
    v_rot = v_rot.reshape(600, -1)

    uv_vector_sum = vector_sum(u_rot, v_rot)
    return uv_vector_sum
Example #2
0
def gen_map(k):
    global t, index, cs, qv, tl, timeobj
    tindex = t[index]
    if cs is not None:
        cs.remove()
        qv.remove()
    time_str = timeobj.time_str(tindex)
    tl.set_text(time_str)
    mscale = 1
    vscale = 15
    scale = 0.04
    lon_data = lons
    lat_data = lats

    print(tindex)
    print(time_str)
    u_rot, v_rot = interpolated_velocities(sgrid, points, ind, timeobj, tindex, sgrid.u, sgrid.v)
    u_rot, v_rot = rotate_vectors(u_rot, v_rot, angles)
    u_rot = u_rot.reshape(600, -1)
    v_rot = v_rot.reshape(600, -1)

    uv_vector_sum = vector_sum(u_rot, v_rot)

    kw = dict(scale=1.0 / scale, pivot='middle', width=0.003, color='black')
    cs = plt.pcolormesh(lon_data[::mscale, ::mscale],
                        lat_data[::mscale, ::mscale],
                        uv_vector_sum[::mscale, ::mscale], zorder=1, cmap=plt.cm.rainbow)
    qv = plt.quiver(lon_data[::vscale, ::vscale], lat_data[::vscale, ::vscale],
                    u_rot[::vscale, ::vscale], v_rot[::vscale, ::vscale], zorder=2, **kw)
    index += 1
    return cs, qv, tl
Example #3
0
def gen_map(k):
    global t, index, cs, qv, tl, timeobj
    tindex = t[index]
    if cs is not None:
        cs.remove()
        qv.remove()
    time_str = timeobj.time_str(tindex)
    tl.set_text(time_str)
    mscale = 1
    vscale = 15
    scale = 0.04
    lon_data = lons
    lat_data = lats

    print tindex
    print time_str
    u_rot, v_rot = interpolated_velocities(sgrid, points, ind, timeobj, tindex, sgrid.u, sgrid.v)
    u_rot, v_rot = rotate_vectors(u_rot, v_rot, angles)
    u_rot = u_rot.reshape(600, -1)
    v_rot = v_rot.reshape(600, -1)

    uv_vector_sum = vector_sum(u_rot, v_rot)

    kw = dict(scale=1.0 / scale, pivot='middle', width=0.003, color='black')
    cs = plt.pcolormesh(lon_data[::mscale, ::mscale],
                        lat_data[::mscale, ::mscale],
                        uv_vector_sum[::mscale, ::mscale], zorder=1, cmap=plt.cm.rainbow)
    qv = plt.quiver(lon_data[::vscale, ::vscale], lat_data[::vscale, ::vscale],
                    u_rot[::vscale, ::vscale], v_rot[::vscale, ::vscale], zorder=2, **kw)
    index += 1
    return cs, qv, tl
Example #4
0
def f(time):
    '''
    time: float index
    '''
    vels = interpolated_velocities(
        sgrid, points, timeobj, time, sgrid.u, sgrid.v, u_alphas, v_alphas, u_ind, v_ind)

    u_rot = vels[:, 0]
    v_rot = vels[:, 1]
    u_rot, v_rot = rotate_vectors(u_rot, v_rot, angles)
    u_rot = u_rot.reshape(600, -1)
    v_rot = v_rot.reshape(600, -1)

    uv_vector_sum = vector_sum(u_rot, v_rot)
    return uv_vector_sum
Example #5
0
time_idx = 0
v_idx = 0

interp_u = sgrid.interpolate_var_to_points(
    points, sgrid.u[time_idx, v_idx], slices=None)
interp_v = sgrid.interpolate_var_to_points(
    points, sgrid.v, slices=[time_idx, v_idx])

ind = sgrid.locate_faces(points)
ang_ind = ind + [1, 1]
angles = sgrid.angles[:][ang_ind[:, 0], ang_ind[:, 1]]
u_rot, v_rot = rotate_vectors(interp_u, interp_v, angles)
u_rot = u_rot.reshape(600, -1)
v_rot = v_rot.reshape(600, -1)

uv_vector_sum = vector_sum(u_rot, v_rot)


def make_map(projection=ccrs.PlateCarree(), figsize=(20, 20)):
    fig, ax = plt.subplots(figsize=figsize,
                           subplot_kw=dict(projection=projection))
    gl = ax.gridlines(draw_labels=True)
    gl.xlabels_top = gl.ylabels_right = False
    gl.xformatter = LONGITUDE_FORMATTER
    gl.yformatter = LATITUDE_FORMATTER
    return fig, ax


mscale = 1
vscale = 10
scale = 0.03
# In[7]:

from pysgrid.processing_2d import rotate_vectors

angles = nc.variables[sgrid.angle.variable][sgrid.angle.center_slicing]
u, v = rotate_vectors(u, v, angles)


# - vector_sum

# In[8]:

from pysgrid.processing_2d import vector_sum

speed = vector_sum(u, v)


# We need to get the grid cell centers before plotting.
# A high level object could use pysgrid's API to get the cell centers and its coordinates variable names.

# In[9]:

grid_cell_centers = sgrid.centers

lon_var_name, lat_var_name = sgrid.face_coordinates

sg_lon = getattr(sgrid, lon_var_name)
sg_lat = getattr(sgrid, lat_var_name)

def test_vector_sum():
    x_vector = np.array([3, 5, 9, 11])
    y_vector = np.array([4, 12, 40, 60])
    sum_result = vector_sum(x_vector, y_vector)
    expected = np.array([5, 13, 41, 61])
    np.testing.assert_almost_equal(sum_result, expected)
Example #8
0
interp_v = sgrid.interpolate_var_to_points(points,
                                           sgrid.v,
                                           slices=[time_idx, v_idx])

# rotation is still ugly...
from pysgrid.processing_2d import rotate_vectors, vector_sum
from pysgrid.processing_2d import vector_sum

ind = sgrid.locate_faces(points)
ang_ind = ind + [1, 1]
angles = sgrid.angles[:][ang_ind[:, 0], ang_ind[:, 1]]
u_rot, v_rot = rotate_vectors(interp_u, interp_v, angles)
u_rot = u_rot.reshape(600, -1)
v_rot = v_rot.reshape(600, -1)

uv_vector_sum = vector_sum(u_rot, v_rot)

import numpy as np
import matplotlib.pyplot as plt

import cartopy.crs as ccrs
from cartopy.io import shapereader
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER


def make_map(projection=ccrs.PlateCarree(), figsize=(20, 20)):
    fig, ax = plt.subplots(figsize=figsize,
                           subplot_kw=dict(projection=projection))
    gl = ax.gridlines(draw_labels=True)
    gl.xlabels_top = gl.ylabels_right = False
    gl.xformatter = LONGITUDE_FORMATTER
Example #9
0
v_idx = 0  # surface
time_idx = -1  # Last time step.

u = u_velocity[time_idx, v_idx, u_var.center_slicing[-2], u_var.center_slicing[-1]]
v = v_velocity[time_idx, v_idx, v_var.center_slicing[-2], v_var.center_slicing[-1]]


u = avg_to_cell_center(u, u_var.center_axis)
v = avg_to_cell_center(v, v_var.center_axis)


angles = nc.variables[sgrid.angle.variable][sgrid.angle.center_slicing]
u, v = rotate_vectors(u, v, angles)


speed = vector_sum(u, v)

\*\* CF convention does describe the angle variable for grids that needs rotation, but there is no action expected. For example, in the formula_terms, pysgrid must be improved to abstract that action when needed via a simpler method.

```xml
<entry id="angle_of_rotation_from_east_to_x">
    <canonical_units>degree</canonical_units>
    <grib></grib>
    <amip></amip>
    <description>The quantity with standard name angle_of_rotation_from_east_to_x is the angle, anticlockwise reckoned positive, between due East and (dr/di)jk, where r(i,j,k) is the vector 3D position of the point with coordinate indices (i,j,k).  It could be used for rotating vector fields between model space and latitude-longitude space.</description>
</entry>
```

lon_var_name, lat_var_name = sgrid.face_coordinates

sg_lon = getattr(sgrid, lon_var_name)
 vertical_index, vertical = nearest_z(raw_var1, canon_dataset, z)
 print('Vertical: {0}'.format(vertical))
 var1_trimmed = raw_var1[time_idx, vertical_index, cached_var1.center_slicing[2], cached_var1.center_slicing[3]]
 var2_trimmed = raw_var2[time_idx, vertical_index, cached_var2.center_slicing[2], cached_var2.center_slicing[3]]
 var1_avg = avg_to_cell_center(var1_trimmed, cached_var1.center_axis)
 var2_avg = avg_to_cell_center(var2_trimmed, cached_var2.center_axis)
 if cached_var1.center_axis == 1 and cached_var2.center_axis == 0:
     x_var = var1_avg
     y_var = var2_avg
 else:
     x_var = var2_avg
     y_var = var1_avg
 x_rot, y_rot = rotate_vectors(x_var, y_var, angles)
 subset_x_rot = subset_data(x_rot, subset_idx)
 subset_y_rot = subset_data(y_rot, subset_idx)
 xy_vector_sum = vector_sum(subset_x_rot, subset_y_rot)
 # start experimental quiver_response section
 
 # end experimental quiver_response section
 
 fig = plt.figure(figsize=(12, 12))
 plt.subplot(111, aspect=(1.0/np.cos(np.mean(subset_lat)*np.pi/180.0)))
 q = plt.quiver(subset_lon[::SUB], 
                subset_lat[::SUB], 
                subset_x_rot[::SUB], 
                subset_y_rot[::SUB],
                xy_vector_sum[::SUB],
                scale=1.0/SCALE, 
                pivot='middle', 
                zorder=1e35, 
                width=0.003
Example #11
0
def test_vector_sum():
    x_vector = np.array([3, 5, 9, 11])
    y_vector = np.array([4, 12, 40, 60])
    sum_result = vector_sum(x_vector, y_vector)
    expected = np.array([5, 13, 41, 61])
    np.testing.assert_almost_equal(sum_result, expected)
cell_centers = sg.centers
lon_var_name, lat_var_name = sg.face_coordinates
lon_data = cell_centers[:, :, 0]
lat_data = cell_centers[:, :, 1]
lon_var_obj = getattr(sg, lon_var_name)
lat_var_obj = getattr(sg, lat_var_name)
lon_subset = lon_data[lon_var_obj.center_slicing]
lat_subset = lat_data[lat_var_obj.center_slicing]
angles = sg.angles[lon_var_obj.center_slicing]

u_data_trimmed = u_var[TIME_INDEX, VERTICAL_INDEX, sg_u.center_slicing[2], sg_u.center_slicing[3]]
v_data_trimmed = v_var[TIME_INDEX, VERTICAL_INDEX, sg_v.center_slicing[2], sg_v.center_slicing[3]]
u_data_avg = avg_to_cell_center(u_data_trimmed, sg_u.center_axis)
v_data_avg = avg_to_cell_center(v_data_trimmed, sg_v.center_axis)
u_rotated, v_rotated = rotate_vectors(u_data_avg, v_data_avg, angles)
uv_vector_sum = vector_sum(u_rotated, v_rotated)

fig = plt.figure(figsize=(12, 12))
plt.subplot(111, aspect=(1.0/np.cos(np.mean(lat_subset)*np.pi/180.0)))
q = plt.quiver(lon_subset[::SUB, ::SUB], 
               lat_subset[::SUB, ::SUB], 
               u_rotated[::SUB, ::SUB], 
               v_rotated[::SUB, ::SUB],
               uv_vector_sum[::SUB, ::SUB],
               scale=1.0/SCALE, 
               pivot='middle', 
               zorder=1e35, 
               width=0.003
              )