コード例 #1
0
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])
コード例 #2
0
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
コード例 #3
0
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
コード例 #4
0
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)
コード例 #5
0
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
コード例 #6
0
      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})