def test_num_per_timestep_release_elements(self): 'release elements in the context of a spill container' # todo: need a test for a line release where rate is given - to check # positions are being initialized correctly end_time = self.rel_time + timedelta(hours=1) release = ContinuousRelease(self.rel_time, self.pos, num_per_timestep=100, initial_elements=1000, end_release_time=end_time) s = Spill(release) sc = SpillContainer() sc.spills += s sc.prepare_for_model_run() for ix in range(5): time = self.rel_time + timedelta(seconds=900 * ix) num_les = sc.release_elements(900, time) if time <= s.get('end_release_time'): if ix == 0: assert num_les == 1100 else: assert num_les == 100 assert sc.num_released == 100 + ix * 100 + 1000 else: assert num_les == 0
def test_init(element_type, amount): ''' Test various initializtions ''' spill = Spill(Release(release_time=datetime.now()), element_type=element_type, amount=amount, units='kg') if element_type is None: assert np.all(spill.get('windage_range') == (0.01, 0.04)) assert (spill.get('windage_persist') == 900) assert len(spill.get('initializers')) == 1 # add windages else: assert len(spill.get('initializers')) == 0 assert spill.name == 'Spill' assert spill.get('release_duration') == 0
def test_set_newparticle_positions(self): 'define two spatial releases and check positions are set correctly' sp2 = Spill(SpatialRelease(self.sp.release.release_time, ((0, 0, 0), (0, 0, 0)))) (data_arrays, num) = release_elements(self.sp, self.sp.release.release_time, 600) assert (self.sp.get('num_released') == self.sp.release.num_elements and self.sp.release.num_elements == num) (data_arrays, num2) = release_elements(sp2, sp2.release.release_time, 600, data_arrays) assert (sp2.get('num_released') == sp2.release.num_elements and len(data_arrays['positions']) == num2 + num) assert (np.all(data_arrays['positions'][:num, :] == self.sp.get('start_position'))) assert (np.all(data_arrays['positions'][num:, :] == sp2.get('start_position')))
def test_init(element_type, amount): ''' Test various initializtions ''' spill = Spill(Release(release_time=datetime.now()), element_type=element_type, amount=amount, units='kg' ) if element_type is None: assert np.all(spill.get('windage_range') == (0.01, 0.04)) assert (spill.get('windage_persist') == 900) assert len(spill.get('initializers')) == 1 # add windages else: assert len(spill.get('initializers')) == 0 assert spill.name == 'Spill' assert spill.get('release_duration') == 0
def test_set_newparticle_positions(self): 'define two spatial releases and check positions are set correctly' sp2 = Spill( SpatialRelease(self.sp.release.release_time, ((0, 0, 0), (0, 0, 0)))) (data_arrays, num) = release_elements(self.sp, self.sp.release.release_time, 600) assert (self.sp.get('num_released') == self.sp.release.num_elements and self.sp.release.num_elements == num) (data_arrays, num2) = release_elements(sp2, sp2.release.release_time, 600, data_arrays) assert (sp2.get('num_released') == sp2.release.num_elements and len(data_arrays['positions']) == num2 + num) assert (np.all( data_arrays['positions'][:num, :] == self.sp.get('start_position')) ) assert (np.all( data_arrays['positions'][num:, :] == sp2.get('start_position')))
def test_amount_mass_vol(amount, units): ''' ensure mass is being returned correctly when 'amount' is initialized wtih 'mass' or 'volume' ''' spill = Spill(Release(datetime.now()), amount=amount, units=units, substance=test_oil) assert spill.amount == amount assert spill.units == units if units in Spill.valid_vol_units: exp_mass = (spill.get('substance').get_density() * uc.convert('Volume', units, 'm^3', spill.amount)) else: exp_mass = uc.convert('Mass', units, 'kg', spill.amount) assert spill.get_mass() == exp_mass exp_mass_g = exp_mass * 1000 assert spill.get_mass('g') == exp_mass_g
def test_full_run(self): 'just check that all data arrays work correctly' s = Spill(InitElemsFromFile(testdata['nc']['nc_output'])) model = Model(start_time=s.get('release_time'), time_step=self.time_step.total_seconds(), duration=timedelta(days=2)) model.spills += s model.movers += RandomMover() # setup model run for step in model: if step['step_num'] == 0: continue for sc in model.spills.items(): for key in sc.data_arrays.keys(): # following keys will not change with run if key in ('status_codes', 'mass', 'id', 'spill_num', 'last_water_positions'): # all water map assert np.all(sc[key] == s.release._init_data[key]) else: assert np.any(sc[key] != s.release._init_data[key])
def test_num_per_timestep_release_elements(self): 'release elements in the context of a spill container' # todo: need a test for a line release where rate is given - to check # positions are being initialized correctly end_time = self.rel_time + timedelta(hours=1) release = PointLineRelease(self.rel_time, self.pos, num_per_timestep=100, end_release_time=end_time) s = Spill(release) sc = SpillContainer() sc.spills += s sc.prepare_for_model_run() for ix in range(5): time = self.rel_time + timedelta(seconds=900 * ix) num_les = sc.release_elements(900, time) if time <= s.get('end_release_time'): assert num_les == 100 assert sc.num_released == 100 + ix * 100 else: assert num_les == 0