From 94c9d9af0f6ad45f9514335e9ec28923d589a931 Mon Sep 17 00:00:00 2001
From: stefan meyer <stefan.meyer@student.tugraz.at>
Date: Wed, 6 Sep 2017 16:04:18 +0200
Subject: [PATCH] part 2 of refactoring. Bug fixing

---
 .../UnitTests/M11Tests.vb                     |   4 +-
 .../VectoCommon/Utils/IntExtensionMethods.cs  |   2 +-
 VectoCommon/VectoCommon/Utils/SI.cs           | 376 ++++++++++--------
 VectoCommon/VectoCommon/Utils/SIUtils.cs      | 257 ++++++++++--
 .../OutputData/XML/XMLDeclarationReport.cs    | 230 +++++------
 VectoCore/VectoCoreTest/Utils/SITest.cs       |  37 +-
 6 files changed, 548 insertions(+), 358 deletions(-)

diff --git a/VECTOAux/VectoAuxiliariesTests/UnitTests/M11Tests.vb b/VECTOAux/VectoAuxiliariesTests/UnitTests/M11Tests.vb
index c18a62a928..f56000de74 100644
--- a/VECTOAux/VectoAuxiliariesTests/UnitTests/M11Tests.vb
+++ b/VECTOAux/VectoAuxiliariesTests/UnitTests/M11Tests.vb
@@ -64,8 +64,10 @@ Namespace UnitTests
 			Assert.AreEqual(target.SmartElectricalTotalCycleElectricalEnergyGeneratedDuringOverrunOnly.Value(), OUT1, 0.00001)
 			Assert.AreEqual(target.SmartElectricalTotalCycleEletricalEnergyGenerated.Value(), OUT2, 0.00001)
 			Assert.AreEqual(target.TotalCycleElectricalDemand.Value(), OUT3, 0.00001)
+		    'Assert.AreEqual(target.TotalCycleFuelConsumptionSmartElectricalLoad.ConvertTo().Gramm, OUT4, 0.00001)
             Assert.AreEqual(target.TotalCycleFuelConsumptionSmartElectricalLoad.ConvertTo(Unit.SI.Gramm), OUT4, 0.00001)
-            Assert.AreEqual(target.TotalCycleFuelConsumptionZeroElectricalLoad.Value(), OUT5.SI().Gramm.Value(), 0.00001)
+            'Assert.AreEqual(target.TotalCycleFuelConsumptionZeroElectricalLoad.Value(), OUT5.SI().Gramm.Value(), 0.00001)
+		    Assert.AreEqual(target.TotalCycleFuelConsumptionZeroElectricalLoad.Value(), OUT5.SI(Unit.SI.Gramm).Value(), 0.00001)
 			Assert.AreEqual(target.StopStartSensitiveTotalCycleElectricalDemand.Value(), OUT6, 0.00001)
 		End Sub
 
diff --git a/VectoCommon/VectoCommon/Utils/IntExtensionMethods.cs b/VectoCommon/VectoCommon/Utils/IntExtensionMethods.cs
index d1c4555a68..71b2bb0cc2 100644
--- a/VectoCommon/VectoCommon/Utils/IntExtensionMethods.cs
+++ b/VectoCommon/VectoCommon/Utils/IntExtensionMethods.cs
@@ -48,7 +48,7 @@ namespace TUGraz.VectoCommon.Utils
 
         public static SI SI(this int value, UnitInstance si)
         {
-            return new SI(si,value*si.Getfactor());
+            return new SI(si,value);
         }
 
         /// <summary>
diff --git a/VectoCommon/VectoCommon/Utils/SI.cs b/VectoCommon/VectoCommon/Utils/SI.cs
index 4a79df5208..ec96cd20ba 100644
--- a/VectoCommon/VectoCommon/Utils/SI.cs
+++ b/VectoCommon/VectoCommon/Utils/SI.cs
@@ -1054,43 +1054,45 @@ namespace TUGraz.VectoCommon.Utils
 		protected readonly double Val;
 
 
-	    /// <summary>
-	    /// The array of the SI units.
-	    /// </summary>
-	    protected int[] SIUnits;
+        /// <summary>
+        /// The array of the SI units.
+        /// </summary>
+        protected int[] SIUnits;
+
+        protected UnitInstance.IsMass isMass;
 
 
         /// <summary>
         /// The current exponent for conversion operations (Square, Cubic, Linear, e.g. new SI(3).Square.Meter).
         /// Can be reseted with Reset, Per, Cast.
         /// </summary>
-        private readonly int _exponent;
-
-		/// <summary>
-		/// A flag indicating if the current SI is in reciprocal mode (used in the <see cref="Per"/> method for reciprocal units: e.g. new SI(2).Meter.Per.Second) ==> [m/s]
-		/// Can be reseted with Reset, Per, Cast.
-		/// </summary>
-		private readonly bool _reciproc;
+        //private readonly int _exponent;
 
-		/// <summary>
-		/// A flag indicating if the current SI is in reverse mode (used for conversions: e.g. new SI(2).Rounds.Per.Minute.ConverTo.Radian.Per.Second ==> [rpm/min] => [rad/s]).
-		/// </summary>
-		private readonly bool _reverse;
+        /// <summary>
+        /// A flag indicating if the current SI is in reciprocal mode (used in the <see cref="Per"/> method for reciprocal units: e.g. new SI(2).Meter.Per.Second) ==> [m/s]
+        /// Can be reseted with Reset, Per, Cast.
+        /// </summary>
+        //private readonly bool _reciproc;
 
-		/// <summary>
-		/// Enum for defining the Units.
-		/// </summary>
-		[SuppressMessage("ReSharper", "InconsistentNaming")]
-		protected enum Unit
-		{
-		    kg,
-		    m,
-		    s,
-		    A,
-		    K,
-		    mol,
-		    cd,
-		}
+        /// <summary>
+        /// A flag indicating if the current SI is in reverse mode (used for conversions: e.g. new SI(2).Rounds.Per.Minute.ConverTo.Radian.Per.Second ==> [rpm/min] => [rad/s]).
+        /// </summary>
+        //private readonly bool _reverse;
+
+        ///// <summary>
+        ///// Enum for defining the Units.
+        ///// </summary>
+        //[SuppressMessage("ReSharper", "InconsistentNaming")]
+        //protected enum Unit
+        //{
+        //    kg,
+        //    m,
+        //    s,
+        //    A,
+        //    K,
+        //    mol,
+        //    cd,
+        //}
 
 
         /// <summary>
@@ -1101,12 +1103,13 @@ namespace TUGraz.VectoCommon.Utils
         public SI(double val = 0.0)
         {
             Val = val;
-            _reciproc = false;
-            _reverse = false;
+
+            //_reciproc = false;
+            //_reverse = false;
 
             SIUnits = new int[7] { 0, 0, 0, 0, 0, 0, 0 };
 
-            _exponent = 1;
+            //_exponent = 1;
 
             if (double.IsNaN(val))
             {
@@ -1128,13 +1131,15 @@ namespace TUGraz.VectoCommon.Utils
         /// <param name="reciproc">if set to <c>true</c> then the object is in reciproc mode (1/...)</param>
         /// <param name="reverse">if set to <c>true</c> then the object is in reverse convertion mode (e.g. rpm/min => rad/s).</param>
         /// <param name="exponent">The exponent for further conversions (e.g. Square.Meter).</param>
-        protected SI(double val, int[] siunits, bool reciproc = false,
-            bool reverse = false, int exponent = 1)
+        //protected SI(double val, int[] siunits, bool reciproc = false,
+        //    bool reverse = false, int exponent = 1)
+        protected SI(double val, int[] siunits, UnitInstance.IsMass isMassParam)
         {
             Val = val;
-            _reciproc = reciproc;
-            _reverse = reverse;
-            _exponent = exponent;
+            isMass = isMassParam;
+            //_reciproc = reciproc;
+            //_reverse = reverse;
+            //_exponent = exponent;
 
             SIUnits = siunits;
 
@@ -1150,7 +1155,9 @@ namespace TUGraz.VectoCommon.Utils
             }
         }
 
-	    public SI(UnitInstance si, double val = 0) : this(val, si.GetSIUnits()){}
+	    public SI(UnitInstance si, double val = 0) : this(val * si.Getfactor, si.GetSIUnits(),si.GetGrammMode()){
+       
+        }
 
         /// <summary>
         /// Initializes a new instance of the <see cref="SI"/> class which copies the units from an already existing SI.
@@ -1158,75 +1165,87 @@ namespace TUGraz.VectoCommon.Utils
         /// <param name="val">The value.</param>
         /// <param name="unit">The unit.</param>
         [DebuggerHidden]
-        private SI(double val, SI unit) : this(val, unit.SIUnits){}
+        private SI(double val, SI unit) : this(val, unit.SIUnits, unit.isMass) {}
 
         //[DebuggerHidden]
-        protected SI(SI si, double? factor = null, int[] siUnitsParam = null,
-            bool? reciproc = null, bool? reverse = null, int? exponent = null)
+        //protected SI(SI si, double? factor = null, int[] siUnitsParam = null,
+        //    bool? reciproc = null, bool? reverse = null, int? exponent = null)
+	    protected SI(SI si, double factor , int[] siUnitsParam, int exponent, bool reverse, UnitInstance.IsMass isMassParam)
         {
 
-            Val = si.Val;
-            _reciproc = reciproc ?? si._reciproc;
-            _reverse = reverse ?? si._reverse;
-            _exponent = exponent ?? si._exponent;
+            // Val = si.Val;
+            Val = si.Val * factor;
+            isMass = isMassParam;
+            SIUnits = siUnitsParam;
+            //_reciproc = reciproc ?? si._reciproc;
+            //_reverse = reverse ?? si._reverse;
+            //_exponent = exponent ?? si._exponent;
 
 
-            if (siUnitsParam == null) //////////////????
-            {
-                siUnitsParam = new int[] { 0, 0, 0, 0, 0, 0, 0 };
-            }
+            //if (siUnitsParam == null) //////////////????
+            //{
+            //    siUnitsParam = new int[] { 0, 0, 0, 0, 0, 0, 0 };
+            //}
 
-            if (_reciproc)
-            {
-                siUnitsParam = SIUtils.SIUnitsMultFactor(siUnitsParam, -1); 
-            }
 
-            if (_reverse)
-            {
-                // compare the si Units
-                if (!SIUtils.CompareSIUnits(siUnitsParam, si.SIUnits))
-                {
-                    throw new VectoException(
-                        "Unit missing. Conversion not possible. [{0}] does not contain a [{1}].",
-                        GetUnitString(siUnitsParam), si.GetUnitString());
-                }
+            ////if (_reciproc)
+            ////{
+            ////siUnitsParam = SIUtils.SIUnitsMultFactor(siUnitsParam, -1); 
+            ////}
 
-                SIUnits = si.SIUnits;
+            ////if (_reverse)
+            //if (reverse)
+            //{
+            //    // compare the si Units
+            //    if (!SIUtils.CompareSIUnits(siUnitsParam, si.SIUnits))
+            //    {
+            //        throw new VectoException(
+            //            "Unit missing. Conversion not possible. [{0}] does not contain a [{1}].",
+            //            GetUnitString(siUnitsParam), si.GetUnitString());
+            //    }
 
-                factor = 1 / factor;
+            //    SIUnits = si.SIUnits;
 
-                //_reverse = false;
+            //    factor = 1 / factor;
 
-            }
-            else
-            {
-                SIUnits = SIUtils.AdditionTheSIUnits(si.SIUnits, SIUtils.SIUnitsMultFactor(siUnitsParam, _exponent));
-            }
+            //    ////_reverse = false;
 
+            //}
+            //else
+            //{
+            //SIUnits = SIUtils.AdditionTheSIUnits(si.SIUnits, siUnitsParam);
 
-            if (_reciproc)
-            {
-                if (factor.HasValue)
-                {
-                    //Val /= (factor.Value * _exponent);
-                    Val /= Math.Pow(factor.Value, _exponent);
-                }
+            //    //SIUnits = SIUtils.AdditionTheSIUnits(si.SIUnits, SIUtils.SIUnitsMultFactor(siUnitsParam, _exponent));
+            //}
+
+
+            //if (_reciproc)
+            //{
+            //    if (factor.HasValue)
+            //    {
+            //        //Val /= (factor.Value * _exponent);
+            //        Val /= Math.Pow(factor.Value, _exponent);
+            //    }
+
+            //}
+            //else
+            //{
+            //    if (factor.HasValue)
+            //    {
+            //        //Val *= (factor.Value * _exponent);
+            //   Val *= Math.Pow(factor, exponent);
+            //    }
+            //}
+
+            //if (_reverse)
+            //if (reverse)
+            //{
+            //   // Val /= factor;
+            //    //Val /= factor.Value;
+            //    //_reverse = false;
+            //}
 
-            }
-            else
-            {
-                if (factor.HasValue)
-                {
-                    //Val *= (factor.Value * _exponent);
-                    Val *= Math.Pow(factor.Value, _exponent);
-                }
-            }
 
-            if (_reverse)
-            {
-                Val /= factor.Value;
-                _reverse = false;
-            }
 
             if (double.IsNaN(Val))
             {
@@ -1258,14 +1277,41 @@ namespace TUGraz.VectoCommon.Utils
 	    public SI ConvertTo(UnitInstance si)
 	    {
 
-	        double factorValue = si.Getfactor();
-	        if (si.GetGrammMode() == UnitInstance.GrammMode.Gramm)
+	        if (!SIUtils.CompareSIUnits(SIUnits, si.GetSIUnits()))
 	        {
-	            factorValue *= 1000.0;
+	            throw new VectoException(
+	                "Unit missing. Conversion not possible. [{0}] does not contain a [{1}].",
+	                GetUnitString(SIUnits), si.GetSIUnits());
 	        }
-	        return new SI(this, siUnitsParam: si.GetSIUnits(), factor: factorValue,
-	            exponent: 1, reciproc: false, reverse: true);
-	    }
+
+            double factorValue = si.Getfactor;
+            int exp = si.GetExponent;
+
+
+	        if ((isMass & UnitInstance.IsMass.IsGramm) == UnitInstance.IsMass.IsGramm)
+	        {
+	            factorValue /= 1000;
+	        }
+
+	        if((si.GetGrammMode() & UnitInstance.IsMass.IsGramm) == UnitInstance.IsMass.IsGramm)
+            {
+                factorValue *= 1000;
+                isMass |= UnitInstance.IsMass.IsGramm;
+            }
+
+            //if (si.GetGrammMode() == UnitInstance.GrammMode.Gramm)
+            //{
+            //    factorValue *= 1000.0;
+            //}
+            //if ((si.GetGrammMode() & UnitInstance.IsMass.IsGramm) == UnitInstance.IsMass.IsGramm)
+            //{
+            //    factorValue *= 1000.0;
+            //}
+            //return new SI(this, siUnitsParam: si.GetSIUnits(), factor: factorValue,
+            // exponent: 1, reciproc: false, reverse: true);
+            return new SI(this, siUnitsParam: si.GetSIUnits(), factor: factorValue, exponent: exp,
+                reverse: true, isMassParam: isMass);
+        }
 
         /// <summary>
         /// Casts the SI Unit to the concrete unit type (if the units allow such an cast).
@@ -1289,7 +1335,7 @@ namespace TUGraz.VectoCommon.Utils
         /// </summary>
         public SI ToBasicUnits()
 		{
-		    return new SI(Val, SIUnits);
+		    return new SI(Val, SIUnits,isMass);
 		}
 
 
@@ -1307,7 +1353,7 @@ namespace TUGraz.VectoCommon.Utils
 		/// </summary>
 		public SI Clone()
 		{
-		    return new SI(Val, SIUnits);
+		    return new SI(Val, SIUnits,isMass);
         }
 
 		/// <summary>
@@ -1653,7 +1699,7 @@ namespace TUGraz.VectoCommon.Utils
             int[] unitArray = new int[7];
             unitArray = SIUtils.AdditionTheSIUnits(si1.SIUnits, si2.SIUnits);
 
-            return new SI(si1.Val * si2.Val, unitArray);
+            return new SI(si1.Val * si2.Val, unitArray, si1.isMass);
         }
 
         /// <summary>
@@ -1721,7 +1767,7 @@ namespace TUGraz.VectoCommon.Utils
 	        unitArray = SIUtils.AdditionTheSIUnits(
 	            si1.SIUnits, SIUtils.SIUnitsMultFactor(si2.SIUnits, -1));
 
-	        return new SI(result, unitArray);
+	        return new SI(result, unitArray, si1.isMass);
 	    }
 
         /// <summary>
@@ -1988,68 +2034,75 @@ namespace TUGraz.VectoCommon.Utils
 		/// </summary>
 	    public string GetUnitString(int[] SIUnitParam = null)
 	    {
-	        Array unitnames = Enum.GetNames(typeof(Unit));
-	        string numerator = "";
-	        string denominator = "";
-	        int potent = 0;
-	        string potentStr = "";
-
             if (SIUnitParam == null)
             {
                 SIUnitParam = SIUnits;
             }
-	        for (var i = 0; i < SIUnitParam.Length; i++)
-	        {
-	            int currentValue = SIUnitParam[i];
-	            potent = Math.Abs(currentValue);
-	            potentStr = "";
-	            if (currentValue != 0)
-	            {
-	                string currentUnit = (string)unitnames.GetValue(i);
-
-	                if (potent > 1)
-	                {
-	                    potentStr = "^" + potent;
-	                }
-
-	                if (currentValue > 0)
-	                {
-	                    numerator += currentUnit + potentStr;
-
-	                }
-	                else if (currentValue < 0)
-	                {
-	                    denominator += currentUnit + potentStr;
-	                }
-	            }
-	        }
-	        string result = "";
-
-	        if (numerator == "")
-	        {
-	            if (denominator == "")
-	            {
-	                result = "-";
-	            }
-	            else
-	            {
-	                result = "1/" + denominator;
-	            }
-	        }
-	        else
-	        {
-	            if (denominator == "")
-	            {
-	                result = numerator;
-	            }
-	            else
-	            {
-	                result = numerator + "/" + denominator;
-	            }
-	        }
-
-	        return result;
-	    }
+	        return Unit.GetUnitString(SIUnitParam,
+                ((isMass & UnitInstance.IsMass.IsGramm) == UnitInstance.IsMass.IsGramm));
+            //return Unit.GetUnitString(SIUnitParam);
+            //Array unitnames = Enum.GetNames(typeof(Unit));
+            //string numerator = "";
+            //string denominator = "";
+            //int potent = 0;
+            //string potentStr = "";
+
+            //   if (SIUnitParam == null)
+            //   {
+            //       SIUnitParam = SIUnits;
+            //   }
+            //for (var i = 0; i < SIUnitParam.Length; i++)
+            //{
+            //    int currentValue = SIUnitParam[i];
+            //    potent = Math.Abs(currentValue);
+            //    potentStr = "";
+            //    if (currentValue != 0)
+            //    {
+            //        string currentUnit = (string)unitnames.GetValue(i);
+
+            //        if (potent > 1)
+            //        {
+            //            potentStr = "^" + potent;
+            //        }
+
+            //        if (currentValue > 0)
+            //        {
+            //            numerator += currentUnit + potentStr;
+
+            //        }
+            //        else if (currentValue < 0)
+            //        {
+            //            denominator += currentUnit + potentStr;
+            //        }
+            //    }
+            //}
+            //string result = "";
+
+            //if (numerator == "")
+            //{
+            //    if (denominator == "")
+            //    {
+            //        result = "-";
+            //    }
+            //    else
+            //    {
+            //        result = "1/" + denominator;
+            //    }
+            //}
+            //else
+            //{
+            //    if (denominator == "")
+            //    {
+            //        result = numerator;
+            //    }
+            //    else
+            //    {
+            //        result = numerator + "/" + denominator;
+            //    }
+            //}
+
+            //return result;
+        }
 
 
 
@@ -2321,8 +2374,9 @@ namespace TUGraz.VectoCommon.Utils
 
 	        if (!HasEqualUnit(si))
 	        {
-	            if (SIUtils.GetnumberofSIUnits(si.SIUnits) >= SIUtils.GetnumberofSIUnits(SIUnits))
-	            {
+                //if (SIUtils.GetnumberofSIUnits(si.SIUnits) >= SIUtils.GetnumberofSIUnits(SIUnits))
+	            if (si.SIUnits.Sum<int>(n => Math.Abs(n)) >= SIUnits.Sum<int>(n => Math.Abs(n)))
+                {
 	                return -1;
 	            }
 	            return 1;
diff --git a/VectoCommon/VectoCommon/Utils/SIUtils.cs b/VectoCommon/VectoCommon/Utils/SIUtils.cs
index 3cc6d413b9..d72f189ad8 100644
--- a/VectoCommon/VectoCommon/Utils/SIUtils.cs
+++ b/VectoCommon/VectoCommon/Utils/SIUtils.cs
@@ -44,16 +44,16 @@ namespace TUGraz.VectoCommon.Utils
         }
 
         //new method
-        public static int GetnumberofSIUnits(int[] array)
-        {
-            int resultCount = 0;
-            for (int count = 0; count < array.Length; count++)
-            {
-                resultCount += array[count] < 0 ? array[count] * (-1) : array[count];
+        //public static int GetnumberofSIUnits(int[] array)
+        //{
+        //    int resultCount = 0;
+        //    for (int count = 0; count < array.Length; count++)
+        //    {
+        //        resultCount += array[count] < 0 ? array[count] * (-1) : array[count];
 
-            }
-            return resultCount;
-        }
+        //    }
+        //    return resultCount;
+        //}
     }
 
 
@@ -63,71 +63,208 @@ namespace TUGraz.VectoCommon.Utils
         {
             get
             {
-                return new UnitInstance(new int[7] { 0, 0, 0, 0, 0, 0, 0 }, 1, 1, 1, UnitInstance.GrammMode.NoMass);
+                return new UnitInstance(new int[7] { 0, 0, 0, 0, 0, 0, 0 }, 1, 1, 1);//, UnitInstance.GrammMode.NoMass);
             }
         }
 
+
+        /// <summary>
+        /// Enum for defining the Units.
+        /// </summary>
+        //[SuppressMessage("ReSharper", "InconsistentNaming")]
+        private enum SIUnit
+        {
+            kg,
+            m,
+            s,
+            A,
+            K,
+            mol,
+            cd,
+        }
+
+        //public static string GetUnitString(int[] SIUnitParam)
+        public static string GetUnitString(int[] SIUnitParam,bool isGramm)
+        {
+
+            Array unitnames = Enum.GetNames(typeof(SIUnit));
+            string numerator = "";
+            string denominator = "";
+            int potent = 0;
+            string potentStr = "";
+
+
+            for (var i = 0; i < SIUnitParam.Length; i++)
+            {
+                int currentValue = SIUnitParam[i];
+
+
+                potent = Math.Abs(currentValue);
+                potentStr = "";
+                if (currentValue != 0)
+                {
+                    string currentUnit = (string)unitnames.GetValue(i);
+                    if(currentUnit == "kg" && isGramm == true)
+                    {
+                        currentUnit = "g";
+                    }
+
+
+                    if (potent > 1)
+                    {
+                        potentStr = "^" + potent;
+                    }
+
+                    if (currentValue > 0)
+                    {
+                        numerator += currentUnit + potentStr;
+
+                    }
+                    else if (currentValue < 0)
+                    {
+                        denominator += currentUnit + potentStr;
+                    }
+                }
+            }
+            string result = "";
+
+            if (numerator == "")
+            {
+                if (denominator == "")
+                {
+                    result = "-";
+                }
+                else
+                {
+                    result = "1/" + denominator;
+                }
+            }
+            else
+            {
+                if (denominator == "")
+                {
+                    result = numerator;
+                }
+                else
+                {
+                    result = numerator + "/" + denominator;
+                }
+            }
+
+            return result;
+        }
+
+
     }
 
     public struct UnitInstance
     {
         private int[] units;
-        private double factorValue;
 
+        private double factorValue;
         private int exponent;
         private int reciproc;
 
-        public enum GrammMode
+
+        [Flags]
+        public enum IsMass
         {
-            NoMass,
-            Gramm,
-            Kilo,
-            KiloGramm
+            IsKilo = 0x01, //0001
+            IsGramm = 0x02, //0010
+            IsKiloGramm = 0x04 //0100
         }
-        private GrammMode grammMode;
+        private IsMass isMassOption;
+
+        //public enum GrammMode
+        //{
+        //    NoMass,
+        //    Gramm,
+        //    Kilo,
+        //    KiloGramm
+        //}
+        //private GrammMode grammMode;
+
 
         public UnitInstance(int[] param_units,
-            double param_factor, int param_exponent, int param_reciproc,
-            GrammMode param_grammMode)
+            double param_factor, int param_exponent, int param_reciproc)//,
+            //GrammMode param_grammMode)
         {
             units = param_units;
             factorValue = param_factor;
             exponent = param_exponent;
             reciproc = param_reciproc;
-            grammMode = param_grammMode;
+            //grammMode = param_grammMode;
+            isMassOption = IsMass.IsKiloGramm;
         }
 
-        public GrammMode GetGrammMode()
+        //public GrammMode GetGrammMode()
+        //{
+        //    return grammMode;
+        //}
+
+        public IsMass GetGrammMode()
         {
-            return grammMode;
+            return isMassOption;
         }
 
         public int[] GetSIUnits()
         {
             return units;
         }
-        public double Getfactor()
+        public double Getfactor
         {
-            return factorValue;
+            get
+            {
+                return factorValue;
+            }
+            //return factorValue;
+        }
+        public int GetExponent
+        {
+            get
+            {
+                return exponent;
+            }
         }
-
 
         public UnitInstance Gramm
         {
             get
             {
-                if (grammMode == GrammMode.NoMass)
+                //if (grammMode == GrammMode.NoMass)
+                //{
+                //    grammMode = GrammMode.Gramm;
+                //}
+                //else if (grammMode == GrammMode.Kilo)
+                //{
+                //    grammMode = GrammMode.KiloGramm;
+                //}
+
+                units[0] += 1 * reciproc * exponent;
+
+                double factor = Math.Pow(1000, reciproc * exponent);
+
+                if ((isMassOption & IsMass.IsKilo) == IsMass.IsKilo)
                 {
-                    grammMode = GrammMode.Gramm;
+                    //is Kilo -> Kilogramm are selected
+                    isMassOption = (isMassOption | ~IsMass.IsGramm);
+                    isMassOption = (isMassOption | IsMass.IsKiloGramm);
+                    factorValue /= factor;
+
                 }
-                else if (grammMode == GrammMode.Kilo)
+                else
                 {
-                    grammMode = GrammMode.KiloGramm;
+                    //is not kilo -> Gramm are selected
+                    isMassOption = (isMassOption | IsMass.IsGramm);
+                    isMassOption = (isMassOption | ~IsMass.IsKiloGramm);
+                    //factorValue *= factor;
                 }
-                units[0] += 1 * reciproc * exponent;
+                isMassOption = (isMassOption & ~IsMass.IsKilo);
 
-                factorValue /= Math.Pow(1000, exponent * reciproc);
+
+                //factorValue /= Math.Pow(1000, exponent * reciproc);
                 //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
+
                 return this; // not work
             }
         }
@@ -135,6 +272,8 @@ namespace TUGraz.VectoCommon.Utils
         {
             get
             {
+                isMassOption = (isMassOption & ~IsMass.IsKilo);
+
                 exponent = 3;
                 //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
                 return this;
@@ -144,6 +283,8 @@ namespace TUGraz.VectoCommon.Utils
         {
             get
             {
+                isMassOption = (isMassOption & ~IsMass.IsKilo);
+
                 int ReciprocAndExponent = reciproc * exponent;
                 units[2] += 1 * ReciprocAndExponent;
 
@@ -156,14 +297,16 @@ namespace TUGraz.VectoCommon.Utils
         {
             get
             {
-                if (grammMode == GrammMode.NoMass)
-                {
-                    grammMode = GrammMode.Kilo;
-                }
-                else if (grammMode == GrammMode.Gramm)
-                {
-                    grammMode = GrammMode.KiloGramm;
-                }
+                isMassOption = (isMassOption | IsMass.IsKilo);
+
+                //if (grammMode == GrammMode.NoMass)
+                //{
+                //    grammMode = GrammMode.Kilo;
+                //}
+                //else if (grammMode == GrammMode.Gramm)
+                //{
+                //    grammMode = GrammMode.KiloGramm;
+                //}
 
                 factorValue *= Math.Pow(1000, exponent * reciproc);
                 //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
@@ -174,6 +317,8 @@ namespace TUGraz.VectoCommon.Utils
         {
             get
             {
+                isMassOption = (isMassOption & ~IsMass.IsKilo);
+
                 exponent = 1;
                 //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
                 return this;
@@ -183,6 +328,8 @@ namespace TUGraz.VectoCommon.Utils
         {
             get
             {
+                isMassOption = (isMassOption & ~IsMass.IsKilo);
+
                 units[1] += 1 * reciproc * exponent;
                 //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
                 return this;
@@ -192,6 +339,7 @@ namespace TUGraz.VectoCommon.Utils
         {
             get
             {
+                isMassOption = (isMassOption & ~IsMass.IsKilo);
 
                 factorValue /= Math.Pow(1000, exponent * reciproc);
                 //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
@@ -202,6 +350,8 @@ namespace TUGraz.VectoCommon.Utils
         {
             get
             {
+                isMassOption = (isMassOption & ~IsMass.IsKilo);
+
                 factorValue /= Math.Pow(100, exponent * reciproc);
                 //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
                 return this;
@@ -210,7 +360,9 @@ namespace TUGraz.VectoCommon.Utils
         public UnitInstance Dezi
         {
             get
-            {
+            {                
+                isMassOption = (isMassOption & ~IsMass.IsKilo);
+
                 factorValue /= Math.Pow(10, exponent * reciproc);
                 //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
                 return this;
@@ -220,6 +372,8 @@ namespace TUGraz.VectoCommon.Utils
         {
             get
             {
+                isMassOption = (isMassOption & ~IsMass.IsKilo);
+
                 int ReciprocAndExponent = reciproc * exponent;
                 units[2] += 1 * ReciprocAndExponent;
 
@@ -232,6 +386,8 @@ namespace TUGraz.VectoCommon.Utils
         {
             get
             {
+                isMassOption = (isMassOption & ~IsMass.IsKilo);
+
                 int ReciprocAndExponent = reciproc * exponent;
                 units[0] += 1 * ReciprocAndExponent;
                 units[1] += 1 * ReciprocAndExponent;
@@ -244,6 +400,8 @@ namespace TUGraz.VectoCommon.Utils
         {
             get
             {
+                isMassOption = (isMassOption & ~IsMass.IsKilo);
+
                 exponent = 1;
                 reciproc = reciproc * (-1);
 
@@ -255,6 +413,8 @@ namespace TUGraz.VectoCommon.Utils
         {
             get
             {
+                isMassOption = (isMassOption & ~IsMass.IsKilo);
+
                 //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
                 return this;
             }
@@ -263,6 +423,8 @@ namespace TUGraz.VectoCommon.Utils
         {
             get
             {
+                isMassOption = (isMassOption & ~IsMass.IsKilo);
+
                 factorValue *= Math.Pow(2 * Math.PI, exponent * reciproc);
                 //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
                 return this;
@@ -272,6 +434,8 @@ namespace TUGraz.VectoCommon.Utils
         {
             get
             {
+                isMassOption = (isMassOption & ~IsMass.IsKilo);
+
                 units[2] += 1 * reciproc * exponent;
                 //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
                 return this;
@@ -281,6 +445,8 @@ namespace TUGraz.VectoCommon.Utils
         {
             get
             {
+                isMassOption = (isMassOption & ~IsMass.IsKilo);
+
                 exponent = 2;
                 //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
                 return this;
@@ -290,6 +456,11 @@ namespace TUGraz.VectoCommon.Utils
         {
             get
             {
+                // remove Gramm and Kilo and KiloGramm is selected.
+                isMassOption = (isMassOption & ~IsMass.IsKilo);
+                isMassOption = (isMassOption | ~IsMass.IsGramm);
+                isMassOption = (isMassOption | IsMass.IsKiloGramm);
+
                 int ReciprocAndExponent = reciproc * exponent;
                 units[0] += 1 * ReciprocAndExponent;
                 factorValue *= Math.Pow(1000, ReciprocAndExponent);
@@ -301,6 +472,8 @@ namespace TUGraz.VectoCommon.Utils
         {
             get
             {
+                isMassOption = (isMassOption & ~IsMass.IsKilo);
+
                 int ReciprocAndExponent = reciproc * exponent;
                 units[0] += 1 * ReciprocAndExponent;
                 units[1] += 2 * ReciprocAndExponent;
@@ -313,6 +486,8 @@ namespace TUGraz.VectoCommon.Utils
         {
             get
             {
+                isMassOption = (isMassOption & ~IsMass.IsKilo);
+
                 int ReciprocAndExponent = reciproc * exponent;
                 units[0] += 1 * ReciprocAndExponent;
                 units[1] += 2 * ReciprocAndExponent;
@@ -326,6 +501,8 @@ namespace TUGraz.VectoCommon.Utils
         {
             get
             {
+                isMassOption = (isMassOption & ~IsMass.IsKilo);
+
                 int ReciprocAndExponent = reciproc * exponent;
                 units[2] += 3 * ReciprocAndExponent;
                 factorValue /= Math.Pow(1000, ReciprocAndExponent);
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs
index dc5c83cd03..5eb39607ca 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs
@@ -169,147 +169,95 @@ namespace TUGraz.VectoCore.OutputData.XML
 			_customerReport.Initialize(modelData);
 		}
 
-	    public static IEnumerable<XElement> GetResults(ResultEntry result, XNamespace tns, bool fullOutput)
-	    {
-	        var fuel = FuelData.Instance().Lookup(result.FuelType);
-	        var retVal = new List<XElement> {
-	            new XElement(tns + XMLNames.Report_Results_FuelConsumption,
-	                new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/km"),
-	                (result.FuelConsumptionTotal.ConvertTo(Unit.SI.Gramm) / result.Distance.ConvertTo(Unit.SI.Kilo.Meter)).Value()
-	                .ToMinSignificantDigits(3, 1)),
-	            new XElement(tns + XMLNames.Report_Results_FuelConsumption,
-	                new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/t-km"),
-	                (result.FuelConsumptionTotal.ConvertTo(Unit.SI.Gramm) / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) /
-	                 result.Payload.ConvertTo(Unit.SI.Ton)).Value().ToMinSignificantDigits(3, 1)),
-	            result.CargoVolume > 0
-	                ? new XElement(tns + XMLNames.Report_Results_FuelConsumption,
-	                    new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/m³-km"),
-	                    (result.FuelConsumptionTotal.ConvertTo(Unit.SI.Gramm) / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) / result.CargoVolume)
-	                    .Value
-	                    ().ToMinSignificantDigits(3, 1))
-	                : null
-	        };
-	        //FC
-	        if (fullOutput)
-	        {
-	            retVal.Add(new XElement(tns + XMLNames.Report_Results_FuelConsumption,
-	                new XAttribute(XMLNames.Report_Results_Unit_Attr, "MJ/km"),
-	                (result.EnergyConsumptionTotal / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) / 1e6).Value().ToMinSignificantDigits(3, 1)));
-	            retVal.Add(new XElement(tns + XMLNames.Report_Results_FuelConsumption,
-	                new XAttribute(XMLNames.Report_Results_Unit_Attr, "MJ/t-km"),
-	                (result.EnergyConsumptionTotal / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) / result.Payload.ConvertTo(Unit.SI.Ton) / 1e6)
-	                .Value().ToMinSignificantDigits(3, 1)));
-	            if (result.CargoVolume > 0)
-	            {
-	                retVal.Add(new XElement(tns + XMLNames.Report_Results_FuelConsumption,
-	                    new XAttribute(XMLNames.Report_Results_Unit_Attr, "MJ/m³-km"),
-	                    (result.EnergyConsumptionTotal / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) / result.CargoVolume / 1e6).Value()
-	                    .ToMinSignificantDigits(3, 1)));
-	            }
-	        }
-	        if (fuel.FuelDensity != null)
-	        {
-	            retVal.Add(new XElement(tns + XMLNames.Report_Results_FuelConsumption,
-	                new XAttribute(XMLNames.Report_Results_Unit_Attr, "l/100km"),
-	                (result.FuelConsumptionTotal.ConvertTo(Unit.SI.Gramm) / fuel.FuelDensity / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) * 100)
-	                .Value().ToMinSignificantDigits(3, 1)));
-	            retVal.Add(new XElement(tns + XMLNames.Report_Results_FuelConsumption,
-	                new XAttribute(XMLNames.Report_Results_Unit_Attr, "l/t-km"),
-	                (result.FuelConsumptionTotal.ConvertTo(Unit.SI.Gramm) / fuel.FuelDensity / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) /
-	                 result.Payload.ConvertTo(Unit.SI.Ton)).Value().ToMinSignificantDigits(3, 1)));
-	            if (result.CargoVolume > 0)
-	            {
-	                retVal.Add(new XElement(tns + XMLNames.Report_Results_FuelConsumption,
-	                    new XAttribute(XMLNames.Report_Results_Unit_Attr, "l/m³-km"),
-	                    (result.FuelConsumptionTotal.ConvertTo(Unit.SI.Gramm) / fuel.FuelDensity / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) /
-	                     result.CargoVolume).Value().ToMinSignificantDigits(3, 1)));
-	            }
-	        }
-	        //CO2
-	        retVal.Add(new XElement(tns + XMLNames.Report_Results_CO2, new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/km"),
-	            (result.CO2Total.ConvertTo(Unit.SI.Gramm) / result.Distance.ConvertTo(Unit.SI.Kilo.Meter)).Value().ToMinSignificantDigits(3, 1)));
-	        retVal.Add(new XElement(tns + XMLNames.Report_Results_CO2,
-	            new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/t-km"),
-	            (result.CO2Total.ConvertTo(Unit.SI.Gramm) / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) /
-	             result.Payload.ConvertTo(Unit.SI.Ton)).Value().ToMinSignificantDigits(3, 1)));
-	        if (result.CargoVolume > 0)
-	        {
-	            retVal.Add(new XElement(tns + XMLNames.Report_Results_CO2,
-	                new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/m³-km"),
-	                (result.CO2Total.ConvertTo(Unit.SI.Gramm) / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) / result.CargoVolume).Value()
-	                .ToMinSignificantDigits(3, 1)));
-	        }
-
-	        return retVal;
-	    }
-        ////////public static IEnumerable<XElement> GetResults(ResultEntry result, XNamespace tns, bool fullOutput)
-        ////////{
-        ////////	var fuel = FuelData.Instance().Lookup(result.FuelType);
-        ////////	var retVal = new List<XElement> {
-        ////////		new XElement(tns + XMLNames.Report_Results_FuelConsumption,
-        ////////			new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/km"),
-        ////////			(result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter).Value()
-        ////////				.ToMinSignificantDigits(3, 1)),
-        ////////		new XElement(tns + XMLNames.Report_Results_FuelConsumption,
-        ////////			new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/t-km"),
-        ////////			(result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter /
-        ////////			result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1)),
-        ////////		result.CargoVolume > 0
-        ////////			? new XElement(tns + XMLNames.Report_Results_FuelConsumption,
-        ////////				new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/m³-km"),
-        ////////				(result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume)
-        ////////					.Value
-        ////////					().ToMinSignificantDigits(3, 1))
-        ////////			: null
-        ////////	};
-        ////////	//FC
-        ////////	if (fullOutput) {
-        ////////		retVal.Add(new XElement(tns + XMLNames.Report_Results_FuelConsumption,
-        ////////			new XAttribute(XMLNames.Report_Results_Unit_Attr, "MJ/km"),
-        ////////			(result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / 1e6).Value().ToMinSignificantDigits(3, 1)));
-        ////////		retVal.Add(new XElement(tns + XMLNames.Report_Results_FuelConsumption,
-        ////////			new XAttribute(XMLNames.Report_Results_Unit_Attr, "MJ/t-km"),
-        ////////			(result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / result.Payload.ConvertTo().Ton / 1e6)
-        ////////				.Value().ToMinSignificantDigits(3, 1)));
-        ////////		if (result.CargoVolume > 0) {
-        ////////			retVal.Add(new XElement(tns + XMLNames.Report_Results_FuelConsumption,
-        ////////				new XAttribute(XMLNames.Report_Results_Unit_Attr, "MJ/m³-km"),
-        ////////				(result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume / 1e6).Value()
-        ////////					.ToMinSignificantDigits(3, 1)));
-        ////////		}
-        ////////	}
-        ////////	if (fuel.FuelDensity != null) {
-        ////////		retVal.Add(new XElement(tns + XMLNames.Report_Results_FuelConsumption,
-        ////////			new XAttribute(XMLNames.Report_Results_Unit_Attr, "l/100km"),
-        ////////			(result.FuelConsumptionTotal.ConvertTo().Gramm / fuel.FuelDensity / result.Distance.ConvertTo().Kilo.Meter * 100)
-        ////////				.Value().ToMinSignificantDigits(3, 1)));
-        ////////		retVal.Add(new XElement(tns + XMLNames.Report_Results_FuelConsumption,
-        ////////			new XAttribute(XMLNames.Report_Results_Unit_Attr, "l/t-km"),
-        ////////			(result.FuelConsumptionTotal.ConvertTo().Gramm / fuel.FuelDensity / result.Distance.ConvertTo().Kilo.Meter /
-        ////////			result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1)));
-        ////////		if (result.CargoVolume > 0) {
-        ////////			retVal.Add(new XElement(tns + XMLNames.Report_Results_FuelConsumption,
-        ////////				new XAttribute(XMLNames.Report_Results_Unit_Attr, "l/m³-km"),
-        ////////				(result.FuelConsumptionTotal.ConvertTo().Gramm / fuel.FuelDensity / result.Distance.ConvertTo().Kilo.Meter /
-        ////////				result.CargoVolume).Value().ToMinSignificantDigits(3, 1)));
-        ////////		}
-        ////////	}
-        ////////	//CO2
-        ////////	retVal.Add(new XElement(tns + XMLNames.Report_Results_CO2, new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/km"),
-        ////////		(result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter).Value().ToMinSignificantDigits(3, 1)));
-        ////////	retVal.Add(new XElement(tns + XMLNames.Report_Results_CO2,
-        ////////		new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/t-km"),
-        ////////		(result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter /
-        ////////		result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1)));
-        ////////	if (result.CargoVolume > 0) {
-        ////////		retVal.Add(new XElement(tns + XMLNames.Report_Results_CO2,
-        ////////			new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/m³-km"),
-        ////////			(result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume).Value()
-        ////////				.ToMinSignificantDigits(3, 1)));
-        ////////	}
-
-        ////////	return retVal;
-        ////////}
+
+        public static IEnumerable<XElement> GetResults(ResultEntry result, XNamespace tns, bool fullOutput)
+        {
+            var fuel = FuelData.Instance().Lookup(result.FuelType);
+            var retVal = new List<XElement> {
+                new XElement(tns + XMLNames.Report_Results_FuelConsumption,
+                    new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/km"),
+                    //(result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter).Value()
+                    (result.FuelConsumptionTotal.ConvertTo(Unit.SI.Gramm) / result.Distance.ConvertTo(Unit.SI.Kilo.Meter)).Value()
+                        .ToMinSignificantDigits(3, 1)),
+                new XElement(tns + XMLNames.Report_Results_FuelConsumption,
+                    new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/t-km"),
+                    //(result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter /
+                    (result.FuelConsumptionTotal.ConvertTo(Unit.SI.Gramm) / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) /
+                    //result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1)),
+                    result.Payload.ConvertTo(Unit.SI.Ton)).Value().ToMinSignificantDigits(3, 1)),
+                result.CargoVolume > 0
+                    ? new XElement(tns + XMLNames.Report_Results_FuelConsumption,
+                        new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/m³-km"),
+                        //(result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume)
+                        (result.FuelConsumptionTotal.ConvertTo(Unit.SI.Gramm) / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) / result.CargoVolume)
+                            .Value
+                            ().ToMinSignificantDigits(3, 1))
+                    : null
+            };
+            //FC
+            if (fullOutput)
+            {
+                retVal.Add(new XElement(tns + XMLNames.Report_Results_FuelConsumption,
+                    new XAttribute(XMLNames.Report_Results_Unit_Attr, "MJ/km"),
+                    //(result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / 1e6).Value().ToMinSignificantDigits(3, 1)));
+                    (result.EnergyConsumptionTotal / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) / 1e6).Value().ToMinSignificantDigits(3, 1)));
+                retVal.Add(new XElement(tns + XMLNames.Report_Results_FuelConsumption,
+                    new XAttribute(XMLNames.Report_Results_Unit_Attr, "MJ/t-km"),
+                    //(result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / result.Payload.ConvertTo().Ton / 1e6)
+                    (result.EnergyConsumptionTotal / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) / result.Payload.ConvertTo(Unit.SI.Ton) / 1e6)
+                        .Value().ToMinSignificantDigits(3, 1)));
+                if (result.CargoVolume > 0)
+                {
+                    retVal.Add(new XElement(tns + XMLNames.Report_Results_FuelConsumption,
+                        new XAttribute(XMLNames.Report_Results_Unit_Attr, "MJ/m³-km"),
+                        //(result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume / 1e6).Value()
+                        (result.EnergyConsumptionTotal / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) / result.CargoVolume / 1e6).Value()
+                            .ToMinSignificantDigits(3, 1)));
+                }
+            }
+            if (fuel.FuelDensity != null)
+            {
+                retVal.Add(new XElement(tns + XMLNames.Report_Results_FuelConsumption,
+                    new XAttribute(XMLNames.Report_Results_Unit_Attr, "l/100km"),
+                    //(result.FuelConsumptionTotal.ConvertTo().Gramm / fuel.FuelDensity / result.Distance.ConvertTo().Kilo.Meter * 100)
+                    (result.FuelConsumptionTotal.ConvertTo(Unit.SI.Gramm) / fuel.FuelDensity / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) * 100)
+                        .Value().ToMinSignificantDigits(3, 1)));
+                retVal.Add(new XElement(tns + XMLNames.Report_Results_FuelConsumption,
+                    new XAttribute(XMLNames.Report_Results_Unit_Attr, "l/t-km"),
+                    //(result.FuelConsumptionTotal.ConvertTo().Gramm / fuel.FuelDensity / result.Distance.ConvertTo().Kilo.Meter /
+                    (result.FuelConsumptionTotal.ConvertTo(Unit.SI.Gramm) / fuel.FuelDensity / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) /
+                    //result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1)));
+                     result.Payload.ConvertTo(Unit.SI.Ton)).Value().ToMinSignificantDigits(3, 1)));
+                if (result.CargoVolume > 0)
+                {
+                    retVal.Add(new XElement(tns + XMLNames.Report_Results_FuelConsumption,
+                        new XAttribute(XMLNames.Report_Results_Unit_Attr, "l/m³-km"),
+                        //(result.FuelConsumptionTotal.ConvertTo().Gramm / fuel.FuelDensity / result.Distance.ConvertTo().Kilo.Meter /
+                        (result.FuelConsumptionTotal.ConvertTo(Unit.SI.Gramm) / fuel.FuelDensity / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) /
+                        result.CargoVolume).Value().ToMinSignificantDigits(3, 1)));
+                }
+            }
+            //CO2
+            retVal.Add(new XElement(tns + XMLNames.Report_Results_CO2, new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/km"),
+                //(result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter).Value().ToMinSignificantDigits(3, 1)));
+                (result.CO2Total.ConvertTo(Unit.SI.Gramm) / result.Distance.ConvertTo(Unit.SI.Kilo.Meter)).Value().ToMinSignificantDigits(3, 1)));
+            retVal.Add(new XElement(tns + XMLNames.Report_Results_CO2,
+                new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/t-km"),
+                //(result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter /
+                (result.CO2Total.ConvertTo(Unit.SI.Gramm) / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) /
+                //result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1)));
+                 result.Payload.ConvertTo(Unit.SI.Ton)).Value().ToMinSignificantDigits(3, 1)));
+            if (result.CargoVolume > 0)
+            {
+                retVal.Add(new XElement(tns + XMLNames.Report_Results_CO2,
+                    new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/m³-km"),
+                    //(result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume).Value()
+                    (result.CO2Total.ConvertTo(Unit.SI.Gramm) / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) / result.CargoVolume).Value()
+                        .ToMinSignificantDigits(3, 1)));
+            }
+
+            return retVal;
+        }
 
     }
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/Utils/SITest.cs b/VectoCore/VectoCoreTest/Utils/SITest.cs
index 6ee48da8be..8bf61afdfc 100644
--- a/VectoCore/VectoCoreTest/Utils/SITest.cs
+++ b/VectoCore/VectoCoreTest/Utils/SITest.cs
@@ -93,7 +93,8 @@ namespace TUGraz.VectoCore.Tests.Utils
             //var generalSIUnit = 3600000000.0.SI().Gramm.Per.Kilo.Watt.Hour.ConvertTo().Kilo.Gramm.Per.Watt.Second;
             var generalSIUnit = 3600000000.0.SI(Unit.SI.Gramm.Per.Kilo.Watt.Hour).ConvertTo(Unit.SI.Kilo.Gramm.Per.Watt.Second);
 			Assert.IsInstanceOf<SI>(generalSIUnit);
-            ////////////Assert.AreEqual(1, generalSIUnit.Value());
+            //Assert.AreEqual(1, generalSIUnit.Value());
+            AssertHelper.AreRelativeEqual(1, generalSIUnit.Value()); ////////////////
 
             //type conversion
             var engineSpeed = 600.0;
@@ -106,8 +107,8 @@ namespace TUGraz.VectoCore.Tests.Utils
 
             // cast SI to specialized unit classes.
             PerSecond angularVelocity5 = angularVelocity4.Cast<PerSecond>();
-            ///////////Assert.AreEqual(angularVelocity3, angularVelocity5);
-            //////////Assert.AreEqual(angularVelocity3.Value(), angularVelocity4.Value());
+            Assert.AreEqual(angularVelocity3, angularVelocity5);
+            Assert.AreEqual(angularVelocity3.Value(), angularVelocity4.Value());
 
             // ConvertTo only allows conversion if the units are correct.
             //AssertHelper.Exception<VectoException>(() => { var x = 40.SI<Newton>().ConvertTo().Watt; });
@@ -160,8 +161,8 @@ namespace TUGraz.VectoCore.Tests.Utils
 
             //kg = kg.ConvertTo().Gramm.Clone();
             kg = kg.ConvertTo(Unit.SI.Gramm).Clone();
-            //Assert.AreEqual(5000, kg.Value());         //not tested
-            // Assert.AreEqual("5000.0000 [g]", kg.ToString()); //not tested
+            Assert.AreEqual(5000, kg.Value());
+            Assert.AreEqual("5000.0000 [g]", kg.ToString()); //not tested
 
             var x = 5.SI();
             Assert.AreEqual((2.0 / 5.0).SI(), 2 / x);
@@ -635,12 +636,15 @@ namespace TUGraz.VectoCore.Tests.Utils
         public void SI_NewTests()
         {
 
+            var sig1 = 5.SI(Unit.SI.Gramm);
+            Assert.AreEqual(5, sig1.Value());
+
 
             UnitInstance sikg = Unit.SI.Kilo.Gramm;
             Assert.AreEqual("kg", 1.SI().GetUnitString(sikg.GetSIUnits()));
 
             UnitInstance sig = Unit.SI.Gramm;
-            Assert.AreEqual("g", 1.SI().GetUnitString(sikg.GetSIUnits()));
+            //Assert.AreEqual("g", 1.SI().GetUnitString(sig.GetSIUnits()));
 
             //Assert.AreEqual(5000, kg.Value());         //not tested
             // Assert.AreEqual("5000.0000 [g]", kg.ToString()); //not tested
@@ -651,13 +655,13 @@ namespace TUGraz.VectoCore.Tests.Utils
             UnitInstance ui1 = Unit.SI.Kilo.Gramm.Meter.Per.Square.Second;
             Assert.AreEqual("kgm/s^2", 1.SI().GetUnitString(ui1.GetSIUnits()));
 
-            UnitInstance ui2 = Unit.SI.Gramm.Per.Kilo.Watt.Hour;
-            Assert.AreEqual("s^2/m^2", 1.SI().GetUnitString(ui2.GetSIUnits()));
-            Assert.AreEqual(2.7777777777777777E-10d,ui2.Getfactor());
+            //UnitInstance ui2 = Unit.SI.Gramm.Per.Kilo.Watt.Hour;
+            //Assert.AreEqual("s^2/m^2", 1.SI().GetUnitString(ui2.GetSIUnits()));
+            //Assert.AreEqual(2.7777777777777777E-10d,ui2.Getfactor());
 
             UnitInstance ui3 = Unit.SI.Kilo.Gramm.Per.Watt.Second;
             Assert.AreEqual("s^2/m^2", 1.SI().GetUnitString(ui3.GetSIUnits()));
-            Assert.AreEqual(1, ui3.Getfactor());
+            Assert.AreEqual(1, ui3.Getfactor);
 
 
 
@@ -667,12 +671,17 @@ namespace TUGraz.VectoCore.Tests.Utils
             var ton = 3.SI(Unit.SI.Ton);
             Assert.AreEqual("3000.0000 [kg]", ton.ToOutputFormat(showUnit: true));
 
-            var val1 = 5.SI(Unit.SI.Cubic.Dezi.Meter);
-            Assert.AreEqual("0.0050 [m^3]", val1.ToOutputFormat(showUnit: true));
+            var val1 = 7.SI(Unit.SI.Cubic.Dezi.Meter);
+            Assert.AreEqual("0.0070 [m^3]", val1.ToOutputFormat(showUnit: true));
 
             var uni = Unit.SI.Cubic.Dezi.Meter;
             Assert.AreEqual("m^3", 1.SI().GetUnitString(uni.GetSIUnits()));
-            AssertHelper.AreRelativeEqual(0.001, uni.Getfactor());
+            AssertHelper.AreRelativeEqual(0.001, uni.Getfactor);
+
+            var uni2 = Unit.SI.Cubic.Centi.Meter;
+            Assert.AreEqual("m^3", 1.SI().GetUnitString(uni2.GetSIUnits()));
+            AssertHelper.AreRelativeEqual(0.000001, uni2.Getfactor);
+
 
             var val2 = 7.SI(Unit.SI.Cubic.Dezi.Meter).ConvertTo(Unit.SI.Cubic.Dezi.Meter);
             Assert.AreEqual("0.0070 [m^3]", val2.ToOutputFormat(showUnit: true));
@@ -686,7 +695,7 @@ namespace TUGraz.VectoCore.Tests.Utils
 
             var uni1 = Unit.SI.Kilo.Meter.Per.Hour;
             Assert.AreEqual("m/s", 1.SI().GetUnitString(uni1.GetSIUnits()));
-            AssertHelper.AreRelativeEqual(0.2777777777, uni1.Getfactor());
+            AssertHelper.AreRelativeEqual(0.2777777777, uni1.Getfactor);
 
 
             NewtonMeter newtonMeter = 5.SI<NewtonMeter>();
-- 
GitLab