Repository: NREL/OpenStudio (language: python)

Issue:
Breaking changes to consider
Enhancement Request
--------------
Checklist:
- CoolingTower:*Speed
  - [x] `evaporationLossMode` (`boost::optional<std::string>` to `std::string`)
  - [x] `blowdownCalculationMode` (`boost::optional<std::string>` to `std::string`)
  - [x] `cellControl` for CoolingTower:VariableSpeed
- EvaporativeFluidCooler:SingleSpeed
  - [ ] `performanceInputMethod` (make required-field, and change `boost::optional<std::string>` to `std::string`)



Discussion / hints:

Fix patch:
diff --git a/src/model/CoolingTowerSingleSpeed.cpp b/src/model/CoolingTowerSingleSpeed.cpp
index 8e5a284e808..f162ecebf57 100644
--- a/src/model/CoolingTowerSingleSpeed.cpp
+++ b/src/model/CoolingTowerSingleSpeed.cpp
@@ -252,8 +252,10 @@ namespace model {
       return getObject<ModelObject>().getModelObjectTarget<Schedule>(OS_CoolingTower_SingleSpeedFields::BasinHeaterOperatingScheduleName);
     }
 
-    boost::optional<std::string> CoolingTowerSingleSpeed_Impl::evaporationLossMode() const {
-      return getString(OS_CoolingTower_SingleSpeedFields::EvaporationLossMode, true);
+    std::string CoolingTowerSingleSpeed_Impl::evaporationLossMode() const {
+      boost::optional<std::string> value = getString(OS_CoolingTower_SingleSpeedFields::EvaporationLossMode, true);
+      OS_ASSERT(value);
+      return value.get();
     }
 
     bool CoolingTowerSingleSpeed_Impl::isEvaporationLossModeDefaulted() const {
@@ -280,8 +282,10 @@ namespace model {
       return isEmpty(OS_CoolingTower_SingleSpeedFields::DriftLossPercent);
     }
 
-    boost::optional<std::string> CoolingTowerSingleSpeed_Impl::blowdownCalculationMode() const {
-      return getString(OS_CoolingTower_SingleSpeedFields::BlowdownCalculationMode, true);
+    std::string CoolingTowerSingleSpeed_Impl::blowdownCalculationMode() const {
+      boost::optional<std::string> value = getString(OS_CoolingTower_SingleSpeedFields::BlowdownCalculationMode, true);
+      OS_ASSERT(value);
+      return value.get();
     }
 
     bool CoolingTowerSingleSpeed_Impl::isBlowdownCalculationModeDefaulted() const {
@@ -1126,7 +1130,7 @@ namespace model {
     return getImpl<detail::CoolingTowerSingleSpeed_Impl>()->basinHeaterOperatingSchedule();
   }
 
-  boost::optional<std::string> CoolingTowerSingleSpeed::evaporationLossMode() const {
+  std::string CoolingTowerSingleSpeed::evaporationLossMode() const {
     return getImpl<detail::CoolingTowerSingleSpeed_Impl>()->evaporationLossMode();
   }
 
@@ -1150,7 +1154,7 @@ namespace model {
     return getImpl<detail::CoolingTowerSingleSpeed_Impl>()->isDriftLossPercentDefaulted();
   }
 
-  boost::optional<std::string> CoolingTowerSingleSpeed::blowdownCalculationMode() const {
+  std::string CoolingTowerSingleSpeed::blowdownCalculationMode() const {
     return getImpl<detail::CoolingTowerSingleSpeed_Impl>()->blowdownCalculationMode();
   }
 
diff --git a/src/model/CoolingTowerSingleSpeed.hpp b/src/model/CoolingTowerSingleSpeed.hpp
index e26dba6e079..8bf42d79499 100644
--- a/src/model/CoolingTowerSingleSpeed.hpp
+++ b/src/model/CoolingTowerSingleSpeed.hpp
@@ -120,7 +120,7 @@ namespace model {
 
     boost::optional<Schedule> basinHeaterOperatingSchedule() const;
 
-    boost::optional<std::string> evaporationLossMode() const;
+    std::string evaporationLossMode() const;
 
     bool isEvaporationLossModeDefaulted() const;
 
@@ -132,7 +132,7 @@ namespace model {
 
     bool isDriftLossPercentDefaulted() const;
 
-    boost::optional<std::string> blowdownCalculationMode() const;
+    std::string blowdownCalculationMode() const;
 
     bool isBlowdownCalculationModeDefaulted() const;
 
diff --git a/src/model/CoolingTowerSingleSpeed_Impl.hpp b/src/model/CoolingTowerSingleSpeed_Impl.hpp
index da1e8746b9d..9d62aa1a460 100644
--- a/src/model/CoolingTowerSingleSpeed_Impl.hpp
+++ b/src/model/CoolingTowerSingleSpeed_Impl.hpp
@@ -123,7 +123,7 @@ namespace model {
 
       boost::optional<Schedule> basinHeaterOperatingSchedule() const;
 
-      boost::optional<std::string> evaporationLossMode() const;
+      std::string evaporationLossMode() const;
 
       bool isEvaporationLossModeDefaulted() const;
 
@@ -135,7 +135,7 @@ namespace model {
 
       bool isDriftLossPercentDefaulted() const;
 
-      boost::optional<std::string> blowdownCalculationMode() const;
+      std::string blowdownCalculationMode() const;
 
       bool isBlowdownCalculationModeDefaulted() const;
 
diff --git a/src/model/CoolingTowerTwoSpeed.cpp b/src/model/CoolingTowerTwoSpeed.cpp
index 4bf5ffa17f6..3de4ebeef78 100644
--- a/src/model/CoolingTowerTwoSpeed.cpp
+++ b/src/model/CoolingTowerTwoSpeed.cpp
@@ -404,8 +404,10 @@ namespace model {
       return getObject<ModelObject>().getModelObjectTarget<Schedule>(OS_CoolingTower_TwoSpeedFields::BasinHeaterOperatingScheduleName);
     }
 
-    boost::optional<std::string> CoolingTowerTwoSpeed_Impl::evaporationLossMode() const {
-      return getString(OS_CoolingTower_TwoSpeedFields::EvaporationLossMode, true);
+    std::string CoolingTowerTwoSpeed_Impl::evaporationLossMode() const {
+      boost::optional<std::string> value = getString(OS_CoolingTower_TwoSpeedFields::EvaporationLossMode, true);
+      OS_ASSERT(value);
+      return value.get();
     }
 
     bool CoolingTowerTwoSpeed_Impl::isEvaporationLossModeDefaulted() const {
@@ -432,8 +434,10 @@ namespace model {
       return isEmpty(OS_CoolingTower_TwoSpeedFields::DriftLossPercent);
     }
 
-    boost::optional<std::string> CoolingTowerTwoSpeed_Impl::blowdownCalculationMode() const {
-      return getString(OS_CoolingTower_TwoSpeedFields::BlowdownCalculationMode, true);
+    std::string CoolingTowerTwoSpeed_Impl::blowdownCalculationMode() const {
+      boost::optional<std::string> value = getString(OS_CoolingTower_TwoSpeedFields::BlowdownCalculationMode, true);
+      OS_ASSERT(value);
+      return value.get();
     }
 
     bool CoolingTowerTwoSpeed_Impl::isBlowdownCalculationModeDefaulted() const {
@@ -1446,7 +1450,7 @@ namespace model {
     return getImpl<detail::CoolingTowerTwoSpeed_Impl>()->basinHeaterOperatingSchedule();
   }
 
-  boost::optional<std::string> CoolingTowerTwoSpeed::evaporationLossMode() const {
+  std::string CoolingTowerTwoSpeed::evaporationLossMode() const {
     return getImpl<detail::CoolingTowerTwoSpeed_Impl>()->evaporationLossMode();
   }
 
@@ -1470,7 +1474,7 @@ namespace model {
     return getImpl<detail::CoolingTowerTwoSpeed_Impl>()->isDriftLossPercentDefaulted();
   }
 
-  boost::optional<std::string> CoolingTowerTwoSpeed::blowdownCalculationMode() const {
+  std::string CoolingTowerTwoSpeed::blowdownCalculationMode() const {
     return getImpl<detail::CoolingTowerTwoSpeed_Impl>()->blowdownCalculationMode();
   }
 
diff --git a/src/model/CoolingTowerTwoSpeed.hpp b/src/model/CoolingTowerTwoSpeed.hpp
index ddbd8643992..9c883c67dcd 100644
--- a/src/model/CoolingTowerTwoSpeed.hpp
+++ b/src/model/CoolingTowerTwoSpeed.hpp
@@ -167,7 +167,7 @@ namespace model {
 
     boost::optional<Schedule> basinHeaterOperatingSchedule() const;
 
-    boost::optional<std::string> evaporationLossMode() const;
+    std::string evaporationLossMode() const;
 
     bool isEvaporationLossModeDefaulted() const;
 
@@ -179,7 +179,7 @@ namespace model {
 
     bool isDriftLossPercentDefaulted() const;
 
-    boost::optional<std::string> blowdownCalculationMode() const;
+    std::string blowdownCalculationMode() const;
 
     bool isBlowdownCalculationModeDefaulted() const;
 
diff --git a/src/model/CoolingTowerTwoSpeed_Impl.hpp b/src/model/CoolingTowerTwoSpeed_Impl.hpp
index 079f3575df1..f1898d4e874 100644
--- a/src/model/CoolingTowerTwoSpeed_Impl.hpp
+++ b/src/model/CoolingTowerTwoSpeed_Impl.hpp
@@ -175,7 +175,7 @@ namespace model {
 
       boost::optional<Schedule> basinHeaterOperatingSchedule() const;
 
-      boost::optional<std::string> evaporationLossMode() const;
+      std::string evaporationLossMode() const;
 
       bool isEvaporationLossModeDefaulted() const;
 
@@ -187,7 +187,7 @@ namespace model {
 
       bool isDriftLossPercentDefaulted() const;
 
-      boost::optional<std::string> blowdownCalculationMode() const;
+      std::string blowdownCalculationMode() const;
 
       bool isBlowdownCalculationModeDefaulted() const;
 
diff --git a/src/model/CoolingTowerVariableSpeed.cpp b/src/model/CoolingTowerVariableSpeed.cpp
index 6f3f00c142f..e0806a6e6e1 100644
--- a/src/model/CoolingTowerVariableSpeed.cpp
+++ b/src/model/CoolingTowerVariableSpeed.cpp
@@ -236,8 +236,10 @@ namespace model {
       return getObject<ModelObject>().getModelObjectTarget<Schedule>(OS_CoolingTower_VariableSpeedFields::BasinHeaterOperatingSchedule);
     }
 
-    boost::optional<std::string> CoolingTowerVariableSpeed_Impl::evaporationLossMode() const {
-      return getString(OS_CoolingTower_VariableSpeedFields::EvaporationLossMode, true);
+    std::string CoolingTowerVariableSpeed_Impl::evaporationLossMode() const {
+      boost::optional<std::string> value = getString(OS_CoolingTower_VariableSpeedFields::EvaporationLossMode, true);
+      OS_ASSERT(value);
+      return value.get();
     }
 
     bool CoolingTowerVariableSpeed_Impl::isEvaporationLossModeDefaulted() const {
@@ -258,8 +260,10 @@ namespace model {
       return getDouble(OS_CoolingTower_VariableSpeedFields::DriftLossPercent, true);
     }
 
-    boost::optional<std::string> CoolingTowerVariableSpeed_Impl::blowdownCalculationMode() const {
-      return getString(OS_CoolingTower_VariableSpeedFields::BlowdownCalculationMode, true);
+    std::string CoolingTowerVariableSpeed_Impl::blowdownCalculationMode() const {
+      boost::optional<std::string> value = getString(OS_CoolingTower_VariableSpeedFields::BlowdownCalculationMode, true);
+      OS_ASSERT(value);
+      return value.get();
     }
 
     bool CoolingTowerVariableSpeed_Impl::isBlowdownCalculationModeDefaulted() const {
@@ -278,8 +282,10 @@ namespace model {
       return getInt(OS_CoolingTower_VariableSpeedFields::NumberofCells, true);
     }
 
-    boost::optional<std::string> CoolingTowerVariableSpeed_Impl::cellControl() const {
-      return getString(OS_CoolingTower_VariableSpeedFields::CellControl, true);
+    std::string CoolingTowerVariableSpeed_Impl::cellControl() const {
+      boost::optional<std::string> value = getString(OS_CoolingTower_VariableSpeedFields::CellControl, true);
+      OS_ASSERT(value);
+      return value.get();
     }
 
     bool CoolingTowerVariableSpeed_Impl::isCellControlDefaulted() const {
@@ -865,7 +871,7 @@ namespace model {
     return getImpl<detail::CoolingTowerVariableSpeed_Impl>()->basinHeaterOperatingSchedule();
   }
 
-  boost::optional<std::string> CoolingTowerVariableSpeed::evaporationLossMode() const {
+  std::string CoolingTowerVariableSpeed::evaporationLossMode() const {
     return getImpl<detail::CoolingTowerVariableSpeed_Impl>()->evaporationLossMode();
   }
 
@@ -885,7 +891,7 @@ namespace model {
     return getImpl<detail::CoolingTowerVariableSpeed_Impl>()->driftLossPercent();
   }
 
-  boost::optional<std::string> CoolingTowerVariableSpeed::blowdownCalculationMode() const {
+  std::string CoolingTowerVariableSpeed::blowdownCalculationMode() const {
     return getImpl<detail::CoolingTowerVariableSpeed_Impl>()->blowdownCalculationMode();
   }
 
@@ -905,7 +911,7 @@ namespace model {
     return getImpl<detail::CoolingTowerVariableSpeed_Impl>()->numberofCells();
   }
 
-  boost::optional<std::string> CoolingTowerVariableSpeed::cellControl() const {
+  std::string CoolingTowerVariableSpeed::cellControl() const {
     return getImpl<detail::CoolingTowerVariableSpeed_Impl>()->cellControl();
   }
 
diff --git a/src/model/CoolingTowerVariableSpeed.hpp b/src/model/CoolingTowerVariableSpeed.hpp
index 3cd345be35a..ef8cba35c80 100644
--- a/src/model/CoolingTowerVariableSpeed.hpp
+++ b/src/model/CoolingTowerVariableSpeed.hpp
@@ -158,7 +158,7 @@ namespace model {
 
     void resetBasinHeaterOperatingSchedule();
 
-    boost::optional<std::string> evaporationLossMode() const;
+    std::string evaporationLossMode() const;
 
     bool isEvaporationLossModeDefaulted() const;
 
@@ -180,7 +180,7 @@ namespace model {
 
     void resetDriftLossPercent();
 
-    boost::optional<std::string> blowdownCalculationMode() const;
+    std::string blowdownCalculationMode() const;
 
     bool isBlowdownCalculationModeDefaulted() const;
 
@@ -206,7 +206,7 @@ namespace model {
 
     void resetNumberofCells();
 
-    boost::optional<std::string> cellControl() const;
+    std::string cellControl() const;
 
     bool isCellControlDefaulted() const;
 
diff --git a/src/model/CoolingTowerVariableSpeed_Impl.hpp b/src/model/CoolingTowerVariableSpeed_Impl.hpp
index 6afe25365d3..d2421b74cdb 100644
--- a/src/model/CoolingTowerVariableSpeed_Impl.hpp
+++ b/src/model/CoolingTowerVariableSpeed_Impl.hpp
@@ -109,7 +109,7 @@ namespace model {
 
       boost::optional<Schedule> basinHeaterOperatingSchedule() const;
 
-      boost::optional<std::string> evaporationLossMode() const;
+      std::string evaporationLossMode() const;
 
       bool isEvaporationLossModeDefaulted() const;
 
@@ -119,7 +119,7 @@ namespace model {
 
       boost::optional<double> driftLossPercent() const;
 
-      boost::optional<std::string> blowdownCalculationMode() const;
+      std::string blowdownCalculationMode() const;
 
       bool isBlowdownCalculationModeDefaulted() const;
 
@@ -129,7 +129,7 @@ namespace model {
 
       boost::optional<int> numberofCells() const;
 
-      boost::optional<std::string> cellControl() const;
+      std::string cellControl() const;
 
       bool isCellControlDefaulted() const;
 
diff --git a/src/model/PlantLoop.cpp b/src/model/PlantLoop.cpp
index fd3ebae8e1a..e9caa402c5f 100644
--- a/src/model/PlantLoop.cpp
+++ b/src/model/PlantLoop.cpp
@@ -789,7 +789,6 @@ namespace model {
 
     bool PlantLoop_Impl::setMaximumLoopTemperature(double value) {
       return setDouble(OS_PlantLoopFields::MaximumLoopTemperature, value);
-      ;
     }
 
     double PlantLoop_Impl::minimumLoopTemperature() {
@@ -798,7 +797,6 @@ namespace model {
 
     bool PlantLoop_Impl::setMinimumLoopTemperature(double value) {
       return setDouble(OS_PlantLoopFields::MinimumLoopTemperature, value);
-      ;
     }
 
     boost::optional<double> PlantLoop_Impl::maximumLoopFlowRate() {
@@ -807,7 +805,6 @@ namespace model {
 
     bool PlantLoop_Impl::setMaximumLoopFlowRate(double value) {
       return setDouble(OS_PlantLoopFields::MaximumLoopFlowRate, value);
-      ;
     }
 
     bool PlantLoop_Impl::isMaximumLoopFlowRateAutosized() {
@@ -820,7 +817,8 @@ namespace model {
     }
 
     void PlantLoop_Impl::autosizeMaximumLoopFlowRate() {
-      setString(OS_PlantLoopFields::MaximumLoopFlowRate, "Autosize");
+      bool result = setString(OS_PlantLoopFields::MaximumLoopFlowRate, "Autosize");
+      OS_ASSERT(result);
     }
 
     boost::optional<double> PlantLoop_Impl::minimumLoopFlowRate() {
@@ -829,7 +827,6 @@ namespace model {
 
     bool PlantLoop_Impl::setMinimumLoopFlowRate(double value) {
       return setDouble(OS_PlantLoopFields::MinimumLoopFlowRate, value);
-      ;
     }
 
     bool PlantLoop_Impl::isMinimumLoopFlowRateAutosized() {
@@ -842,7 +839,8 @@ namespace model {
     }
 
     void PlantLoop_Impl::autosizeMinimumLoopFlowRate() {
-      setString(OS_PlantLoopFields::MinimumLoopFlowRate, "Autosize");
+      bool result = setString(OS_PlantLoopFields::MinimumLoopFlowRate, "Autosize");
+      OS_ASSERT(result);
     }
 
     boost::optional<double> PlantLoop_Impl::plantLoopVolume() {
@@ -851,7 +849,6 @@ namespace model {
 
     bool PlantLoop_Impl::setPlantLoopVolume(double value) {
       return setDouble(OS_PlantLoopFields::PlantLoopVolume, value);
-      ;
     }
 
     bool PlantLoop_Impl::isPlantLoopVolumeAutocalculated() {
@@ -864,7 +861,8 @@ namespace model {
     }
 
     void PlantLoop_Impl::autocalculatePlantLoopVolume() {
-      setString(OS_PlantLoopFields::PlantLoopVolume, "Autocalculate");
+      bool result = setString(OS_PlantLoopFields::PlantLoopVolume, "Autocalculate");
+      OS_ASSERT(result);
     }
 
     std::string PlantLoop_Impl::fluidType() {
@@ -881,7 +879,6 @@ namespace model {
 
     bool PlantLoop_Impl::setGlycolConcentration(int glycolConcentration) {
       return setInt(OS_PlantLoopFields::GlycolConcentration, glycolConcentration);
-      ;
     }
 
     Node PlantLoop_Impl::loopTemperatureSetpointNode() {
@@ -929,8 +926,14 @@ namespace model {
       }
     }
 
-    boost::optional<std::string> PlantLoop_Impl::commonPipeSimulation() const {
-      return getString(OS_PlantLoopFields::CommonPipeSimulation);
+    std::string PlantLoop_Impl::commonPipeSimulation() const {
+      boost::optional<std::string> value = getString(OS_PlantLoopFields::CommonPipeSimulation, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    bool PlantLoop_Impl::isCommonPipeSimulationDefaulted() const {
+      return isEmpty(OS_PlantLoopFields::CommonPipeSimulation);
     }
 
     bool PlantLoop_Impl::setCommonPipeSimulation(const std::string& value) {
@@ -938,7 +941,8 @@ namespace model {
     }
 
     void PlantLoop_Impl::resetCommonPipeSimulation() {
-      setString(OS_PlantLoopFields::CommonPipeSimulation, "");
+      bool result = setString(OS_PlantLoopFields::CommonPipeSimulation, "");
+      OS_ASSERT(result);
     }
 
     boost::optional<PlantEquipmentOperationHeatingLoad> PlantLoop_Impl::plantEquipmentOperationHeatingLoad() const {
@@ -1013,7 +1017,8 @@ namespace model {
     }
 
     void PlantLoop_Impl::resetPlantEquipmentOperationHeatingLoadSchedule() {
-      setString(OS_PlantLoopFields::PlantEquipmentOperationHeatingLoadSchedule, "");
+      bool result = setString(OS_PlantLoopFields::PlantEquipmentOperationHeatingLoadSchedule, "");
+      OS_ASSERT(result);
     }
 
     boost::optional<Schedule> PlantLoop_Impl::plantEquipmentOperationHeatingLoadSchedule() const {
@@ -1031,7 +1036,8 @@ namespace model {
     }
 
     void PlantLoop_Impl::resetPlantEquipmentOperationCoolingLoadSchedule() {
-      setString(OS_PlantLoopFields::PlantEquipmentOperationCoolingLoadSchedule, "");
+      bool result = setString(OS_PlantLoopFields::PlantEquipmentOperationCoolingLoadSchedule, "");
+      OS_ASSERT(result);
     }
 
     bool PlantLoop_Impl::setPrimaryPlantEquipmentOperationSchemeSchedule(Schedule& schedule) {
@@ -1041,7 +1047,8 @@ namespace model {
     }
 
     void PlantLoop_Impl::resetPrimaryPlantEquipmentOperationSchemeSchedule() {
-      setString(OS_PlantLoopFields::PlantEquipmentOperationCoolingLoadSchedule, "");
+      bool result = setString(OS_PlantLoopFields::PlantEquipmentOperationCoolingLoadSchedule, "");
+      OS_ASSERT(result);
     }
 
     boost::optional<Schedule> PlantLoop_Impl::primaryPlantEquipmentOperationSchemeSchedule() const {
@@ -1059,7 +1066,8 @@ namespace model {
     }
 
     void PlantLoop_Impl::resetComponentSetpointOperationSchemeSchedule() {
-      setString(OS_PlantLoopFields::ComponentSetpointOperationSchemeSchedule, "");
+      bool result = setString(OS_PlantLoopFields::ComponentSetpointOperationSchemeSchedule, "");
+      OS_ASSERT(result);
     }
 
     boost::optional<double> PlantLoop_Impl::autosizedMaximumLoopFlowRate() const {
@@ -1328,6 +1336,14 @@ namespace model {
     return result;
   }
 
+  std::vector<std::string> PlantLoop::commonPipeSimulationValues() {
+    return getIddKeyNames(IddFactory::instance().getObject(iddObjectType()).get(), OS_PlantLoopFields::CommonPipeSimulation);
+  }
+
+  std::vector<std::string> PlantLoop::validCommonPipeSimulationValues() {
+    return commonPipeSimulationValues();
+  }
+
   double PlantLoop::maximumLoopTemperature() {
     return getImpl<detail::PlantLoop_Impl>()->maximumLoopTemperature();
   }
@@ -1404,6 +1420,10 @@ namespace model {
     return getIddKeyNames(IddFactory::instance().getObject(iddObjectType()).get(), OS_PlantLoopFields::FluidType);
   }
 
+  std::vector<std::string> PlantLoop::validFluidTypeValues() {
+    return fluidTypeValues();
+  }
+
   int PlantLoop::glycolConcentration() const {
     return getImpl<detail::PlantLoop_Impl>()->glycolConcentration();
   }
@@ -1424,10 +1444,14 @@ namespace model {
     return getImpl<detail::PlantLoop_Impl>()->sizingPlant();
   }
 
-  boost::optional<std::string> PlantLoop::commonPipeSimulation() const {
+  std::string PlantLoop::commonPipeSimulation() const {
     return getImpl<detail::PlantLoop_Impl>()->commonPipeSimulation();
   }
 
+  bool PlantLoop::isCommonPipeSimulationDefaulted() const {
+    return getImpl<detail::PlantLoop_Impl>()->isCommonPipeSimulationDefaulted();
+  }
+
   bool PlantLoop::setCommonPipeSimulation(const std::string& value) {
     return getImpl<detail::PlantLoop_Impl>()->setCommonPipeSimulation(value);
   }
@@ -1484,6 +1508,10 @@ namespace model {
     return getIddKeyNames(IddFactory::instance().getObject(iddObjectType()).get(), OS_PlantLoopFields::LoadDistributionScheme);
   }
 
+  std::vector<std::string> PlantLoop::validLoadDistributionSchemeValues() {
+    return loadDistributionSchemeValues();
+  }
+
   bool PlantLoop::setPlantEquipmentOperationHeatingLoadSchedule(Schedule& schedule) {
     return getImpl<detail::PlantLoop_Impl>()->setPlantEquipmentOperationHeatingLoadSchedule(schedule);
   }
diff --git a/src/model/PlantLoop.hpp b/src/model/PlantLoop.hpp
index 3283e97d5e1..d787b7d2896 100644
--- a/src/model/PlantLoop.hpp
+++ b/src/model/PlantLoop.hpp
@@ -72,8 +72,16 @@ namespace model {
 
     static std::vector<std::string> loadDistributionSchemeValues();
 
+    static std::vector<std::string> validLoadDistributionSchemeValues();
+
     static std::vector<std::string> fluidTypeValues();
 
+    static std::vector<std::string> validFluidTypeValues();
+
+    static std::vector<std::string> commonPipeSimulationValues();
+
+    static std::vector<std::string> validCommonPipeSimulationValues();
+
     /** Prior to OS 1.11.0 the options where
       Optimal, Sequential, and Uniform.
       E+ changed the available options to.
@@ -138,7 +146,9 @@ namespace model {
 
     void autocalculatePlantLoopVolume();
 
-    boost::optional<std::string> commonPipeSimulation() const;
+    std::string commonPipeSimulation() const;
+
+    bool isCommonPipeSimulationDefaulted() const;
 
     bool setCommonPipeSimulation(const std::string& value);
 
diff --git a/src/model/PlantLoop_Impl.hpp b/src/model/PlantLoop_Impl.hpp
index e44c65145e9..ad445fbd106 100644
--- a/src/model/PlantLoop_Impl.hpp
+++ b/src/model/PlantLoop_Impl.hpp
@@ -125,7 +125,9 @@ namespace model {
 
       void autocalculatePlantLoopVolume();
 
-      boost::optional<std::string> commonPipeSimulation() const;
+      std::string commonPipeSimulation() const;
+
+      bool isCommonPipeSimulationDefaulted() const;
 
       bool setCommonPipeSimulation(const std::string& value);
 


Test patch:
diff --git a/src/model/test/CoolingTowerSingleSpeed_GTest.cpp b/src/model/test/CoolingTowerSingleSpeed_GTest.cpp
index 0798c0a0945..113480df3f2 100644
--- a/src/model/test/CoolingTowerSingleSpeed_GTest.cpp
+++ b/src/model/test/CoolingTowerSingleSpeed_GTest.cpp
@@ -95,8 +95,7 @@ TEST_F(ModelFixture, CoolingTowerSingleSpeed_CoolingTowerSingleSpeed) {
 
   EXPECT_FALSE(coolingTowerSingleSpeed.basinHeaterOperatingSchedule());
 
-  ASSERT_TRUE(coolingTowerSingleSpeed.evaporationLossMode());
-  EXPECT_EQ("LossFactor", coolingTowerSingleSpeed.evaporationLossMode().get());
+  EXPECT_EQ("LossFactor", coolingTowerSingleSpeed.evaporationLossMode());
   EXPECT_FALSE(coolingTowerSingleSpeed.isEvaporationLossModeDefaulted());
 
   EXPECT_EQ(0.2, coolingTowerSingleSpeed.evaporationLossFactor());
@@ -105,8 +104,7 @@ TEST_F(ModelFixture, CoolingTowerSingleSpeed_CoolingTowerSingleSpeed) {
   EXPECT_EQ(0.008, coolingTowerSingleSpeed.driftLossPercent());
   EXPECT_FALSE(coolingTowerSingleSpeed.isDriftLossPercentDefaulted());
 
-  ASSERT_TRUE(coolingTowerSingleSpeed.blowdownCalculationMode());
-  EXPECT_EQ("ConcentrationRatio", coolingTowerSingleSpeed.blowdownCalculationMode().get());
+  EXPECT_EQ("ConcentrationRatio", coolingTowerSingleSpeed.blowdownCalculationMode());
   EXPECT_FALSE(coolingTowerSingleSpeed.isBlowdownCalculationModeDefaulted());
 
   EXPECT_EQ(3.0, coolingTowerSingleSpeed.blowdownConcentrationRatio());
diff --git a/src/model/test/CoolingTowerTwoSpeed_GTest.cpp b/src/model/test/CoolingTowerTwoSpeed_GTest.cpp
index 7577327516c..304836c0fee 100644
--- a/src/model/test/CoolingTowerTwoSpeed_GTest.cpp
+++ b/src/model/test/CoolingTowerTwoSpeed_GTest.cpp
@@ -130,8 +130,7 @@ TEST_F(ModelFixture, CoolingTowerTwoSpeed_constructor) {
 
   EXPECT_FALSE(coolingTowerTwoSpeed.basinHeaterOperatingSchedule());
 
-  ASSERT_TRUE(coolingTowerTwoSpeed.evaporationLossMode());
-  EXPECT_EQ("SaturatedExit", coolingTowerTwoSpeed.evaporationLossMode().get());
+  EXPECT_EQ("SaturatedExit", coolingTowerTwoSpeed.evaporationLossMode());
   EXPECT_TRUE(coolingTowerTwoSpeed.isEvaporationLossModeDefaulted());
 
   EXPECT_EQ(0.2, coolingTowerTwoSpeed.evaporationLossFactor());
@@ -140,8 +139,7 @@ TEST_F(ModelFixture, CoolingTowerTwoSpeed_constructor) {
   EXPECT_EQ(0.008, coolingTowerTwoSpeed.driftLossPercent());
   EXPECT_TRUE(coolingTowerTwoSpeed.isDriftLossPercentDefaulted());
 
-  ASSERT_TRUE(coolingTowerTwoSpeed.blowdownCalculationMode());
-  EXPECT_EQ("ConcentrationRatio", coolingTowerTwoSpeed.blowdownCalculationMode().get());
+  EXPECT_EQ("ConcentrationRatio", coolingTowerTwoSpeed.blowdownCalculationMode());
   EXPECT_TRUE(coolingTowerTwoSpeed.isBlowdownCalculationModeDefaulted());
 
   EXPECT_EQ(3.0, coolingTowerTwoSpeed.blowdownConcentrationRatio());
diff --git a/src/model/test/CoolingTowerVariableSpeed_GTest.cpp b/src/model/test/CoolingTowerVariableSpeed_GTest.cpp
index 8a894383ce1..f32891f3205 100644
--- a/src/model/test/CoolingTowerVariableSpeed_GTest.cpp
+++ b/src/model/test/CoolingTowerVariableSpeed_GTest.cpp
@@ -93,8 +93,7 @@ TEST_F(ModelFixture, CoolingTowerVariableSpeed_constructor) {
 
   EXPECT_FALSE(coolingTowerVariableSpeed.basinHeaterOperatingSchedule());
 
-  ASSERT_TRUE(coolingTowerVariableSpeed.evaporationLossMode());
-  EXPECT_EQ("SaturatedExit", coolingTowerVariableSpeed.evaporationLossMode().get());
+  EXPECT_EQ("SaturatedExit", coolingTowerVariableSpeed.evaporationLossMode());
   EXPECT_FALSE(coolingTowerVariableSpeed.isEvaporationLossModeDefaulted());
 
   EXPECT_EQ(0.2, coolingTowerVariableSpeed.evaporationLossFactor());
@@ -103,8 +102,7 @@ TEST_F(ModelFixture, CoolingTowerVariableSpeed_constructor) {
   ASSERT_TRUE(coolingTowerVariableSpeed.driftLossPercent());
   EXPECT_EQ(0.008, coolingTowerVariableSpeed.driftLossPercent().get());
 
-  ASSERT_TRUE(coolingTowerVariableSpeed.blowdownCalculationMode());
-  EXPECT_EQ("ConcentrationRatio", coolingTowerVariableSpeed.blowdownCalculationMode().get());
+  EXPECT_EQ("ConcentrationRatio", coolingTowerVariableSpeed.blowdownCalculationMode());
   EXPECT_FALSE(coolingTowerVariableSpeed.isBlowdownCalculationModeDefaulted());
 
   ASSERT_TRUE(coolingTowerVariableSpeed.blowdownConcentrationRatio());
@@ -114,8 +112,7 @@ TEST_F(ModelFixture, CoolingTowerVariableSpeed_constructor) {
 
   EXPECT_FALSE(coolingTowerVariableSpeed.numberofCells());
 
-  ASSERT_TRUE(coolingTowerVariableSpeed.cellControl());
-  EXPECT_EQ("MinimalCell", coolingTowerVariableSpeed.cellControl().get());
+  EXPECT_EQ("MinimalCell", coolingTowerVariableSpeed.cellControl());
   EXPECT_TRUE(coolingTowerVariableSpeed.isCellControlDefaulted());
 
   EXPECT_FALSE(coolingTowerVariableSpeed.cellMinimumWaterFlowRateFraction());
diff --git a/src/model/test/PlantLoop_GTest.cpp b/src/model/test/PlantLoop_GTest.cpp
index fc63dda96b6..ff38732283c 100644
--- a/src/model/test/PlantLoop_GTest.cpp
+++ b/src/model/test/PlantLoop_GTest.cpp
@@ -521,3 +521,18 @@ TEST_F(ModelFixture, PlantLoop_AvailabilityManagers) {
  *
  */
 }
+
+TEST_F(ModelFixture, PlantLoop_CommonPipeSimulation) {
+  Model m;
+  PlantLoop plant(m);
+
+  EXPECT_EQ("None", plant.commonPipeSimulation());
+  EXPECT_TRUE(plant.isCommonPipeSimulationDefaulted());
+
+  EXPECT_TRUE(plant.setCommonPipeSimulation("CommonPipe"));
+  EXPECT_FALSE(plant.isCommonPipeSimulationDefaulted());
+  EXPECT_EQ("CommonPipe", plant.commonPipeSimulation());
+
+  plant.resetCommonPipeSimulation();
+  EXPECT_TRUE(plant.isCommonPipeSimulationDefaulted());
+}