Skip to content

Commit

Permalink
Merge pull request #4899 from NREL/4896_MinimalFix
Browse files Browse the repository at this point in the history
Fix #4896 - SPM:MixedAir creation for CoilSystemCoolingWaterHeatExchangerAssisted does not work with FanSystemModel
  • Loading branch information
jmarrec committed Jun 29, 2023
2 parents 4ca478d + bb64a02 commit d286d0c
Showing 1 changed file with 25 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@
#include "../../model/FanVariableVolume_Impl.hpp"
#include "../../model/FanConstantVolume.hpp"
#include "../../model/FanConstantVolume_Impl.hpp"
#include "../../model/FanOnOff.hpp"
#include "../../model/FanOnOff_Impl.hpp"
#include "../../model/FanSystemModel.hpp"
#include "../../model/FanSystemModel_Impl.hpp"

#include "../../model/Model.hpp"
#include "../../utilities/core/Assert.hpp"
Expand All @@ -39,40 +43,35 @@ namespace energyplus {

boost::optional<IdfObject>
ForwardTranslator::translateCoilSystemCoolingWaterHeatExchangerAssisted(CoilSystemCoolingWaterHeatExchangerAssisted& modelObject) {
IdfObject idfObject(IddObjectType::CoilSystem_Cooling_Water_HeatExchangerAssisted);
m_idfObjects.push_back(idfObject);

// Name
if (auto s = modelObject.name()) {
idfObject.setName(*s);
}
IdfObject idfObject = createRegisterAndNameIdfObject(openstudio::IddObjectType::CoilSystem_Cooling_Water_HeatExchangerAssisted, modelObject);

std::string hxSupplyAirInletNodeName;
// InletNodeName
if (auto mo = modelObject.inletModelObject()) {
if (auto node = mo->optionalCast<Node>()) {
hxSupplyAirInletNodeName = node->name().get();
hxSupplyAirInletNodeName = node->nameString();
}
}

std::string hxExhaustAirOutletNodeName;
// OutletNodeName
if (auto mo = modelObject.outletModelObject()) {
if (auto node = mo->optionalCast<Node>()) {
hxExhaustAirOutletNodeName = node->name().get();
hxExhaustAirOutletNodeName = node->nameString();
}
}

std::string hxSupplyAirOutletNodeName = modelObject.name().get() + " HX Supply Air Outlet - Cooling Inlet Node";
std::string hxExhaustAirInletNodeName = modelObject.name().get() + " HX Exhaust Air Inlet - Cooling Outlet Node";
std::string hxSupplyAirOutletNodeName = modelObject.nameString() + " HX Supply Air Outlet - Cooling Inlet Node";
std::string hxExhaustAirInletNodeName = modelObject.nameString() + " HX Exhaust Air Inlet - Cooling Outlet Node";

// HeatExchangerObjectType
// HeatExchangerName
{
auto hx = modelObject.heatExchanger();
if (auto idf = translateAndMapModelObject(hx)) {
idfObject.setString(CoilSystem_Cooling_Water_HeatExchangerAssistedFields::HeatExchangerObjectType, idf->iddObject().name());
idfObject.setString(CoilSystem_Cooling_Water_HeatExchangerAssistedFields::HeatExchangerName, idf->name().get());
idfObject.setString(CoilSystem_Cooling_Water_HeatExchangerAssistedFields::HeatExchangerName, idf->nameString());
if (idf->iddObject().type() == IddObjectType::HeatExchanger_AirToAir_SensibleAndLatent) {
idf->setString(HeatExchanger_AirToAir_SensibleAndLatentFields::SupplyAirInletNodeName, hxSupplyAirInletNodeName);
idf->setString(HeatExchanger_AirToAir_SensibleAndLatentFields::SupplyAirOutletNodeName, hxSupplyAirOutletNodeName);
Expand All @@ -88,7 +87,7 @@ namespace energyplus {
auto coolingCoil = modelObject.coolingCoil();
if (auto idf = translateAndMapModelObject(coolingCoil)) {
idfObject.setString(CoilSystem_Cooling_Water_HeatExchangerAssistedFields::CoolingCoilObjectType, idf->iddObject().name());
idfObject.setString(CoilSystem_Cooling_Water_HeatExchangerAssistedFields::CoolingCoilName, idf->name().get());
idfObject.setString(CoilSystem_Cooling_Water_HeatExchangerAssistedFields::CoolingCoilName, idf->nameString());
if (idf->iddObject().type() == IddObjectType::Coil_Cooling_Water) {
idf->setString(Coil_Cooling_WaterFields::AirInletNodeName, hxSupplyAirOutletNodeName);
idf->setString(Coil_Cooling_WaterFields::AirOutletNodeName, hxExhaustAirInletNodeName);
Expand All @@ -111,15 +110,19 @@ namespace energyplus {

// Need a SPM:MixedAir on the Coil:Cooling:Water outlet node (that we **created** just above in IDF directly, so it won't get picked up by the
// ForwardTranslateAirLoopHVAC method)
if (boost::optional<AirLoopHVAC> _airLoop = modelObject.airLoopHVAC()) {
if (boost::optional<AirLoopHVAC> airLoop_ = modelObject.airLoopHVAC()) {
std::vector<StraightComponent> fans;
std::vector<ModelObject> supplyComponents = _airLoop->supplyComponents();
std::vector<ModelObject> supplyComponents = airLoop_->supplyComponents();

for (auto it = supplyComponents.begin(); it != supplyComponents.end(); ++it) {
if (boost::optional<FanVariableVolume> variableFan = it->optionalCast<FanVariableVolume>()) {
fans.insert(fans.begin(), *variableFan);
} else if (boost::optional<FanConstantVolume> constantFan = it->optionalCast<FanConstantVolume>()) {
fans.insert(fans.begin(), *constantFan);
if (auto fan_ = it->optionalCast<FanVariableVolume>()) {
fans.insert(fans.begin(), std::move(*fan_));
} else if (auto fan_ = it->optionalCast<FanConstantVolume>()) {
fans.insert(fans.begin(), std::move(*fan_));
} else if (auto fan_ = it->optionalCast<FanSystemModel>()) {
fans.insert(fans.begin(), std::move(*fan_));
} else if (auto fan_ = it->optionalCast<FanOnOff>()) {
fans.insert(fans.begin(), std::move(*fan_));
}
}

Expand All @@ -137,11 +140,11 @@ namespace energyplus {
idf_spm.setString(SetpointManager_MixedAirFields::Name, hxExhaustAirInletNodeName + " OS Default SPM");
idf_spm.setString(SetpointManager_MixedAirFields::ControlVariable, "Temperature");

Node supplyOutletNode = _airLoop->supplyOutletNode();
idf_spm.setString(SetpointManager_MixedAirFields::ReferenceSetpointNodeName, supplyOutletNode.name().get());
Node supplyOutletNode = airLoop_->supplyOutletNode();
idf_spm.setString(SetpointManager_MixedAirFields::ReferenceSetpointNodeName, supplyOutletNode.nameString());

idf_spm.setString(SetpointManager_MixedAirFields::FanInletNodeName, inletNode->name().get());
idf_spm.setString(SetpointManager_MixedAirFields::FanOutletNodeName, outletNode->name().get());
idf_spm.setString(SetpointManager_MixedAirFields::FanInletNodeName, inletNode->nameString());
idf_spm.setString(SetpointManager_MixedAirFields::FanOutletNodeName, outletNode->nameString());

idf_spm.setString(SetpointManager_MixedAirFields::SetpointNodeorNodeListName, hxExhaustAirInletNodeName);

Expand Down

0 comments on commit d286d0c

Please sign in to comment.