diff --git a/resources/energyplus/ProposedEnergy+.idd b/resources/energyplus/ProposedEnergy+.idd index 0f07725595a..718ac1ef2a8 100644 --- a/resources/energyplus/ProposedEnergy+.idd +++ b/resources/energyplus/ProposedEnergy+.idd @@ -15410,7 +15410,6 @@ Exterior:FuelEquipment, \required-field \type choice \key Electricity - \key Water \key NaturalGas \key Propane \key FuelOilNo1 diff --git a/resources/model/OpenStudio.idd b/resources/model/OpenStudio.idd index 6bbdcf1c936..cdaccfd9040 100644 --- a/resources/model/OpenStudio.idd +++ b/resources/model/OpenStudio.idd @@ -1848,7 +1848,6 @@ OS:WeatherProperty:SkyTemperature, \key Idso \key BerdahlMartin \key ScheduleValue - \key ScheduleValue \key DifferenceScheduleDryBulbValue \key DifferenceScheduleDewPointValue A4, \field Schedule Name @@ -7353,8 +7352,8 @@ OS:OtherEquipment, \key Coal \key OtherFuel1 \key OtherFuel2 - \key Steam - \key DistrictHeating + \key DistrictHeatingSteam + \key DistrictHeatingWater \key DistrictCooling \default None A7; \field End-Use Subcategory @@ -7592,8 +7591,8 @@ OS:Exterior:FuelEquipment, \key Coal \key OtherFuel1 \key OtherFuel2 - \key Steam - \key DistrictHeating + \key DistrictHeatingSteam + \key DistrictHeatingWater \key DistrictCooling N1, \field Multiplier \type real @@ -30218,8 +30217,8 @@ OS:WaterHeater:Mixed, \key Gasoline \key OtherFuel1 \key OtherFuel2 - \key Steam - \key DistrictHeating + \key DistrictHeatingSteam + \key DistrictHeatingWater N8 , \field Heater Thermal Efficiency \type real \minimum> 0.0 @@ -30244,8 +30243,8 @@ OS:WaterHeater:Mixed, \key Gasoline \key OtherFuel1 \key OtherFuel2 - \key Steam - \key DistrictHeating + \key DistrictHeatingSteam + \key DistrictHeatingWater N10, \field Off Cycle Parasitic Heat Fraction to Tank \type real \minimum 0.0 @@ -30268,8 +30267,8 @@ OS:WaterHeater:Mixed, \key Gasoline \key OtherFuel1 \key OtherFuel2 - \key Steam - \key DistrictHeating + \key DistrictHeatingSteam + \key DistrictHeatingWater N12, \field On Cycle Parasitic Heat Fraction to Tank \type real \minimum 0.0 @@ -31575,8 +31574,8 @@ OS:WaterHeater:Stratified, \key Gasoline \key OtherFuel1 \key OtherFuel2 - \key Steam - \key DistrictHeating + \key DistrictHeatingSteam + \key DistrictHeatingWater N11, \field Heater Thermal Efficiency \required-field \type real @@ -31600,8 +31599,8 @@ OS:WaterHeater:Stratified, \key Gasoline \key OtherFuel1 \key OtherFuel2 - \key Steam - \key DistrictHeating + \key DistrictHeatingSteam + \key DistrictHeatingWater N13, \field Off Cycle Parasitic Heat Fraction to Tank \required-field \type real @@ -31630,8 +31629,8 @@ OS:WaterHeater:Stratified, \key Gasoline \key OtherFuel1 \key OtherFuel2 - \key Steam - \key DistrictHeating + \key DistrictHeatingSteam + \key DistrictHeatingWater N16, \field On Cycle Parasitic Heat Fraction to Tank \required-field \type real @@ -35642,7 +35641,7 @@ OS:LifeCycleCost:UsePriceEscalation, \key ElectricitySurplusSold \key ElectricityNet \key NaturalGas - \key Steam + \key DistrictHeatingSteam \key Gasoline \key Diesel \key Coal @@ -35695,19 +35694,19 @@ OS:UtilityBill, \type choice \required-field \key Electricity - \key Gas + \key NaturalGas \key Gasoline \key Diesel \key Coal - \key FuelOil_1 - \key FuelOil_2 + \key FuelOilNo1 + \key FuelOilNo2 \key Propane \key Water - \key Steam + \key DistrictHeatingSteam \key DistrictCooling - \key DistrictHeating - \key OtherFuel_1 - \key OtherFuel_2 + \key DistrictHeatingWater + \key OtherFuel1 + \key OtherFuel2 \key EnergyTransfer A4, \field Meter Install Location \note Location the meter associated with this utility bill object is installed. @@ -36677,8 +36676,8 @@ OS:Meter:Custom, \key Coal \key OtherFuel1 \key OtherFuel2 - \key Steam - \key DistrictHeating + \key DistrictHeatingSteam + \key DistrictHeatingWater \key DistrictCooling \key Water \key Generic @@ -36708,8 +36707,8 @@ OS:Meter:CustomDecrement, \key Coal \key OtherFuel1 \key OtherFuel2 - \key Steam - \key DistrictHeating + \key DistrictHeatingSteam + \key DistrictHeatingWater \key DistrictCooling \key Water \key Generic @@ -36745,7 +36744,7 @@ OS:EnvironmentalImpactFactors, A1, \field Handle \type handle \required-field - N1, \field District Heating Efficiency + N1, \field District Heating Water Efficiency \note District heating efficiency used when converted to natural gas \minimum> 0.0 \required-field @@ -36754,7 +36753,7 @@ OS:EnvironmentalImpactFactors, \units W/W \minimum> 0.0 \required-field - N3, \field Steam Conversion Efficiency + N3, \field District Heating Steam Conversion Efficiency \note Steam conversion efficiency used to convert steam usage to natural gas \minimum> 0.0 \required-field @@ -37398,9 +37397,9 @@ OS:EnergyManagementSystem:MeteredOutputVariable, \key WellWaterDrawn \key CondensateWaterCollected \key EnergyTransfer - \key Steam + \key DistrictHeatingSteam \key DistrictCooling - \key DistrictHeating + \key DistrictHeatingWater \key ElectricityProducedOnSite \key SolarWaterHeating \key SolarAirHeating @@ -37638,9 +37637,9 @@ OS:PythonPlugin:OutputVariable, \key WellWaterDrawn \key CondensateWaterCollected \key EnergyTransfer - \key Steam + \key DistrictHeatingSteam \key DistrictCooling - \key DistrictHeating + \key DistrictHeatingWater \key ElectricityProducedOnSite \key SolarWaterHeating \key SolarAirHeating diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateEnvironmentalImpactFactors.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateEnvironmentalImpactFactors.cpp index cec94d76679..a908950b1a5 100644 --- a/src/energyplus/ForwardTranslator/ForwardTranslateEnvironmentalImpactFactors.cpp +++ b/src/energyplus/ForwardTranslator/ForwardTranslateEnvironmentalImpactFactors.cpp @@ -24,13 +24,14 @@ namespace energyplus { m_idfObjects.push_back(idfObject); // District Heating Water Efficiency - idfObject.setDouble(EnvironmentalImpactFactorsFields::DistrictHeatingWaterEfficiency, modelObject.districtHeatingEfficiency()); + idfObject.setDouble(EnvironmentalImpactFactorsFields::DistrictHeatingWaterEfficiency, modelObject.districtHeatingWaterEfficiency()); // District Cooling COP idfObject.setDouble(EnvironmentalImpactFactorsFields::DistrictCoolingCOP, modelObject.districtCoolingCOP()); // District Heating Steam Conversion Efficiency - idfObject.setDouble(EnvironmentalImpactFactorsFields::DistrictHeatingSteamConversionEfficiency, modelObject.steamConversionEfficiency()); + idfObject.setDouble(EnvironmentalImpactFactorsFields::DistrictHeatingSteamConversionEfficiency, + modelObject.districtHeatingSteamConversionEfficiency()); // Total Carbon Equivalent Emission Factor From N2O idfObject.setDouble(EnvironmentalImpactFactorsFields::TotalCarbonEquivalentEmissionFactorFromN2O, diff --git a/src/energyplus/ReverseTranslator/ReverseTranslateEnvironmentalImpactFactors.cpp b/src/energyplus/ReverseTranslator/ReverseTranslateEnvironmentalImpactFactors.cpp index e50918266ec..f0557dbfd80 100644 --- a/src/energyplus/ReverseTranslator/ReverseTranslateEnvironmentalImpactFactors.cpp +++ b/src/energyplus/ReverseTranslator/ReverseTranslateEnvironmentalImpactFactors.cpp @@ -22,9 +22,9 @@ namespace energyplus { auto modelObject = m_model.getUniqueModelObject(); // District Heating Water Efficiency: Optional Double - if (boost::optional _districtHeatingEfficiency = + if (boost::optional _districtHeatingWaterEfficiency = workspaceObject.getDouble(EnvironmentalImpactFactorsFields::DistrictHeatingWaterEfficiency)) { - modelObject.setDistrictHeatingEfficiency(_districtHeatingEfficiency.get()); + modelObject.setDistrictHeatingWaterEfficiency(_districtHeatingWaterEfficiency.get()); } // District Cooling COP: Optional Double @@ -33,9 +33,9 @@ namespace energyplus { } // District Heating Steam Conversion Efficiency: Optional Double - if (boost::optional _steamConversionEfficiency = + if (boost::optional _districtHeatingSteamConversionEfficiency = workspaceObject.getDouble(EnvironmentalImpactFactorsFields::DistrictHeatingSteamConversionEfficiency)) { - modelObject.setSteamConversionEfficiency(_steamConversionEfficiency.get()); + modelObject.setDistrictHeatingSteamConversionEfficiency(_districtHeatingSteamConversionEfficiency.get()); } // Total Carbon Equivalent Emission Factor From N2O: Optional Double diff --git a/src/energyplus/Test/EnvironmentalImpactFactors_GTest.cpp b/src/energyplus/Test/EnvironmentalImpactFactors_GTest.cpp index 751d2452be8..00cef54cd94 100644 --- a/src/energyplus/Test/EnvironmentalImpactFactors_GTest.cpp +++ b/src/energyplus/Test/EnvironmentalImpactFactors_GTest.cpp @@ -37,9 +37,9 @@ TEST_F(EnergyPlusFixture, ForwardTranslator_EnvironmentalImpactFactors) { // Get the unique object auto environmentalImpactFactors = m.getUniqueModelObject(); - EXPECT_TRUE(environmentalImpactFactors.setDistrictHeatingEfficiency(0.35)); + EXPECT_TRUE(environmentalImpactFactors.setDistrictHeatingWaterEfficiency(0.35)); EXPECT_TRUE(environmentalImpactFactors.setDistrictCoolingCOP(3.3)); - EXPECT_TRUE(environmentalImpactFactors.setSteamConversionEfficiency(0.27)); + EXPECT_TRUE(environmentalImpactFactors.setDistrictHeatingSteamConversionEfficiency(0.27)); EXPECT_TRUE(environmentalImpactFactors.setTotalCarbonEquivalentEmissionFactorFromN2O(79.2)); EXPECT_TRUE(environmentalImpactFactors.setTotalCarbonEquivalentEmissionFactorFromCH4(6.1)); EXPECT_TRUE(environmentalImpactFactors.setTotalCarbonEquivalentEmissionFactorFromCO2(0.31)); @@ -99,9 +99,9 @@ TEST_F(EnergyPlusFixture, ReverseTranslator_EnvironmentalImpactFactors) { ASSERT_TRUE(m.getOptionalUniqueModelObject()); auto environmentalImpactFactors = m.getUniqueModelObject(); - EXPECT_EQ(0.35, environmentalImpactFactors.districtHeatingEfficiency()); + EXPECT_EQ(0.35, environmentalImpactFactors.districtHeatingWaterEfficiency()); EXPECT_EQ(3.3, environmentalImpactFactors.districtCoolingCOP()); - EXPECT_EQ(0.27, environmentalImpactFactors.steamConversionEfficiency()); + EXPECT_EQ(0.27, environmentalImpactFactors.districtHeatingSteamConversionEfficiency()); EXPECT_EQ(79.2, environmentalImpactFactors.totalCarbonEquivalentEmissionFactorFromN2O()); EXPECT_EQ(6.1, environmentalImpactFactors.totalCarbonEquivalentEmissionFactorFromCH4()); EXPECT_EQ(0.31, environmentalImpactFactors.totalCarbonEquivalentEmissionFactorFromCO2()); diff --git a/src/model/DistrictCooling.cpp b/src/model/DistrictCooling.cpp index 0331f32380e..b4a146482bd 100644 --- a/src/model/DistrictCooling.cpp +++ b/src/model/DistrictCooling.cpp @@ -34,8 +34,12 @@ namespace model { const std::vector& DistrictCooling_Impl::outputVariableNames() const { static const std::vector result{ - "District Cooling Chilled Water Rate", "District Cooling Chilled Water Energy", "District Cooling Rate", - "District Cooling Inlet Temperature", "District Cooling Outlet Temperature", "District Cooling Mass Flow Rate"}; + "District Cooling Water Rate", + "District Cooling Water Energy", + "District Cooling Water Inlet Temperature", + "District Cooling Water Outlet Temperature", + "District Cooling Water Mass Flow Rate", + }; return result; } diff --git a/src/model/DistrictHeating.cpp b/src/model/DistrictHeating.cpp index 6e2ab1b8647..75d89c35e44 100644 --- a/src/model/DistrictHeating.cpp +++ b/src/model/DistrictHeating.cpp @@ -34,8 +34,12 @@ namespace model { const std::vector& DistrictHeating_Impl::outputVariableNames() const { static const std::vector result{ - "District Heating Hot Water Rate", "District Heating Hot Water Energy", "District Heating Rate", - "District Heating Inlet Temperature", "District Heating Outlet Temperature", "District Heating Mass Flow Rate"}; + "District Heating Water Energy", + "District Heating Water Rate", + "District Heating Water Inlet Temperature", + "District Heating Water Outlet Temperature", + "District Heating Water Mass Flow Rate", + }; return result; } diff --git a/src/model/EnvironmentalImpactFactors.cpp b/src/model/EnvironmentalImpactFactors.cpp index d1083f595f9..b9867be0bfe 100644 --- a/src/model/EnvironmentalImpactFactors.cpp +++ b/src/model/EnvironmentalImpactFactors.cpp @@ -9,9 +9,8 @@ #include #include -#include "../utilities/units/Unit.hpp" - #include "../utilities/core/Assert.hpp" +#include "../utilities/core/DeprecatedHelpers.hpp" namespace openstudio { namespace model { @@ -43,8 +42,8 @@ namespace model { return EnvironmentalImpactFactors::iddObjectType(); } - double EnvironmentalImpactFactors_Impl::districtHeatingEfficiency() const { - boost::optional value = getDouble(OS_EnvironmentalImpactFactorsFields::DistrictHeatingEfficiency, true); + double EnvironmentalImpactFactors_Impl::districtHeatingWaterEfficiency() const { + boost::optional value = getDouble(OS_EnvironmentalImpactFactorsFields::DistrictHeatingWaterEfficiency, true); OS_ASSERT(value); return value.get(); } @@ -55,8 +54,8 @@ namespace model { return value.get(); } - double EnvironmentalImpactFactors_Impl::steamConversionEfficiency() const { - boost::optional value = getDouble(OS_EnvironmentalImpactFactorsFields::SteamConversionEfficiency, true); + double EnvironmentalImpactFactors_Impl::districtHeatingSteamConversionEfficiency() const { + boost::optional value = getDouble(OS_EnvironmentalImpactFactorsFields::DistrictHeatingSteamConversionEfficiency, true); OS_ASSERT(value); return value.get(); } @@ -79,8 +78,8 @@ namespace model { return value.get(); } - bool EnvironmentalImpactFactors_Impl::setDistrictHeatingEfficiency(double districtHeatingEfficiency) { - bool result = setDouble(OS_EnvironmentalImpactFactorsFields::DistrictHeatingEfficiency, districtHeatingEfficiency); + bool EnvironmentalImpactFactors_Impl::setDistrictHeatingWaterEfficiency(double districtHeatingWaterEfficiency) { + bool result = setDouble(OS_EnvironmentalImpactFactorsFields::DistrictHeatingWaterEfficiency, districtHeatingWaterEfficiency); return result; } @@ -89,8 +88,9 @@ namespace model { return result; } - bool EnvironmentalImpactFactors_Impl::setSteamConversionEfficiency(double steamConversionEfficiency) { - bool result = setDouble(OS_EnvironmentalImpactFactorsFields::SteamConversionEfficiency, steamConversionEfficiency); + bool EnvironmentalImpactFactors_Impl::setDistrictHeatingSteamConversionEfficiency(double districtHeatingSteamConversionEfficiency) { + bool result = + setDouble(OS_EnvironmentalImpactFactorsFields::DistrictHeatingSteamConversionEfficiency, districtHeatingSteamConversionEfficiency); return result; } @@ -121,9 +121,9 @@ namespace model { OS_ASSERT(getImpl()); // Defaults from E+ IDD, captured at v9.5.0 - setDistrictHeatingEfficiency(0.3); + setDistrictHeatingWaterEfficiency(0.3); setDistrictCoolingCOP(3.0); - setSteamConversionEfficiency(0.25); + setDistrictHeatingSteamConversionEfficiency(0.25); setTotalCarbonEquivalentEmissionFactorFromN2O(80.7272); setTotalCarbonEquivalentEmissionFactorFromCH4(6.2727); setTotalCarbonEquivalentEmissionFactorFromCO2(0.2727); @@ -133,16 +133,16 @@ namespace model { return {IddObjectType::OS_EnvironmentalImpactFactors}; } - double EnvironmentalImpactFactors::districtHeatingEfficiency() const { - return getImpl()->districtHeatingEfficiency(); + double EnvironmentalImpactFactors::districtHeatingWaterEfficiency() const { + return getImpl()->districtHeatingWaterEfficiency(); } double EnvironmentalImpactFactors::districtCoolingCOP() const { return getImpl()->districtCoolingCOP(); } - double EnvironmentalImpactFactors::steamConversionEfficiency() const { - return getImpl()->steamConversionEfficiency(); + double EnvironmentalImpactFactors::districtHeatingSteamConversionEfficiency() const { + return getImpl()->districtHeatingSteamConversionEfficiency(); } double EnvironmentalImpactFactors::totalCarbonEquivalentEmissionFactorFromN2O() const { @@ -157,16 +157,16 @@ namespace model { return getImpl()->totalCarbonEquivalentEmissionFactorFromCO2(); } - bool EnvironmentalImpactFactors::setDistrictHeatingEfficiency(double districtHeatingEfficiency) { - return getImpl()->setDistrictHeatingEfficiency(districtHeatingEfficiency); + bool EnvironmentalImpactFactors::setDistrictHeatingWaterEfficiency(double districtHeatingWaterEfficiency) { + return getImpl()->setDistrictHeatingWaterEfficiency(districtHeatingWaterEfficiency); } bool EnvironmentalImpactFactors::setDistrictCoolingCOP(double districtCoolingCOP) { return getImpl()->setDistrictCoolingCOP(districtCoolingCOP); } - bool EnvironmentalImpactFactors::setSteamConversionEfficiency(double steamConversionEfficiency) { - return getImpl()->setSteamConversionEfficiency(steamConversionEfficiency); + bool EnvironmentalImpactFactors::setDistrictHeatingSteamConversionEfficiency(double districtHeatingSteamConversionEfficiency) { + return getImpl()->setDistrictHeatingSteamConversionEfficiency(districtHeatingSteamConversionEfficiency); } bool EnvironmentalImpactFactors::setTotalCarbonEquivalentEmissionFactorFromN2O(double totalCarbonEquivalentEmissionFactorFromN2O) { @@ -186,6 +186,28 @@ namespace model { /// @cond EnvironmentalImpactFactors::EnvironmentalImpactFactors(std::shared_ptr impl) : ModelObject(impl) {} + + // DEPRECATED + double EnvironmentalImpactFactors::districtHeatingEfficiency() const { + DEPRECATED_AT_MSG(3, 7, 0, "Use districtHeatingWaterEfficiency instead."); + return getImpl()->districtHeatingWaterEfficiency(); + } + + bool EnvironmentalImpactFactors::setDistrictHeatingEfficiency(double districtHeatingEfficiency) { + DEPRECATED_AT_MSG(3, 7, 0, "Use setDistrictHeatingWaterEfficiency instead."); + return getImpl()->setDistrictHeatingWaterEfficiency(districtHeatingEfficiency); + } + + double EnvironmentalImpactFactors::steamConversionEfficiency() const { + DEPRECATED_AT_MSG(3, 7, 0, "Use districtHeatingSteamConversionEfficiency instead."); + return getImpl()->districtHeatingSteamConversionEfficiency(); + } + + bool EnvironmentalImpactFactors::setSteamConversionEfficiency(double steamConversionEfficiency) { + DEPRECATED_AT_MSG(3, 7, 0, "Use setDistrictHeatingSteamConversionEfficiency instead."); + return getImpl()->setDistrictHeatingSteamConversionEfficiency(steamConversionEfficiency); + } + /// @endcond } // namespace model diff --git a/src/model/EnvironmentalImpactFactors.hpp b/src/model/EnvironmentalImpactFactors.hpp index edfcd252e3f..34e8b71074b 100644 --- a/src/model/EnvironmentalImpactFactors.hpp +++ b/src/model/EnvironmentalImpactFactors.hpp @@ -9,6 +9,8 @@ #include #include "ModelObject.hpp" +#include "../utilities/core/Deprecated.hpp" + namespace openstudio { namespace model { @@ -40,11 +42,13 @@ namespace model { /** @name Getters */ //@{ - double districtHeatingEfficiency() const; + double districtHeatingWaterEfficiency() const; + OS_DEPRECATED(3, 7, 0) double districtHeatingEfficiency() const; double districtCoolingCOP() const; - double steamConversionEfficiency() const; + double districtHeatingSteamConversionEfficiency() const; + OS_DEPRECATED(3, 7, 0) double steamConversionEfficiency() const; double totalCarbonEquivalentEmissionFactorFromN2O() const; @@ -56,11 +60,13 @@ namespace model { /** @name Setters */ //@{ - bool setDistrictHeatingEfficiency(double districtHeatingEfficiency); + bool setDistrictHeatingWaterEfficiency(double districtHeatingEfficiency); + OS_DEPRECATED(3, 7, 0) bool setDistrictHeatingEfficiency(double districtHeatingEfficiency); bool setDistrictCoolingCOP(double districtCoolingCOP); - bool setSteamConversionEfficiency(double steamConversionEfficiency); + bool setDistrictHeatingSteamConversionEfficiency(double districtHeatingSteamConversionEfficiency); + OS_DEPRECATED(3, 7, 0) bool setSteamConversionEfficiency(double steamConversionEfficiency); bool setTotalCarbonEquivalentEmissionFactorFromN2O(double totalCarbonEquivalentEmissionFactorFromN2O); diff --git a/src/model/EnvironmentalImpactFactors_Impl.hpp b/src/model/EnvironmentalImpactFactors_Impl.hpp index 94e4fc08665..35c0f3e9fa8 100644 --- a/src/model/EnvironmentalImpactFactors_Impl.hpp +++ b/src/model/EnvironmentalImpactFactors_Impl.hpp @@ -41,11 +41,11 @@ namespace model { /** @name Getters */ //@{ - double districtHeatingEfficiency() const; + double districtHeatingWaterEfficiency() const; double districtCoolingCOP() const; - double steamConversionEfficiency() const; + double districtHeatingSteamConversionEfficiency() const; double totalCarbonEquivalentEmissionFactorFromN2O() const; @@ -57,11 +57,11 @@ namespace model { /** @name Setters */ //@{ - bool setDistrictHeatingEfficiency(double districtHeatingEfficiency); + bool setDistrictHeatingWaterEfficiency(double districtHeatingEfficiency); bool setDistrictCoolingCOP(double districtCoolingCOP); - bool setSteamConversionEfficiency(double steamConversionEfficiency); + bool setDistrictHeatingSteamConversionEfficiency(double districtHeatingSteamConversionEfficiency); bool setTotalCarbonEquivalentEmissionFactorFromN2O(double totalCarbonEquivalentEmissionFactorFromN2O); diff --git a/src/model/ExteriorFuelEquipment.cpp b/src/model/ExteriorFuelEquipment.cpp index d59d2450f54..ce878f2e41d 100644 --- a/src/model/ExteriorFuelEquipment.cpp +++ b/src/model/ExteriorFuelEquipment.cpp @@ -15,6 +15,7 @@ #include "Facility.hpp" #include "Facility_Impl.hpp" +#include "../utilities/data/DataEnums.hpp" #include #include @@ -130,8 +131,8 @@ namespace model { OS_ASSERT(result); } - bool ExteriorFuelEquipment_Impl::setFuelType(const std::string& fuelType) { - bool result = setString(OS_Exterior_FuelEquipmentFields::FuelUseType, fuelType); + bool ExteriorFuelEquipment_Impl::setFuelType(const FuelType& fuelType) { + bool result = setString(OS_Exterior_FuelEquipmentFields::FuelUseType, fuelType.valueDescription()); return result; } @@ -215,7 +216,7 @@ namespace model { ok = setSchedule(defaultSchedule); OS_ASSERT(ok); - setFuelType("Electricity"); + setFuelType(FuelType::Electricity); /* *ok = this->setMultiplier(1.0); @@ -238,7 +239,7 @@ namespace model { LOG_AND_THROW("Could not set " << briefDescription() << "'s schedule to " << schedule.briefDescription() << "."); } - setFuelType("NaturalGas"); + setFuelType(FuelType::Gas); /* *ok = this->setMultiplier(1.0); @@ -301,10 +302,19 @@ namespace model { getImpl()->resetSchedule(); } - bool ExteriorFuelEquipment::setFuelType(const std::string& fuelType) { + bool ExteriorFuelEquipment::setFuelType(const FuelType& fuelType) { return getImpl()->setFuelType(fuelType); } + bool ExteriorFuelEquipment::setFuelType(const std::string& fuelType) { + try { + return setFuelType(FuelType{fuelType}); + } catch (std::runtime_error& e) { + LOG(Debug, e.what()); + return false; + } + } + bool ExteriorFuelEquipment::setMultiplier(double multiplier) { return getImpl()->setMultiplier(multiplier); } diff --git a/src/model/ExteriorFuelEquipment.hpp b/src/model/ExteriorFuelEquipment.hpp index 62844e0b12c..370fc797a04 100644 --- a/src/model/ExteriorFuelEquipment.hpp +++ b/src/model/ExteriorFuelEquipment.hpp @@ -10,11 +10,14 @@ #include "ExteriorLoadInstance.hpp" namespace openstudio { + +class FuelType; + namespace model { class ExteriorFuelEquipmentDefinition; - class Schedule; class Facility; + class Schedule; namespace detail { @@ -80,6 +83,7 @@ namespace model { void resetSchedule(); + bool setFuelType(const FuelType& fuelType); bool setFuelType(const std::string& fuelType); bool setMultiplier(double multiplier); diff --git a/src/model/ExteriorFuelEquipment_Impl.hpp b/src/model/ExteriorFuelEquipment_Impl.hpp index 54e08a9cd74..0a853703dcb 100644 --- a/src/model/ExteriorFuelEquipment_Impl.hpp +++ b/src/model/ExteriorFuelEquipment_Impl.hpp @@ -10,6 +10,9 @@ #include "ExteriorLoadInstance_Impl.hpp" namespace openstudio { + +class FuelType; + namespace model { class ExteriorFuelEquipmentDefinition; @@ -76,7 +79,7 @@ namespace model { void resetSchedule(); - bool setFuelType(const std::string& fuelType); + bool setFuelType(const FuelType& fuelType); bool setMultiplier(double multiplier); diff --git a/src/model/MeterCustom.cpp b/src/model/MeterCustom.cpp index 5e39e17e565..b631aaa2d60 100644 --- a/src/model/MeterCustom.cpp +++ b/src/model/MeterCustom.cpp @@ -16,6 +16,8 @@ #include #include +#include "../utilities/data/DataEnums.hpp" + // Needed for extensible groups #include "../utilities/idf/WorkspaceExtensibleGroup.hpp" @@ -55,8 +57,8 @@ namespace model { return getString(OS_Meter_CustomFields::FuelType, true); } - bool MeterCustom_Impl::setFuelType(const std::string& fuelType) { - return setString(OS_Meter_CustomFields::FuelType, fuelType); + bool MeterCustom_Impl::setFuelType(const FuelType& fuelType) { + return setString(OS_Meter_CustomFields::FuelType, fuelType.valueDescription()); } void MeterCustom_Impl::resetFuelType() { @@ -177,7 +179,7 @@ namespace model { OS_ASSERT(getImpl()); // Default the fuelType to Electricity (maybe "Generic"?) - setFuelType("Electricity"); + setFuelType(FuelType::Electricity); } IddObjectType MeterCustom::iddObjectType() { @@ -192,10 +194,23 @@ namespace model { return getImpl()->fuelType(); } - bool MeterCustom::setFuelType(const std::string& fuelType) { + bool MeterCustom::setFuelType(const FuelType& fuelType) { return getImpl()->setFuelType(fuelType); } + bool MeterCustom::setFuelType(const std::string& fuelType) { + // Special case for custom meters, the only ones that have "Generic" as a possibility + if (openstudio::istringEqual("Generic", fuelType)) { + return this->setString(OS_Meter_CustomFields::FuelType, "Generic"); + } + try { + return setFuelType(FuelType{fuelType}); + } catch (std::runtime_error& e) { + LOG(Debug, e.what()); + return false; + } + } + void MeterCustom::resetFuelType() { getImpl()->resetFuelType(); } diff --git a/src/model/MeterCustom.hpp b/src/model/MeterCustom.hpp index 5df67b56c5e..3c374600139 100644 --- a/src/model/MeterCustom.hpp +++ b/src/model/MeterCustom.hpp @@ -12,6 +12,9 @@ //#include namespace openstudio { + +class FuelType; + namespace model { namespace detail { @@ -65,6 +68,7 @@ namespace model { /** @name Setters */ //@{ + bool setFuelType(const FuelType& fuelType); bool setFuelType(const std::string& fuelType); void resetFuelType(); diff --git a/src/model/MeterCustomDecrement.cpp b/src/model/MeterCustomDecrement.cpp index 1aa6ec3242f..6853c24491b 100644 --- a/src/model/MeterCustomDecrement.cpp +++ b/src/model/MeterCustomDecrement.cpp @@ -16,6 +16,8 @@ #include #include +#include "../utilities/data/DataEnums.hpp" + // Needed for extensible groups #include "../utilities/idf/WorkspaceExtensibleGroup.hpp" @@ -55,8 +57,8 @@ namespace model { return getString(OS_Meter_CustomDecrementFields::FuelType, true); } - bool MeterCustomDecrement_Impl::setFuelType(const std::string& fuelType) { - return setString(OS_Meter_CustomDecrementFields::FuelType, fuelType); + bool MeterCustomDecrement_Impl::setFuelType(const FuelType& fuelType) { + return setString(OS_Meter_CustomDecrementFields::FuelType, fuelType.valueDescription()); } void MeterCustomDecrement_Impl::resetFuelType() { @@ -189,7 +191,7 @@ namespace model { setSourceMeterName(sourceMeterName); // Default the fuelType to Electricity (maybe "Generic"?) - setFuelType("Electricity"); + setFuelType(FuelType::Electricity); } IddObjectType MeterCustomDecrement::iddObjectType() { @@ -204,10 +206,23 @@ namespace model { return getImpl()->fuelType(); } - bool MeterCustomDecrement::setFuelType(const std::string& fuelType) { + bool MeterCustomDecrement::setFuelType(const FuelType& fuelType) { return getImpl()->setFuelType(fuelType); } + bool MeterCustomDecrement::setFuelType(const std::string& fuelType) { + // Special case for custom meters, the only ones that have "Generic" as a possibility + if (openstudio::istringEqual("Generic", fuelType)) { + return this->setString(OS_Meter_CustomDecrementFields::FuelType, "Generic"); + } + try { + return setFuelType(FuelType{fuelType}); + } catch (std::runtime_error& e) { + LOG(Debug, e.what()); + return false; + } + } + void MeterCustomDecrement::resetFuelType() { getImpl()->resetFuelType(); } diff --git a/src/model/MeterCustomDecrement.hpp b/src/model/MeterCustomDecrement.hpp index e23b89b0ff1..1d5d8fb5968 100644 --- a/src/model/MeterCustomDecrement.hpp +++ b/src/model/MeterCustomDecrement.hpp @@ -12,6 +12,9 @@ //#include namespace openstudio { + +class FuelType; + namespace model { namespace detail { @@ -67,6 +70,7 @@ namespace model { /** @name Setters */ //@{ + bool setFuelType(const FuelType& fuelType); bool setFuelType(const std::string& fuelType); void resetFuelType(); diff --git a/src/model/MeterCustomDecrement_Impl.hpp b/src/model/MeterCustomDecrement_Impl.hpp index 1ba3a21b42d..06e4dc423d5 100644 --- a/src/model/MeterCustomDecrement_Impl.hpp +++ b/src/model/MeterCustomDecrement_Impl.hpp @@ -10,6 +10,9 @@ #include "ModelObject_Impl.hpp" namespace openstudio { + +class FuelType; + namespace model { namespace detail { @@ -67,7 +70,7 @@ namespace model { /** @name Setters */ //@{ - bool setFuelType(const std::string& fuelType); + bool setFuelType(const FuelType& fuelType); void resetFuelType(); diff --git a/src/model/MeterCustom_Impl.hpp b/src/model/MeterCustom_Impl.hpp index c7c58224bf7..7237e21c057 100644 --- a/src/model/MeterCustom_Impl.hpp +++ b/src/model/MeterCustom_Impl.hpp @@ -10,6 +10,9 @@ #include "ModelObject_Impl.hpp" namespace openstudio { + +class FuelType; + namespace model { namespace detail { @@ -65,7 +68,7 @@ namespace model { /** @name Setters */ //@{ - bool setFuelType(const std::string& fuelType); + bool setFuelType(const FuelType& fuelType); void resetFuelType(); diff --git a/src/model/OtherEquipment.cpp b/src/model/OtherEquipment.cpp index f6a652f006c..74c24b6c0fd 100644 --- a/src/model/OtherEquipment.cpp +++ b/src/model/OtherEquipment.cpp @@ -19,11 +19,14 @@ #include "LifeCycleCost.hpp" #include "Model.hpp" +#include "../utilities/data/DataEnums.hpp" + #include #include #include #include "../utilities/core/Assert.hpp" +#include "utilities/core/Compare.hpp" namespace openstudio { namespace model { @@ -198,8 +201,8 @@ namespace model { OS_ASSERT(setString(OS_OtherEquipmentFields::EndUseSubcategory, "")); } - bool OtherEquipment_Impl::setFuelType(const std::string& fuelType) { - return this->setString(OS_OtherEquipmentFields::FuelType, fuelType); + bool OtherEquipment_Impl::setFuelType(const FuelType& fuelType) { + return this->setString(OS_OtherEquipmentFields::FuelType, fuelType.valueDescription()); } void OtherEquipment_Impl::resetFuelType() { @@ -349,10 +352,23 @@ namespace model { return getImpl()->isFuelTypeDefaulted(); } - bool OtherEquipment::setFuelType(const std::string& fuelType) { + bool OtherEquipment::setFuelType(const FuelType& fuelType) { return getImpl()->setFuelType(fuelType); } + bool OtherEquipment::setFuelType(const std::string& fuelType) { + // Special case for this one, the only that has "None" as a possibility + if (openstudio::istringEqual("None", fuelType)) { + return this->setString(OS_OtherEquipmentFields::FuelType, "None"); + } + try { + return setFuelType(FuelType{fuelType}); + } catch (std::runtime_error& e) { + LOG(Debug, e.what()); + return false; + } + } + void OtherEquipment::resetFuelType() { getImpl()->resetFuelType(); } diff --git a/src/model/OtherEquipment.hpp b/src/model/OtherEquipment.hpp index 1d5b3e7d58c..a7ab7240cd2 100644 --- a/src/model/OtherEquipment.hpp +++ b/src/model/OtherEquipment.hpp @@ -10,6 +10,9 @@ #include "SpaceLoadInstance.hpp" namespace openstudio { + +class FuelType; + namespace model { class OtherEquipmentDefinition; @@ -80,6 +83,8 @@ namespace model { void resetEndUseSubcategory(); /** Sets the fuel type. **/ + bool setFuelType(const FuelType& fuelType); + bool setFuelType(const std::string& fuelType); /** Resets the fuel type to its default. **/ diff --git a/src/model/OtherEquipment_Impl.hpp b/src/model/OtherEquipment_Impl.hpp index a4bfc7dcaab..533748522fa 100644 --- a/src/model/OtherEquipment_Impl.hpp +++ b/src/model/OtherEquipment_Impl.hpp @@ -10,6 +10,9 @@ #include "SpaceLoadInstance_Impl.hpp" namespace openstudio { + +class FuelType; + namespace model { class OtherEquipmentDefinition; @@ -81,7 +84,7 @@ namespace model { void resetEndUseSubcategory(); - bool setFuelType(const std::string& fuelType); + bool setFuelType(const FuelType& fuelType); void resetFuelType(); diff --git a/src/model/OutputMeter.cpp b/src/model/OutputMeter.cpp index ca433c4285c..d8bda53f751 100644 --- a/src/model/OutputMeter.cpp +++ b/src/model/OutputMeter.cpp @@ -409,8 +409,8 @@ namespace model { static const boost::regex result( "^(.*?)?:?(InteriorLights|ExteriorLights|InteriorEquipment|ExteriorEquipment|Fans|Pumps|HeatingCoils|Heating|CoolingCoils|Cooling|" "HeatRejection|Humidifier|HeatRecoveryForCooling|HeatRecoveryForHeating|HeatRecovery|WaterSystems|Cogeneration|Refrigeration|Chillers|Boilers|" - "Baseboard)?:?(Electricity|Gasoline|NaturalGas|Diesel|Coal|FuelOilNo1|FuelOilNo2|Propane|Water|Steam|DistrictCooling|DistrictHeating|" - "OtherFuel1|OtherFuel2|EnergyTransfer)?:?(Facility|Building|HVAC|Zone|System|Plant)?:?([^:]*?)?$"); + "Baseboard)?:?(Electricity|Gasoline|NaturalGas|Diesel|Coal|FuelOilNo1|FuelOilNo2|Propane|Water|DistrictHeatingSteam|DistrictCooling|" + "DistrictHeatingWater|OtherFuel1|OtherFuel2|EnergyTransfer)?:?(Facility|Building|HVAC|Zone|System|Plant)?:?([^:]*?)?$"); return result; } diff --git a/src/model/UtilityBill.cpp b/src/model/UtilityBill.cpp index 3c0f16ab1cc..06e36690c8c 100644 --- a/src/model/UtilityBill.cpp +++ b/src/model/UtilityBill.cpp @@ -142,7 +142,7 @@ namespace model { } if (!result) { - LOG(Error, "Unknown consumption unit '" << consumptionUnit << "' for fuel type '" << fuelType.valueName() << "'"); + LOG(Error, "Unknown consumption unit '" << consumptionUnit << "' for fuel type '" << fuelType.valueDescription() << "'"); } return result; @@ -346,7 +346,7 @@ namespace model { } if (!value) { - LOG(Error, "Unknown consumption unit '" << consumptionUnit << "' for fuel type '" << fuelType.valueName() << "'"); + LOG(Error, "Unknown consumption unit '" << consumptionUnit << "' for fuel type '" << fuelType.valueDescription() << "'"); } } @@ -376,7 +376,7 @@ namespace model { } else if (peakDemandUnit.get() == "W") { result = "Watts"; } else { - LOG(Error, "Unknown peak demand unit '" << peakDemandUnit.get() << "' for fuel type '" << this->fuelType().valueName() << "'"); + LOG(Error, "Unknown peak demand unit '" << peakDemandUnit.get() << "' for fuel type '" << this->fuelType().valueDescription() << "'"); } } return result; @@ -395,7 +395,7 @@ namespace model { } else if (peakDemandUnit.get() == "W") { result = 1; } else { - LOG(Error, "Unknown peak demand unit '" << peakDemandUnit.get() << "' for fuel type '" << fuelType.valueName() << "'"); + LOG(Error, "Unknown peak demand unit '" << peakDemandUnit.get() << "' for fuel type '" << fuelType.valueDescription() << "'"); } } return result; @@ -610,7 +610,7 @@ namespace model { result.emplace_back("MBtu"); break; default: - LOG_AND_THROW("Unknown fuel type '" + fuelType.valueName() + "'"); + LOG_AND_THROW("Unknown fuel type '" + fuelType.valueDescription() + "'"); } return result; @@ -654,7 +654,7 @@ namespace model { case FuelType::EnergyTransfer: break; default: - LOG_AND_THROW("Unknown fuel type '" + fuelType.valueName() + "'"); + LOG_AND_THROW("Unknown fuel type '" + fuelType.valueDescription() + "'"); } return result; @@ -1242,10 +1242,10 @@ namespace model { UtilityBill::UtilityBill(const FuelType& fuelType, const Model& model) : ModelObject(UtilityBill::iddObjectType(), model) { OS_ASSERT(getImpl()); - bool test = setString(OS_UtilityBillFields::FuelType, fuelType.valueName()); + bool test = setString(OS_UtilityBillFields::FuelType, fuelType.valueDescription()); if (!test) { remove(); - LOG_AND_THROW("Unable to create UtilityBill for FuelType " << fuelType.valueName() << "."); + LOG_AND_THROW("Unable to create UtilityBill for FuelType " << fuelType.valueDescription() << "."); } std::vector consumptionUnitValues = this->consumptionUnitValues(); diff --git a/src/model/WaterHeaterMixed.cpp b/src/model/WaterHeaterMixed.cpp index c4aa6ced0af..f8117b463c4 100644 --- a/src/model/WaterHeaterMixed.cpp +++ b/src/model/WaterHeaterMixed.cpp @@ -537,8 +537,8 @@ namespace model { OS_ASSERT(result); } - bool WaterHeaterMixed_Impl::setHeaterFuelType(const std::string& heaterFuelType) { - bool result = setString(OS_WaterHeater_MixedFields::HeaterFuelType, heaterFuelType); + bool WaterHeaterMixed_Impl::setHeaterFuelType(const FuelType& heaterFuelType) { + const bool result = setString(OS_WaterHeater_MixedFields::HeaterFuelType, heaterFuelType.valueDescription()); return result; } @@ -582,13 +582,8 @@ namespace model { OS_ASSERT(result); } - bool WaterHeaterMixed_Impl::setOffCycleParasiticFuelType(boost::optional offCycleParasiticFuelType) { - bool result = false; - if (offCycleParasiticFuelType) { - result = setString(OS_WaterHeater_MixedFields::OffCycleParasiticFuelType, offCycleParasiticFuelType.get()); - } else { - result = setString(OS_WaterHeater_MixedFields::OffCycleParasiticFuelType, ""); - } + bool WaterHeaterMixed_Impl::setOffCycleParasiticFuelType(const FuelType& offCycleParasiticFuelType) { + const bool result = setString(OS_WaterHeater_MixedFields::OffCycleParasiticFuelType, offCycleParasiticFuelType.valueDescription()); return result; } @@ -617,13 +612,8 @@ namespace model { OS_ASSERT(result); } - bool WaterHeaterMixed_Impl::setOnCycleParasiticFuelType(boost::optional onCycleParasiticFuelType) { - bool result = false; - if (onCycleParasiticFuelType) { - result = setString(OS_WaterHeater_MixedFields::OnCycleParasiticFuelType, onCycleParasiticFuelType.get()); - } else { - result = setString(OS_WaterHeater_MixedFields::OnCycleParasiticFuelType, ""); - } + bool WaterHeaterMixed_Impl::setOnCycleParasiticFuelType(const FuelType& onCycleParasiticFuelType) { + const bool result = setString(OS_WaterHeater_MixedFields::OnCycleParasiticFuelType, onCycleParasiticFuelType.valueDescription()); return result; } @@ -1467,12 +1457,12 @@ namespace model { setMaximumTemperatureLimit(82.22); setHeaterControlType("Cycle"); setHeaterMaximumCapacity(845000); - setHeaterFuelType("NaturalGas"); + setHeaterFuelType(FuelType::Gas); setHeaterThermalEfficiency(0.8); setOffCycleParasiticFuelConsumptionRate(20.0); - setOffCycleParasiticFuelType("NaturalGas"); + setOffCycleParasiticFuelType(FuelType::Gas); setOffCycleParasiticHeatFractiontoTank(0.8); - setOnCycleParasiticFuelType("NaturalGas"); + setOnCycleParasiticFuelType(FuelType::Gas); setOffCycleLossCoefficienttoAmbientTemperature(6.0); setOnCycleLossCoefficienttoAmbientTemperature(6.0); setUseSideEffectiveness(1.0); @@ -1816,10 +1806,19 @@ namespace model { getImpl()->resetHeaterIgnitionDelay(); } - bool WaterHeaterMixed::setHeaterFuelType(const std::string& heaterFuelType) { + bool WaterHeaterMixed::setHeaterFuelType(const FuelType& heaterFuelType) { return getImpl()->setHeaterFuelType(heaterFuelType); } + bool WaterHeaterMixed::setHeaterFuelType(const std::string& heaterFuelType) { + try { + return setHeaterFuelType(FuelType{heaterFuelType}); + } catch (std::runtime_error& e) { + LOG(Debug, e.what()); + return false; + } + } + bool WaterHeaterMixed::setHeaterThermalEfficiency(double heaterThermalEfficiency) { return getImpl()->setHeaterThermalEfficiency(heaterThermalEfficiency); } @@ -1844,10 +1843,19 @@ namespace model { getImpl()->resetOffCycleParasiticFuelConsumptionRate(); } - bool WaterHeaterMixed::setOffCycleParasiticFuelType(const std::string& offCycleParasiticFuelType) { + bool WaterHeaterMixed::setOffCycleParasiticFuelType(const FuelType& offCycleParasiticFuelType) { return getImpl()->setOffCycleParasiticFuelType(offCycleParasiticFuelType); } + bool WaterHeaterMixed::setOffCycleParasiticFuelType(const std::string& offCycleParasiticFuelType) { + try { + return setOffCycleParasiticFuelType(FuelType{offCycleParasiticFuelType}); + } catch (std::runtime_error& e) { + LOG(Debug, e.what()); + return false; + } + } + void WaterHeaterMixed::resetOffCycleParasiticFuelType() { getImpl()->resetOffCycleParasiticFuelType(); } @@ -1868,10 +1876,19 @@ namespace model { getImpl()->resetOnCycleParasiticFuelConsumptionRate(); } - bool WaterHeaterMixed::setOnCycleParasiticFuelType(const std::string& onCycleParasiticFuelType) { + bool WaterHeaterMixed::setOnCycleParasiticFuelType(const FuelType& onCycleParasiticFuelType) { return getImpl()->setOnCycleParasiticFuelType(onCycleParasiticFuelType); } + bool WaterHeaterMixed::setOnCycleParasiticFuelType(const std::string& onCycleParasiticFuelType) { + try { + return setOnCycleParasiticFuelType(FuelType{onCycleParasiticFuelType}); + } catch (std::runtime_error& e) { + LOG(Debug, e.what()); + return false; + } + } + void WaterHeaterMixed::resetOnCycleParasiticFuelType() { getImpl()->resetOnCycleParasiticFuelType(); } diff --git a/src/model/WaterHeaterMixed.hpp b/src/model/WaterHeaterMixed.hpp index 013993ae63f..74dfaf83e7a 100644 --- a/src/model/WaterHeaterMixed.hpp +++ b/src/model/WaterHeaterMixed.hpp @@ -11,6 +11,8 @@ namespace openstudio { +class FuelType; + namespace model { class Schedule; @@ -220,6 +222,7 @@ namespace model { void resetHeaterIgnitionDelay(); + bool setHeaterFuelType(const FuelType& heaterFuelType); bool setHeaterFuelType(const std::string& heaterFuelType); bool setHeaterThermalEfficiency(double heaterThermalEfficiency); @@ -234,6 +237,7 @@ namespace model { void resetOffCycleParasiticFuelConsumptionRate(); + bool setOffCycleParasiticFuelType(const FuelType& offCycleParasiticFuelType); bool setOffCycleParasiticFuelType(const std::string& offCycleParasiticFuelType); void resetOffCycleParasiticFuelType(); @@ -246,6 +250,7 @@ namespace model { void resetOnCycleParasiticFuelConsumptionRate(); + bool setOnCycleParasiticFuelType(const FuelType& onCycleParasiticFuelType); bool setOnCycleParasiticFuelType(const std::string& onCycleParasiticFuelType); void resetOnCycleParasiticFuelType(); diff --git a/src/model/WaterHeaterMixed_Impl.hpp b/src/model/WaterHeaterMixed_Impl.hpp index 17e73e12185..c06f8f7ebb4 100644 --- a/src/model/WaterHeaterMixed_Impl.hpp +++ b/src/model/WaterHeaterMixed_Impl.hpp @@ -11,6 +11,8 @@ namespace openstudio { +class FuelType; + namespace model { class Schedule; @@ -250,7 +252,7 @@ namespace model { void resetHeaterIgnitionDelay(); - bool setHeaterFuelType(const std::string& heaterFuelType); + bool setHeaterFuelType(const FuelType& heaterFuelType); bool setHeaterThermalEfficiency(boost::optional heaterThermalEfficiency); @@ -264,7 +266,7 @@ namespace model { void resetOffCycleParasiticFuelConsumptionRate(); - bool setOffCycleParasiticFuelType(boost::optional offCycleParasiticFuelType); + bool setOffCycleParasiticFuelType(const FuelType& offCycleParasiticFuelType); void resetOffCycleParasiticFuelType(); @@ -276,7 +278,7 @@ namespace model { void resetOnCycleParasiticFuelConsumptionRate(); - bool setOnCycleParasiticFuelType(boost::optional onCycleParasiticFuelType); + bool setOnCycleParasiticFuelType(const FuelType& onCycleParasiticFuelType); void resetOnCycleParasiticFuelType(); diff --git a/src/model/WaterHeaterStratified.cpp b/src/model/WaterHeaterStratified.cpp index eae5f6c709e..78b6ec1fbfc 100644 --- a/src/model/WaterHeaterStratified.cpp +++ b/src/model/WaterHeaterStratified.cpp @@ -687,8 +687,8 @@ namespace model { return result; } - bool WaterHeaterStratified_Impl::setHeaterFuelType(const std::string& heaterFuelType) { - bool result = setString(OS_WaterHeater_StratifiedFields::HeaterFuelType, heaterFuelType); + bool WaterHeaterStratified_Impl::setHeaterFuelType(const FuelType& heaterFuelType) { + const bool result = setString(OS_WaterHeater_StratifiedFields::HeaterFuelType, heaterFuelType.valueDescription()); return result; } @@ -702,13 +702,13 @@ namespace model { return result; } - bool WaterHeaterStratified_Impl::setOffCycleParasiticFuelType(const std::string& offCycleParasiticFuelType) { - bool result = setString(OS_WaterHeater_StratifiedFields::OffCycleParasiticFuelType, offCycleParasiticFuelType); + bool WaterHeaterStratified_Impl::setOffCycleParasiticFuelType(const FuelType& offCycleParasiticFuelType) { + bool result = setString(OS_WaterHeater_StratifiedFields::OffCycleParasiticFuelType, offCycleParasiticFuelType.valueDescription()); return result; } bool WaterHeaterStratified_Impl::setOffCycleParasiticHeatFractiontoTank(double offCycleParasiticHeatFractiontoTank) { - bool result = setDouble(OS_WaterHeater_StratifiedFields::OffCycleParasiticHeatFractiontoTank, offCycleParasiticHeatFractiontoTank); + const bool result = setDouble(OS_WaterHeater_StratifiedFields::OffCycleParasiticHeatFractiontoTank, offCycleParasiticHeatFractiontoTank); return result; } @@ -722,8 +722,8 @@ namespace model { return result; } - bool WaterHeaterStratified_Impl::setOnCycleParasiticFuelType(const std::string& onCycleParasiticFuelType) { - bool result = setString(OS_WaterHeater_StratifiedFields::OnCycleParasiticFuelType, onCycleParasiticFuelType); + bool WaterHeaterStratified_Impl::setOnCycleParasiticFuelType(const FuelType& onCycleParasiticFuelType) { + const bool result = setString(OS_WaterHeater_StratifiedFields::OnCycleParasiticFuelType, onCycleParasiticFuelType.valueDescription()); return result; } @@ -1457,16 +1457,16 @@ namespace model { setHeater2Capacity(4500); setHeater2Height(0); - setHeaterFuelType("Electricity"); + setHeaterFuelType(FuelType::Electricity); setHeaterThermalEfficiency(0.98); setOffCycleParasiticFuelConsumptionRate(10.0); - setOffCycleParasiticFuelType("Electricity"); + setOffCycleParasiticFuelType(FuelType::Electricity); setOffCycleParasiticHeatFractiontoTank(0); setOffCycleParasiticHeight(0); setOnCycleParasiticFuelConsumptionRate(10.0); - setOnCycleParasiticFuelType("Electricity"); + setOnCycleParasiticFuelType(FuelType::Electricity); setOnCycleParasiticHeatFractiontoTank(0); setOnCycleParasiticHeight(0); @@ -1902,10 +1902,19 @@ namespace model { return getImpl()->setHeater2Height(heater2Height); } - bool WaterHeaterStratified::setHeaterFuelType(const std::string& heaterFuelType) { + bool WaterHeaterStratified::setHeaterFuelType(const FuelType& heaterFuelType) { return getImpl()->setHeaterFuelType(heaterFuelType); } + bool WaterHeaterStratified::setHeaterFuelType(const std::string& heaterFuelType) { + try { + return setHeaterFuelType(FuelType{heaterFuelType}); + } catch (std::runtime_error& e) { + LOG(Debug, e.what()); + return false; + } + } + bool WaterHeaterStratified::setHeaterThermalEfficiency(double heaterThermalEfficiency) { return getImpl()->setHeaterThermalEfficiency(heaterThermalEfficiency); } @@ -1914,10 +1923,19 @@ namespace model { return getImpl()->setOffCycleParasiticFuelConsumptionRate(offCycleParasiticFuelConsumptionRate); } - bool WaterHeaterStratified::setOffCycleParasiticFuelType(const std::string& offCycleParasiticFuelType) { + bool WaterHeaterStratified::setOffCycleParasiticFuelType(const FuelType& offCycleParasiticFuelType) { return getImpl()->setOffCycleParasiticFuelType(offCycleParasiticFuelType); } + bool WaterHeaterStratified::setOffCycleParasiticFuelType(const std::string& offCycleParasiticFuelType) { + try { + return setOffCycleParasiticFuelType(FuelType{offCycleParasiticFuelType}); + } catch (std::runtime_error& e) { + LOG(Debug, e.what()); + return false; + } + } + bool WaterHeaterStratified::setOffCycleParasiticHeatFractiontoTank(double offCycleParasiticHeatFractiontoTank) { return getImpl()->setOffCycleParasiticHeatFractiontoTank(offCycleParasiticHeatFractiontoTank); } @@ -1930,10 +1948,19 @@ namespace model { return getImpl()->setOnCycleParasiticFuelConsumptionRate(onCycleParasiticFuelConsumptionRate); } - bool WaterHeaterStratified::setOnCycleParasiticFuelType(const std::string& onCycleParasiticFuelType) { + bool WaterHeaterStratified::setOnCycleParasiticFuelType(const FuelType& onCycleParasiticFuelType) { return getImpl()->setOnCycleParasiticFuelType(onCycleParasiticFuelType); } + bool WaterHeaterStratified::setOnCycleParasiticFuelType(const std::string& onCycleParasiticFuelType) { + try { + return setOnCycleParasiticFuelType(FuelType{onCycleParasiticFuelType}); + } catch (std::runtime_error& e) { + LOG(Debug, e.what()); + return false; + } + } + bool WaterHeaterStratified::setOnCycleParasiticHeatFractiontoTank(double onCycleParasiticHeatFractiontoTank) { return getImpl()->setOnCycleParasiticHeatFractiontoTank(onCycleParasiticHeatFractiontoTank); } diff --git a/src/model/WaterHeaterStratified.hpp b/src/model/WaterHeaterStratified.hpp index 764a439b1de..228c5c16857 100644 --- a/src/model/WaterHeaterStratified.hpp +++ b/src/model/WaterHeaterStratified.hpp @@ -11,6 +11,8 @@ namespace openstudio { +class FuelType; + namespace model { class Schedule; @@ -244,12 +246,14 @@ namespace model { bool setHeater2Height(double heater2Height); + bool setHeaterFuelType(const FuelType& heaterFuelType); bool setHeaterFuelType(const std::string& heaterFuelType); bool setHeaterThermalEfficiency(double heaterThermalEfficiency); bool setOffCycleParasiticFuelConsumptionRate(double offCycleParasiticFuelConsumptionRate); + bool setOffCycleParasiticFuelType(const FuelType& offCycleParasiticFuelType); bool setOffCycleParasiticFuelType(const std::string& offCycleParasiticFuelType); bool setOffCycleParasiticHeatFractiontoTank(double offCycleParasiticHeatFractiontoTank); @@ -258,6 +262,7 @@ namespace model { bool setOnCycleParasiticFuelConsumptionRate(double onCycleParasiticFuelConsumptionRate); + bool setOnCycleParasiticFuelType(const FuelType& onCycleParasiticFuelType); bool setOnCycleParasiticFuelType(const std::string& onCycleParasiticFuelType); bool setOnCycleParasiticHeatFractiontoTank(double onCycleParasiticHeatFractiontoTank); diff --git a/src/model/WaterHeaterStratified_Impl.hpp b/src/model/WaterHeaterStratified_Impl.hpp index 1262540a8cf..b069de55150 100644 --- a/src/model/WaterHeaterStratified_Impl.hpp +++ b/src/model/WaterHeaterStratified_Impl.hpp @@ -11,6 +11,8 @@ namespace openstudio { +class FuelType; + namespace model { class Schedule; @@ -273,13 +275,13 @@ namespace model { bool setHeater2Height(double heater2Height); - bool setHeaterFuelType(const std::string& heaterFuelType); + bool setHeaterFuelType(const FuelType& heaterFuelType); bool setHeaterThermalEfficiency(double heaterThermalEfficiency); bool setOffCycleParasiticFuelConsumptionRate(double offCycleParasiticFuelConsumptionRate); - bool setOffCycleParasiticFuelType(const std::string& offCycleParasiticFuelType); + bool setOffCycleParasiticFuelType(const FuelType& offCycleParasiticFuelType); bool setOffCycleParasiticHeatFractiontoTank(double offCycleParasiticHeatFractiontoTank); @@ -287,7 +289,7 @@ namespace model { bool setOnCycleParasiticFuelConsumptionRate(double onCycleParasiticFuelConsumptionRate); - bool setOnCycleParasiticFuelType(const std::string& onCycleParasiticFuelType); + bool setOnCycleParasiticFuelType(const FuelType& onCycleParasiticFuelType); bool setOnCycleParasiticHeatFractiontoTank(double onCycleParasiticHeatFractiontoTank); diff --git a/src/model/test/EnvironmentalImpactFactors_GTest.cpp b/src/model/test/EnvironmentalImpactFactors_GTest.cpp index e60c8bbf08a..50abed3cbcd 100644 --- a/src/model/test/EnvironmentalImpactFactors_GTest.cpp +++ b/src/model/test/EnvironmentalImpactFactors_GTest.cpp @@ -18,11 +18,11 @@ TEST_F(ModelFixture, EnvironmentalImpactFactors_GettersSetters) { auto environmentalImpactFactors = m.getUniqueModelObject(); // District Heating Efficiency: Required Double - EXPECT_TRUE(environmentalImpactFactors.setDistrictHeatingEfficiency(0.1)); - EXPECT_EQ(0.1, environmentalImpactFactors.districtHeatingEfficiency()); + EXPECT_TRUE(environmentalImpactFactors.setDistrictHeatingWaterEfficiency(0.1)); + EXPECT_EQ(0.1, environmentalImpactFactors.districtHeatingWaterEfficiency()); // Bad Value - EXPECT_FALSE(environmentalImpactFactors.setDistrictHeatingEfficiency(-10.0)); - EXPECT_EQ(0.1, environmentalImpactFactors.districtHeatingEfficiency()); + EXPECT_FALSE(environmentalImpactFactors.setDistrictHeatingWaterEfficiency(-10.0)); + EXPECT_EQ(0.1, environmentalImpactFactors.districtHeatingWaterEfficiency()); // District Cooling COP: Required Double EXPECT_TRUE(environmentalImpactFactors.setDistrictCoolingCOP(0.1)); @@ -32,11 +32,11 @@ TEST_F(ModelFixture, EnvironmentalImpactFactors_GettersSetters) { EXPECT_EQ(0.1, environmentalImpactFactors.districtCoolingCOP()); // Steam Conversion Efficiency: Required Double - EXPECT_TRUE(environmentalImpactFactors.setSteamConversionEfficiency(0.1)); - EXPECT_EQ(0.1, environmentalImpactFactors.steamConversionEfficiency()); + EXPECT_TRUE(environmentalImpactFactors.setDistrictHeatingSteamConversionEfficiency(0.1)); + EXPECT_EQ(0.1, environmentalImpactFactors.districtHeatingSteamConversionEfficiency()); // Bad Value - EXPECT_FALSE(environmentalImpactFactors.setSteamConversionEfficiency(-10.0)); - EXPECT_EQ(0.1, environmentalImpactFactors.steamConversionEfficiency()); + EXPECT_FALSE(environmentalImpactFactors.setDistrictHeatingSteamConversionEfficiency(-10.0)); + EXPECT_EQ(0.1, environmentalImpactFactors.districtHeatingSteamConversionEfficiency()); // Total Carbon Equivalent Emission Factor From N2O: Required Double EXPECT_TRUE(environmentalImpactFactors.setTotalCarbonEquivalentEmissionFactorFromN2O(3)); diff --git a/src/osversion/VersionTranslator.cpp b/src/osversion/VersionTranslator.cpp index 5e54aac5d07..6d69ac2a16c 100644 --- a/src/osversion/VersionTranslator.cpp +++ b/src/osversion/VersionTranslator.cpp @@ -34,6 +34,7 @@ #include "../utilities/math/FloatCompare.hpp" #include "../utilities/idf/IdfObject_Impl.hpp" #include "../utilities/core/UUID.hpp" +#include "../utilities/data/DataEnums.hpp" #include #include @@ -5674,8 +5675,8 @@ namespace osversion { }); /***************************************************************************************************************************************************** - * Output:Meter fuel types renames * - *****************************************************************************************************************************************************/ + * Output:Meter fuel types renames * + *****************************************************************************************************************************************************/ const static std::map meterFuelTypesMap({ {"FuelOil_1", "FuelOilNo1"}, @@ -7897,6 +7898,83 @@ namespace osversion { {"OS:Coil:WaterHeating:AirToWaterHeatPump:Wrapped", 13}, }}; + // Making the map case-insentive by providing a Comparator `IstringCompare` + const std::map replaceFuelTypesMap{{ + {"Steam", "DistrictHeatingSteam"}, + {"DistrictHeating", "DistrictHeatingWater"}, + // Additionally, for UtilityBill, align the IDD choices to E+. This will also be covered by this + {"Gas", "NaturalGas"}, + {"FuelOil_1", "FuelOilNo1"}, + {"FuelOil_2", "FuelOilNo2"}, + {"OtherFuel_1", "OtherFuel1"}, + {"OtherFuel_2", "OtherFuel2"}, + }}; + + const std::multimap fuelTypeRenamesMap{{ + {"OS:OtherEquipment", 6}, // Fuel Type + {"OS:Exterior:FuelEquipment", 4}, // Fuel Use Type + {"OS:WaterHeater:Mixed", 11}, // Heater Fuel Type + {"OS:WaterHeater:Mixed", 15}, // Off Cycle Parasitic Fuel Type + {"OS:WaterHeater:Mixed", 18}, // On Cycle Parasitic Fuel Type + {"OS:WaterHeater:Stratified", 17}, // Heater Fuel Type + {"OS:WaterHeater:Stratified", 20}, // Off Cycle Parasitic Fuel Type + {"OS:WaterHeater:Stratified", 24}, // On Cycle Parasitic Fuel Type + {"OS:UtilityBill", 2}, // Fuel Type + {"OS:Meter:Custom", 2}, // Fuel Type + {"OS:Meter:CustomDecrement", 2}, // Fuel Type + {"OS:EnergyManagementSystem:MeteredOutputVariable", 5}, // Resource Type + {"OS:PythonPlugin:OutputVariable", 6}, // Resource Type + }}; + + auto checkIfReplaceNeeded = [replaceFuelTypesMap](const IdfObject& object, int fieldIndex) -> bool { + if (boost::optional fuelType_ = object.getString(fieldIndex)) { + return replaceFuelTypesMap.contains(*fuelType_); + } + return false; + }; + + auto replaceForField = [&replaceFuelTypesMap](const IdfObject& object, IdfObject& newObject, int fieldIndex) -> void { + if (boost::optional fuelType_ = object.getString(fieldIndex)) { + auto it = replaceFuelTypesMap.find(*fuelType_); + if (it != replaceFuelTypesMap.end()) { + LOG(Trace, "Replacing " << *fuelType_ << " with " << it->second << " at fieldIndex " << fieldIndex << " for " << object.nameString()); + newObject.setString(fieldIndex, it->second); + } + } + }; + + /************************************************************************************************************************************************* + * Output:Variable fuel * + ************************************************************************************************************************************************/ + + const static boost::regex re_strip_multiple_spaces("[' ']{2,}"); + + // Making the map case-insentive by providing a Comparator `IstringCompare` + // https://github.com/NREL/EnergyPlus/blob/v9.4.0-IOFreeze/src/Transition/SupportFiles/Report%20Variables%209-3-0%20to%209-4-0.csv + const static std::map replaceOutputVariablesMap({ + {"District Cooling Chilled Water Energy", "District Cooling Water Energy"}, + {"District Cooling Chilled Water Rate", "District Cooling Water Rate"}, + {"District Cooling Rate", "District Cooling Water Rate"}, + {"District Cooling Inlet Temperature", "District Cooling Water Inlet Temperature"}, + {"District Cooling Outlet Temperature", "District Cooling Water Outlet Temperature"}, + {"District Cooling Mass Flow Rate", "District Cooling Water Mass Flow Rate"}, + {"District Heating Hot Water Energy", "District Heating Water Energy"}, + {"District Heating Hot Water Rate", "District Heating Water Rate"}, + {"District Heating Rate", "District Heating Water Rate"}, + {"District Heating Inlet Temperature", "District Heating Water Inlet Temperature"}, + {"District Heating Outlet Temperature", "District Heating Water Outlet Temperature"}, + {"District Heating Mass Flow Rate", "District Heating Water Mass Flow Rate"}, + }); + + /************************************************************************************************************************************************* + * Output:Meter fuel types renames * + ************************************************************************************************************************************************/ + + const static std::array, 2> meterFuelTypesMap{{ + {"DistrictHeating", "DistrictHeatingWater"}, + {"Steam", "DistrictHeatingSteam"}, + }}; + for (const IdfObject& object : idf_3_6_1.objects()) { auto iddname = object.iddObject().name(); @@ -8258,6 +8336,105 @@ namespace osversion { ss << object; + } else if (iddname == "OS:Boiler:HotWater") { + + // 1 Field has been added from 3.6.1 to 3.7.0: + // ------------------------------------------- + // * Off Cycle Parasitic Fuel Load * 16 + auto iddObject = idd_3_7_0.getObject(iddname); + IdfObject newObject(iddObject.get()); + + for (size_t i = 0; i < object.numFields(); ++i) { + if ((value = object.getString(i))) { + if (i < 16) { + newObject.setString(i, value.get()); + } else { + newObject.setString(i + 1, value.get()); + } + } + } + + newObject.setDouble(16, 0.0); + + m_refactored.push_back(RefactoredObjectData(object, newObject)); + ss << newObject; + + } else if (iddname == "OS:Output:Meter") { + + std::string name = object.nameString(); + + // Structured bindings + for (const auto& [k, v] : meterFuelTypesMap) { + name = boost::regex_replace(name, boost::regex(k, boost::regex::icase), v); + } + if (name == object.nameString()) { + // No-op + ss << object; + } else { + + // Copy everything but 'Variable Name' field + auto iddObject = idd_3_7_0.getObject(iddname); + IdfObject newObject(iddObject.get()); + + for (size_t i = 0; i < object.numFields(); ++i) { + // Skip name field + if (i == 1) { + continue; + } + if ((value = object.getString(i))) { + newObject.setString(i, value.get()); + } + } + + newObject.setName(name); + + ss << newObject; + m_refactored.emplace_back(std::move(object), std::move(newObject)); + } + + } else if ((iddname == "OS:Output:Variable") || (iddname == "OS:EnergyManagementSystem:Sensor") + || (iddname == "OS:EnergyManagementSystem:Actuator")) { + + unsigned variableNameIndex = 3; + if (iddname == "OS:EnergyManagementSystem:Actuator") { + variableNameIndex = 4; // Actuated Component Control Type + } + + if ((value = object.getString(variableNameIndex))) { + + std::string variableName = value.get(); + // Strip consecutive spaces and all + variableName = boost::regex_replace(variableName, re_strip_multiple_spaces, " "); + + auto it = replaceOutputVariablesMap.find(variableName); + if (it == replaceOutputVariablesMap.end()) { + // No-op + ss << object; + } else { + + // Copy everything but 'Variable Name' field + auto iddObject = idd_3_7_0.getObject(iddname); + IdfObject newObject(iddObject.get()); + + for (size_t i = 0; i < object.numFields(); ++i) { + if (i == variableNameIndex) { + continue; + } else if ((value = object.getString(i))) { + newObject.setString(i, value.get()); + } + } + + LOG(Trace, "Replacing " << variableName << " with " << it->second << " for " << object.nameString()); + newObject.setString(variableNameIndex, it->second); + + ss << newObject; + m_refactored.emplace_back(std::move(object), std::move(newObject)); + } + } else { + // No-op + ss << object; + } + } else if (auto it = std::find_if(crankcaseCoilWithIndex.cbegin(), crankcaseCoilWithIndex.cend(), [&iddname](const auto& p) { return iddname == p.first; }); it != crankcaseCoilWithIndex.cend()) { @@ -8287,28 +8464,40 @@ namespace osversion { m_refactored.push_back(RefactoredObjectData(object, newObject)); ss << newObject; - } else if (iddname == "OS:Boiler:HotWater") { - - // 1 Field has been added from 3.6.1 to 3.7.0: - // ------------------------------------------- - // * Off Cycle Parasitic Fuel Load * 16 - auto iddObject = idd_3_7_0.getObject(iddname); - IdfObject newObject(iddObject.get()); + } else if (fuelTypeRenamesMap.find(iddname) != fuelTypeRenamesMap.end()) { + LOG(Trace, "Checking for a fuel type rename in Object of type '" << iddname << "' and named '" << object.nameString() << "'"); + auto rangeFields = fuelTypeRenamesMap.equal_range(iddname); + // First pass, find if a replacement is needed + bool isReplaceNeeded = false; + for (auto it = rangeFields.first; it != rangeFields.second; ++it) { + if (checkIfReplaceNeeded(object, it->second)) { + isReplaceNeeded = true; + break; + } + } + if (isReplaceNeeded) { + LOG(Trace, "Replace needed!"); - for (size_t i = 0; i < object.numFields(); ++i) { - if ((value = object.getString(i))) { - if (i < 16) { + // Make a new object, and copy evertything in place + auto iddObject = idd_3_7_0.getObject(iddname); + IdfObject newObject(iddObject.get()); + for (size_t i = 0; i < object.numFields(); ++i) { + if ((value = object.getString(i))) { newObject.setString(i, value.get()); - } else { - newObject.setString(i + 1, value.get()); } } - } - newObject.setDouble(16, 0.0); + // Then handle the renames + for (auto it = rangeFields.first; it != rangeFields.second; ++it) { + replaceForField(object, newObject, it->second); + } - m_refactored.push_back(RefactoredObjectData(object, newObject)); - ss << newObject; + ss << newObject; + m_refactored.emplace_back(std::move(object), std::move(newObject)); + } else { + // No-op + ss << object; + } // No-op } else { diff --git a/src/osversion/test/3_7_0/test_vt_FuelTypeRenames.osm b/src/osversion/test/3_7_0/test_vt_FuelTypeRenames.osm new file mode 100644 index 00000000000..002f7a09479 --- /dev/null +++ b/src/osversion/test/3_7_0/test_vt_FuelTypeRenames.osm @@ -0,0 +1,492 @@ + +OS:Version, + {d80a6235-1e0e-4441-b714-c716a28dec17}, !- Handle + 3.6.1; !- Version Identifier + +OS:OtherEquipment:Definition, + {452fb4d4-1cfb-4079-b11f-b67a5b026fa5}, !- Handle + Other Equipment Definition 1, !- Name + EquipmentLevel, !- Design Level Calculation Method + 0, !- Design Level {W} + , !- Watts per Space Floor Area {W/m2} + ; !- Watts per Person {W/Person} + +OS:OtherEquipment, + {dffae808-dce1-47d7-8536-ceae4c6fdf61}, !- Handle + Other Equipment 1, !- Name + {452fb4d4-1cfb-4079-b11f-b67a5b026fa5}, !- Other Equipment Definition Name + , !- Space or SpaceType Name + , !- Schedule Name + , !- Multiplier + SteAm, !- Fuel Type + General; !- End-Use Subcategory + +OS:Exterior:FuelEquipment:Definition, + {00e311ec-fd08-4cfb-a52f-1d540ca4e3a2}, !- Handle + Exterior Fuel Equipment Definition 1, !- Name + 0; !- Design Level {W} + +OS:Exterior:FuelEquipment, + {33cf3764-71ac-479f-9407-562b6b637a00}, !- Handle + Exterior Fuel Equipment 1, !- Name + {00e311ec-fd08-4cfb-a52f-1d540ca4e3a2}, !- Exterior Fuel Equipment Definition Name + {670288ed-c9bc-45c3-8b34-b4e49d242826}, !- Schedule Name + DISTRICTHEATING, !- Fuel Use Type + , !- Multiplier + General; !- End-Use Subcategory + +OS:Schedule:Constant, + {670288ed-c9bc-45c3-8b34-b4e49d242826}, !- Handle + Always On Discrete, !- Name + {d6898ac5-5735-4c57-803a-46db2ddf0cea}, !- Schedule Type Limits Name + 1; !- Value + +OS:ScheduleTypeLimits, + {d6898ac5-5735-4c57-803a-46db2ddf0cea}, !- Handle + OnOff, !- Name + 0, !- Lower Limit Value + 1, !- Upper Limit Value + Discrete, !- Numeric Type + Availability; !- Unit Type + +OS:WaterHeater:Mixed, + {bd82d5ca-8e5d-401d-a922-bf1563fc45fd}, !- Handle + Water Heater Mixed 1, !- Name + 0.3785, !- Tank Volume {m3} + {3ef3c85c-2359-42d3-a783-501f9aa32840}, !- Setpoint Temperature Schedule Name + 2, !- Deadband Temperature Difference {deltaC} + 82.22, !- Maximum Temperature Limit {C} + Cycle, !- Heater Control Type + 845000, !- Heater Maximum Capacity {W} + , !- Heater Minimum Capacity {W} + , !- Heater Ignition Minimum Flow Rate {m3/s} + , !- Heater Ignition Delay {s} + StEAm, !- Heater Fuel Type + 0.8, !- Heater Thermal Efficiency + , !- Part Load Factor Curve Name + 20, !- Off Cycle Parasitic Fuel Consumption Rate {W} + DisTrictHeating, !- Off Cycle Parasitic Fuel Type + 0.8, !- Off Cycle Parasitic Heat Fraction to Tank + , !- On Cycle Parasitic Fuel Consumption Rate {W} + STEAM, !- On Cycle Parasitic Fuel Type + , !- On Cycle Parasitic Heat Fraction to Tank + Schedule, !- Ambient Temperature Indicator + {5f778b50-cdb5-419a-855c-9f3084b6075d}, !- Ambient Temperature Schedule Name + , !- Ambient Temperature Thermal Zone Name + , !- Ambient Temperature Outdoor Air Node Name + 6, !- Off Cycle Loss Coefficient to Ambient Temperature {W/K} + , !- Off Cycle Loss Fraction to Thermal Zone + 6, !- On Cycle Loss Coefficient to Ambient Temperature {W/K} + , !- On Cycle Loss Fraction to Thermal Zone + , !- Peak Use Flow Rate {m3/s} + , !- Use Flow Rate Fraction Schedule Name + , !- Cold Water Supply Temperature Schedule Name + , !- Use Side Inlet Node Name + , !- Use Side Outlet Node Name + 1, !- Use Side Effectiveness + , !- Source Side Inlet Node Name + , !- Source Side Outlet Node Name + 1, !- Source Side Effectiveness + autosize, !- Use Side Design Flow Rate {m3/s} + autosize, !- Source Side Design Flow Rate {m3/s} + 1.5, !- Indirect Water Heating Recovery Time {hr} + IndirectHeatPrimarySetpoint, !- Source Side Flow Control Mode + , !- Indirect Alternate Setpoint Temperature Schedule Name + General; !- End-Use Subcategory + +OS:Schedule:Ruleset, + {5f778b50-cdb5-419a-855c-9f3084b6075d}, !- Handle + Schedule Ruleset 1, !- Name + {09969319-6c16-45d8-ab8a-b2ed136031c9}, !- Schedule Type Limits Name + {044aeb95-c6b4-45d8-a22e-bd4bf00292e1}; !- Default Day Schedule Name + +OS:Schedule:Day, + {044aeb95-c6b4-45d8-a22e-bd4bf00292e1}, !- Handle + Schedule Day 1, !- Name + {09969319-6c16-45d8-ab8a-b2ed136031c9}, !- Schedule Type Limits Name + , !- Interpolate to Timestep + 24, !- Hour 1 + 0, !- Minute 1 + 22; !- Value Until Time 1 + +OS:ScheduleTypeLimits, + {09969319-6c16-45d8-ab8a-b2ed136031c9}, !- Handle + Temperature, !- Name + , !- Lower Limit Value + , !- Upper Limit Value + Continuous, !- Numeric Type + Temperature; !- Unit Type + +OS:Schedule:Ruleset, + {3ef3c85c-2359-42d3-a783-501f9aa32840}, !- Handle + Schedule Ruleset 2, !- Name + {09969319-6c16-45d8-ab8a-b2ed136031c9}, !- Schedule Type Limits Name + {5b7ac0ac-17fe-49af-9b6c-638a04aeaa5c}; !- Default Day Schedule Name + +OS:Schedule:Day, + {5b7ac0ac-17fe-49af-9b6c-638a04aeaa5c}, !- Handle + Schedule Day 2, !- Name + {09969319-6c16-45d8-ab8a-b2ed136031c9}, !- Schedule Type Limits Name + , !- Interpolate to Timestep + 24, !- Hour 1 + 0, !- Minute 1 + 60; !- Value Until Time 1 + +OS:WaterHeater:Sizing, + {5e5f1dae-c68d-470d-bbff-c0a2abd82dc1}, !- Handle + {bd82d5ca-8e5d-401d-a922-bf1563fc45fd}, !- WaterHeater Name + PeakDraw, !- Design Mode + 0.538503, !- Time Storage Can Meet Peak Draw {hr} + 0, !- Time for Tank Recovery {hr} + 1; !- Nominal Tank Volume for Autosizing Plant Connections {m3} + +OS:WaterHeater:Stratified, + {5f165d9a-1903-4385-878d-67aeaf9f32e4}, !- Handle + Water Heater Stratified 1, !- Name + General, !- End-Use Subcategory + 0.1893, !- Tank Volume {m3} + 1.4, !- Tank Height {m} + VerticalCylinder, !- Tank Shape + , !- Tank Perimeter {m} + 82.22, !- Maximum Temperature Limit {C} + MasterSlave, !- Heater Priority Control + {803a92ea-56df-49e0-8c79-f76d26abd39e}, !- Heater 1 Setpoint Temperature Schedule Name + 2, !- Heater 1 Deadband Temperature Difference {deltaC} + 4500, !- Heater 1 Capacity {W} + 1, !- Heater 1 Height {m} + {db1f74c8-e51b-4fb3-a806-ef135e34f8c0}, !- Heater 2 Setpoint Temperature Schedule Name + 5, !- Heater 2 Deadband Temperature Difference {deltaC} + 4500, !- Heater 2 Capacity {W} + 0, !- Heater 2 Height {m} + StEAm, !- Heater Fuel Type + 0.98, !- Heater Thermal Efficiency + 10, !- Off Cycle Parasitic Fuel Consumption Rate {W} + DisTrictHeating, !- Off Cycle Parasitic Fuel Type + 0, !- Off Cycle Parasitic Heat Fraction to Tank + 0, !- Off Cycle Parasitic Height {m} + 10, !- On Cycle Parasitic Fuel Consumption Rate {W} + STEAM, !- On Cycle Parasitic Fuel Type + 0, !- On Cycle Parasitic Heat Fraction to Tank + 0, !- On Cycle Parasitic Height {m} + Schedule, !- Ambient Temperature Indicator + {13b81961-5b38-4943-a73b-4e329c9d45c3}, !- Ambient Temperature Schedule Name + , !- Ambient Temperature Thermal Zone Name + , !- Ambient Temperature Outdoor Air Node Name + 0.846, !- Uniform Skin Loss Coefficient per Unit Area to Ambient Temperature {W/m2-K} + 1, !- Skin Loss Fraction to Zone + 0, !- Off Cycle Flue Loss Coefficient to Ambient Temperature {W/K} + 1, !- Off Cycle Flue Loss Fraction to Zone + , !- Peak Use Flow Rate {m3/s} + , !- Use Flow Rate Fraction Schedule Name + , !- Cold Water Supply Temperature Schedule Name + , !- Use Side Inlet Node Name + , !- Use Side Outlet Node Name + 1, !- Use Side Effectiveness + 0, !- Use Side Inlet Height {m} + autocalculate, !- Use Side Outlet Height {m} + , !- Source Side Inlet Node Name + , !- Source Side Outlet Node Name + 1, !- Source Side Effectiveness + autocalculate, !- Source Side Inlet Height {m} + 0, !- Source Side Outlet Height {m} + Fixed, !- Inlet Mode + autosize, !- Use Side Design Flow Rate {m3/s} + autosize, !- Source Side Design Flow Rate {m3/s} + 1.5, !- Indirect Water Heating Recovery Time {hr} + 6, !- Number of Nodes + 0.1, !- Additional Destratification Conductivity {W/m-K} + 0.15, !- Node 1 Additional Loss Coefficient {W/m2-K} + 0, !- Node 2 Additional Loss Coefficient {W/m2-K} + 0, !- Node 3 Additional Loss Coefficient {W/m2-K} + 0, !- Node 4 Additional Loss Coefficient {W/m2-K} + 0, !- Node 5 Additional Loss Coefficient {W/m2-K} + 0.1, !- Node 6 Additional Loss Coefficient {W/m2-K} + 0, !- Node 7 Additional Loss Coefficient {W/m2-K} + 0, !- Node 8 Additional Loss Coefficient {W/m2-K} + 0, !- Node 9 Additional Loss Coefficient {W/m2-K} + 0, !- Node 10 Additional Loss Coefficient {W/m2-K} + 0, !- Node 11 Additional Loss Coefficient {W/m2-K} + 0, !- Node 12 Additional Loss Coefficient {W/m2-K} + IndirectHeatPrimarySetpoint; !- Source Side Flow Control Mode + +OS:Schedule:Ruleset, + {803a92ea-56df-49e0-8c79-f76d26abd39e}, !- Handle + Schedule Ruleset 3, !- Name + {09969319-6c16-45d8-ab8a-b2ed136031c9}, !- Schedule Type Limits Name + {8e4a2a61-b207-4702-8baf-e284418a9c48}; !- Default Day Schedule Name + +OS:Schedule:Day, + {8e4a2a61-b207-4702-8baf-e284418a9c48}, !- Handle + Schedule Day 3, !- Name + {09969319-6c16-45d8-ab8a-b2ed136031c9}, !- Schedule Type Limits Name + , !- Interpolate to Timestep + 24, !- Hour 1 + 0, !- Minute 1 + 48.89; !- Value Until Time 1 + +OS:Schedule:Ruleset, + {db1f74c8-e51b-4fb3-a806-ef135e34f8c0}, !- Handle + Schedule Ruleset 4, !- Name + {09969319-6c16-45d8-ab8a-b2ed136031c9}, !- Schedule Type Limits Name + {061f96eb-85ea-4310-a588-8ec3f1a382e4}; !- Default Day Schedule Name + +OS:Schedule:Day, + {061f96eb-85ea-4310-a588-8ec3f1a382e4}, !- Handle + Schedule Day 4, !- Name + {09969319-6c16-45d8-ab8a-b2ed136031c9}, !- Schedule Type Limits Name + , !- Interpolate to Timestep + 24, !- Hour 1 + 0, !- Minute 1 + 48.89; !- Value Until Time 1 + +OS:Schedule:Ruleset, + {13b81961-5b38-4943-a73b-4e329c9d45c3}, !- Handle + Schedule Ruleset 5, !- Name + {09969319-6c16-45d8-ab8a-b2ed136031c9}, !- Schedule Type Limits Name + {9013dccb-2d2c-4a27-a1e6-c3f5cb0921e4}; !- Default Day Schedule Name + +OS:Schedule:Day, + {9013dccb-2d2c-4a27-a1e6-c3f5cb0921e4}, !- Handle + Schedule Day 5, !- Name + {09969319-6c16-45d8-ab8a-b2ed136031c9}, !- Schedule Type Limits Name + , !- Interpolate to Timestep + 24, !- Hour 1 + 0, !- Minute 1 + 22; !- Value Until Time 1 + +OS:WaterHeater:Sizing, + {1b2e7f50-3227-4e1b-87ce-68ef331a4540}, !- Handle + {5f165d9a-1903-4385-878d-67aeaf9f32e4}, !- WaterHeater Name + PeakDraw, !- Design Mode + 0.538503, !- Time Storage Can Meet Peak Draw {hr} + 0, !- Time for Tank Recovery {hr} + 1; !- Nominal Tank Volume for Autosizing Plant Connections {m3} + +OS:UtilityBill, + {155126cf-3a0f-4213-b414-f18c749adf1a}, !- Handle + Legacy, !- Name + FuelOil_1, !- Fuel Type + , !- Meter Install Location + , !- Meter Specific Install Location + , !- Meter End Use Category + , !- Meter Specific End Use + gal, !- Consumption Unit + , !- Consumption Unit Conversion Factor + ; !- Peak Demand Unit + +OS:UtilityBill, + {60447826-5b4c-4b65-8839-5c9b0ba88d95}, !- Handle + Steam, !- Name + Steam, !- Fuel Type + , !- Meter Install Location + , !- Meter Specific Install Location + , !- Meter End Use Category + , !- Meter Specific End Use + lbs, !- Consumption Unit + , !- Consumption Unit Conversion Factor + ; !- Peak Demand Unit + +OS:Meter:Custom, + {ba8fa90d-e30c-4855-a8b9-a6423273d3b8}, !- Handle + Meter Custom 1, !- Name + DistrictHEATING; !- Fuel Type + +OS:Meter:CustomDecrement, + {98c459e1-09f7-47ec-8620-c6b369a6452b}, !- Handle + Meter Custom Decrement 1, !- Name + STEAM, !- Fuel Type + Meter Custom 1; !- Source Meter Name + +OS:EnergyManagementSystem:MeteredOutputVariable, + {73c13c91-4d49-4726-a7f4-c81cd0d7cb79}, !- Handle + Energy Management System Metered Output Variable 1, !- Name + DUMMY, !- EMS Variable Name + SystemTimestep, !- Update Frequency + , !- EMS Program or Subroutine Name + STEAM, !- Resource Type + Building, !- Group Type + Fans; !- End-Use Category + +OS:PythonPlugin:Variable, + {47d688f1-3662-4e4c-8519-65b8c40d6dea}, !- Handle + Python Plugin Variable 1; !- Name + +OS:PythonPlugin:OutputVariable, + {cd7e8ad8-bd59-4d98-ba20-19bc7cfed382}, !- Handle + Python Plugin Output Variable 1, !- Name + {47d688f1-3662-4e4c-8519-65b8c40d6dea}, !- Python Plugin Variable Name + Averaged, !- Type of Data in Variable + ZoneTimestep, !- Update Frequency + , !- Units + DISTRictHeating; !- Resource Type + +OS:Output:Meter, + {82bb7e48-72fa-4785-ab8f-f03e621b78c2}, !- Handle + Steam:Facility; !- Name + +OS:EnergyManagementSystem:Sensor, + {927a5162-b0e0-45e1-85c4-e0a72ee46670}, !- Handle + Steam_Facility, !- Name + , !- Output Variable or Output Meter Index Key Name + {82bb7e48-72fa-4785-ab8f-f03e621b78c2}; !- Output Variable or Output Meter Name + +OS:Output:Meter, + {52593b8b-140d-4df8-ac89-d6de2f85dfd0}, !- Handle + Heating:DistrictHeating; !- Name + +OS:EnergyManagementSystem:Sensor, + {988c0796-5cf2-4a84-83c6-df4bb5a7f685}, !- Handle + Heating_DistrictHeating, !- Name + , !- Output Variable or Output Meter Index Key Name + {52593b8b-140d-4df8-ac89-d6de2f85dfd0}; !- Output Variable or Output Meter Name + +OS:Output:Variable, + {85eb035c-7714-4852-91a3-9d8b3cff42c8}, !- Handle + District Cooling Chilled Water Energy, !- Name + , !- Key Value + District Cooling Chilled Water Energy; !- Variable Name + +OS:EnergyManagementSystem:Sensor, + {01cacc9d-3749-4ae7-b13b-314f8fdf53e3}, !- Handle + District_Cooling_Chilled_Water_Energy, !- Name + , !- Output Variable or Output Meter Index Key Name + {85eb035c-7714-4852-91a3-9d8b3cff42c8}; !- Output Variable or Output Meter Name + +OS:Output:Variable, + {b4d8aa6f-0bdd-46f1-a615-2c17717cd72f}, !- Handle + District Cooling Chilled Water Rate, !- Name + , !- Key Value + District Cooling Chilled Water Rate; !- Variable Name + +OS:EnergyManagementSystem:Sensor, + {b45a2472-8e69-4d84-851d-6473d51bac12}, !- Handle + District_Cooling_Chilled_Water_Rate, !- Name + , !- Output Variable or Output Meter Index Key Name + {b4d8aa6f-0bdd-46f1-a615-2c17717cd72f}; !- Output Variable or Output Meter Name + +OS:Output:Variable, + {3b307b1d-b49c-4ca3-bb8a-52082adc4762}, !- Handle + District Cooling Rate, !- Name + , !- Key Value + District Cooling Rate; !- Variable Name + +OS:EnergyManagementSystem:Sensor, + {ab74c3ba-4c86-4d8f-a8a8-7d72ae10416f}, !- Handle + District_Cooling_Rate, !- Name + , !- Output Variable or Output Meter Index Key Name + {3b307b1d-b49c-4ca3-bb8a-52082adc4762}; !- Output Variable or Output Meter Name + +OS:Output:Variable, + {76c20bf1-54b5-454f-b01c-d89b5e6f4a60}, !- Handle + District Cooling Inlet Temperature, !- Name + , !- Key Value + District Cooling Inlet Temperature; !- Variable Name + +OS:EnergyManagementSystem:Sensor, + {5dd336d2-f2ab-4ed1-b093-e52793ae97e5}, !- Handle + District_Cooling_Inlet_Temperature, !- Name + , !- Output Variable or Output Meter Index Key Name + {76c20bf1-54b5-454f-b01c-d89b5e6f4a60}; !- Output Variable or Output Meter Name + +OS:Output:Variable, + {b0b43663-22de-4f74-ab61-e6609c800f8d}, !- Handle + District Cooling Outlet Temperature, !- Name + , !- Key Value + District Cooling Outlet Temperature; !- Variable Name + +OS:EnergyManagementSystem:Sensor, + {a8574aab-18a4-4187-b87d-429f29e96e0a}, !- Handle + District_Cooling_Outlet_Temperature, !- Name + , !- Output Variable or Output Meter Index Key Name + {b0b43663-22de-4f74-ab61-e6609c800f8d}; !- Output Variable or Output Meter Name + +OS:Output:Variable, + {139eead6-519a-4865-90c7-4690feebf028}, !- Handle + District Cooling Mass Flow Rate, !- Name + , !- Key Value + District Cooling Mass Flow Rate; !- Variable Name + +OS:EnergyManagementSystem:Sensor, + {85eed609-5daa-4361-bfa9-aeaa8f9d7624}, !- Handle + District_Cooling_Mass_Flow_Rate, !- Name + , !- Output Variable or Output Meter Index Key Name + {139eead6-519a-4865-90c7-4690feebf028}; !- Output Variable or Output Meter Name + +OS:Output:Variable, + {21dfc32f-cb6d-4854-b5f1-d899e5033c14}, !- Handle + District Heating Hot Water Energy, !- Name + , !- Key Value + District Heating Hot Water Energy; !- Variable Name + +OS:EnergyManagementSystem:Sensor, + {8ab1e008-1909-4adc-8d77-2b041a8efca8}, !- Handle + District_Heating_Hot_Water_Energy, !- Name + , !- Output Variable or Output Meter Index Key Name + {21dfc32f-cb6d-4854-b5f1-d899e5033c14}; !- Output Variable or Output Meter Name + +OS:Output:Variable, + {82f9f936-6ebf-48a4-ae51-613ab2481065}, !- Handle + District Heating Hot Water Rate, !- Name + , !- Key Value + District Heating Hot Water Rate; !- Variable Name + +OS:EnergyManagementSystem:Sensor, + {a2f24426-c928-4599-a2b7-013515193e52}, !- Handle + District_Heating_Hot_Water_Rate, !- Name + , !- Output Variable or Output Meter Index Key Name + {82f9f936-6ebf-48a4-ae51-613ab2481065}; !- Output Variable or Output Meter Name + +OS:Output:Variable, + {16979d27-c6fd-4a1c-ad9d-020590961832}, !- Handle + District Heating Rate, !- Name + , !- Key Value + District Heating Rate; !- Variable Name + +OS:EnergyManagementSystem:Sensor, + {c355e059-b0b1-479d-97ce-380b3506daa6}, !- Handle + District_Heating_Rate, !- Name + , !- Output Variable or Output Meter Index Key Name + {16979d27-c6fd-4a1c-ad9d-020590961832}; !- Output Variable or Output Meter Name + +OS:Output:Variable, + {f494e2cc-5f81-4110-ae12-8b5cfd0b90c1}, !- Handle + District Heating Inlet Temperature, !- Name + , !- Key Value + District Heating Inlet Temperature; !- Variable Name + +OS:EnergyManagementSystem:Sensor, + {f441c7e5-b7a7-42c9-8779-5a76626916ed}, !- Handle + District_Heating_Inlet_Temperature, !- Name + , !- Output Variable or Output Meter Index Key Name + {f494e2cc-5f81-4110-ae12-8b5cfd0b90c1}; !- Output Variable or Output Meter Name + +OS:Output:Variable, + {63d510a2-0c30-40c0-bd0f-bcdfa45fc844}, !- Handle + District Heating Outlet Temperature, !- Name + , !- Key Value + District Heating Outlet Temperature; !- Variable Name + +OS:EnergyManagementSystem:Sensor, + {cd083219-9801-426e-ab86-81023df66d8e}, !- Handle + District_Heating_Outlet_Temperature, !- Name + , !- Output Variable or Output Meter Index Key Name + {63d510a2-0c30-40c0-bd0f-bcdfa45fc844}; !- Output Variable or Output Meter Name + +OS:Output:Variable, + {6da6e7df-5aaf-498e-9a30-2e15082b5cc1}, !- Handle + District Heating Mass Flow Rate, !- Name + , !- Key Value + District Heating Mass Flow Rate; !- Variable Name + +OS:EnergyManagementSystem:Sensor, + {b58af2d6-e80d-45b5-9658-b0bebacf07e4}, !- Handle + District_Heating_Mass_Flow_Rate, !- Name + , !- Output Variable or Output Meter Index Key Name + {6da6e7df-5aaf-498e-9a30-2e15082b5cc1}; !- Output Variable or Output Meter Name + +OS:EnergyManagementSystem:Sensor, + {f2a3bcb7-3afd-4611-af4c-9eda6719c46d}, !- Handle + District_Cooling_Inlet_Temperature_Standandalone, !- Name + , !- Output Variable or Output Meter Index Key Name + District Cooling Inlet Temperature; !- Output Variable or Output Meter Name + diff --git a/src/osversion/test/3_7_0/test_vt_FuelTypeRenames.rb b/src/osversion/test/3_7_0/test_vt_FuelTypeRenames.rb new file mode 100644 index 00000000000..bdb83ecf60f --- /dev/null +++ b/src/osversion/test/3_7_0/test_vt_FuelTypeRenames.rb @@ -0,0 +1,88 @@ +#require '/usr/local/openstudio-3.6.1/Ruby/openstudio' + +include OpenStudio::Model + +m = Model.new + +od = OtherEquipmentDefinition.new(m) +o = OtherEquipment.new(od) +o.setFuelType("SteAm") + +ed = ExteriorFuelEquipmentDefinition.new(m) +e = ExteriorFuelEquipment.new(ed) +e.setFuelType("DISTRICTHEATING") + +wh = WaterHeaterMixed.new(m) +wh.setHeaterFuelType("StEAm") +wh.setOffCycleParasiticFuelType("DisTrictHeating") +wh.setOnCycleParasiticFuelType("STEAM") + + +wh = WaterHeaterStratified.new(m) +wh.setHeaterFuelType("StEAm") +wh.setOffCycleParasiticFuelType("DisTrictHeating") +wh.setOnCycleParasiticFuelType("STEAM") + +u1 = UtilityBill.new(OpenStudio::FuelType.new("FuelOil_1"), m) +u1.setName("Legacy") +u2 = UtilityBill.new(OpenStudio::FuelType.new("Steam"), m) +u2.setName("Steam") + +mc = MeterCustom.new(m) +mc.setFuelType("DistrictHEATING") + +mcd = MeterCustomDecrement.new(m, mc.nameString) +mcd.setFuelType("STEAM") + +ems_mov = EnergyManagementSystemMeteredOutputVariable.new(m, "DUMMY") +ems_mov.setResourceType("STEAM") + +py_var = PythonPluginVariable.new(m) +py_out = PythonPluginOutputVariable.new(py_var) +py_out.setResourceType("DISTRictHeating") + + +o = OutputMeter.new(m) +o.setFuelType("Steam".to_FuelType) +o.setInstallLocationType("Facility".to_InstallLocationType) +raise if o.name != "Steam:Facility" +ems_sensor = EnergyManagementSystemSensor.new(m, o) +ems_sensor.setName("Steam_Facility") + +o = OutputMeter.new(m) +o.setFuelType("DistrictHeating".to_FuelType) +o.setEndUseType("Heating".to_EndUseType) +raise if o.name != "Heating:DistrictHeating" +ems_sensor = EnergyManagementSystemSensor.new(m, o) +ems_sensor.setName("Heating_DistrictHeating") + +# Test +vars = [ + 'District Cooling Chilled Water Energy', + 'District Cooling Chilled Water Rate', + 'District Cooling Rate', + 'District Cooling Inlet Temperature', + 'District Cooling Outlet Temperature', + 'District Cooling Mass Flow Rate', + 'District Heating Hot Water Energy', + 'District Heating Hot Water Rate', + 'District Heating Rate', + 'District Heating Inlet Temperature', + 'District Heating Outlet Temperature', + 'District Heating Mass Flow Rate' +] +vars.each do |v| + out_var = OutputVariable.new(v, m) + out_var.setName(v) + ems_sensor = EnergyManagementSystemSensor.new(m, out_var) + ems_sensor.setName(v.gsub(" ", "_").gsub("#", "_")) +end + + +# Add an extra one not linked to an actual out_var or out_meter +# This is the only one that should be changed, the rest has handles +var_name = "District Cooling Inlet Temperature" +ems_sensor = EnergyManagementSystemSensor.new(m, var_name) +ems_sensor.setName("#{var_name.gsub(' ', '_')}_Standandalone") + +m.save('test_vt_FuelTypeRenames.osm', true) diff --git a/src/osversion/test/VersionTranslator_GTest.cpp b/src/osversion/test/VersionTranslator_GTest.cpp index 48c88069c20..1e91589b022 100644 --- a/src/osversion/test/VersionTranslator_GTest.cpp +++ b/src/osversion/test/VersionTranslator_GTest.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include #include @@ -3472,3 +3473,130 @@ TEST_F(OSVersionFixture, update_3_6_1_to_3_7_0_BoilerHotWater) { EXPECT_EQ(9, bhw.getDouble(17).get()); // Sizing Factor EXPECT_EQ("Test", bhw.getString(18).get()); // End-Use Subcategory } + +TEST_F(OSVersionFixture, update_3_6_1_to_3_7_0_fuelTypeRenames) { + openstudio::path osmPath = resourcesPath() / toPath("osversion/3_7_0/test_vt_FuelTypeRenames.osm"); + osversion::VersionTranslator vt; + boost::optional model_ = vt.loadModel(osmPath); + ASSERT_TRUE(model_) << "Failed to load " << osmPath; + + openstudio::path outPath = osmPath.parent_path() / toPath(osmPath.stem().string() + "_updated" + osmPath.extension().string()); + model_->save(outPath, true); + + IddFile oldIddFile = getOpenStudioIddFileForVersion(VersionString(3, 6, 1)); + OptionalIdfFile oldIdfFile_ = IdfFile::load(osmPath, oldIddFile); + ASSERT_TRUE(oldIdfFile_); + + // Making the map case-insentive by providing a Comparator `IstringCompare` + const std::map replaceFuelTypesMap{{ + {"Steam", "DistrictHeatingSteam"}, + {"DistrictHeating", "DistrictHeatingWater"}, + // Additionally, for UtilityBill, align the IDD choices to E+. This will also be covered by this + {"FuelOil_1", "FuelOilNo1"}, + {"FuelOil_2", "FuelOilNo2"}, + {"OtherFuel_1", "OtherFuel1"}, + {"OtherFuel_2", "OtherFuel2"}, + }}; + + // iddname, 361 & 370 index, current index + const std::array, 12> fuelTypeRenamesMap{{ + {"OS:OtherEquipment", 6, 6}, // Fuel Type + {"OS:Exterior:FuelEquipment", 4, 4}, // Fuel Use Type + {"OS:WaterHeater:Mixed", 11, 11}, // Heater Fuel Type + {"OS:WaterHeater:Mixed", 15, 15}, // Off Cycle Parasitic Fuel Type + {"OS:WaterHeater:Mixed", 18, 18}, // On Cycle Parasitic Fuel Type + {"OS:WaterHeater:Stratified", 17, 17}, // Heater Fuel Type + {"OS:WaterHeater:Stratified", 20, 20}, // Off Cycle Parasitic Fuel Type + {"OS:WaterHeater:Stratified", 24, 24}, // On Cycle Parasitic Fuel Type + {"OS:Meter:Custom", 2, 2}, // Fuel Type + {"OS:Meter:CustomDecrement", 2, 2}, // Fuel Type + {"OS:EnergyManagementSystem:MeteredOutputVariable", 5, 5}, // Resource Type + {"OS:PythonPlugin:OutputVariable", 6, 6}, // Resource Type + // {"OS:UtilityBill", 2, 2}, // Fuel Type + }}; + + for (const auto& [iddname, oldFieldIndex, newFieldIndex] : fuelTypeRenamesMap) { + + const std::string old_fuelType = oldIdfFile_->getObjectsByType(oldIddFile.getObject(iddname).get())[0].getString(oldFieldIndex).get(); + // Check that the test model (in 3.6.1), actually has bad starting fuels + EXPECT_TRUE(replaceFuelTypesMap.find(old_fuelType) != replaceFuelTypesMap.end()); + + const std::string new_fuelType = model_->getObjectsByType(iddname)[0].getString(newFieldIndex).get(); + EXPECT_NE(old_fuelType, new_fuelType); + EXPECT_EQ(replaceFuelTypesMap.at(old_fuelType), new_fuelType) << "Failed for " << iddname; + } + + // I have two instances of this object, so do them manually + { + auto u = model_->getObjectByTypeAndName("OS:UtilityBill", "Legacy").get(); + EXPECT_EQ("FuelOilNo1", u.getString(2).get()); + } + { + auto u = model_->getObjectByTypeAndName("OS:UtilityBill", "Steam").get(); + EXPECT_EQ("DistrictHeatingSteam", u.getString(2).get()); + } + + { + std::vector outputMeters = model_->getObjectsByType("OS:Output:Meter"); + ASSERT_EQ(2u, outputMeters.size()); + EXPECT_NE(std::find_if(outputMeters.begin(), outputMeters.end(), + [](const WorkspaceObject& wo) { return openstudio::istringEqual(wo.nameString(), "DistrictHeatingSteam:Facility"); }), + outputMeters.end()); + EXPECT_NE(std::find_if(outputMeters.begin(), outputMeters.end(), + [](const WorkspaceObject& wo) { return openstudio::istringEqual(wo.nameString(), "Heating:DistrictHeatingWater"); }), + outputMeters.end()); + } + + { + const static std::map renameMap({ + {"District Cooling Chilled Water Energy", "District Cooling Water Energy"}, + {"District Cooling Chilled Water Rate", "District Cooling Water Rate"}, + {"District Cooling Rate", "District Cooling Water Rate"}, + {"District Cooling Inlet Temperature", "District Cooling Water Inlet Temperature"}, + {"District Cooling Outlet Temperature", "District Cooling Water Outlet Temperature"}, + {"District Cooling Mass Flow Rate", "District Cooling Water Mass Flow Rate"}, + {"District Heating Hot Water Energy", "District Heating Water Energy"}, + {"District Heating Hot Water Rate", "District Heating Water Rate"}, + {"District Heating Rate", "District Heating Water Rate"}, + {"District Heating Inlet Temperature", "District Heating Water Inlet Temperature"}, + {"District Heating Outlet Temperature", "District Heating Water Outlet Temperature"}, + {"District Heating Mass Flow Rate", "District Heating Water Mass Flow Rate"}, + }); + + std::vector outputVariables = model_->getObjectsByType("OS:Output:Variable"); + ASSERT_EQ(renameMap.size(), outputVariables.size()); + ASSERT_EQ(12, outputVariables.size()); + for (const auto& outputVariable : outputVariables) { + auto name = outputVariable.nameString(); + auto it = renameMap.find(name); + ASSERT_NE(it, renameMap.end()) << "Output:Variable named " << name << " not in replaceMap"; + EXPECT_EQ(it->second, outputVariable.getString(3).get()) + << "Output:Variable named " << name << " did not get the expected rename for Variable Name field"; + } + + std::vector emsSensors = model_->getObjectsByType("OS:EnergyManagementSystem:Sensor"); + ASSERT_EQ(15, emsSensors.size()); + + EXPECT_NE(std::find_if(emsSensors.begin(), emsSensors.end(), + [](const WorkspaceObject& wo) { + return openstudio::istringEqual(wo.nameString(), "District_Cooling_Inlet_Temperature_Standandalone"); + }), + emsSensors.end()); + + for (const auto& emsSensor : emsSensors) { + if (openstudio::istringEqual(emsSensor.nameString(), "District_Cooling_Inlet_Temperature_Standandalone")) { + // District Cooling Inlet Temperature => District Cooling Water Inlet Temperature + EXPECT_EQ("District Cooling Water Inlet Temperature", emsSensor.getString(3).get()); + } else { + // All of these have actual handles stored at string, these shouldn't have been touched + boost::optional handle = emsSensor.getString(3); + ASSERT_TRUE(handle.is_initialized()); + UUID uid = toUUID(handle.get()); + boost::optional object = model_->getObject(uid); + ASSERT_TRUE(object); + EXPECT_TRUE(openstudio::istringEqual(object->iddObject().name(), "OS:Output:Variable") + || openstudio::istringEqual(object->iddObject().name(), "OS:Output:Meter")); + } + } + } +} diff --git a/src/utilities/data/DataEnums.hpp b/src/utilities/data/DataEnums.hpp index dbd7f1e3e74..69c109fe9ef 100644 --- a/src/utilities/data/DataEnums.hpp +++ b/src/utilities/data/DataEnums.hpp @@ -37,8 +37,10 @@ OPENSTUDIO_ENUM(InstallLocationType, ); /** \class FuelType - * \brief EnergyPlus meterable fuel types - * \details See the OPENSTUDIO_ENUM documentation in utilities/core/Enum.hpp. The actual + * \brief EnergyPlus meterable fuel types. + * \details Use the valueDescription() for interfacing with EnergyPlus or setting an IDD field. + * + * See the OPENSTUDIO_ENUM documentation in utilities/core/Enum.hpp. The actual * macro call is: * \code OPENSTUDIO_ENUM(FuelType, @@ -71,9 +73,9 @@ OPENSTUDIO_ENUM(FuelType, ((FuelOil_2)(FuelOilNo2)) ((Propane)) ((Water)) - ((Steam)) + ((Steam)(DistrictHeatingSteam)) ((DistrictCooling)) - ((DistrictHeating)) + ((DistrictHeating)(DistrictHeatingWater)) ((OtherFuel_1)(OtherFuel1)) ((OtherFuel_2)(OtherFuel2)) ((EnergyTransfer)) @@ -120,7 +122,8 @@ OPENSTUDIO_ENUM(EndUseFuelType, ((OtherFuel_1)(Other Fuel 1)) ((OtherFuel_2)(Other Fuel 2)) ((DistrictCooling)(District Cooling)) - ((DistrictHeating)(District Heating)) + ((DistrictHeating)(District Heating Water)) + ((DistrictHeatingSteam)(District Heating Steam)) ((Water)) );