Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 0 additions & 22 deletions resources/model/OpenStudio.idd
Original file line number Diff line number Diff line change
Expand Up @@ -10218,28 +10218,6 @@ OS:AirLoopHVAC,
\required-field
\object-list ConnectionObject

OS:AirLoopHVAC:ControllerList,
\memo List controllers in order of control sequence
\extensible:2
\min-fields 4
A1, \field Handle
\type handle
\required-field
A2, \field Name
\type alpha
\required-field
\reference ControllerLists
A3, \field Controller Object Type
\type choice
\required-field
\begin-extensible
\key Controller:WaterCoil
\key Controller:OutdoorAir
A4; \field Controller Name
\type object-list
\required-field
\object-list AirLoopControllers

Comment on lines -10221 to -10242
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kbenne I removed this, as it's actually unused.

OS:AirLoopHVAC:OutdoorAirSystem,
\min-fields 4
A1, \field Handle
Expand Down
1 change: 0 additions & 1 deletion src/energyplus/ForwardTranslator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3127,7 +3127,6 @@ namespace energyplus {
result.push_back(IddObjectType::OS_Exterior_WaterEquipment);

result.push_back(IddObjectType::OS_AirLoopHVAC);
result.push_back(IddObjectType::OS_AirLoopHVAC_ControllerList);

// Translated by AirLoopHVAC
// result.push_back(IddObjectType::OS_AirLoopHVAC_OutdoorAirSystem);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,23 +84,6 @@ namespace energyplus {
idfObject.setString(openstudio::AirLoopHVAC_OutdoorAirSystemFields::Name, name);

// Controller List
IdfObject _controllerList(IddObjectType::AirLoopHVAC_ControllerList);
_controllerList.setName(name + " Controller List");
_controllerList.clearExtensibleGroups();
m_idfObjects.push_back(_controllerList);
idfObject.setString(openstudio::AirLoopHVAC_OutdoorAirSystemFields::ControllerListName, _controllerList.name().get());

ControllerOutdoorAir controllerOutdoorAir = modelObject.getControllerOutdoorAir();

if (!modelObject.airLoopHVACDedicatedOutdoorAirSystem()) {
boost::optional<IdfObject> _controllerOutdoorAir = translateAndMapModelObject(controllerOutdoorAir);
OS_ASSERT(_controllerOutdoorAir);

IdfExtensibleGroup eg = _controllerList.pushExtensibleGroup();
eg.setString(AirLoopHVAC_ControllerListExtensibleFields::ControllerObjectType, _controllerOutdoorAir->iddObject().name());
eg.setString(AirLoopHVAC_ControllerListExtensibleFields::ControllerName, _controllerOutdoorAir->name().get());
}

std::vector<ModelObject> controllers;
auto components = modelObject.components();
for (const auto& component : components) {
Expand All @@ -117,12 +100,34 @@ namespace energyplus {
}
}

for (auto& controller : controllers) {
auto _controller = translateAndMapModelObject(controller);
if (_controller) {
// If it's not empty: then we have work to do.
// If it's empty, there's at least the controller Outdoor Air UNLESS it's on a AirLoopHVACDOAS in which case do nothing
if (!controllers.empty() || !modelObject.airLoopHVACDedicatedOutdoorAirSystem()) {

IdfObject _controllerList(IddObjectType::AirLoopHVAC_ControllerList);
Comment on lines +103 to +107
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the actual fix. The ControllerList is translated only if we have work to do. This is based on how I understand E+ expects it...

_controllerList.setName(name + " Controller List");
_controllerList.clearExtensibleGroups();
m_idfObjects.push_back(_controllerList);
idfObject.setString(openstudio::AirLoopHVAC_OutdoorAirSystemFields::ControllerListName, _controllerList.name().get());

ControllerOutdoorAir controllerOutdoorAir = modelObject.getControllerOutdoorAir();

if (!modelObject.airLoopHVACDedicatedOutdoorAirSystem()) {
boost::optional<IdfObject> _controllerOutdoorAir = translateAndMapModelObject(controllerOutdoorAir);
OS_ASSERT(_controllerOutdoorAir);

IdfExtensibleGroup eg = _controllerList.pushExtensibleGroup();
eg.setString(AirLoopHVAC_ControllerListExtensibleFields::ControllerObjectType, _controller->iddObject().name());
eg.setString(AirLoopHVAC_ControllerListExtensibleFields::ControllerName, _controller->name().get());
eg.setString(AirLoopHVAC_ControllerListExtensibleFields::ControllerObjectType, _controllerOutdoorAir->iddObject().name());
eg.setString(AirLoopHVAC_ControllerListExtensibleFields::ControllerName, _controllerOutdoorAir->name().get());
}

for (auto& controller : controllers) {
auto _controller = translateAndMapModelObject(controller);
if (_controller) {
IdfExtensibleGroup eg = _controllerList.pushExtensibleGroup();
eg.setString(AirLoopHVAC_ControllerListExtensibleFields::ControllerObjectType, _controller->iddObject().name());
eg.setString(AirLoopHVAC_ControllerListExtensibleFields::ControllerName, _controller->name().get());
}
}
}

Expand Down
56 changes: 56 additions & 0 deletions src/energyplus/Test/AirLoopHVACDedicatedOutdoorAirSystem_GTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@
#include "../../model/CoilCoolingWater.hpp"
#include "../../model/CoilCoolingWater_Impl.hpp"

#include "../../utilities/idf/IdfObject.hpp"
#include "../../utilities/idf/WorkspaceObject.hpp"
#include "../../utilities/idf/IdfExtensibleGroup.hpp"
#include "../../utilities/idf/WorkspaceExtensibleGroup.hpp"

Expand Down Expand Up @@ -160,6 +162,60 @@ TEST_F(EnergyPlusFixture, ForwardTranslator_AirLoopHVACDedicatedOutdoorAirSystem
w_egSplitter.getString(AirLoopHVAC_SplitterExtensibleFields::OutletNodeName, false).get());
}

TEST_F(EnergyPlusFixture, ForwardTranslator_AirLoopHVACDedicatedOutdoorAirSystem_ControllerList) {

// Test for #4265 - Do not translate empty AirLoopHVAC:ControllerList for AirLoopHVAC:DedicatedOutdoorAirSystem to avoid E+ Severe errors
ForwardTranslator ft;

Model m;

ControllerOutdoorAir controllerOutdoorAir(m);
AirLoopHVACOutdoorAirSystem oaSystem(m, controllerOutdoorAir);
oaSystem.setName("Outdoor Air System 1");
AirLoopHVACDedicatedOutdoorAirSystem doas(oaSystem);

// There's only the AirLoopHVACOutdoorAirSystem, but no components on it -> do not translate the ControllerList
{
Workspace w = ft.translateModel(m);
EXPECT_EQ(0, w.getObjectsByType(IddObjectType::AirLoopHVAC_ControllerList).size());

WorkspaceObjectVector idfDOASs(w.getObjectsByType(IddObjectType::AirLoopHVAC_DedicatedOutdoorAirSystem));
ASSERT_EQ(1, idfDOASs.size());
WorkspaceObject idfDOAS(idfDOASs[0]);

auto _idfOASystem = idfDOAS.getTarget(AirLoopHVAC_DedicatedOutdoorAirSystemFields::AirLoopHVAC_OutdoorAirSystemName);
ASSERT_TRUE(_idfOASystem);
EXPECT_FALSE(_idfOASystem->getTarget(AirLoopHVAC_OutdoorAirSystemFields::ControllerListName));
}

CoilCoolingWater coil(m);
EXPECT_EQ(2, oaSystem.components().size());
EXPECT_TRUE(coil.addToNode(oaSystem.outboardOANode().get()));
EXPECT_EQ(4, oaSystem.components().size());
PlantLoop p(m);
EXPECT_TRUE(p.addDemandBranchForComponent(coil));

// There's the Controller:WaterCoil, so do translate it
{
Workspace w = ft.translateModel(m);
EXPECT_EQ(1, w.getObjectsByType(IddObjectType::AirLoopHVAC_ControllerList).size());

WorkspaceObjectVector idfDOASs(w.getObjectsByType(IddObjectType::AirLoopHVAC_DedicatedOutdoorAirSystem));
ASSERT_EQ(1, idfDOASs.size());
WorkspaceObject idfDOAS(idfDOASs[0]);

auto _idfOASystem = idfDOAS.getTarget(AirLoopHVAC_DedicatedOutdoorAirSystemFields::AirLoopHVAC_OutdoorAirSystemName);
ASSERT_TRUE(_idfOASystem);
auto _idfControllerList = _idfOASystem->getTarget(AirLoopHVAC_OutdoorAirSystemFields::ControllerListName);
ASSERT_TRUE(_idfControllerList);

ASSERT_EQ(1, _idfControllerList->numExtensibleGroups());
WorkspaceExtensibleGroup w_eg = _idfControllerList->extensibleGroups()[0].cast<WorkspaceExtensibleGroup>();
EXPECT_EQ("Controller:WaterCoil", w_eg.getString(AirLoopHVAC_ControllerListExtensibleFields::ControllerObjectType).get());
EXPECT_TRUE(w_eg.getString(AirLoopHVAC_ControllerListExtensibleFields::ControllerName));
}
}

/* TEST_F(EnergyPlusFixture, ReverseTranslator_AirLoopHVACDedicatedOutdoorAirSystem) {
openstudio::Workspace workspace(openstudio::StrictnessLevel::None, openstudio::IddFileType::EnergyPlus);

Expand Down
1 change: 0 additions & 1 deletion src/model/AirLoopHVAC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,6 @@
#include <utilities/idd/OS_AirLoopHVAC_ZoneSplitter_FieldEnums.hxx>
#include <utilities/idd/OS_AirTerminal_SingleDuct_ConstantVolume_NoReheat_FieldEnums.hxx>
#include <utilities/idd/OS_AvailabilityManagerAssignmentList_FieldEnums.hxx>
#include <utilities/idd/OS_AirLoopHVAC_ControllerList_FieldEnums.hxx>
#include <utilities/idd/OS_Controller_OutdoorAir_FieldEnums.hxx>
#include <utilities/idd/IddEnums.hxx>
#include "../utilities/core/Compare.hpp"
Expand Down
1 change: 0 additions & 1 deletion src/model/AirLoopHVACOutdoorAirSystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@
#include "../utilities/idf/IdfExtensibleGroup.hpp"
#include <utilities/idd/OS_AirLoopHVAC_OutdoorAirSystem_FieldEnums.hxx>
#include <utilities/idd/OS_AvailabilityManagerAssignmentList_FieldEnums.hxx>
#include <utilities/idd/OS_AirLoopHVAC_ControllerList_FieldEnums.hxx>
#include <utilities/idd/OS_Controller_OutdoorAir_FieldEnums.hxx>
#include <utilities/idd/IddEnums.hxx>
#include <utility>
Expand Down