예제 #1
0
    def check_complete(self):
        assert self.U, 'FieldSet does not have a Field named "U"'
        assert self.V, 'FieldSet does not have a Field named "V"'
        for attr, value in vars(self).items():
            if type(value) is Field:
                assert value.name == attr, 'Field %s.name (%s) is not consistent' % (
                    value.name, attr)

        for g in self.gridset.grids:
            g.check_zonal_periodic()
            if len(g.time) == 1:
                continue
            assert isinstance(
                g.time_origin, type(self.time_origin)
            ), 'time origins of different grids must be have the same type'
            if g.time_origin:
                g.time = g.time + (g.time_origin -
                                   self.time_origin) / np.timedelta64(1, 's')
                if g.defer_load:
                    g.time_full = g.time_full + (
                        g.time_origin - self.time_origin) / np.timedelta64(
                            1, 's')
                g.time_origin = self.time_origin
        if not hasattr(self, 'UV'):
            if isinstance(self.U, FieldList):
                self.add_vector_field(VectorFieldList('UV', self.U, self.V))
            else:
                self.add_vector_field(VectorField('UV', self.U, self.V))
        if not hasattr(self, 'UVW') and hasattr(self, 'W'):
            if isinstance(self.U, FieldList):
                self.add_vector_field(
                    VectorFieldList('UVW', self.U, self.V, self.W))
            else:
                self.add_vector_field(
                    VectorField('UVW', self.U, self.V, self.W))
예제 #2
0
 def visit_SummedVectorFieldEvalNode(self, node):
     self.visit(node.field)
     self.visit(node.args)
     cstat = []
     if node.field.obj.W:
         Wlist = node.field.obj.W
     else:
         Wlist = [None] * len(node.field.obj.U)
     for U, V, W, var, var2, var3 in zip(node.field.obj.U, node.field.obj.V,
                                         Wlist, node.var, node.var2,
                                         node.var3):
         vfld = VectorField(node.field.obj.name, U, V, W)
         ccode_eval = vfld.ccode_eval(var, var2, var3, U, V, W,
                                      *node.args.ccode)
         if U.interp_method != 'cgrid_velocity':
             ccode_conv1 = U.ccode_convert(*node.args.ccode)
             ccode_conv2 = V.ccode_convert(*node.args.ccode)
             statements = [
                 c.Statement("%s *= %s" % (var, ccode_conv1)),
                 c.Statement("%s *= %s" % (var2, ccode_conv2))
             ]
         else:
             statements = []
         if var3:
             ccode_conv3 = W.ccode_convert(*node.args.ccode)
             statements.append(c.Statement("%s *= %s" %
                                           (var3, ccode_conv3)))
         conv_stat = c.Block(statements)
         cstat += [
             c.Assign("err", ccode_eval), conv_stat,
             c.Statement("CHECKERROR(err)")
         ]
     node.ccode = c.Block(cstat)
예제 #3
0
def test_add_second_vector_field(pset_mode, mode):
    lon = np.linspace(0., 10., 12, dtype=np.float32)
    lat = np.linspace(0., 10., 10, dtype=np.float32)
    U = np.ones((10, 12), dtype=np.float32)
    V = np.zeros((10, 12), dtype=np.float32)
    data = {'U': U, 'V': V}
    dimensions = {'U': {'lat': lat, 'lon': lon},
                  'V': {'lat': lat, 'lon': lon}}
    fieldset = FieldSet.from_data(data, dimensions, mesh='flat')

    data2 = {'U2': U, 'V2': V}
    dimensions2 = {'lon': [ln + 0.1 for ln in lon], 'lat': [lt - 0.1 for lt in lat]}
    fieldset2 = FieldSet.from_data(data2, dimensions2, mesh='flat')

    UV2 = VectorField('UV2', fieldset2.U2, fieldset2.V2)
    fieldset.add_vector_field(UV2)

    def SampleUV2(particle, fieldset, time):
        u, v = fieldset.UV2[time, particle.depth, particle.lat, particle.lon]
        particle.lon += u * particle.dt
        particle.lat += v * particle.dt

    pset = pset_type[pset_mode]['pset'](fieldset, pclass=ptype[mode], lon=0.5, lat=0.5)
    pset.execute(AdvectionRK4+pset.Kernel(SampleUV2), dt=1, runtime=1)

    assert abs(pset.lon[0] - 2.5) < 1e-9
    assert abs(pset.lat[0] - .5) < 1e-9
예제 #4
0
    def check_complete(self):
        assert self.U, 'FieldSet does not have a Field named "U"'
        assert self.V, 'FieldSet does not have a Field named "V"'
        for attr, value in vars(self).items():
            if type(value) is Field:
                assert value.name == attr, 'Field %s.name (%s) is not consistent' % (
                    value.name, attr)

        for g in self.gridset.grids:
            g.check_zonal_periodic()
            if len(g.time) == 1:
                continue
            assert isinstance(
                g.time_origin, type(self.time_origin)
            ), 'time origins of different grids must be have the same type'
            g.time = g.time + self.time_origin.reltime(g.time_origin)
            if g.defer_load:
                g.time_full = g.time_full + self.time_origin.reltime(
                    g.time_origin)
            g.time_origin = self.time_origin
        if not hasattr(self, 'UV'):
            if isinstance(self.U, SummedField):
                self.add_vector_field(SummedField('UV', self.U, self.V))
            elif isinstance(self.U, NestedField):
                self.add_vector_field(NestedField('UV', self.U, self.V))
            else:
                self.add_vector_field(VectorField('UV', self.U, self.V))
        if not hasattr(self, 'UVW') and hasattr(self, 'W'):
            if isinstance(self.U, SummedField):
                self.add_vector_field(
                    SummedField('UVW', self.U, self.V, self.W))
            elif isinstance(self.U, NestedField):
                self.add_vector_field(
                    NestedField('UVW', self.U, self.V, self.W))
            else:
                self.add_vector_field(
                    VectorField('UVW', self.U, self.V, self.W))

        ccode_fieldnames = []
        counter = 1
        for fld in self.get_fields():
            if fld.name not in ccode_fieldnames:
                fld.ccode_name = fld.name
            else:
                fld.ccode_name = fld.name + str(counter)
                counter += 1
            ccode_fieldnames.append(fld.ccode_name)
예제 #5
0
 def check_complete(self):
     assert (self.U), ('U field is not defined')
     assert (self.V), ('V field is not defined')
     ugrid = self.U.grid
     for g in self.gridset.grids:
         g.check_zonal_periodic()
         if g is ugrid or len(g.time) == 1:
             continue
         assert isinstance(
             g.time_origin, type(ugrid.time_origin)
         ), 'time origins of different grids must be have the same type'
         if g.time_origin:
             g.time = g.time + (g.time_origin -
                                ugrid.time_origin) / np.timedelta64(1, 's')
             if g.defer_load:
                 g.time_full = g.time_full + (
                     g.time_origin - ugrid.time_origin) / np.timedelta64(
                         1, 's')
             g.time_origin = ugrid.time_origin
     if not hasattr(self, 'UV'):
         self.add_vector_field(VectorField('UV', self.U, self.V))
     if not hasattr(self, 'UVW') and hasattr(self, 'W'):
         self.add_vector_field(VectorField('UVW', self.U, self.V, self.W))
예제 #6
0
def test_add_field_after_pset(pset_mode, fieldtype):
    data, dimensions = generate_fieldset(100, 100)
    fieldset = FieldSet.from_data(data, dimensions)
    pset = pset_type[pset_mode]['pset'](fieldset, ScipyParticle, lon=0, lat=0)  # noqa ; to trigger fieldset.check_complete
    field1 = Field('field1', fieldset.U.data, lon=fieldset.U.lon, lat=fieldset.U.lat)
    field2 = Field('field2', fieldset.U.data, lon=fieldset.U.lon, lat=fieldset.U.lat)
    vfield = VectorField('vfield', field1, field2)
    error_thrown = False
    try:
        if fieldtype == 'normal':
            fieldset.add_field(field1)
        elif fieldtype == 'vector':
            fieldset.add_vector_field(vfield)
    except RuntimeError:
        error_thrown = True

    assert error_thrown
예제 #7
0
 def eval(self, time, x, y, z):
     zonal = meridional = vertical = 0
     if self.W is not None:
         for (U, V, W) in zip(self.U, self.V, self.W):
             vfld = VectorField(self.name, U, V, W)
             vfld.fieldset = self.fieldset
             (tmp1, tmp2, tmp3) = vfld.eval(time, x, y, z)
             zonal += tmp1
             meridional += tmp2
             vertical += tmp3
         return (zonal, meridional, vertical)
     else:
         for (U, V) in zip(self.U, self.V):
             vfld = VectorField(self.name, U, V)
             vfld.fieldset = self.fieldset
             (tmp1, tmp2) = vfld.eval(time, x, y, z)
             zonal += tmp1
             meridional += tmp2
         return (zonal, meridional)
예제 #8
0
def test_vector_fields(pset_mode, mode, swapUV):
    lon = np.linspace(0., 10., 12, dtype=np.float32)
    lat = np.linspace(0., 10., 10, dtype=np.float32)
    U = np.ones((10, 12), dtype=np.float32)
    V = np.zeros((10, 12), dtype=np.float32)
    data = {'U': U, 'V': V}
    dimensions = {'U': {'lat': lat, 'lon': lon},
                  'V': {'lat': lat, 'lon': lon}}
    fieldset = FieldSet.from_data(data, dimensions, mesh='flat')
    if swapUV:  # we test that we can freely edit whatever UV field
        UV = VectorField('UV', fieldset.V, fieldset.U)
        fieldset.add_vector_field(UV)

    pset = pset_type[pset_mode]['pset'].from_line(fieldset, size=1, pclass=ptype[mode], start=(0.5, 0.5), finish=(0.5, 0.5))
    pset.execute(AdvectionRK4, dt=1, runtime=1)
    if swapUV:
        assert abs(pset.lon[0] - .5) < 1e-9
        assert abs(pset.lat[0] - 1.5) < 1e-9
    else:
        assert abs(pset.lon[0] - 1.5) < 1e-9
        assert abs(pset.lat[0] - .5) < 1e-9