Exemplo n.º 1
0
def test_stommel_fieldset(mode, tmpdir):
    timer.root = timer.Timer('Main')
    timer.stommel = timer.Timer('Stommel', parent=timer.root)
    outfile = tmpdir.join("StommelParticle")
    psetRK4 = stommel_example(1,
                              mode=mode,
                              method=method['RK4'],
                              outfile=outfile,
                              write_fields=False)
    psetRK45 = stommel_example(1,
                               mode=mode,
                               method=method['RK45'],
                               outfile=outfile,
                               write_fields=False)
    assert np.allclose(psetRK4.lon, psetRK45.lon, rtol=1e-3)
    assert np.allclose(psetRK4.lat, psetRK45.lat, rtol=1e-3)
    err_adv = np.abs(psetRK4.p_start - psetRK4.p)
    assert (err_adv <= 1.e-1).all()
    err_smpl = np.array([
        abs(psetRK4.p[i] -
            psetRK4.fieldset.P[0., psetRK4.lon[i], psetRK4.lat[i],
                               psetRK4.depth[i]]) for i in range(psetRK4.size)
    ])
    assert (err_smpl <= 1.e-1).all()
    timer.stommel.stop()
    timer.root.stop()
    timer.root.print_tree()
Exemplo n.º 2
0
def stommel_example(npart=1,
                    mode='jit',
                    verbose=False,
                    method=AdvectionRK4,
                    grid_type='A',
                    outfile="StommelParticle.nc",
                    repeatdt=None,
                    maxage=None,
                    write_fields=True,
                    pset_mode='soa'):
    timer.fieldset = timer.Timer('FieldSet', parent=timer.stommel)
    fieldset = stommel_fieldset(grid_type=grid_type)
    if write_fields:
        filename = 'stommel'
        fieldset.write(filename)
    timer.fieldset.stop()

    # Determine particle class according to mode
    timer.pset = timer.Timer('Pset', parent=timer.stommel)
    timer.psetinit = timer.Timer('Pset_init', parent=timer.pset)
    ParticleClass = JITParticle if mode == 'jit' else ScipyParticle

    class MyParticle(ParticleClass):
        p = Variable('p', dtype=np.float32, initial=0.)
        p_start = Variable('p_start', dtype=np.float32, initial=fieldset.P)
        age = Variable('age', dtype=np.float32, initial=0.)

    pset = pset_type[pset_mode]['pset'].from_line(fieldset,
                                                  size=npart,
                                                  pclass=MyParticle,
                                                  repeatdt=repeatdt,
                                                  start=(10e3, 5000e3),
                                                  finish=(100e3, 5000e3),
                                                  time=0)

    if verbose:
        print("Initial particle positions:\n%s" % pset)

    # Execute for 30 days, with 1hour timesteps and 12-hourly output
    runtime = delta(days=600)
    dt = delta(hours=1)
    outputdt = delta(days=5)
    maxage = runtime.total_seconds() if maxage is None else maxage
    fieldset.add_constant('maxage', maxage)
    print("Stommel: Advecting %d particles for %s" % (npart, runtime))
    timer.psetinit.stop()
    timer.psetrun = timer.Timer('Pset_run', parent=timer.pset)
    pset.execute(method + pset.Kernel(UpdateP) + pset.Kernel(AgeP),
                 runtime=runtime,
                 dt=dt,
                 moviedt=None,
                 output_file=pset.ParticleFile(name=outfile,
                                               outputdt=outputdt))

    if verbose:
        print("Final particle positions:\n%s" % pset)
    timer.psetrun.stop()
    timer.pset.stop()

    return pset
Exemplo n.º 3
0
def test_stommel_fieldset(mode):
    timer.root = timer.Timer('Main')
    timer.stommel = timer.Timer('Stommel', parent=timer.root)
    psetRK4 = stommel_example(1, mode=mode, method=method['RK4'])
    psetRK45 = stommel_example(1, mode=mode, method=method['RK45'])
    assert np.allclose([p.lon for p in psetRK4], [p.lon for p in psetRK45], rtol=1e-3)
    assert np.allclose([p.lat for p in psetRK4], [p.lat for p in psetRK45], rtol=1e-3)
    err_adv = np.array([abs(p.p_start - p.p) for p in psetRK4])
    assert(err_adv <= 1.e-1).all()
    err_smpl = np.array([abs(p.p - psetRK4.fieldset.P[0., p.lon, p.lat, p.depth]) for p in psetRK4])
    assert(err_smpl <= 1.e-1).all()
    timer.stommel.stop()
    timer.root.stop()
    timer.root.print_tree()
Exemplo n.º 4
0
def stommel_example(npart=1, mode='jit', verbose=False, method=AdvectionRK4):
    timer.fieldset = timer.Timer('FieldSet', parent=timer.stommel)
    fieldset = stommel_fieldset()
    filename = 'stommel'
    fieldset.write(filename)
    timer.fieldset.stop()

    # Determine particle class according to mode
    timer.pset = timer.Timer('Pset', parent=timer.stommel)
    timer.psetinit = timer.Timer('Pset_init', parent=timer.pset)
    ParticleClass = JITParticle if mode == 'jit' else ScipyParticle

    class MyParticle(ParticleClass):
        p = Variable('p', dtype=np.float32, initial=0.)
        p_start = Variable('p_start', dtype=np.float32, initial=fieldset.P)

    pset = ParticleSet.from_line(fieldset,
                                 size=npart,
                                 pclass=MyParticle,
                                 start=(100, 5000),
                                 finish=(200, 5000),
                                 time=0)

    if verbose:
        print("Initial particle positions:\n%s" % pset)

    # Execute for 30 days, with 1hour timesteps and 12-hourly output
    runtime = delta(days=30)
    dt = delta(hours=1)
    outputdt = delta(hours=12)
    print("Stommel: Advecting %d particles for %s" % (npart, runtime))
    timer.psetinit.stop()
    timer.psetrun = timer.Timer('Pset_run', parent=timer.pset)
    pset.execute(method + pset.Kernel(UpdateP),
                 runtime=runtime,
                 dt=dt,
                 moviedt=None,
                 output_file=pset.ParticleFile(name="StommelParticle",
                                               outputdt=outputdt))

    if verbose:
        print("Final particle positions:\n%s" % pset)
    timer.psetrun.stop()
    timer.pset.stop()

    return pset
Exemplo n.º 5
0
    assert np.allclose(psetRK4.lat, psetRK45.lat, rtol=1e-3)
    err_adv = np.abs(psetRK4.p_start - psetRK4.p)
    assert (err_adv <= 1.e-1).all()
    err_smpl = np.array([
        abs(psetRK4.p[i] -
            psetRK4.fieldset.P[0., psetRK4.lon[i], psetRK4.lat[i],
                               psetRK4.depth[i]]) for i in range(psetRK4.size)
    ])
    assert (err_smpl <= 1.e-1).all()
    timer.stommel.stop()
    timer.root.stop()
    timer.root.print_tree()


if __name__ == "__main__":
    timer.root = timer.Timer('Main')
    timer.args = timer.Timer('Args', parent=timer.root)
    p = ArgumentParser(description="""
Example of particle advection in the steady-state solution of the Stommel equation"""
                       )
    p.add_argument('mode',
                   choices=('scipy', 'jit'),
                   nargs='?',
                   default='jit',
                   help='Execution mode for performing computation')
    p.add_argument('-p',
                   '--particles',
                   type=int,
                   default=1,
                   help='Number of particles to advect')
    p.add_argument(
            y) + '/*/' + 'metoffice_foam1_amm7_NWS_RFVL_dm*.nc'
        fnames += sorted(glob(str(basepath)))
    filenames = {'U': fnames, 'V': fnames}
    variables = {'U': 'vozocrtx', 'V': 'vomecrty'}
    dimensions = {'lon': 'lon', 'lat': 'lat', 'depth': 'depth', 'time': 'time'}
    return FieldSet.from_netcdf(filenames,
                                variables,
                                dimensions,
                                allow_time_extrapolation=False)


def DeleteParticle(particle, fieldset, time, dt):
    particle.delete()


timer.root = timer.Timer('Main')
timer.fieldset = timer.Timer('FieldSet', parent=timer.root)
field_set = get_cmems_fieldset(2013)
timer.fieldset.stop()

kernel = AdvectionRK4

time0 = field_set.U.grid.time[0]
lonv = np.arange(-6, 10.1, .2)
latv = np.arange(50, 63, .2)
lon, lat = np.meshgrid(lonv, latv)
lon = lon.flatten()
lat = lat.flatten()
time = time0 * np.ones(lon.shape)
pset = ParticleSet.from_list(field_set,
                             JITParticle,