def __init__(self, release_time=None, start_position=None, plume_data=None, end_release_time=None, **kwargs): ''' :param num_elements: total number of elements to be released :type num_elements: integer :param start_position: initial location the elements are released :type start_position: 3-tuple of floats (long, lat, z) :param release_time: time the LEs are released :type release_time: datetime.datetime :param start_positions: locations the LEs are released :type start_positions: (num_elements, 3) numpy array of float64 -- (long, lat, z) ''' super(VerticalPlumeRelease, self).__init__(release_time=release_time, **kwargs) self.start_position = np.array(start_position, dtype=world_point_type).reshape((3, )) plume = Plume(position=start_position, plume_data=plume_data) time_step_delta = timedelta(hours=1).total_seconds() self.plume_gen = PlumeGenerator(release_time=release_time, end_release_time=end_release_time, time_step_delta=time_step_delta, plume=plume) if self.num_elements: self.plume_gen.set_le_mass_from_total_le_count(self.num_elements)
def __init__(self, release_time, num_elements, start_position, plume_data, end_release_time, name=None): ''' :param num_elements: total number of elements to be released :type num_elements: integer :param start_position: initial location the elements are released :type start_position: 3-tuple of floats (long, lat, z) :param release_time: time the LEs are released :type release_time: datetime.datetime :param start_positions: locations the LEs are released :type start_positions: (num_elements, 3) numpy array of float64 -- (long, lat, z) ''' super(VerticalPlumeRelease, self).__init__(release_time, num_elements, name) self.start_position = np.array(start_position, dtype=world_point_type).reshape((3, )) plume = Plume(position=start_position, plume_data=plume_data) time_step_delta = timedelta(hours=1).total_seconds() self.plume_gen = PlumeGenerator(release_time=release_time, end_release_time=end_release_time, time_step_delta=time_step_delta, plume=plume) if self.num_elements: self.plume_gen.set_le_mass_from_total_le_count(self.num_elements)
class VerticalPlumeRelease(Release, Serializable): ''' An Underwater Plume spill class -- a continuous release of particles, controlled by a contained spill generator object. - plume model generator will have an iteration method. This will provide flexible looping and list comprehension behavior. ''' _state = copy.deepcopy(Release._state) # what kinds of customized state attributes would we like to add here? # _state.add(update=['start_position'], save=['start_position']) def __init__(self, release_time, num_elements, start_position, plume_data, end_release_time, name=None): ''' :param num_elements: total number of elements to be released :type num_elements: integer :param start_position: initial location the elements are released :type start_position: 3-tuple of floats (long, lat, z) :param release_time: time the LEs are released :type release_time: datetime.datetime :param start_positions: locations the LEs are released :type start_positions: (num_elements, 3) numpy array of float64 -- (long, lat, z) ''' super(VerticalPlumeRelease, self).__init__(release_time, num_elements, name) self.start_position = np.array(start_position, dtype=world_point_type).reshape((3, )) plume = Plume(position=start_position, plume_data=plume_data) time_step_delta = timedelta(hours=1).total_seconds() self.plume_gen = PlumeGenerator(release_time=release_time, end_release_time=end_release_time, time_step_delta=time_step_delta, plume=plume) if self.num_elements: self.plume_gen.set_le_mass_from_total_le_count(self.num_elements) def _plume_elem_coords(self, current_time, time_step): ''' Return a list of positions for all elements released within current_time + time_step ''' next_time = current_time + timedelta(seconds=time_step) elem_counts = self.plume_gen.elems_in_range(current_time, next_time) for coord, count in zip(self.plume_gen.plume.coords, elem_counts): for c in (coord,) * count: yield tuple(c) def num_elements_to_release(self, current_time, time_step): ''' Return number of particles released in current_time + time_step ''' return len([e for e in self._plume_elem_coords(current_time, time_step)]) def set_newparticle_positions(self, num_new_particles, current_time, time_step, data_arrays): ''' Set positions for new elements added by the SpillContainer ''' coords = [e for e in self._plume_elem_coords(current_time, time_step)] self.coords = np.asarray(tuple(coords), dtype=world_point_type).reshape((-1, 3)) if self.coords.shape[0] != num_new_particles: raise RuntimeError('The Specified number of new particals does not' ' match the number calculated from the ' 'time range.') self.num_released += num_new_particles data_arrays['positions'][-self.coords.shape[0]:, :] = self.coords
class VerticalPlumeRelease(Release): ''' An Underwater Plume spill class -- a continuous release of particles, controlled by a contained spill generator object. - plume model generator will have an iteration method. This will provide flexible looping and list comprehension behavior. ''' def __init__(self, release_time=None, start_position=None, plume_data=None, end_release_time=None, **kwargs): ''' :param num_elements: total number of elements to be released :type num_elements: integer :param start_position: initial location the elements are released :type start_position: 3-tuple of floats (long, lat, z) :param release_time: time the LEs are released :type release_time: datetime.datetime :param start_positions: locations the LEs are released :type start_positions: (num_elements, 3) numpy array of float64 -- (long, lat, z) ''' super(VerticalPlumeRelease, self).__init__(release_time=release_time, **kwargs) self.start_position = np.array(start_position, dtype=world_point_type).reshape((3, )) plume = Plume(position=start_position, plume_data=plume_data) time_step_delta = timedelta(hours=1).total_seconds() self.plume_gen = PlumeGenerator(release_time=release_time, end_release_time=end_release_time, time_step_delta=time_step_delta, plume=plume) if self.num_elements: self.plume_gen.set_le_mass_from_total_le_count(self.num_elements) def _plume_elem_coords(self, current_time, time_step): ''' Return a list of positions for all elements released within current_time + time_step ''' next_time = current_time + timedelta(seconds=time_step) elem_counts = self.plume_gen.elems_in_range(current_time, next_time) for coord, count in zip(self.plume_gen.plume.coords, elem_counts): for c in (coord, ) * count: yield tuple(c) def num_elements_to_release(self, current_time, time_step): ''' Return number of particles released in current_time + time_step ''' return len( [e for e in self._plume_elem_coords(current_time, time_step)]) def set_newparticle_positions(self, num_new_particles, current_time, time_step, data_arrays): ''' Set positions for new elements added by the SpillContainer ''' coords = [e for e in self._plume_elem_coords(current_time, time_step)] self.coords = np.asarray(tuple(coords), dtype=world_point_type).reshape((-1, 3)) if self.coords.shape[0] != num_new_particles: raise RuntimeError('The Specified number of new particals does not' ' match the number calculated from the ' 'time range.') self.num_released += num_new_particles data_arrays['positions'][-self.coords.shape[0]:, :] = self.coords