#4663 #4664 - Fix CoilCoolingDXMultiSpeed::clone and extend testing for AirLoopHVAC::clone#4683
Merged
#4663 #4664 - Fix CoilCoolingDXMultiSpeed::clone and extend testing for AirLoopHVAC::clone#4683
Conversation
aa79f09 to
fe92204
Compare
jmarrec
commented
Sep 15, 2022
Comment on lines
+276
to
+309
| TEST_F(ModelFixture, CoilCoolingDXMultiSpeed_Clone) { | ||
| // Ref #4663 | ||
| Model m; | ||
| CoilCoolingDXMultiSpeed cc(m); | ||
|
|
||
| std::vector<CoilCoolingDXMultiSpeedStageData> stages{CoilCoolingDXMultiSpeedStageData{m}, CoilCoolingDXMultiSpeedStageData{m}}; | ||
| EXPECT_TRUE(cc.setStages(stages)); | ||
|
|
||
| EXPECT_EQ(2u, cc.stages().size()); | ||
| EXPECT_EQ(1u, m.getConcreteModelObjects<CoilCoolingDXMultiSpeed>().size()); | ||
| EXPECT_EQ(2u, m.getConcreteModelObjects<CoilCoolingDXMultiSpeedStageData>().size()); | ||
|
|
||
| { | ||
| // Clone in another model first, so we don't affect the original one | ||
| Model m2; | ||
| auto cc2 = cc.clone(m2).cast<CoilCoolingDXMultiSpeed>(); | ||
| EXPECT_EQ(2u, cc2.stages().size()); | ||
| EXPECT_EQ(1u, m2.getConcreteModelObjects<CoilCoolingDXMultiSpeed>().size()); | ||
| EXPECT_EQ(2u, m2.getConcreteModelObjects<CoilCoolingDXMultiSpeedStageData>().size()); | ||
| } | ||
|
|
||
| { | ||
| // Same model: we expect stages to be cloned and reassigned to the clone | ||
| auto cc2 = cc.clone(m).cast<CoilCoolingDXMultiSpeed>(); | ||
| std::vector<CoilCoolingDXMultiSpeedStageData> stages2 = cc2.stages(); | ||
| EXPECT_EQ(2u, stages2.size()); | ||
| EXPECT_EQ(2u, m.getConcreteModelObjects<CoilCoolingDXMultiSpeed>().size()); | ||
| EXPECT_EQ(4u, m.getConcreteModelObjects<CoilCoolingDXMultiSpeedStageData>().size()); | ||
| for (auto& stage : stages) { | ||
| EXPECT_TRUE(std::find_if(stages2.cbegin(), stages2.cend(), [&stage](const auto& s) { return s.handle() == stage.handle(); }) == stages2.cend()) | ||
| << "Did not expect to find, in the cloned Coil, the CoilCoolingDXMultiSpeedStageData '" << stage.nameString() << "'"; | ||
| } | ||
| } | ||
| } |
Collaborator
Author
There was a problem hiding this comment.
New test for CoilCoolingDXMultiSpeed::clone. Originally it fails
| // Same model: we expect stages to be cloned and reassigned to the clone | ||
| auto cc2 = cc.clone(m).cast<CoilCoolingDXMultiSpeed>(); | ||
| std::vector<CoilCoolingDXMultiSpeedStageData> stages2 = cc2.stages(); | ||
| EXPECT_EQ(2u, stages2.size()); |
Collaborator
Author
There was a problem hiding this comment.
Original: fails because it's 4
Comment on lines
+288
to
+289
| // Deal with the stages: we want them cloned, so first clear and then clone + assign each | ||
| t_clone.removeAllStages(); |
Comment on lines
+1483
to
+1673
| TEST_F(ModelFixture, AirLoopHVAC_singleDuct_Clone_WithComponents) { | ||
| Model m; | ||
|
|
||
| PlantLoop hw_loop(m); | ||
| PlantLoop chw_loop(m); | ||
|
|
||
| EXPECT_EQ(12, m.getConcreteModelObjects<Node>().size()); | ||
| EXPECT_EQ(4, m.getModelObjects<Splitter>().size()); | ||
| EXPECT_EQ(4, m.getModelObjects<Mixer>().size()); | ||
|
|
||
| EXPECT_EQ(6, chw_loop.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(6, hw_loop.components(openstudio::IddObjectType::OS_Node).size()); | ||
|
|
||
| AirLoopHVAC a(m, false); | ||
| EXPECT_FALSE(a.isDualDuct()); | ||
|
|
||
| EXPECT_EQ(1, a.supplyOutletNodes().size()); | ||
| EXPECT_EQ(2, a.supplyComponents().size()); | ||
|
|
||
| EXPECT_EQ(0, a.supplySplitterOutletNodes().size()); | ||
| EXPECT_FALSE(a.supplySplitterInletNode()); | ||
| EXPECT_FALSE(a.supplySplitter()); | ||
|
|
||
| EXPECT_EQ(5, a.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(17, m.getConcreteModelObjects<Node>().size()); | ||
| EXPECT_EQ(5, m.getModelObjects<Splitter>().size()); | ||
| EXPECT_EQ(5, m.getModelObjects<Mixer>().size()); | ||
|
|
||
| auto supplyOutletNode = a.supplyOutletNode(); | ||
|
|
||
| CoilCoolingWater coolingCoil(m); | ||
| EXPECT_TRUE(coolingCoil.addToNode(supplyOutletNode)); | ||
| EXPECT_EQ(17, m.getConcreteModelObjects<Node>().size()); | ||
| EXPECT_EQ(6, chw_loop.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(6, hw_loop.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(5, a.components(openstudio::IddObjectType::OS_Node).size()); | ||
| { | ||
| auto mo = coolingCoil.airOutletModelObject(); | ||
| ASSERT_TRUE(mo); | ||
| auto node = mo->optionalCast<Node>(); | ||
| ASSERT_TRUE(node); | ||
| ASSERT_EQ(supplyOutletNode, node.get()); | ||
| EXPECT_TRUE(chw_loop.addDemandBranchForComponent(coolingCoil)); | ||
| EXPECT_EQ(18, m.getConcreteModelObjects<Node>().size()); | ||
| EXPECT_EQ(7, chw_loop.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(6, hw_loop.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(5, a.components(openstudio::IddObjectType::OS_Node).size()); | ||
| } | ||
|
|
||
| CoilHeatingWater heatingCoil(m); | ||
| EXPECT_TRUE(heatingCoil.addToNode(supplyOutletNode)); | ||
| EXPECT_EQ(19, m.getConcreteModelObjects<Node>().size()); | ||
| EXPECT_EQ(7, chw_loop.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(6, hw_loop.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(6, a.components(openstudio::IddObjectType::OS_Node).size()); | ||
| { | ||
| auto mo = heatingCoil.airOutletModelObject(); | ||
| ASSERT_TRUE(mo); | ||
| auto node = mo->optionalCast<Node>(); | ||
| ASSERT_TRUE(node); | ||
| ASSERT_EQ(supplyOutletNode, node.get()); | ||
| EXPECT_TRUE(hw_loop.addDemandBranchForComponent(heatingCoil)); | ||
| EXPECT_EQ(20, m.getConcreteModelObjects<Node>().size()); | ||
| EXPECT_EQ(7, chw_loop.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(7, hw_loop.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(6, a.components(openstudio::IddObjectType::OS_Node).size()); | ||
| } | ||
|
|
||
| EXPECT_EQ(1, a.supplyOutletNodes().size()); | ||
| EXPECT_EQ(5, a.supplyComponents().size()); // o----CC----o----HC----o | ||
| EXPECT_EQ(5, a.demandComponents().size()); // 3 nodes, one splitter, one mixer | ||
|
|
||
| EXPECT_FALSE(a.supplySplitter()); | ||
|
|
||
| ThermalZone z(m); | ||
| auto alwaysOn = m.alwaysOnDiscreteSchedule(); | ||
| AirTerminalSingleDuctConstantVolumeNoReheat atu(m, alwaysOn); | ||
| EXPECT_TRUE(a.addBranchForZone(z, atu)); | ||
|
|
||
| EXPECT_EQ(2, m.getConcreteModelObjects<PlantLoop>().size()); | ||
| EXPECT_EQ(1, m.getConcreteModelObjects<CoilCoolingWater>().size()); | ||
| EXPECT_EQ(1, m.getConcreteModelObjects<CoilHeatingWater>().size()); | ||
| EXPECT_EQ(23, m.getConcreteModelObjects<Node>().size()); | ||
| EXPECT_EQ(7, chw_loop.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(7, hw_loop.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(8, a.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(1, a.supplyOutletNodes().size()); | ||
| EXPECT_EQ(5, a.supplyComponents().size()); // o----CC----o----HC----o | ||
| EXPECT_EQ(9, a.demandComponents().size()); // o----Splitter-----o----ATU----o---Zone----o --- mixer ----o | ||
| ASSERT_TRUE(coolingCoil.plantLoop()); | ||
| EXPECT_EQ(chw_loop, coolingCoil.plantLoop().get()); | ||
| ASSERT_TRUE(heatingCoil.plantLoop()); | ||
| EXPECT_EQ(hw_loop, heatingCoil.plantLoop().get()); | ||
| { | ||
| Model m2; | ||
| // PlantLoops aren't taken with | ||
| auto a2 = a.clone(m2).cast<AirLoopHVAC>(); | ||
|
|
||
| EXPECT_EQ(1, m2.getConcreteModelObjects<AirLoopHVAC>().size()); | ||
| EXPECT_EQ(0, m2.getConcreteModelObjects<PlantLoop>().size()); | ||
| EXPECT_EQ(1, m2.getConcreteModelObjects<AirTerminalSingleDuctConstantVolumeNoReheat>().size()); | ||
| EXPECT_EQ(0, m2.getConcreteModelObjects<ThermalZone>().size()); | ||
| EXPECT_EQ(1, m2.getConcreteModelObjects<CoilCoolingWater>().size()); | ||
| EXPECT_EQ(1, m2.getConcreteModelObjects<CoilHeatingWater>().size()); | ||
|
|
||
| EXPECT_EQ(7, m2.getConcreteModelObjects<Node>().size()); | ||
|
|
||
| EXPECT_EQ(7, chw_loop.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(7, hw_loop.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(7, a2.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(1, a2.supplyOutletNodes().size()); | ||
| EXPECT_EQ(5, a2.supplyComponents().size()); // o----CC----o----HC----o | ||
| EXPECT_EQ(7, a2.demandComponents().size()); // o----Splitter-----o----ATU----o --- mixer ----o | ||
|
|
||
| // Ensure the ATU is connectable (cf #4663) | ||
| auto z2 = z.clone(m2).cast<ThermalZone>(); | ||
| EXPECT_EQ(8, m2.getConcreteModelObjects<Node>().size()); | ||
| EXPECT_EQ(1, m2.getConcreteModelObjects<ThermalZone>().size()); | ||
| EXPECT_EQ(0, z2.equipment().size()); | ||
|
|
||
| EXPECT_TRUE(a2.addBranchForZone(z2)); | ||
|
|
||
| EXPECT_EQ(9, m2.getConcreteModelObjects<Node>().size()); | ||
| EXPECT_EQ(8, a2.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(1, a2.supplyOutletNodes().size()); | ||
| EXPECT_EQ(5, a2.supplyComponents().size()); // o----CC----o----HC----o | ||
| EXPECT_EQ(9, a2.demandComponents().size()); // o----Splitter-----o----ATU----o---Zone----o --- mixer ----o | ||
| EXPECT_EQ(1, z2.equipment().size()); | ||
|
|
||
| ASSERT_EQ(1, a2.components(openstudio::IddObjectType::OS_Coil_Cooling_Water).size()); | ||
| auto coolingCoil2 = a2.components(openstudio::IddObjectType::OS_Coil_Cooling_Water)[0].cast<CoilCoolingWater>(); | ||
| EXPECT_FALSE(coolingCoil2.plantLoop()); | ||
|
|
||
| ASSERT_EQ(1, a2.components(openstudio::IddObjectType::OS_Coil_Heating_Water).size()); | ||
| auto heatingCoil2 = a2.components(openstudio::IddObjectType::OS_Coil_Heating_Water)[0].cast<CoilHeatingWater>(); | ||
| EXPECT_FALSE(heatingCoil2.plantLoop()); | ||
| } | ||
|
|
||
| { | ||
| // Same model | ||
| auto a2 = a.clone(m).cast<AirLoopHVAC>(); | ||
|
|
||
| EXPECT_EQ(2, m.getConcreteModelObjects<AirLoopHVAC>().size()); | ||
| EXPECT_EQ(2, m.getConcreteModelObjects<PlantLoop>().size()); | ||
| EXPECT_EQ(2, m.getConcreteModelObjects<AirTerminalSingleDuctConstantVolumeNoReheat>().size()); | ||
| EXPECT_EQ(1, m.getConcreteModelObjects<ThermalZone>().size()); | ||
| EXPECT_EQ(2, m.getConcreteModelObjects<CoilCoolingWater>().size()); | ||
| EXPECT_EQ(2, m.getConcreteModelObjects<CoilHeatingWater>().size()); | ||
|
|
||
| // 23 + 7 (new loop) + 2 loops x 2 nodes | ||
| EXPECT_EQ(34, m.getConcreteModelObjects<Node>().size()); | ||
| EXPECT_EQ(9, chw_loop.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(9, hw_loop.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(8, a.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(1, a.supplyOutletNodes().size()); | ||
| EXPECT_EQ(5, a.supplyComponents().size()); // o----CC----o----HC----o | ||
| EXPECT_EQ(9, a.demandComponents().size()); // o----Splitter-----o----ATU----o---Zone----o --- mixer ----o | ||
| EXPECT_EQ(7, a2.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(1, a2.supplyOutletNodes().size()); | ||
| EXPECT_EQ(5, a2.supplyComponents().size()); // o----CC----o----HC----o | ||
| EXPECT_EQ(7, a2.demandComponents().size()); // o----Splitter-----o----ATU----o --- mixer ----o | ||
|
|
||
| // Ensure the ATU is connectable (cf #4663) | ||
| auto z2 = z.clone(m).cast<ThermalZone>(); | ||
| EXPECT_EQ(35, m.getConcreteModelObjects<Node>().size()); | ||
| EXPECT_EQ(2, m.getConcreteModelObjects<ThermalZone>().size()); | ||
| EXPECT_EQ(1, z.equipment().size()); | ||
| EXPECT_EQ(0, z2.equipment().size()); | ||
|
|
||
| EXPECT_TRUE(a2.addBranchForZone(z2)); | ||
|
|
||
| EXPECT_EQ(36, m.getConcreteModelObjects<Node>().size()); | ||
| EXPECT_EQ(8, a2.components(openstudio::IddObjectType::OS_Node).size()); | ||
| EXPECT_EQ(1, a2.supplyOutletNodes().size()); | ||
| EXPECT_EQ(5, a2.supplyComponents().size()); // o----CC----o----HC----o | ||
| EXPECT_EQ(9, a2.demandComponents().size()); // o----Splitter-----o----ATU----o---Zone----o --- mixer ----o | ||
| EXPECT_EQ(1, z.equipment().size()); | ||
| EXPECT_EQ(1, z2.equipment().size()); | ||
|
|
||
| // Coils are also reconnected to plant loops | ||
| ASSERT_EQ(1, a2.components(openstudio::IddObjectType::OS_Coil_Cooling_Water).size()); | ||
| auto coolingCoil2 = a2.components(openstudio::IddObjectType::OS_Coil_Cooling_Water)[0].cast<CoilCoolingWater>(); | ||
| ASSERT_TRUE(coolingCoil2.plantLoop()); | ||
| EXPECT_EQ(chw_loop, coolingCoil2.plantLoop().get()); | ||
|
|
||
| ASSERT_EQ(1, a2.components(openstudio::IddObjectType::OS_Coil_Heating_Water).size()); | ||
| auto heatingCoil2 = a2.components(openstudio::IddObjectType::OS_Coil_Heating_Water)[0].cast<CoilHeatingWater>(); | ||
| ASSERT_TRUE(heatingCoil2.plantLoop()); | ||
| EXPECT_EQ(hw_loop, heatingCoil2.plantLoop().get()); | ||
| } | ||
| } |
Collaborator
|
CI Results for fe92204:
|
Collaborator
Author
|
@mleachNREL If you could try out one of the installers listed above in #4683 (comment) that would be awesome. |
Collaborator
Author
|
I'm going to merge this, but we can reopen the issues if @mleachNREL tests and find another issue. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pull request overview
Pull Request Author
src/model/test)src/energyplus/Test)src/osversion/VersionTranslator.cpp)Labels:
IDDChangeAPIChangePull Request - Ready for CIso that CI builds your PRReview Checklist
This will not be exhaustively relevant to every PR.