The openLCA data model

The basic data model of openLCA is defined in the package org.openlca.core.model of the olca-core module. When you work with data in openLCA you will usually interact with the types of this package. In this section, we describe the basic data types and how they are related to each other. Each type is basically a Java class which you can access like a normal Python class from Jython. However, for the description of the data model we will use a simple notation where each type has a name and a set of properties which again have a type:

type TypeName {
    property      TypeOfProperty
    listProperty  List[TypeOfItems]
}

Note that we will not describe all types of the openLCA model and we will focus on the most important properties.

The basic inventory model

The openLCA data model is built around a basic inventory model which has the following components:

In this model, processes are the basic building blocks that describe the production of a material or energy, treatment of waste, provision of a service, etc. Each process has a set of exchanges that contain the inputs and outputs of flows like products, wastes, resources, and emissions of that process. The product flows (since openLCA 1.7 also waste flows) can be linked in a product system to specify the supply chain of a product or service - the functional unit of that product system. Such product systems are then used to calculate inventory and impact assessment results.

Units and unit groups

All quantitative amounts of the inputs and outputs in a process have a unit of measurement. In openLCA convertible units are organized in groups that have a reference unit to which the conversion factors of the units are related:

type Unit {
    name              String
    conversionFactor  double
    ...
}

type UnitGroup {
    name           String
    referenceUnit  Unit
    units          List[Unit]
    ...
}

Units and unit groups can be created in the following way:

import org.openlca.core.model as model

kg = model.Unit()
kg.name = 'kg'
kg.conversionFactor = 1.0

unitsOfMass = model.UnitGroup()
unitsOfMass.name = 'Units of mass'
unitsOfMass.referenceUnit = kg
unitsOfMass.units.add(kg)

Flows and flow properties

Flows are the things that are moved around as inputs and outputs (exchanges) of processes. When a process produces electricity and another process consumes electricity from the first process both processes will have an output exchange and input exchange with a reference to the same flow. The basic type definition of a flow looks like this:

type Flow {
    name                   String
    flowType               FlowType
    referenceFlowProperty  FlowProperty
    flowPropertyFactors    List[FlowPropertyFactor]
    ...
}

The flow type

The flowType property indicates whether the flow is a product, waste, or elementary flow. Product flows (and waste flows starting from openLCA 1.7) can link inputs and outputs of processes (like electricity) in a product system where elementary flows (like CO2) are the emissions and resources of the processes. Basically, in the calculation the flow type is used to decide whether to put an exchange amount into the technology matrix $A$ or the intervention matrix $B$ (see also the calculation section).

The type FlowType is an enumeration type with the following values: PRODUCT_FLOW, ELEMENTARY_FLOW, or WASTE_FLOW. When you create a flow, you can set the flow type in the following way:

import org.openlca.core.model as model

f = model.Flow()
f.flowType = model.FlowType.PRODUCT_FLOW
f.name = 'Liquid aluminium'

Flow properties

A flow in openLCA has physical properties (like mass or volume), called flow properties, in which the amount of a flow in a process exchange can be specified:

type FlowProperty {
    name              String
    flowPropertyType  FlowPropertyType
    unitGroup         UnitGroup
    ...
}

Like the FlowType the FlowPropertyType is an enumeration type and can have the following values: PHYSICAL and ECONOMIC. The flow property type is basically only used when physical and economic allocation factors of a process are calculating automatically. With this, a flow property can be created in the following way:

mass = model.FlowProperty()
mass.flowPropertyType = model.FlowPropertyType.PHYSICAL
mass.unitGroup = unitsOfMass

For a flow, all flow properties need to be convertible by a factor which is defined by the type FlowPropertyFactor:

type FlowPropertyFactor {
    conversionFactor  double
    flowProperty      FlowProperty
}

These conversion factors are related to the reference flow property (referenceFlowProperty) of the flow:

f.referenceFlowProperty = mass
massFactor = model.FlowPropertyFactor()
massFactor.conversionFactor = 1.0
massFactor.flowProperty = mass
f.flowPropertyFactors.add(massFactor)

Processes

A process describes the inputs and outputs (exchanges) related to a quantitative reference which is typically the output product of the process:

type Process {
    name                   String
    quantitativeReference  Exchange
    exchanges              List[Exchange]
    ...
}

An input or output is described by the type Exchange in openLCA:

type Exchange {
    input        boolean
    flow         Flow
    unit         Unit
    amountValue  double
    ...
}

The Boolean property input indicates whether the exchange is an input (True) or not (False). Each exchange has a flow (like steel or CO2), unit, and amount but also a flow property factor which indicates the physical quantity of the amount (not that there are different physical quantities that can have the same unit). The following example shows how we can create a process:

import org.openlca.core.model as model

p = model.Process()
p.name = 'Aluminium smelting'
output = model.Exchange()  # liquid aluminium
output.input = False
output.amountValue = 1000  # kg
p.exchanges.add(output)
p.quantitativeReference = output