Source code for bw2calc.multi_lca

# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals, division
from eight import *

from .lca import LCA
from .utils import wrap_functional_unit
try:
    from bw2data import calculation_setups
except ImportError:
[docs] calculation_setups = None
import numpy as np
[docs] class MultiLCA(object): """Wrapper class for performing LCA calculations with many functional units and LCIA methods. Needs to be passed a ``calculation_setup`` name. This class does not subclass the `LCA` class, and performs all calculations upon instantiation. Initialization creates `self.results`, which is a NumPy array of LCA scores, with rows of functional units and columns of LCIA methods. Ordering is the same as in the `calculation_setup`. """ def __init__(self, cs_name, log_config=None): if calculation_setups is None: raise ImportError assert cs_name in calculation_setups try: cs = calculation_setups[cs_name] except KeyError: raise ValueError( "{} is not a known `calculation_setup`.".format(cs_name) )
[docs] self.func_units = cs['inv']
[docs] self.methods = cs['ia']
[docs] self.lca = LCA(demand=self.all, method=self.methods[0], log_config=log_config)
self.lca.logger.info({ 'message': 'Started MultiLCA calculation', 'methods': list(self.methods), 'functional units': [wrap_functional_unit(o) for o in self.func_units] }) self.lca.lci(factorize=True)
[docs] self.method_matrices = []
[docs] self.results = np.zeros((len(self.func_units), len(self.methods)))
for method in self.methods: self.lca.switch_method(method) self.method_matrices.append(self.lca.characterization_matrix) for row, func_unit in enumerate(self.func_units): self.lca.redo_lci(func_unit) for col, cf_matrix in enumerate(self.method_matrices): self.lca.characterization_matrix = cf_matrix self.lca.lcia_calculation() self.results[row, col] = self.lca.score @property
[docs] def all(self): """Get all possible databases by merging all functional units""" return {key: 1 for func_unit in self.func_units for key in func_unit}