Commit 43248a84 authored by Kai-Holger Brassel's avatar Kai-Holger Brassel
Browse files

Added units for carbon emissions correctly

parent 8c7a07e5
Pipeline #4042 passed with stage
in 2 minutes and 54 seconds
package de.hftstuttgart.cityunits.model;
import javax.measure.Quantity;
/**
* This interface represents total amounts of Carbon.
*/
public interface CarbonEmission extends Quantity<CarbonEmission>
{
}
\ No newline at end of file
...@@ -20,6 +20,10 @@ import tech.units.indriya.unit.TransformedUnit; ...@@ -20,6 +20,10 @@ import tech.units.indriya.unit.TransformedUnit;
import tech.units.indriya.unit.UnitDimension; import tech.units.indriya.unit.UnitDimension;
import tech.units.indriya.unit.Units; import tech.units.indriya.unit.Units;
/**
* See https://www.openhab.org/docs/concepts/units-of-measurement.html and
* https://github.com/unitsofmeasurement/uom-demos/blob/master/domain/energy/src/main/java/tech/uom/demo/energy/
*/
public class UrbanSimulationUnits extends AbstractSystemOfUnits { public class UrbanSimulationUnits extends AbstractSystemOfUnits {
private static final UrbanSimulationUnits INSTANCE = new UrbanSimulationUnits(); private static final UrbanSimulationUnits INSTANCE = new UrbanSimulationUnits();
...@@ -28,8 +32,11 @@ public class UrbanSimulationUnits extends AbstractSystemOfUnits { ...@@ -28,8 +32,11 @@ public class UrbanSimulationUnits extends AbstractSystemOfUnits {
return getClass().getSimpleName(); return getClass().getSimpleName();
} }
public static final Unit<Dimensionless> CO2EQ = addUnit(AbstractUnit.ONE);
public static final Unit<Mass> TON = addUnit(Units.KILOGRAM.multiply(1000)); public static final Unit<Mass> TON = addUnit(Units.KILOGRAM.multiply(1000));
public static final Unit<CarbonEmission> GRAM_CO2_EQUIVALENT = Units.GRAM.asType(CarbonEmission.class);
public static final Unit<CarbonEmission> KILOGRAM_CO2_EQUIVALENT = Units.KILOGRAM.asType(CarbonEmission.class);
public static final Unit<CarbonEmission> TON_CO2_EQUIVALENT = TON.asType(CarbonEmission.class);
public static final Unit<Dimensionless> PARTS_PER_MILLION = addUnit(new TransformedUnit<>(AbstractUnit.ONE, public static final Unit<Dimensionless> PARTS_PER_MILLION = addUnit(new TransformedUnit<>(AbstractUnit.ONE,
MultiplyConverter.ofRational(BigInteger.ONE, BigInteger.valueOf(1000000)))); MultiplyConverter.ofRational(BigInteger.ONE, BigInteger.valueOf(1000000))));
public static final Unit<Dimensionless> DECIBEL = addUnit(AbstractUnit.ONE.transform( public static final Unit<Dimensionless> DECIBEL = addUnit(AbstractUnit.ONE.transform(
...@@ -38,16 +45,16 @@ public class UrbanSimulationUnits extends AbstractSystemOfUnits { ...@@ -38,16 +45,16 @@ public class UrbanSimulationUnits extends AbstractSystemOfUnits {
new AlternateUnit<Intensity>(Units.WATT.divide(Units.SQUARE_METRE), "W/m²")); new AlternateUnit<Intensity>(Units.WATT.divide(Units.SQUARE_METRE), "W/m²"));
// To model costs I added monetary units quick and dirty as SI base units. // To model costs I added monetary units quick and dirty as SI base units.
// According to JavaDoc of AbstractUnit, // According to JavaDoc of AbstractUnit, monetary units should rather be implemented in an extra type hierarchy
// monetary units should rather be implemented in an extra type hierarchy below // below ComparableUnit.
// ComparableUnit.
public final static Dimension MONEY_DIMENSION = UnitDimension.parse('M'); public final static Dimension MONEY_DIMENSION = UnitDimension.parse('M');
public final static Unit<Euro> EURO = new BaseUnit<Euro>("€", MONEY_DIMENSION); public final static Unit<Euro> EURO = new BaseUnit<Euro>("€", MONEY_DIMENSION);
public final static Unit<Dollar> DOLLAR = new BaseUnit<Dollar>("$", MONEY_DIMENSION); public final static Unit<Dollar> DOLLAR = new BaseUnit<Dollar>("$", MONEY_DIMENSION);
static { static {
SimpleUnitFormat.getInstance().label(CO2EQ, "CO₂eq");
SimpleUnitFormat.getInstance().label(TON, "t"); SimpleUnitFormat.getInstance().label(TON, "t");
SimpleUnitFormat.getInstance().label(KILOGRAM_CO2_EQUIVALENT, "kg CO₂eq");
SimpleUnitFormat.getInstance().label(TON_CO2_EQUIVALENT, "t CO₂eq");
SimpleUnitFormat.getInstance().label(DECIBEL, "dB"); SimpleUnitFormat.getInstance().label(DECIBEL, "dB");
SimpleUnitFormat.getInstance().label(PARTS_PER_MILLION, "ppm"); SimpleUnitFormat.getInstance().label(PARTS_PER_MILLION, "ppm");
SimpleUnitFormat.getInstance().label(EURO, "€"); SimpleUnitFormat.getInstance().label(EURO, "€");
......
...@@ -13,6 +13,7 @@ import javax.measure.quantity.Mass; ...@@ -13,6 +13,7 @@ import javax.measure.quantity.Mass;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import de.hftstuttgart.cityunits.model.CarbonEmission;
import de.hftstuttgart.cityunits.model.UrbanSimulationUnits; import de.hftstuttgart.cityunits.model.UrbanSimulationUnits;
import tech.units.indriya.quantity.Quantities; import tech.units.indriya.quantity.Quantities;
import tech.units.indriya.unit.Units; import tech.units.indriya.unit.Units;
...@@ -68,10 +69,12 @@ class QuantityTest { ...@@ -68,10 +69,12 @@ class QuantityTest {
@Test @Test
void testCO2eq() { void testCO2eq() {
Quantity<Mass> q = Quantities.getQuantity((String) "5200.5 kg·CO₂eq").asType(Mass.class); Quantity<CarbonEmission> q = Quantities.getQuantity((String) "5200.7 kg CO₂eq").asType(CarbonEmission.class);
assertEquals("[M]", q.getUnit().getDimension().toString(), "Wrong dimension!"); assertEquals("[M]", q.getUnit().getDimension().toString(), "Wrong dimension!");
assertTrue(q.isEquivalentTo(Quantities.getQuantity((String) "5.2005 t·CO₂eq").asType(Mass.class)), assertTrue(q.isEquivalentTo(Quantities.getQuantity((String) "5.2007 t CO₂eq").asType(CarbonEmission.class)),
"Wrong conversion from kg of CO₂eq to ton of CO₂eq!"); "Wrong conversion from kg of CO₂eq to ton of CO₂eq!");
assertTrue(q.isEquivalentTo(Quantities.getQuantity((String) "5200700 g CO₂eq").asType(CarbonEmission.class)),
"Wrong conversion from kg of CO₂eq to gram of CO₂eq!");
} }
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment