From 2518fc62a9bb5fffbb242bce4de61bab3211786d Mon Sep 17 00:00:00 2001 From: Stefanos Doumpoulakis <dubulak@gmail.com> Date: Thu, 9 Jan 2025 14:34:29 +0200 Subject: [PATCH] feat: new battery and supercap readers (#872) --- .../Lorries/Group5_HEV_P2_supercap.xml | 38 +++++--- ...ectricStorageSystemDeclarationInputData.cs | 97 ++++++++++++++++++- .../XMLDeclarationInputDataV26InjectModule.cs | 23 +++++ .../XMLDeclarationReaderInjectModule.cs | 3 +- .../Reader/Impl/XMLComponentReader.cs | 9 +- .../Models/Declaration/SpecificResistances.cs | 67 +++++++++++++ .../ElectricComponents/Battery/BatteryData.cs | 5 + .../Declaration/SpecificResistances.csv | 3 + .../XSD/VectoDeclarationDefinitions.2.6.xsd | 2 +- VectoCore/VectoCore/Utils/XMLDefinitions.cs | 3 +- 10 files changed, 226 insertions(+), 24 deletions(-) create mode 100644 VectoCore/VectoCore/InputData/FileIO/XML/Declaration/NinjectModules/XMLDeclarationInputDataV26InjectModule.cs create mode 100644 VectoCore/VectoCore/Models/Declaration/SpecificResistances.cs create mode 100644 VectoCore/VectoCore/Resources/Declaration/SpecificResistances.csv diff --git a/Generic Vehicles/Declaration Mode/xEV XML Jobs/Lorries/Group5_HEV_P2_supercap.xml b/Generic Vehicles/Declaration Mode/xEV XML Jobs/Lorries/Group5_HEV_P2_supercap.xml index 9721a6509c..23351fee0c 100644 --- a/Generic Vehicles/Declaration Mode/xEV XML Jobs/Lorries/Group5_HEV_P2_supercap.xml +++ b/Generic Vehicles/Declaration Mode/xEV XML Jobs/Lorries/Group5_HEV_P2_supercap.xml @@ -1,5 +1,15 @@ <?xml version="1.0" encoding="UTF-8"?> -<tns:VectoInputDeclaration xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" schemaVersion="2.0" xmlns:tns="urn:tugraz:ivt:VectoAPI:DeclarationInput:v2.0" xmlns:di="http://www.w3.org/2000/09/xmldsig#" xsi:schemaLocation="urn:tugraz:ivt:VectoAPI:DeclarationJob V:\VectoCore\VectoCore\Resources\XSD/VectoDeclarationJob.xsd" xmlns:v1.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v1.0" xmlns:v2.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xmlns:v2.1="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.1" xmlns:v2.3="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.3" xmlns:v2.4="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.4"> +<tns:VectoInputDeclaration + xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.4" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + schemaVersion="2.0" + xmlns:tns="urn:tugraz:ivt:VectoAPI:DeclarationInput:v2.0" + xmlns:di="http://www.w3.org/2000/09/xmldsig#" + xsi:schemaLocation="urn:tugraz:ivt:VectoAPI:DeclarationJob V:\VectoCore\VectoCore\Resources\XSD/VectoDeclarationJob.xsd" + xmlns:v1.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v1.0" + xmlns:v2.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" + xmlns:v2.3="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.3" + xmlns:v2.6="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.6"> <v2.0:Vehicle xsi:type="Vehicle_HEV-Px_HeavyLorryDeclarationType" id="Group5_HEV_P2_sc"> <Manufacturer>TU Graz</Manufacturer> <ManufacturerAddress>Inffeldgasse 19</ManufacturerAddress> @@ -2219,19 +2229,19 @@ </ElectricMachine> <ElectricEnergyStorage> <Capacitor> - <Data xsi:type="v2.3:CapacitorSystemDataType" id="CAP-qwertz"> - <v2.3:Manufacturer>SuperCAP Factory</v2.3:Manufacturer> - <v2.3:Model>Super cap 7000</v2.3:Model> - <v2.3:CertificationNumber>123456789</v2.3:CertificationNumber> - <v2.3:Date>2017-01-01T00:00:00Z</v2.3:Date> - <v2.3:AppVersion>aaaaa</v2.3:AppVersion> - <v2.3:CertificationMethod>Measured</v2.3:CertificationMethod> - <v2.3:Capacitance>37.00</v2.3:Capacitance> - <v2.3:InternalResistance>5.00</v2.3:InternalResistance> - <v2.3:MinVoltage>100.00</v2.3:MinVoltage> - <v2.3:MaxVoltage>900.00</v2.3:MaxVoltage> - <v2.3:MaxChargingCurrent>2200.00</v2.3:MaxChargingCurrent> - <v2.3:MaxDischargingCurrent>2200.00</v2.3:MaxDischargingCurrent> + <Data xsi:type="v2.6:CapacitorSystemDataType" id="CAP-qwertz"> + <v2.6:Manufacturer>SuperCAP Factory</v2.6:Manufacturer> + <v2.6:Model>Super cap 7000</v2.6:Model> + <v2.6:CertificationNumber>123456789</v2.6:CertificationNumber> + <v2.6:Date>2017-01-01T00:00:00Z</v2.6:Date> + <v2.6:AppVersion>aaaaa</v2.6:AppVersion> + <v2.6:CertificationMethod>Measured</v2.6:CertificationMethod> + <v2.6:Capacitance>37.00</v2.6:Capacitance> + <v2.6:InternalResistance>5000.00</v2.6:InternalResistance> + <v2.6:MinVoltage>100.00</v2.6:MinVoltage> + <v2.6:MaxVoltage>900.00</v2.6:MaxVoltage> + <v2.6:MaxChargingCurrent>2200.00</v2.6:MaxChargingCurrent> + <v2.6:MaxDischargingCurrent>2200.00</v2.6:MaxDischargingCurrent> </Data> <Signature> <di:Reference> diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs index b837673929..614e6280ac 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs @@ -211,7 +211,10 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider public const string XSD_TYPE = "BatterySystemStandardValuesDataType"; public static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE); - public XMLBatteryPackDeclarationInputDataStandardV23(XmlNode componentNode, string sourceFile) : base(componentNode, sourceFile) { } + public XMLBatteryPackDeclarationInputDataStandardV23(XmlNode componentNode, string sourceFile) : base(componentNode, sourceFile) + { + throw new VectoException($"{XSD_TYPE} v2.3 is no longer supported. Use newer version instead."); + } #region Overrides of AbstractBatteryPackDeclarationInputDataProvider @@ -284,9 +287,79 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider #endregion } + public class XMLBatteryPackDeclarationInputDataStandardV26 : AbstractBatteryPackDeclarationInputDataProvider + { + public static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_DEFINITIONS_NAMESPACE_URI_V26; + public const string XSD_TYPE = "BatterySystemStandardValuesDataType"; + public static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE); + + private SpecificResistances _specificResistances; + + public XMLBatteryPackDeclarationInputDataStandardV26(XmlNode componentNode, string sourceFile) : base(componentNode, sourceFile) + { + _specificResistances = new SpecificResistances(); + } + + protected override XNamespace NamespaceURI => NAMESPACE_URI; + + protected override TableData GetMaxCurrentMap() + { + var entries = base.GetMaxCurrentMap(); + + var requiredEntrySoCs = new List<int>() { 0, 30, 80, 100 }; + + foreach (var soc in requiredEntrySoCs) + { + if (!entries.AsEnumerable().Any(z => z.Field<string>(XMLNames.REESS_CurrentLimits_SoC).ToInt() == soc)) + { + throw new VectoException($"Battery does not contain Current Limit entry for SoC: {soc}"); + } + } + + return entries; + } + + protected override TableData GetInternalResistanceCurve() + { + const int SoC = 50; + + var mapSoC = BatterySOCReader.Create(VoltageCurve); + if (!mapSoC.ContainsSoC(SoC / 100)) + { + throw new VectoException($"Battery SoC map does not contain entry with SoC: {SoC}"); + } + + var vNom = mapSoC.Lookup(SoC / 100); + var minCells = vNom / 4.0.SI<Volt>(); + var maxCells = vNom / 3.0.SI<Volt>(); + + var resistances = base.GetInternalResistanceCurve(); + var specificResistanceData = _specificResistances.Lookup(BatteryType); + + DataRow rowSoC = resistances.AsEnumerable().First(x => x.ParseDouble(0) == SoC); + + for (var i = 1; i < resistances.Columns.Count; i++) + { + var resistance = rowSoC.ParseDouble(i); + var resistanceName = resistances.Columns[i].ColumnName; + + var specificResistance = specificResistanceData.GetValue(resistanceName); + var cellResistance = specificResistance / Capacity.AsAmpHour; + var minResistance = cellResistance * minCells.Value(); + var maxResistance = cellResistance * maxCells.Value(); - public class XMLBatteryPackDeclarationDeclarationInputDataV24 : AbstractCommonComponentType, + if ((resistance < minResistance) || (resistance > maxResistance)) + { + Log.Warn($@"Battery {resistanceName}: {resistance}, for SoC: {SoC}, out of range [{minResistance.ToString("N2")}, {maxResistance.ToString("N2")}]"); + } + } + + return resistances; + } + } + + public class XMLBatteryPackDeclarationDeclarationInputDataV24 : AbstractCommonComponentType, IXMLBatteryPackDeclarationInputData { public static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_DEFINITIONS_NAMESPACE_URI_V24; @@ -401,9 +474,12 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider public const string XSD_TYPE = "REESSCapacitorType"; public static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE); - public XMLSuperCapDeclarationInputDataV24(XmlNode componentNode, string sourceFile) : base(componentNode, sourceFile) + public XMLSuperCapDeclarationInputDataV24(XmlNode componentNode, string sourceFile, bool disallowed = true) : base(componentNode, sourceFile) { - //SourceType = DataSourceType.XMLEmbedded; + if (disallowed) + { + throw new VectoException($"Capacitor v2.3 is no longer supported. Use newer version instead."); + } } #region Implementation of IREESSPackInputData @@ -454,6 +530,17 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider #endregion } + public class XMLSuperCapDeclarationInputDataV26 : XMLSuperCapDeclarationInputDataV24 + { + public static new readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_DEFINITIONS_NAMESPACE_URI_V26; + public const string XSD_TYPE = "CapacitorSystemDataType"; + public static new readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE); + + public XMLSuperCapDeclarationInputDataV26(XmlNode componentNode, string sourceFile) : base(componentNode, sourceFile, false) + {} + + public override Ohm InternalResistance => GetDouble(XMLNames.Capacitor_InternalResistance).SI(Unit.SI.Milli.Ohm).Cast<Ohm>(); + } // --------------------------------------------------------------------------------------- @@ -465,7 +552,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider public static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE); - public XMLSuperCapDeclarationInputDataV01(XmlNode componentNode, string sourceFile) : base(componentNode, sourceFile) { } + public XMLSuperCapDeclarationInputDataV01(XmlNode componentNode, string sourceFile) : base(componentNode, sourceFile, false) { } #region Overrides of XMLSuperCapDeclarationInputDataV24 diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/NinjectModules/XMLDeclarationInputDataV26InjectModule.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/NinjectModules/XMLDeclarationInputDataV26InjectModule.cs new file mode 100644 index 0000000000..2f2d87990c --- /dev/null +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/NinjectModules/XMLDeclarationInputDataV26InjectModule.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Ninject.Modules; +using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider; +using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Interfaces; + +namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.NinjectModules +{ + public class XMLDeclarationInputDataV26InjectModule : NinjectModule + { + public override void Load() + { + Bind<IXMLBatteryPackDeclarationInputData>().To<XMLBatteryPackDeclarationInputDataStandardV26>() + .Named(XMLBatteryPackDeclarationInputDataStandardV26.QUALIFIED_XSD_TYPE); + + Bind<IXMLSuperCapDeclarationInputData>().To<XMLSuperCapDeclarationInputDataV26>() + .Named(XMLSuperCapDeclarationInputDataV26.QUALIFIED_XSD_TYPE); + } + } +} diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/NinjectModules/XMLDeclarationReaderInjectModule.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/NinjectModules/XMLDeclarationReaderInjectModule.cs index bcf6935cf2..e0a0616134 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/NinjectModules/XMLDeclarationReaderInjectModule.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/NinjectModules/XMLDeclarationReaderInjectModule.cs @@ -54,7 +54,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration new XMLDeclarationInputDataV23InjectModule(), new XMLDeclarationInputDataV24InjectModule(), new XMLDeclarationInputDataV25InjectModule(), - new XMLDeclarationInputDataMultistageV01InjectModule(), + new XMLDeclarationInputDataV26InjectModule(), + new XMLDeclarationInputDataMultistageV01InjectModule(), }); #endregion diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLComponentReader.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLComponentReader.cs index 44e4917f43..d8dc378eb3 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLComponentReader.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLComponentReader.cs @@ -615,7 +615,9 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl public const string XSD_TYPE = "ElectricEnergyStorageType"; public static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE); - [Inject] public virtual IDeclarationInjectFactory Factory { protected get; set; } + public const double MINIMUM_CORRECTLY_PLACED_SUPERCAP_TYPE_VERSION = 2.6; + + [Inject] public virtual IDeclarationInjectFactory Factory { protected get; set; } public XMLREESSReaderV24(IXMLDeclarationVehicleData vehicle, XmlNode componentNode, string sourceFile) : base( componentNode) { } @@ -651,7 +653,10 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl protected virtual ISuperCapDeclarationInputData SuperCapCreator(string version, XmlNode componentNode, string sourcefile) { - return Factory.CreateSuperCapDeclarationInputData(version, componentNode, sourcefile); + var dataNode = GetNode(XMLNames.ComponentDataWrapper, componentNode); + var dataVersion = XMLHelper.GetXsdType(dataNode.SchemaInfo.SchemaType); + var capVersion = XMLHelper.GetVersion(dataNode) >= MINIMUM_CORRECTLY_PLACED_SUPERCAP_TYPE_VERSION ? dataVersion : version; + return Factory.CreateSuperCapDeclarationInputData(capVersion, componentNode, sourcefile); } #endregion diff --git a/VectoCore/VectoCore/Models/Declaration/SpecificResistances.cs b/VectoCore/VectoCore/Models/Declaration/SpecificResistances.cs new file mode 100644 index 0000000000..6e48970da8 --- /dev/null +++ b/VectoCore/VectoCore/Models/Declaration/SpecificResistances.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.Models.Declaration +{ + public class SpecificResistances : LookupData<BatteryType, SpecificResistances.SpecificResistancesData> + { + protected override string ResourceId => DeclarationData.DeclarationDataResourcePrefix + ".SpecificResistances.csv"; + protected override string ErrorMessage => "SpecificResistances Lookup Error: no value found. Key: '{0}'"; + + public struct SpecificResistancesData + { + public double Ri_2; + public double Ri_10; + public double Ri_20; + public double Ri_120; + + public double GetValue(string variable) + { + var modifiedVariable = variable.Replace('-', '_'); + + switch (modifiedVariable) + { + case nameof(Ri_2): return Ri_2; + case nameof(Ri_10): return Ri_10; + case nameof(Ri_20): return Ri_20; + case nameof(Ri_120): return Ri_120; + default: throw new ArgumentOutOfRangeException($"{variable} is not part of SpecificResistancesData"); + } + } + } + + public override SpecificResistancesData Lookup(BatteryType key) + { + return base.Lookup(key); + } + + protected override void ParseData(DataTable table) + { + var ri120 = nameof(SpecificResistancesData.Ri_120).ToLower(); + + foreach (DataRow row in table.Rows) + { + var val = new SpecificResistancesData() + { + Ri_2 = row.ParseDouble(nameof(SpecificResistancesData.Ri_2).ToLower()), + Ri_10 = row.ParseDouble(nameof(SpecificResistancesData.Ri_10).ToLower()), + Ri_20 = row.ParseDouble(nameof(SpecificResistancesData.Ri_20).ToLower()), + Ri_120 = !row.IsNull(ri120) && !String.IsNullOrWhiteSpace(row[ri120].ToString()) ? row.ParseDouble(ri120) : double.NaN + }; + + var type = (BatteryType)Enum.Parse(typeof(BatteryType), row["type"].ToString()); + + Data.Add(type, val); + } + } + + } +} diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricComponents/Battery/BatteryData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricComponents/Battery/BatteryData.cs index a30f9d9d6e..008ff5673c 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricComponents/Battery/BatteryData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricComponents/Battery/BatteryData.cs @@ -140,6 +140,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricComponents.Ba Entries[idx].BatteryVolts, soc); } + public bool ContainsSoC(double soc) + { + return Entries.Any(x => x.SOC.IsEqual(soc)); + } + protected int FindIndex(double soc) { if (soc < Entries.First().SOC) diff --git a/VectoCore/VectoCore/Resources/Declaration/SpecificResistances.csv b/VectoCore/VectoCore/Resources/Declaration/SpecificResistances.csv new file mode 100644 index 0000000000..9b026f7a7a --- /dev/null +++ b/VectoCore/VectoCore/Resources/Declaration/SpecificResistances.csv @@ -0,0 +1,3 @@ +Type, Ri_2, Ri_10, Ri_20, Ri_120 +HEBS, 210, 240, 270, 390 +HPBS, 40, 45, 50, \ No newline at end of file diff --git a/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.2.6.xsd b/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.2.6.xsd index a330a3055e..15b9aff84f 100644 --- a/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.2.6.xsd +++ b/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.2.6.xsd @@ -440,7 +440,7 @@ <xs:element name="CurrentLimits"> <xs:complexType> <xs:sequence> - <xs:element name="Entry" type="v2.3:BatterySystemCurrentLimitsEntryType" minOccurs="2" maxOccurs="unbounded"/> + <xs:element name="Entry" type="v2.3:BatterySystemCurrentLimitsEntryType" minOccurs="4" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> diff --git a/VectoCore/VectoCore/Utils/XMLDefinitions.cs b/VectoCore/VectoCore/Utils/XMLDefinitions.cs index c25b4ebb2f..7c6d79f032 100644 --- a/VectoCore/VectoCore/Utils/XMLDefinitions.cs +++ b/VectoCore/VectoCore/Utils/XMLDefinitions.cs @@ -102,9 +102,10 @@ namespace TUGraz.VectoCore.Utils public const string DECLARATION_DEFINITIONS_NAMESPACE_URI_V24 = DECLARATION_NAMESPACE + ":v2.4"; public const string DECLARATION_DEFINITIONS_NAMESPACE_URI_V25 = DECLARATION_NAMESPACE + ":v2.5"; + public const string DECLARATION_DEFINITIONS_NAMESPACE_URI_V26 = DECLARATION_NAMESPACE + ":v2.6"; - public const string DECLARATION_INPUT_NAMESPACE = "urn:tugraz:ivt:VectoAPI:DeclarationInput"; + public const string DECLARATION_INPUT_NAMESPACE = "urn:tugraz:ivt:VectoAPI:DeclarationInput"; public const string DECLARATION_INPUT_NAMESPACE_URI_V10 = DECLARATION_INPUT_NAMESPACE + ":v1.0"; -- GitLab