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()
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
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()
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
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,