def test_nestedfields(mode, k_sample_p): xdim = 10 ydim = 20 U1 = Field('U1', 0.1 * np.ones((ydim, xdim), dtype=np.float32), lon=np.linspace(0., 1., xdim, dtype=np.float32), lat=np.linspace(0., 1., ydim, dtype=np.float32)) V1 = Field('V1', 0.2 * np.ones((ydim, xdim), dtype=np.float32), lon=np.linspace(0., 1., xdim, dtype=np.float32), lat=np.linspace(0., 1., ydim, dtype=np.float32)) U2 = Field('U2', 0.3 * np.ones((ydim, xdim), dtype=np.float32), lon=np.linspace(0., 2., xdim, dtype=np.float32), lat=np.linspace(0., 2., ydim, dtype=np.float32)) V2 = Field('V2', 0.4 * np.ones((ydim, xdim), dtype=np.float32), lon=np.linspace(0., 2., xdim, dtype=np.float32), lat=np.linspace(0., 2., ydim, dtype=np.float32)) U = NestedField('U', [U1, U2]) V = NestedField('V', [V1, V2]) fieldset = FieldSet(U, V) P1 = Field('P1', 0.1 * np.ones((ydim, xdim), dtype=np.float32), lon=np.linspace(0., 1., xdim, dtype=np.float32), lat=np.linspace(0., 1., ydim, dtype=np.float32)) P2 = Field('P2', 0.2 * np.ones((ydim, xdim), dtype=np.float32), lon=np.linspace(0., 2., xdim, dtype=np.float32), lat=np.linspace(0., 2., ydim, dtype=np.float32)) P = NestedField('P', [P1, P2]) fieldset.add_field(P) def Recover(particle, fieldset, time): particle.lon = -1 particle.lat = -1 particle.p = 999 particle.time = particle.time + particle.dt pset = ParticleSet(fieldset, pclass=pclass(mode), lon=[0], lat=[.3]) pset.execute(AdvectionRK4 + pset.Kernel(k_sample_p), runtime=1, dt=1) assert np.isclose(pset.lat[0], .5) assert np.isclose(pset.p[0], .1) pset = ParticleSet(fieldset, pclass=pclass(mode), lon=[0], lat=[1.3]) pset.execute(AdvectionRK4 + pset.Kernel(k_sample_p), runtime=1, dt=1) assert np.isclose(pset.lat[0], 1.7) assert np.isclose(pset.p[0], .2) pset = ParticleSet(fieldset, pclass=pclass(mode), lon=[0], lat=[2.3]) pset.execute(AdvectionRK4 + pset.Kernel(k_sample_p), runtime=1, dt=1, recovery={ErrorCode.ErrorOutOfBounds: Recover}) assert np.isclose(pset.lat[0], -1) assert np.isclose(pset.p[0], 999) assert np.allclose(fieldset.UV[0][0, 0, 0, 0], [.1, .2])
def set_diffusion_MERCATOR( fieldset, diffusivity): # create fields needed for the brownian motion if type(fieldset.U) == Field: size2D = (fieldset.U.grid.ydim, fieldset.U.grid.xdim) lat1 = fieldset.U.grid.lat lon1 = fieldset.U.grid.lon fieldset.add_field( Field('Kh_zonal', data=diffusivity * np.ones(size2D), lon=lon1, lat=lat1, allow_time_extrapolation=True)) fieldset.add_field( Field('Kh_meridional', data=diffusivity * np.ones(size2D), lon=lon1, lat=lat1, allow_time_extrapolation=True)) else: size2D_0083 = (fieldset.U[0].grid.ydim, fieldset.U[0].grid.xdim) size2D_025 = (fieldset.U[1].grid.ydim, fieldset.U[1].grid.xdim) Kh_zonal = NestedField('Kh_zonal', [ Field('Kh_zonal', data=diffusivity * np.ones(size2D_0083), lat=fieldset.U[0].grid.lat, lon=fieldset.U[0].grid.lon, mesh='spherical', allow_time_extrapolation=True), Field('Kh_zonal', data=diffusivity * np.ones(size2D_025), lat=fieldset.U[1].grid.lat, lon=fieldset.U[1].grid.lon, mesh='spherical', allow_time_extrapolation=True) ]) Kh_meridional = NestedField('Kh_meridional', [ Field('Kh_meridional', data=diffusivity * np.ones(size2D_0083), lat=fieldset.U[0].grid.lat, lon=fieldset.U[0].grid.lon, mesh='spherical', allow_time_extrapolation=True), Field('Kh_meridional', data=diffusivity * np.ones(size2D_025), lat=fieldset.U[1].grid.lat, lon=fieldset.U[1].grid.lon, mesh='spherical', allow_time_extrapolation=True) ]) fieldset.add_field(Kh_zonal) fieldset.add_field(Kh_meridional) return fieldset
def set_cmems(fieldset): data_dir = '/projects/0/topios/hydrodynamic_data/CMEMS/NORTHWESTSHELF_REANALYSIS_PHYS_004_009/MetO-NWS-REAN-PHYS-daily-CUR/' fnames = [] years = range(2000, 2005) for y in years: basepath = data_dir + str( y) + '/*/' + 'metoffice_foam1_amm7_NWS_RFVL_dm*.nc' fnames += sorted(glob(str(basepath))) dimensionsU = {'lon': 'lon', 'lat': 'lat', 'time': 'time'} dimensionsV = {'lon': 'lon', 'lat': 'lat', 'time': 'time'} indices = { 'lon': range(1, 296), 'lat': range(1, 374) } # cmems puts nan values at its borders Ucmems = Field.from_netcdf(fnames, ('Ucmems', 'vozocrtx'), dimensionsU, fieldtype='U', indices=indices, allow_time_extrapolation=False) Vcmems = Field.from_netcdf(fnames, ('Vcmems', 'vomecrty'), dimensionsV, fieldtype='V', indices=indices, allow_time_extrapolation=False, grid=Ucmems.grid, dataFiles=Ucmems.dataFiles) fieldset.add_field(Ucmems) fieldset.add_field(Vcmems) fieldset.Ucmems.vmax = 5 fieldset.Vcmems.vmax = 5 fieldset.Unemo = fieldset.U fieldset.Unemo.name = 'Unemo' fieldset.Vnemo = fieldset.V fieldset.Vnemo.name = 'Vnemo' U = NestedField('U', [fieldset.Ucmems, fieldset.Unemo]) V = NestedField('V', [fieldset.Vcmems, fieldset.Vnemo]) fieldset.U = U fieldset.V = V fieldset.cmems = True
def set_unbeaching(fieldset): files = '/home/philippe/data/ORCA%s-N06_unbeaching_vel.nc' % fieldset.nemo_res filenames = files variables = {'Unemo_unbeach': 'unBeachU', 'Vnemo_unbeach': 'unBeachV'} dimensions = {'lon': 'glamf', 'lat': 'gphif'} fieldsetUnBeach = FieldSet.from_nemo(filenames, variables, dimensions, tracer_interp_method='cgrid_velocity') fieldset.add_field(fieldsetUnBeach.Unemo_unbeach) fieldset.add_field(fieldsetUnBeach.Vnemo_unbeach) if fieldset.cmems: fname = '/home/philippe/data/cmems_NWS_rean_004_009_unbeaching_vel.nc' dimensionsU = {'lon': 'lon', 'lat': 'lat'} Ucmems_unbeach = Field.from_netcdf(fname, ('Ucmems_unbeach', 'unBeachU'), dimensionsU, fieldtype='U') dimensionsV = {'lon': 'lon', 'lat': 'lat'} Vcmems_unbeach = Field.from_netcdf(fname, ('Vcmems_unbeach', 'unBeachV'), dimensionsV, fieldtype='V') fieldset.add_field(Ucmems_unbeach) fieldset.add_field(Vcmems_unbeach) UVnemo_unbeach = VectorField('UVnemo_unbeach', fieldset.Unemo_unbeach, fieldset.Vnemo_unbeach) UVcmems_unbeach = VectorField('UVcmems_unbeach', fieldset.Ucmems_unbeach, fieldset.Vcmems_unbeach) UVunbeach = NestedField('UVunbeach', [UVcmems_unbeach, UVnemo_unbeach]) fieldset.add_vector_field(UVunbeach) else: UVunbeach = VectorField('UVunbeach', fieldset.Unemo_unbeach, fieldset.Vnemo_unbeach) fieldset.add_vector_field(UVunbeach)
def get_MERCATOR(path, start_date=0, finish_date=-1, chunksize=False, fieldset=None): fdir = sorted(glob(path + '*.nc')) len_path = len(path) if type(start_date) == datetime: start_date_str = start_date.strftime("%Y%m%d") finish_date_str = finish_date.strftime("%Y%m%d") for i, e in enumerate(fdir): if e.find(str(start_date_str), len_path) > 0: start_index = i elif e.find(str(finish_date_str), len_path) > 0: finish_index = i if start_date > finish_date: filenames = { 'U': fdir[finish_index:start_index + 1], 'V': fdir[finish_index:start_index + 1] } else: filenames = { 'U': fdir[start_index:finish_index + 1], 'V': fdir[start_index:finish_index + 1] } if path.find('0083') > 0: variables = {'U': 'uo', 'V': 'vo'} else: variables = {'U': 'u', 'V': 'v'} dimensions = { 'U': { 'time': 'time', 'depth': 'depth', 'lon': 'longitude', 'lat': 'latitude' }, 'V': { 'time': 'time', 'depth': 'depth', 'lon': 'longitude', 'lat': 'latitude' } } if fieldset: fieldset.Unemo_old = fieldset.U fieldset.Unemo_old.name = 'Unemo_old' fieldset.Vnemo_old = fieldset.V fieldset.Vnemo_old.name = 'Vnemo_old' fieldset_new = FieldSet.from_nemo(filenames, variables, dimensions, vmax=5, vmin=-5, field_chunksize=chunksize) fieldset_new.U.name = 'Unemo_new' fieldset_new.V.name = 'Vnemo_new' fieldset.add_field(fieldset_new.U) fieldset.add_field(fieldset_new.V) fieldset.U = NestedField('U', [fieldset.Unemo_old, fieldset.Unemo_new]) fieldset.V = NestedField('V', [fieldset.Vnemo_old, fieldset.Vnemo_new]) else: fieldset = FieldSet.from_nemo(filenames, variables, dimensions, vmax=5, vmin=-5, field_chunksize=chunksize) return fieldset
myfieldset.append(get_nemo_fields(ufiles,vfiles,wfiles,mesh_mask,run3D=options['run3D'],chunksize=False,vdiffusion=options['vdiffusion'],beaching=options['beaching'])) if options['nesting']==True: print('using ',nbgrids,' nested grids') # NestedFields ufields=[];vfields=[];wfields=[];Kzfields=[];KzEVDfields=[];tmaskfields=[]; for g in range(nbgrids): ufields.append(myfieldset[g].U); vfields.append(myfieldset[g].V) if options['run3D']: wfields.append(myfieldset[g].W) if options['vdiffusion']: Kzfields.append(myfieldset[g].Kz) ; KzEVDfields.append(myfieldset[g].Kz_EVD); if options['beaching']>0: tmaskfields.append(myfieldset[g].tmask) U=NestedField('U', ufields) V=NestedField('V', vfields) if options['run3D']: W=NestedField('W', wfields) if options['vdiffusion']: Kz=NestedField('Kz', Kzfields) Kz_EVD=NestedField('Kz_EVD', KzEVDfields) if options['beaching']>0: tmask=NestedField('tmask', tmaskfields) if options['run3D']: if options['vdiffusion']: if options['beaching']>0: fieldset = FieldSet(U, V, {'W':W, 'Kz':Kz, 'Kz_EVD':Kz_EVD, 'tmask':tmask}) else: fieldset = FieldSet(U, V, {'W':W, 'Kz':Kz, 'Kz_EVD':Kz_EVD})