def _run_on_fire(self, fire): if 'activity' not in fire: raise ValueError( "Missing activity data required for computing emissions") for aa in fire.active_areas: for loc in aa.locations: if 'fuelbeds' not in loc: raise ValueError( "Missing fuelbed data required for computing emissions" ) for fb in loc['fuelbeds']: if 'consumption' not in fb: raise ValueError( "Missing consumption data required for computing emissions" ) if 'fccs_id' not in fb: raise ValueError( "Missing FCCS Id required for computing emissions") fccs2ef = Fccs2Ef(fb["fccs_id"], is_rx=(fire["type"] == "rx")) calculator = EmissionsCalculator(fccs2ef, species=self.species) _calculate(calculator, fb, self.include_emissions_details) # Convert from lbs to tons # TODO: Update EFs to be tons/ton in a) eflookup package, # b) just after instantiating look-up objects, above, # or c) just before calling EmissionsCalculator, above datautils.multiply_nested_data(fb['emissions'], self.CONVERSION_FACTOR) if self.include_emissions_details: datautils.multiply_nested_data(fb['emissions_details'], self.CONVERSION_FACTOR)
def _run_fuelbed(fb, location, fuel_loadings_manager, season, burn_type, msg_level): fuel_loadings_csv_filename = fuel_loadings_manager.generate_custom_csv( fb['fccs_id']) fc = consume.FuelConsumption( fccs_file=fuel_loadings_csv_filename) #msg_level=msg_level) fb['fuel_loadings'] = fuel_loadings_manager.get_fuel_loadings( fb['fccs_id'], fc.FCCS) fc.burn_type = burn_type fc.fuelbed_fccs_ids = [fb['fccs_id']] fc.season = [season] # Note: if we end up running fc on all fuelbeds at once, use lists # for the rest # Note: consumption output is always returned in tons per acre # (see comment, below) and is linearly related to area, so the # consumption values are the same regardless of what we set # fuelbed_area_acres to. Released heat output, on the other hand, # is not linearly related to area, so we need to set area area = (fb['pct'] / 100.0) * location['area'] fc.fuelbed_area_acres = [area] fc.fuelbed_ecoregion = [location['ecoregion']] _apply_settings(fc, location, burn_type) _results = fc.results() if _results: # TODO: validate that _results['consumption'] and # _results['heat'] are defined fb['consumption'] = _results['consumption'] fb['consumption'].pop('debug', None) fb['heat'] = _results['heat release'] # Multiply each consumption value by area if output_inits is 'tons_ac' # Note: regardless of what fc.output_units is set to, it gets # reset to 'tons_ac' in the call to fc.results, and the output values # are the same (presumably always in tons_ac) # Also multiply heat by area, though we're currently not sure if the # units are in fact BTU per acre if fc.output_units == 'tons_ac': datautils.multiply_nested_data(fb["consumption"], area) datautils.multiply_nested_data(fb["heat"], area) else: # TODO: somehow get error information from fc object; when # you call fc.results() in an error situation, it writes to # stdout or stderr (?), something like: # # !!! Error settings problem, the following are required: # fm_type # it would be nice to access that error message here and # include it in the exception message raise RuntimeError("Failed to calculate consumption for " "fuelbed {}".format(fb['fccs_id']))
def _run_fuelbed(fb, location, fuel_loadings_manager, season, burn_type, msg_level): fuel_loadings_csv_filename = fuel_loadings_manager.generate_custom_csv( fb['fccs_id']) fc = consume.FuelConsumption( fccs_file=fuel_loadings_csv_filename) #msg_level=msg_level) fb['fuel_loadings'] = fuel_loadings_manager.get_fuel_loadings( fb['fccs_id'], fc.FCCS) fc.burn_type = burn_type fc.fuelbed_fccs_ids = [fb['fccs_id']] fc.season = [season] # Note: if we end up running fc on all fuelbeds at once, use lists # for the rest # Note: consume expects area, but disregards it when computing # consumption values - it produces tons per unit area (acre?), not # total tons; so, to avoid confution, just set it to 1 and # then correct the consumption values by multiplying by area, below area = (fb['pct'] / 100.0) * location['area'] fc.fuelbed_area_acres = [1] # see see note,above fc.fuelbed_ecoregion = [location['ecoregion']] _apply_settings(fc, location, burn_type) _results = fc.results() if _results: # TODO: validate that _results['consumption'] and # _results['heat'] are defined fb['consumption'] = _results['consumption'] fb['consumption'].pop('debug', None) fb['heat'] = _results['heat release'] # multiply each consumption and heat value by area if # output_inits is 'tons_ac', # TODO: multiple by area even if user sets output_units to 'tons', # because consume doesn't seem to be multiplying by area for us # even when 'tons' is specified if fc.output_units == 'tons_ac': datautils.multiply_nested_data(fb["consumption"], area) datautils.multiply_nested_data(fb["heat"], area) else: # TODO: somehow get error information from fc object; when # you call fc.results() in an error situation, it writes to # stdout or stderr (?), something like: # # !!! Error settings problem, the following are required: # fm_type # it would be nice to access that error message here and # include it in the exception message raise RuntimeError("Failed to calculate consumption for " "fuelbed {}".format(fb['fccs_id']))