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