def test_dissolution_k_ow(oil, temp, num_elems, k_ow, on): ''' Here we are testing that the molar averaged oil/water partition coefficient (K_ow) is getting calculated with reasonable values ''' et = floating(substance=oil) diss = Dissolution(waves) (sc, time_step) = weathering_data_arrays(diss.array_types, water, element_type=et, num_elements=num_elems)[:2] print 'num spills:', len(sc.spills) print 'spill[0] amount:', sc.spills[0].amount # we don't want to query the oil database, but get the sample oil assert sc.spills[0].element_type.substance.record.id is None model_time = (sc.spills[0].release_time + timedelta(seconds=time_step)) diss.on = on diss.prepare_for_model_run(sc) diss.initialize_data(sc, sc.num_released) diss.prepare_for_model_step(sc, time_step, model_time) diss.weather_elements(sc, time_step, model_time) assert all(np.isclose(sc._data_arrays['partition_coeff'], k_ow))
def test_dissolution_mass_balance(oil, temp, num_elems, expected_mb, on): ''' Fuel Oil #6 does not exist... ''' et = floating(substance=oil) diss = Dissolution(waves) (sc, time_step) = weathering_data_arrays(diss.array_types, water, element_type=et, num_elements=num_elems)[:2] print 'num spills:', len(sc.spills) print 'spill[0] amount:', sc.spills[0].amount model_time = (sc.spills[0].get('release_time') + timedelta(seconds=time_step)) diss.on = on diss.prepare_for_model_run(sc) diss.initialize_data(sc, sc.num_released) diss.prepare_for_model_step(sc, time_step, model_time) diss.weather_elements(sc, time_step, model_time) if on: assert np.isclose(sc.mass_balance['dissolution'], expected_mb) else: assert 'dissolution' not in sc.mass_balance
def test_dissolution(oil, temp, num_elems, on): ''' Fuel Oil #6 does not exist... ''' et = floating(substance=oil) diss = Dissolution(waves) (sc, time_step) = weathering_data_arrays(diss.array_types, water, element_type=et, num_elements=num_elems)[:2] print 'num spills:', len(sc.spills) print 'spill[0] amount:', sc.spills[0].amount model_time = (sc.spills[0].get('release_time') + timedelta(seconds=time_step)) diss.on = on diss.prepare_for_model_run(sc) diss.initialize_data(sc, sc.num_released) diss.prepare_for_model_step(sc, time_step, model_time) diss.weather_elements(sc, time_step, model_time) if on: print sc._data_arrays assert all(np.isclose(sc._data_arrays['partition_coeff'], 511.445)) assert sc.mass_balance['dissolution'] > 0 print "sc.mass_balance['dissolution']" print sc.mass_balance['dissolution'] else: assert 'dissolution' not in sc.mass_balance
def test_dissolution_droplet_size(oil, temp, num_elems, drop_size, on): ''' Here we are testing that the molar averaged oil/water partition coefficient (K_ow) is getting calculated with reasonable values ''' et = floating(substance=oil) disp = NaturalDispersion(waves, water) diss = Dissolution(waves) (sc, time_step) = weathering_data_arrays(diss.array_types, water, element_type=et, num_elements=num_elems)[:2] print 'num_spills:', len(sc.spills) print 'spill[0] amount:', sc.spills[0].amount, sc.spills[0].units model_time = (sc.spills[0] .release_time + timedelta(seconds=time_step)) print 'model_time = ', model_time print 'time_step = ', time_step # we don't want to query the oil database, but get the sample oil assert sc.spills[0].element_type.substance.record.id is None disp.on = on diss.on = on disp.prepare_for_model_run(sc) diss.prepare_for_model_run(sc) disp.initialize_data(sc, sc.num_released) diss.initialize_data(sc, sc.num_released) for i in range(3): disp.prepare_for_model_step(sc, time_step, model_time) diss.prepare_for_model_step(sc, time_step, model_time) disp.weather_elements(sc, time_step, model_time) diss.weather_elements(sc, time_step, model_time) print 'droplet_avg_size:', sc._data_arrays['droplet_avg_size'] assert np.allclose(sc._data_arrays['droplet_avg_size'], drop_size[i])
def test_dissolution_droplet_size(oil, temp, num_elems, drop_size, on): ''' Here we are testing that the molar averaged oil/water partition coefficient (K_ow) is getting calculated with reasonable values ''' et = floating(substance=oil) disp = NaturalDispersion(waves, water) diss = Dissolution(waves, wind) (sc, time_step) = weathering_data_arrays(diss.array_types, water, element_type=et, num_elements=num_elems)[:2] print 'num_spills:', len(sc.spills) print 'spill[0] amount:', sc.spills[0].amount, sc.spills[0].units model_time = (sc.spills[0] .release_time + timedelta(seconds=time_step)) print 'model_time = ', model_time print 'time_step = ', time_step # we don't want to query the oil database, but get the sample oil assert sc.spills[0].element_type.substance.record.id is None disp.on = on diss.on = on disp.prepare_for_model_run(sc) diss.prepare_for_model_run(sc) disp.initialize_data(sc, sc.num_released) diss.initialize_data(sc, sc.num_released) for i in range(3): disp.prepare_for_model_step(sc, time_step, model_time) diss.prepare_for_model_step(sc, time_step, model_time) disp.weather_elements(sc, time_step, model_time) diss.weather_elements(sc, time_step, model_time) print 'droplet_avg_size:', sc._data_arrays['droplet_avg_size'] assert np.allclose(sc._data_arrays['droplet_avg_size'], drop_size[i])
def test_dissolution_not_active(oil, temp, num_elems): ''' Fuel Oil #6 does not exist... ''' diss = Dissolution(waves) et = floating(substance=oil) (sc, time_step) = weathering_data_arrays(diss.array_types, water, element_type=et)[:2] sc.amount = 10000 model_time = (sc.spills[0].get('release_time') + timedelta(seconds=time_step)) diss.prepare_for_model_run(sc) new_model_time = (sc.spills[0].get('release_time') + timedelta(seconds=3600)) diss.active_start = new_model_time diss.prepare_for_model_step(sc, time_step, model_time) diss.weather_elements(sc, time_step, model_time) assert np.all(sc.mass_balance['dissolution'] == 0)
def test_dissolution_k_ow(oil, temp, num_elems, k_ow, on): ''' Here we are testing that the molar averaged oil/water partition coefficient (K_ow) is getting calculated with reasonable values Note: for now droplets are calculated in natural dispersion so natural dispersion is required for the dissolution algorithm ''' diss = Dissolution(waves, wind) disp = NaturalDispersion(waves, water) (sc, time_step) = weathering_data_arrays(diss.array_types, water, substance=oil, num_elements=num_elems)[:2] print 'num spills:', len(sc.spills) print 'spill[0] amount:', sc.spills[0].amount # we don't want to query the oil database, but get the sample oil #assert sc.spills[0].substance.record.id is None model_time = (sc.spills[0].release_time + timedelta(seconds=time_step)) disp.on = on diss.on = on disp.prepare_for_model_run(sc) diss.prepare_for_model_run(sc) disp.initialize_data(sc, sc.num_released) diss.initialize_data(sc, sc.num_released) disp.prepare_for_model_step(sc, time_step, model_time) diss.prepare_for_model_step(sc, time_step, model_time) disp.weather_elements(sc, time_step, model_time) diss.weather_elements(sc, time_step, model_time) assert all(np.isclose(sc._data_arrays['partition_coeff'], k_ow))
def test_dissolution_mass_balance(oil, temp, wind_speed, num_elems, expected_mb, on): ''' Test a single dissolution step. - for this, we need a dispersion weatherer to give us a droplet size distribution. Fuel Oil #6 does not exist... ''' waves = build_waves_obj(wind_speed, 'knots', 270, temp) wind = waves.wind water = waves.water disp = NaturalDispersion(waves, water) diss = Dissolution(waves, wind) all_array_types = diss.array_types.union(disp.array_types) (sc, time_step) = weathering_data_arrays(all_array_types, water, num_elements=num_elems, units='kg', amount_per_element=1.0 )[:2] print 'time_step: {}'.format(time_step) print 'num spills:', len(sc.spills) print 'spill[0] amount: {} {}'.format(sc.spills[0].amount, sc.spills[0].units) print 'temperature = ', temp print 'wind = ', print '\n'.join(['\t{} {}'.format(ts[1][0], waves.wind.units) for ts in waves.wind.timeseries]) print # we don't want to query the oil database, but get the sample oil #assert sc.spills[0].substance.record.id is None initial_amount = sc.spills[0].amount model_time = (sc.spills[0].release_time + timedelta(seconds=time_step)) disp.on = on disp.prepare_for_model_run(sc) disp.initialize_data(sc, sc.num_released) diss.on = on diss.prepare_for_model_run(sc) diss.initialize_data(sc, sc.num_released) disp.prepare_for_model_step(sc, time_step, model_time) diss.prepare_for_model_step(sc, time_step, model_time) disp.weather_elements(sc, time_step, model_time) diss.weather_elements(sc, time_step, model_time) if on: print ('fraction dissolved: {}' .format(sc.mass_balance['dissolution'] / initial_amount) ) print ('fraction dissolved: {:.2%}' .format(sc.mass_balance['dissolution'] / initial_amount) ) print sc.mass_balance['dissolution'], expected_mb assert np.isclose(sc.mass_balance['dissolution'], expected_mb, rtol=1e-4) else: assert 'dissolution' not in sc.mass_balance
def test_dissolution_mass_balance(oil, temp, wind_speed, num_elems, expected_mb, on): ''' Test a single dissolution step. - for this, we need a dispersion weatherer to give us a droplet size distribution. Fuel Oil #6 does not exist... ''' et = floating(substance=oil) waves = build_waves_obj(wind_speed, 'knots', 270, temp) water = waves.water disp = NaturalDispersion(waves, water) diss = Dissolution(waves) all_array_types = diss.array_types.union(disp.array_types) (sc, time_step) = weathering_data_arrays(all_array_types, water, element_type=et, num_elements=num_elems, units='kg', amount_per_element=1.0 )[:2] print 'time_step: {}'.format(time_step) print 'num spills:', len(sc.spills) print 'spill[0] amount: {} {}'.format(sc.spills[0].amount, sc.spills[0].units) print 'temperature = ', temp print 'wind = ', print '\n'.join(['\t{} {}'.format(ts[1][0], waves.wind.units) for ts in waves.wind.timeseries]) print # we don't want to query the oil database, but get the sample oil assert sc.spills[0].element_type.substance.record.id is None initial_amount = sc.spills[0].amount model_time = (sc.spills[0].release_time + timedelta(seconds=time_step)) disp.on = on disp.prepare_for_model_run(sc) disp.initialize_data(sc, sc.num_released) diss.on = on diss.prepare_for_model_run(sc) diss.initialize_data(sc, sc.num_released) disp.prepare_for_model_step(sc, time_step, model_time) diss.prepare_for_model_step(sc, time_step, model_time) disp.weather_elements(sc, time_step, model_time) diss.weather_elements(sc, time_step, model_time) if on: print ('fraction dissolved: {}' .format(sc.mass_balance['dissolution'] / initial_amount) ) print ('fraction dissolved: {:.2%}' .format(sc.mass_balance['dissolution'] / initial_amount) ) print sc.mass_balance['dissolution'], expected_mb assert np.isclose(sc.mass_balance['dissolution'], expected_mb) else: assert 'dissolution' not in sc.mass_balance