Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ideal loads air system ems override enthalpy update correction #8519

Merged
merged 28 commits into from
Mar 5, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
2a2d150
Fix the missing supply enthalpy updates.
jcyuan2020 Jan 30, 2021
3a69126
Set up a new test unit case. Compiles ok.
jcyuan2020 Feb 1, 2021
fb2679a
Revise the test unit. Compiles ok.
jcyuan2020 Feb 1, 2021
6f78b76
Merge remote-tracking branch 'upstream/develop' into IdealLoadsAirSys…
jcyuan2020 Feb 1, 2021
b945ab1
Merge remote-tracking branch 'upstream/develop' into IdealLoadsAirSys…
jcyuan2020 Feb 4, 2021
1d500fa
Merge remote-tracking branch 'upstream/develop' into IdealLoadsAirSys…
jcyuan2020 Feb 4, 2021
cc37ad0
Merge remote-tracking branch 'upstream/develop' into IdealLoadsAirSys…
jcyuan2020 Feb 5, 2021
aa07520
Merge remote-tracking branch 'upstream/develop' into IdealLoadsAirSys…
jcyuan2020 Feb 6, 2021
818e87e
Merge remote-tracking branch 'upstream/develop' into IdealLoadsAirSys…
jcyuan2020 Feb 6, 2021
11e377e
Merge remote-tracking branch 'upstream/develop' into IdealLoadsAirSys…
jcyuan2020 Feb 7, 2021
8a9163e
Created a new EMS testing unit for Purhcased air. Compiles ok. Test p…
jcyuan2020 Feb 7, 2021
d0edb77
2021-02-18: Resolved conflicts while merging upstream develop into th…
jcyuan2020 Feb 19, 2021
da7af70
Merge remote-tracking branch 'upstream/develop' into IdealLoadsAirSys…
jcyuan2020 Feb 19, 2021
cb0d6dd
Merge remote-tracking branch 'upstream/develop' into IdealLoadsAirSys…
jcyuan2020 Feb 19, 2021
794a413
Merge remote-tracking branch 'upstream/develop' into IdealLoadsAirSys…
jcyuan2020 Feb 19, 2021
29c5866
Merge remote-tracking branch 'upstream/develop' into IdealLoadsAirSys…
jcyuan2020 Feb 22, 2021
d35704a
Merge remote-tracking branch 'upstream/develop' into IdealLoadsAirSys…
jcyuan2020 Feb 24, 2021
a416b98
Remove additonal tab space.
jcyuan2020 Feb 25, 2021
14cf1d2
Propose to move the entire EMS supply air temp and humrat override se…
jcyuan2020 Feb 25, 2021
f4677e1
Added another unit test for zero supply mass airflow case. Compiles o…
jcyuan2020 Feb 26, 2021
1e14220
Merge remote-tracking branch 'upstream/develop' into IdealLoadsAirSys…
jcyuan2020 Feb 26, 2021
b70fc91
Purchased air off reporting supply temperature and humid update.
jcyuan2020 Mar 1, 2021
784d91b
Merge remote-tracking branch 'upstream/develop' into IdealLoadsAirSys…
jcyuan2020 Mar 1, 2021
d8fa87e
Merge remote-tracking branch 'upstream/develop' into IdealLoadsAirSys…
jcyuan2020 Mar 1, 2021
7516db4
Merge remote-tracking branch 'upstream/develop' into IdealLoadsAirSys…
jcyuan2020 Mar 3, 2021
77c4439
Modify unit tests to accommondate state variable changes.
jcyuan2020 Mar 3, 2021
69ecdf8
Merge remote-tracking branch 'upstream/develop' into IdealLoadsAirSys…
Myoldmopar Mar 5, 2021
dbc3faf
Fixed unit test
Myoldmopar Mar 5, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
19 changes: 11 additions & 8 deletions src/EnergyPlus/PurchasedAirManager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2698,15 +2698,16 @@ void CalcPurchAirLoads(EnergyPlusData &state,

} // Cooling or heating required

// EMS override point Purch air supply temp and humidty ratio ..... but only if unit is on, SupplyMassFlowRate>0.0
if (PurchAir(PurchAirNum).EMSOverrideSupplyTempOn) {
PurchAir(PurchAirNum).SupplyTemp = PurchAir(PurchAirNum).EMSValueSupplyTemp;
}
if (PurchAir(PurchAirNum).EMSOverrideSupplyHumRatOn) {
PurchAir(PurchAirNum).SupplyHumRat = PurchAir(PurchAirNum).EMSValueSupplyHumRat;
}

if (SupplyMassFlowRate > 0.0) {
// EMS override point Purch air supply temp and humidty ratio ..... but only if unit is on, SupplyMassFlowRate>0.0
if (PurchAir(PurchAirNum).EMSOverrideSupplyTempOn) {
PurchAir(PurchAirNum).SupplyTemp = PurchAir(PurchAirNum).EMSValueSupplyTemp;
}
if (PurchAir(PurchAirNum).EMSOverrideSupplyHumRatOn) {
PurchAir(PurchAirNum).SupplyHumRat = PurchAir(PurchAirNum).EMSValueSupplyHumRat;
}
SupplyEnthalpy = PsyHFnTdbW(PurchAir(PurchAirNum).SupplyTemp, PurchAir(PurchAirNum).SupplyHumRat);

Copy link
Contributor

Choose a reason for hiding this comment

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

I don't see how setting the EMS conditions all the time to only when mass flow > 0 changes the answer. But then there are only 2 changes here so these changes certainly did something. Maybe it was the 2nd change that fixed this and this change just updates based on EMS only when there is flow. I guess that's OK (see other comment).

// compute coil loads
if ((PurchAir(PurchAirNum).SupplyHumRat == PurchAir(PurchAirNum).MixedAirHumRat) &&
(PurchAir(PurchAirNum).SupplyTemp == PurchAir(PurchAirNum).MixedAirTemp)) {
Expand Down Expand Up @@ -2861,6 +2862,8 @@ void CalcPurchAirLoads(EnergyPlusData &state,
PurchAir(PurchAirNum).OALatOutput = 0.0;
PurchAir(PurchAirNum).MixedAirTemp = Node(RecircNodeNum).Temp;
PurchAir(PurchAirNum).MixedAirHumRat = Node(RecircNodeNum).HumRat;
PurchAir(PurchAirNum).SupplyTemp = Node(InNodeNum).Temp;
PurchAir(PurchAirNum).SupplyHumRat = Node(InNodeNum).HumRat;
Copy link
Contributor

Choose a reason for hiding this comment

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

This all looks reasonable but I am unsure of the difference between setting the supply node condition to the inlet versus the mixed node when the unit is off. @mjwitte ? And when EMS is setting the conditions, regardless if there is flow, shouldn't the supply condition reflect what EMS is writing to the node? I guess at 0 mass flow you can't have a delta T, w or H so this does make sense this way.

Copy link
Contributor

Choose a reason for hiding this comment

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

@rraustad The supplytemp and supplyhumrat struct variables were added recently so that new output variables could be added. Since these are the conditions at the InNode, then they better have the same value. When flow is zero, the InNode conditions are set to match the zone node. That was done long ago, probably to make sure there aren't any funny noise values in the zone air balance calcs.

}

PurchAir(PurchAirNum).OutdoorAirMassFlowRate = OAMassFlowRate;
Expand Down
349 changes: 349 additions & 0 deletions tst/EnergyPlus/unit/PurchasedAirManager.unit.cc
Original file line number Diff line number Diff line change
Expand Up @@ -943,3 +943,352 @@ TEST_F(ZoneIdealLoadsTest, IdealLoads_NoCapacityTest)
// #8365 Supply air mass flow rate should be zero during heating mode when capacity is limited to zero
EXPECT_EQ(state->dataPurchasedAirMgr->PurchAir(1).SupplyAirMassFlowRate, 0.0);
}

TEST_F(ZoneIdealLoadsTest, IdealLoads_EMSOverrideTest_Revised)
{
std::string const idf_objects = delimited_string({
"Zone,",
" EAST ZONE, !- Name",
" 0, !- Direction of Relative North{ deg }",
" 0, !- X Origin{ m }",
" 0, !- Y Origin{ m }",
" 0, !- Z Origin{ m }",
" 1, !- Type",
" 1, !- Multiplier",
" autocalculate, !- Ceiling Height{ m }",
" autocalculate; !- Volume{ m3 }",

"ZoneHVAC:IdealLoadsAirSystem,",
" ZONE 1 IDEAL LOADS, !- Name",
" , !- Availability Schedule Name",
" Zone Inlet Node, !- Zone Supply Air Node Name",
" Zone Exhaust Node, !- Zone Exhaust Air Node Name",
" , !- System Inlet Air Node Name",
" 50, !- Maximum Heating Supply Air Temperature{ C }",
" 13, !- Minimum Cooling Supply Air Temperature{ C }",
" 0.015, !- Maximum Heating Supply Air Humidity Ratio{ kgWater / kgDryAir }",
" 0.009, !- Minimum Cooling Supply Air Humidity Ratio{ kgWater / kgDryAir }",
" NoLimit, !- Heating Limit",
" autosize, !- Maximum Heating Air Flow Rate{ m3 / s }",
" , !- Maximum Sensible Heating Capacity{ W }",
" NoLimit, !- Cooling Limit",
" autosize, !- Maximum Cooling Air Flow Rate{ m3 / s }",
" , !- Maximum Total Cooling Capacity{ W }",
" , !- Heating Availability Schedule Name",
" , !- Cooling Availability Schedule Name",
" ConstantSupplyHumidityRatio, !- Dehumidification Control Type",
" , !- Cooling Sensible Heat Ratio{ dimensionless }",
" ConstantSupplyHumidityRatio, !- Humidification Control Type",
" , !- Design Specification Outdoor Air Object Name",
" , !- Outdoor Air Inlet Node Name",
" , !- Demand Controlled Ventilation Type",
" , !- Outdoor Air Economizer Type",
" , !- Heat Recovery Type",
" , !- Sensible Heat Recovery Effectiveness{ dimensionless }",
" ; !- Latent Heat Recovery Effectiveness{ dimensionless }",

"ZoneHVAC:EquipmentConnections,",
" EAST ZONE, !- Zone Name",
" ZoneEquipment, !- Zone Conditioning Equipment List Name",
" Zone Inlet Node, !- Zone Air Inlet Node or NodeList Name",
" Zone Exhaust Node, !- Zone Air Exhaust Node or NodeList Name",
" Zone Node, !- Zone Air Node Name",
" Zone Outlet Node; !- Zone Return Air Node Name",

"ZoneHVAC:EquipmentList,",
" ZoneEquipment, !- Name",
" SequentialLoad, !- Load Distribution Scheme",
" ZoneHVAC:IdealLoadsAirSystem, !- Zone Equipment 1 Object Type",
" ZONE 1 IDEAL LOADS, !- Zone Equipment 1 Name",
" 1, !- Zone Equipment 1 Cooling Sequence",
" 1; !- Zone Equipment 1 Heating or No - Load Sequence",

" Output:EnergyManagementSystem, ",
" Verbose, !- Actuator Availability Dictionary Reporting ",
" Verbose, !- Internal Variable Availability Dictionary Reporting ",
" Verbose; !- EMS Runtime Language Debug Output Level ",

"EnergyManagementSystem:Actuator,",
"Mdot,",
"ZONE 1 IDEAL LOADS,",
"Ideal Loads Air System,",
"Air Mass Flow Rate;",

"EnergyManagementSystem:Actuator,",
"Tsupply,",
"ZONE 1 IDEAL LOADS,",
"Ideal Loads Air System,",
"Air TEMPERATURE;",

"EnergyManagementSystem:Actuator,",
"HRsupply,",
"ZONE 1 IDEAL LOADS,",
"Ideal Loads Air System,",
"Air Humidity Ratio;",

"EnergyManagementSystem:Sensor,",
"ZoneAirTemp,",
"EAST ZONE,",
"Zone Mean Air Temperature;",

"EnergyManagementSystem:OutputVariable,",
"MassstromIdealLoad_EMS, ! - Name",
"Mdot, ! - EMS Variable Name",
"Averaged, ! - Type of Data in Variable",
"SystemTimeStep; ! - Update Frequency",

"EnergyManagementSystem:OutputVariable,",
"SupplyTempIdealLoad_EMS, ! - Name",
"Tsupply, ! - EMS Variable Name",
"Averaged, ! - Type of Data in Variable",
"SystemTimeStep; ! - Update Frequency",

"EnergyManagementSystem:ProgramCallingManager,",
"Test inside HVAC system iteration Loop,",
"InsideHVACSystemIterationLoop,",
"Test_InsideHVACSystemIterationLoop;",

"EnergyManagementSystem:Program,",
"Test_InsideHVACSystemIterationLoop,",
"set Mdot = 0.1,",
"set Tsupply = 18,",
"set HRsupply = 0.010;",
});

ASSERT_TRUE(process_idf(idf_objects)); // read idf objects

state->dataGlobal->DoWeathSim = true;

bool ErrorsFound = false;
GetZoneData(*state, ErrorsFound);
state->dataHeatBal->Zone(1).HTSurfaceFirst = 1;
state->dataHeatBal->Zone(1).HTSurfaceLast = 1;
state->dataScheduleMgr->Schedule.allocate(1);
AllocateHeatBalArrays(*state);
EXPECT_FALSE(ErrorsFound); // expect no errors
state->dataZoneEquip->ZoneEquipConfig.allocate(1);

state->dataZoneEquip->ZoneEquipConfig(1).IsControlled = true;
state->dataZoneEquip->ZoneEquipConfig(1).NumInletNodes = 1;
state->dataZoneEquip->ZoneEquipConfig(1).InletNode.allocate(1);
state->dataZoneEquip->ZoneEquipConfig(1).InletNode(1) = 1;

state->dataZoneEquip->ZoneEquipConfig(1).ExhaustNode.allocate(1);
state->dataZoneEquip->ZoneEquipConfig(1).NumExhaustNodes = 1;
state->dataZoneEquip->ZoneEquipConfig(1).ExhaustNode(1) = 2;
state->dataGlobal->TimeStepZone = 0.25;

EMSManager::CheckIfAnyEMS(*state); // get EMS input

state->dataEMSMgr->FinishProcessingUserInput = true;

bool FirstHVACIteration(true);

if (state->dataPurchasedAirMgr->GetPurchAirInputFlag) {
GetPurchasedAir(*state);
state->dataPurchasedAirMgr->GetPurchAirInputFlag = false;
}

state->dataPurchasedAirMgr->PurchAir(1).EMSOverrideMdotOn = true;
state->dataPurchasedAirMgr->PurchAir(1).EMSOverrideSupplyTempOn = true;
state->dataPurchasedAirMgr->PurchAir(1).EMSOverrideSupplyHumRatOn = true;

DataLoopNode::Node(2).Temp = 25.0;
DataLoopNode::Node(2).HumRat = 0.001;

InitPurchasedAir(*state, 1, FirstHVACIteration, 1, 1);
Real64 SysOutputProvided;
Real64 MoistOutputProvided;

bool anyEMSRan;
ManageEMS(*state, EMSManager::EMSCallFrom::HVACIterationLoop, anyEMSRan, ObjexxFCL::Optional_int_const());

state->dataZoneEquip->ZoneEquipConfig(1).ZoneNode = 1;
state->dataPurchasedAirMgr->PurchAir(1).OutdoorAirNodeNum = 2;
state->dataPurchasedAirMgr->PurchAir(1).ZoneRecircAirNodeNum = 1;

CalcPurchAirLoads(*state, 1, SysOutputProvided, MoistOutputProvided, 1, 1);

EXPECT_EQ(state->dataPurchasedAirMgr->PurchAir(1).EMSValueSupplyTemp, 18.0);
EXPECT_EQ(state->dataPurchasedAirMgr->PurchAir(1).EMSValueSupplyHumRat, 0.01);

EXPECT_EQ(EnergyPlus::DataLoopNode::Node(1).Enthalpy, 43431.131);
EXPECT_EQ(EnergyPlus::DataLoopNode::Node(1).HumRat, 0.01);
EXPECT_EQ(EnergyPlus::DataLoopNode::Node(1).Temp, 18.0);
}

TEST_F(ZoneIdealLoadsTest, IdealLoads_EMSOverrideTest_Revised_ZeroFlow)
{
std::string const idf_objects = delimited_string({
"Zone,",
" EAST ZONE, !- Name",
" 0, !- Direction of Relative North{ deg }",
" 0, !- X Origin{ m }",
" 0, !- Y Origin{ m }",
" 0, !- Z Origin{ m }",
" 1, !- Type",
" 1, !- Multiplier",
" autocalculate, !- Ceiling Height{ m }",
" autocalculate; !- Volume{ m3 }",

"ZoneHVAC:IdealLoadsAirSystem,",
" ZONE 1 IDEAL LOADS, !- Name",
" , !- Availability Schedule Name",
" Zone Inlet Node, !- Zone Supply Air Node Name",
" Zone Exhaust Node, !- Zone Exhaust Air Node Name",
" , !- System Inlet Air Node Name",
" 50, !- Maximum Heating Supply Air Temperature{ C }",
" 13, !- Minimum Cooling Supply Air Temperature{ C }",
" 0.015, !- Maximum Heating Supply Air Humidity Ratio{ kgWater / kgDryAir }",
" 0.009, !- Minimum Cooling Supply Air Humidity Ratio{ kgWater / kgDryAir }",
" NoLimit, !- Heating Limit",
" autosize, !- Maximum Heating Air Flow Rate{ m3 / s }",
" , !- Maximum Sensible Heating Capacity{ W }",
" NoLimit, !- Cooling Limit",
" autosize, !- Maximum Cooling Air Flow Rate{ m3 / s }",
" , !- Maximum Total Cooling Capacity{ W }",
" , !- Heating Availability Schedule Name",
" , !- Cooling Availability Schedule Name",
" ConstantSupplyHumidityRatio, !- Dehumidification Control Type",
" , !- Cooling Sensible Heat Ratio{ dimensionless }",
" ConstantSupplyHumidityRatio, !- Humidification Control Type",
" , !- Design Specification Outdoor Air Object Name",
" , !- Outdoor Air Inlet Node Name",
" , !- Demand Controlled Ventilation Type",
" , !- Outdoor Air Economizer Type",
" , !- Heat Recovery Type",
" , !- Sensible Heat Recovery Effectiveness{ dimensionless }",
" ; !- Latent Heat Recovery Effectiveness{ dimensionless }",

"ZoneHVAC:EquipmentConnections,",
" EAST ZONE, !- Zone Name",
" ZoneEquipment, !- Zone Conditioning Equipment List Name",
" Zone Inlet Node, !- Zone Air Inlet Node or NodeList Name",
" Zone Exhaust Node, !- Zone Air Exhaust Node or NodeList Name",
" Zone Node, !- Zone Air Node Name",
" Zone Outlet Node; !- Zone Return Air Node Name",

"ZoneHVAC:EquipmentList,",
" ZoneEquipment, !- Name",
" SequentialLoad, !- Load Distribution Scheme",
" ZoneHVAC:IdealLoadsAirSystem, !- Zone Equipment 1 Object Type",
" ZONE 1 IDEAL LOADS, !- Zone Equipment 1 Name",
" 1, !- Zone Equipment 1 Cooling Sequence",
" 1; !- Zone Equipment 1 Heating or No - Load Sequence",

" Output:EnergyManagementSystem, ",
" Verbose, !- Actuator Availability Dictionary Reporting ",
" Verbose, !- Internal Variable Availability Dictionary Reporting ",
" Verbose; !- EMS Runtime Language Debug Output Level ",

"EnergyManagementSystem:Actuator,",
"Mdot,",
"ZONE 1 IDEAL LOADS,",
"Ideal Loads Air System,",
"Air Mass Flow Rate;",

"EnergyManagementSystem:Actuator,",
"Tsupply,",
"ZONE 1 IDEAL LOADS,",
"Ideal Loads Air System,",
"Air TEMPERATURE;",

"EnergyManagementSystem:Actuator,",
"HRsupply,",
"ZONE 1 IDEAL LOADS,",
"Ideal Loads Air System,",
"Air Humidity Ratio;",

"EnergyManagementSystem:Sensor,",
"ZoneAirTemp,",
"EAST ZONE,",
"Zone Mean Air Temperature;",

"EnergyManagementSystem:OutputVariable,",
"MassstromIdealLoad_EMS, ! - Name",
"Mdot, ! - EMS Variable Name",
"Averaged, ! - Type of Data in Variable",
"SystemTimeStep; ! - Update Frequency",

"EnergyManagementSystem:OutputVariable,",
"SupplyTempIdealLoad_EMS, ! - Name",
"Tsupply, ! - EMS Variable Name",
"Averaged, ! - Type of Data in Variable",
"SystemTimeStep; ! - Update Frequency",

"EnergyManagementSystem:ProgramCallingManager,",
"Test inside HVAC system iteration Loop,",
"InsideHVACSystemIterationLoop,",
"Test_InsideHVACSystemIterationLoop;",

"EnergyManagementSystem:Program,",
"Test_InsideHVACSystemIterationLoop,",
"set Mdot = 0.0,",
"set Tsupply = 18,",
"set HRsupply = 0.010;",
});

ASSERT_TRUE(process_idf(idf_objects)); // read idf objects

state->dataGlobal->DoWeathSim = true;

bool ErrorsFound = false;
GetZoneData(*state, ErrorsFound);
state->dataHeatBal->Zone(1).HTSurfaceFirst = 1;
state->dataHeatBal->Zone(1).HTSurfaceLast = 1;
state->dataScheduleMgr->Schedule.allocate(1);
AllocateHeatBalArrays(*state);
EXPECT_FALSE(ErrorsFound); // expect no errors
state->dataZoneEquip->ZoneEquipConfig.allocate(1);

state->dataZoneEquip->ZoneEquipConfig(1).IsControlled = true;
state->dataZoneEquip->ZoneEquipConfig(1).NumInletNodes = 1;
state->dataZoneEquip->ZoneEquipConfig(1).InletNode.allocate(1);
state->dataZoneEquip->ZoneEquipConfig(1).InletNode(1) = 1;

state->dataZoneEquip->ZoneEquipConfig(1).ExhaustNode.allocate(1);
state->dataZoneEquip->ZoneEquipConfig(1).NumExhaustNodes = 1;
state->dataZoneEquip->ZoneEquipConfig(1).ExhaustNode(1) = 2;
state->dataGlobal->TimeStepZone = 0.25;

EMSManager::CheckIfAnyEMS(*state); // get EMS input

state->dataEMSMgr->FinishProcessingUserInput = true;

bool FirstHVACIteration(true);

if (state->dataPurchasedAirMgr->GetPurchAirInputFlag) {
GetPurchasedAir(*state);
state->dataPurchasedAirMgr->GetPurchAirInputFlag = false;
}

state->dataPurchasedAirMgr->PurchAir(1).EMSOverrideMdotOn = true;
state->dataPurchasedAirMgr->PurchAir(1).EMSOverrideSupplyTempOn = true;
state->dataPurchasedAirMgr->PurchAir(1).EMSOverrideSupplyHumRatOn = true;

DataLoopNode::Node(2).Temp = 25.0;
DataLoopNode::Node(2).HumRat = 0.001;

InitPurchasedAir(*state, 1, FirstHVACIteration, 1, 1);
Real64 SysOutputProvided;
Real64 MoistOutputProvided;

bool anyEMSRan;
ManageEMS(*state, EMSManager::EMSCallFrom::HVACIterationLoop, anyEMSRan, ObjexxFCL::Optional_int_const());

state->dataZoneEquip->ZoneEquipConfig(1).ZoneNode = 1;
state->dataPurchasedAirMgr->PurchAir(1).OutdoorAirNodeNum = 2;
state->dataPurchasedAirMgr->PurchAir(1).ZoneRecircAirNodeNum = 1;

CalcPurchAirLoads(*state, 1, SysOutputProvided, MoistOutputProvided, 1, 1);

EXPECT_EQ(SysOutputProvided, 0.0);
EXPECT_EQ(MoistOutputProvided, 0.0);

EXPECT_EQ(state->dataPurchasedAirMgr->PurchAir(1).EMSValueSupplyTemp, 18.0);
EXPECT_EQ(state->dataPurchasedAirMgr->PurchAir(1).EMSValueSupplyHumRat, 0.01);

EXPECT_EQ(EnergyPlus::DataLoopNode::Node(1).Enthalpy, 0.0);
EXPECT_EQ(EnergyPlus::DataLoopNode::Node(1).HumRat, 0.0);
EXPECT_EQ(EnergyPlus::DataLoopNode::Node(1).Temp, 0.0);
}