def test_hycom_advection():
    print("Loading Data...")
    field = generate_field.hycom_surface(months=list(range(1, 13)))
    field.x = np.linspace(min(field.x), max(field.x), len(field.x))
    land = np.isnan(field.U[0])
    field.U[:, land] = 0
    field.V[:, land] = 0

    field.time = (
        field.time - np.datetime64('1970-01-01T00:00:00')) / np.timedelta64(
            1, 's')  # convert from numpy datetime to seconds since epoch

    # initialize particles
    [X, Y] = np.meshgrid(field.x, field.y)
    ocean_points = np.array([X[~land.T], Y[~land.T]]).T
    num_particles = 5000
    p0 = ocean_points[np.random.choice(np.arange(len(ocean_points)),
                                       size=num_particles,
                                       replace=False)]

    # initialize advection parameters
    t_start = field.time[0]
    t_end = field.time[-1]
    num_timesteps = 365 * 24
    time = np.linspace(t_start, t_end, num_timesteps)
    dt = time[1] - time[0]
    print(f'dt: {dt/3600: .1f} hours')
    save_every = 24
    device_index = 2  # amd
    P, buf_time, kernel_time = openCL_advect(field,
                                             p0,
                                             t_start,
                                             num_timesteps,
                                             save_every,
                                             dt,
                                             device_index,
                                             verbose=True,
                                             kernel='lat_lon')
    P = np.concatenate([p0[:, np.newaxis], P], axis=1)
    out_time = time[0] + dt * np.arange(num_timesteps + 1, step=save_every)

    # make an animation
    proj = ccrs.PlateCarree()
    fig = plt.figure(figsize=[14, 8])
    ax = plt.axes(projection=proj)
    ax.coastlines()

    dot, = ax.plot([], [], '.')

    def update(i):
        dot.set_xdata(P[:, i, 0])
        dot.set_ydata(P[:, i, 1])
        ax.set_title(datetime.utcfromtimestamp(out_time[i]))
        ax.set_ylim(-90, 90)
        return dot,

    ani = FuncAnimation(fig, update, frames=len(out_time))
    #plt.show()
    print('saving animation...')
    ani.save('plots/hycom_2015.mp4', fps=30)
Exemple #2
0
def test_ocean():
    field = generate_field.multiple_timestep_ocean()

    # initialize particles
    [X, Y] = np.meshgrid(np.linspace(-180, 180, 47), np.linspace(-85, 85, 29))
    p0 = np.array([X.flatten(), Y.flatten()]).T

    # initialize advection parameters
    num_timesteps = 100
    save_every = 1
    dt = 3600 * 1  # 1 hrs
    device_index = 2  # amd
    t0 = 0
    P, buf_time, kernel_time = openCL_advect(field,
                                             p0,
                                             t0,
                                             num_timesteps,
                                             save_every,
                                             dt,
                                             device_index,
                                             verbose=True,
                                             kernel='lat_lon')

    plot_advection(P, dt * np.arange(num_timesteps, step=save_every), field)
    return P
    def advect_circles(dt, field):
        # advect particles
        p0 = np.array([[.4, 0]])
        num_timesteps = int(10 / dt)
        save_every = 1

        P, buffer_seconds, kernel_seconds = openCL_advect(
            field=field,
            p0=p0,
            t0=0,
            num_timesteps=num_timesteps,
            save_every=save_every,
            dt=dt,
            device_index=0,
            verbose=False)
        return P[0, :, 0], P[0, :, 1]
Exemple #4
0
def test_hycom():
    field = generate_field.hycom_surface(months=list(range(1, 13)) * 2)
    land = np.isnan(field.U[0])
    field.U[:, land] = 0
    field.V[:, land] = 0

    field.time = (
        field.time - np.datetime64('1970-01-01T00:00:00')) / np.timedelta64(
            1, 's')  # convert from numpy datetime to seconds since epoch

    # initialize particles
    [X, Y] = np.meshgrid(field.x, field.y)
    ocean_points = np.array([X[~land.T], Y[~land.T]]).T
    num_particles = 5000
    p0 = ocean_points[np.random.choice(np.arange(len(ocean_points)),
                                       size=num_particles,
                                       replace=False)]

    # initialize advection parameters
    t_start = field.time[0]
    t_end = field.time[-1]
    num_timesteps = 2 * 365 * 10
    time = np.linspace(t_start, t_end, num_timesteps)
    dt = time[1] - time[0]
    print(f'dt: {dt/3600: .1f} hours')
    save_every = 20
    device_index = 2  # amd
    P, buf_time, kernel_time = openCL_advect(field,
                                             p0,
                                             t_start,
                                             num_timesteps,
                                             save_every,
                                             dt,
                                             device_index,
                                             verbose=True,
                                             kernel='lat_lon')
    P = np.concatenate([p0[:, np.newaxis], P], axis=1)

    field.x = np.linspace(min(field.x), max(field.x), len(field.x))
    plot_ocean_advection(
        P,
        np.linspace(t_start, t_end + (t_end - t_start),
                    num_timesteps // save_every))
    return P
Exemple #5
0
def run_opencl(num_particles,
               num_timesteps,
               save_every=1,
               device='amd',
               verbose=False):
    field = generate_field.converge()
    p0 = np.random.rand(num_particles, 2) * [
        field.x.max() - field.x.min(),
        field.y.max() - field.y.min()
    ] + [field.x.min(), field.y.min()]
    t0 = 0
    dt = 1
    device_index = {'cpu': 0, 'iris': 1, 'amd': 2}[device]
    P, buffer_seconds, kernel_seconds = openCL_advect(field, p0, t0,
                                                      num_timesteps,
                                                      save_every, dt,
                                                      device_index, verbose)

    return P, buffer_seconds, kernel_seconds
def test_cartesian_electric_dipole():
    field1 = generate_field.electric_dipole(nx=1000)
    field2 = generate_field.electric_dipole(nx=1000)

    field = Field2D(x=field1.x,
                    y=field1.y,
                    time=np.array([0, .5]),
                    U=np.concatenate([field1.U, -field2.U], axis=0),
                    V=np.concatenate([field1.V, -field2.V], axis=0))

    # advect particles
    np.random.seed(2)
    p0 = np.random.rand(1000, 2) * [
        field.x.max() - field.x.min(),
        field.y.max() - field.y.min()
    ] + [field.x.min(), field.y.min()]
    num_timesteps = 600
    save_every = 10
    dt = 1e-3
    P, buffer_seconds, kernel_seconds = openCL_advect(
        field=field,
        p0=p0,
        t0=0,
        num_timesteps=num_timesteps,
        save_every=save_every,
        dt=dt,
        device_index=2,
        verbose=True)

    fig, ax = plt.subplots(1, 1)
    ax.set_aspect(1)
    dot, = ax.plot([], [], '.', markersize=5, color='C0')
    charge1 = ax.add_artist(Circle((-1, 0), 0.05, color='blue'))
    charge2 = ax.add_artist(Circle((1, 0), 0.05, color='red'))
    ax.streamplot(field.x,
                  field.y,
                  field.U[0].T,
                  field.V[0].T,
                  linewidth=1,
                  density=2,
                  arrowsize=0,
                  color='gray')
    ax.set_xlim([min(field.x), max(field.x)])
    ax.set_ylim([min(field.y), max(field.y)])
    ax.axes.xaxis.set_visible(False)
    ax.axes.yaxis.set_visible(False)

    time = dt * np.arange(num_timesteps, step=save_every)

    def update(i):
        if i == 0:
            charge1.set_color('blue')
            charge2.set_color('red')
        elif i == 24:
            charge1.set_color('red')
            charge2.set_color('blue')

        dot.set_xdata(P[:, i, 0])
        dot.set_ydata(P[:, i, 1])
        ax.set_title(f't={i}')
        ax.set_xlim([min(field.x), max(field.x)])
        ax.set_ylim([min(field.y), max(field.y)])
        return dot, charge1, charge2

    ani = FuncAnimation(fig, update, frames=len(time))
    plt.show()
import generate_field
import numpy as np

from openCL_driver import openCL_advect
from plot_advection import plot_advection

field = generate_field.converge_diverge()

p0 = np.random.rand(500, 2) * [field.x.max() - field.x.min(), field.y.max() - field.y.min()] + [field.x.min(), field.y.min()]
dt = 1
device_index = 0
num_timesteps = 100
save_every = 1
verbose = True
t0 = field.time[0]

P, buffer_seconds, kernel_seconds = openCL_advect(field, p0, t0, num_timesteps, save_every, dt, device_index, verbose)
plot_advection(P, np.arange(num_timesteps), field)