Skip to content

Commit

Permalink
Merge pull request #8247 from NREL/8066_CoilDXCurveOperatingMode_Sizing
Browse files Browse the repository at this point in the history
Fix #8066 - Coil:Cooling:DX:CurveFit:OperatingMode: Nominal Evaporative Condenser Pump Power is marked autosizabled, but not autosized, and other autosized missing units
  • Loading branch information
Myoldmopar authored Sep 16, 2020
2 parents 49391bb + 26074b4 commit de9073b
Show file tree
Hide file tree
Showing 3 changed files with 169 additions and 7 deletions.
20 changes: 17 additions & 3 deletions src/EnergyPlus/Coils/CoilCoolingDXCurveFitOperatingMode.cc
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,12 @@ void CoilCoolingDXCurveFitOperatingMode::instantiateFromInputSpec(EnergyPlusData
this->name = input_data.name;
this->ratedGrossTotalCap = input_data.gross_rated_total_cooling_capacity;
this->ratedEvapAirFlowRate = input_data.rated_evaporator_air_flow_rate;
this->ratedCondAirFlowRate = input_data.rated_condenser_air_flow_rate;
this->maxCyclingRate = input_data.maximum_cycling_rate;
this->evapRateRatio = input_data.ratio_of_initial_moisture_evaporation_rate_and_steady_state_latent_capacity;
this->latentTimeConst = input_data.latent_capacity_time_constant;
this->timeForCondensateRemoval = input_data.nominal_time_for_condensate_removal_to_begin;
// TODO: UNUSED apply_latent_degradation_to_speeds_greater_than_1
this->nominalEvaporativePumpPower = input_data.nominal_evap_condenser_pump_power;

// Must all be greater than zero to use the latent capacity degradation model
Expand Down Expand Up @@ -158,7 +160,7 @@ void CoilCoolingDXCurveFitOperatingMode::size(EnergyPlusData &state)
bool PrintFlag = true;

int SizingMethod = DataHVACGlobals::CoolingAirflowSizing;
std::string SizingString = "Rated Evaporator Air Flow Rate";
std::string SizingString = "Rated Evaporator Air Flow Rate [m3/s]";
Real64 TempSize = this->original_input_specs.rated_evaporator_air_flow_rate;
ReportSizingManager::RequestSizing(state, CompType, CompName, SizingMethod, SizingString, TempSize, PrintFlag, RoutineName);
this->ratedEvapAirFlowRate = TempSize;
Expand All @@ -168,7 +170,7 @@ void CoilCoolingDXCurveFitOperatingMode::size(EnergyPlusData &state)
DataEnvironment::StdBaroPress, ratedInletAirTemp, ratedInletAirHumRat, RoutineName);

SizingMethod = DataHVACGlobals::CoolingCapacitySizing;
SizingString = "Rated Gross Total Cooling Capacity";
SizingString = "Rated Gross Total Cooling Capacity [W]";
DataSizing::DataFlowUsedForSizing = this->ratedEvapAirFlowRate; // TODO: This is volume flow, right?
TempSize = this->original_input_specs.gross_rated_total_cooling_capacity;
ReportSizingManager::RequestSizing(state, CompType, CompName, SizingMethod, SizingString, TempSize, PrintFlag, RoutineName);
Expand All @@ -178,11 +180,23 @@ void CoilCoolingDXCurveFitOperatingMode::size(EnergyPlusData &state)
// Auto size condenser air flow to Total Capacity * 0.000114 m3/s/w (850 cfm/ton)
DataSizing::DataConstantUsedForSizing = this->ratedGrossTotalCap;
DataSizing::DataFractionUsedForSizing = 0.000114;
SizingString = "Rated Condenser Air Flow Rate";
SizingString = "Rated Condenser Air Flow Rate [m3/s]";
TempSize = this->original_input_specs.rated_condenser_air_flow_rate;
ReportSizingManager::RequestSizing(state, CompType, CompName, SizingMethod, SizingString, TempSize, PrintFlag, RoutineName);
this->ratedCondAirFlowRate = TempSize;


if (this->condenserType != AIRCOOLED) {
// Auto size Nominal Evaporative Condenser Pump Power to Total Capacity * 0.004266 w/w (15 W/ton)
SizingMethod = DataHVACGlobals::AutoCalculateSizing;
DataSizing::DataConstantUsedForSizing = this->ratedGrossTotalCap;
DataSizing::DataFractionUsedForSizing = 0.004266;
SizingString = "Nominal Evaporative Condenser Pump Power [W]";
TempSize = this->original_input_specs.nominal_evap_condenser_pump_power;
ReportSizingManager::RequestSizing(state, CompType, CompName, SizingMethod, SizingString, TempSize, PrintFlag, RoutineName);
this->nominalEvaporativePumpPower = TempSize;
}

for (auto &curSpeed : this->speeds) {
curSpeed.parentModeRatedGrossTotalCap = this->ratedGrossTotalCap;
curSpeed.parentModeRatedEvapAirFlowRate = this->ratedEvapAirFlowRate;
Expand Down
148 changes: 148 additions & 0 deletions tst/EnergyPlus/unit/Coils/CoilCoolingDXCurveFitOperatingMode.unit.cc
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@

// EnergyPlus Headers
#include <EnergyPlus/Coils/CoilCoolingDX.hh>
#include <EnergyPlus/DataEnvironment.hh>
#include <EnergyPlus/DataSizing.hh>
#include <EnergyPlus/OutputReportPredefined.hh>
#include <EnergyPlus/OutputReportTabular.hh>
#include "../Coils/CoilCoolingDXFixture.hh"

using namespace EnergyPlus;
Expand All @@ -62,3 +66,147 @@ TEST_F( CoilCoolingDXTest, CoilCoolingDXCurveFitModeInput )
EXPECT_EQ("MODE1", thisMode.name);
EXPECT_EQ("MODE1SPEED1", thisMode.speeds[0].name);
}

TEST_F(CoilCoolingDXTest, CoilCoolingDXCurveFitOperatingMode_Sizing) {

EnergyPlus::sqlite->sqliteBegin();
EnergyPlus::sqlite->createSQLiteSimulationsRecord(1, "EnergyPlus Version", "Current Time");

std::string idf_objects = delimited_string({

"Coil:Cooling:DX,",
" Coil Cooling DX 1, !- Name",
" Air Loop HVAC Unitary System 5 Fan - Cooling Coil Node, !- Evaporator Inlet Node Name",
" Air Loop HVAC Unitary System 5 Cooling Coil - Heating Coil Node, !- Evaporator Outlet Node Name",
" Always On Discrete, !- Availability Schedule Name",
" , !- Condenser Zone Name",
" Coil Cooling DX 1 Condenser Inlet Node, !- Condenser Inlet Node Name",
" Coil Cooling DX 1 Condenser Outlet Node, !- Condenser Outlet Node Name",
" Coil Cooling DX Curve Fit Performance 1; !- Performance Object Name",
"",
"Coil:Cooling:DX:CurveFit:Performance,",
" Coil Cooling DX Curve Fit Performance 1, !- Name",
" 0, !- Crankcase Heater Capacity {W}",
" -25, !- Minimum Outdoor Dry-Bulb Temperature for Compressor Operation {C}",
" 10, !- Maximum Outdoor Dry-Bulb Temperature for Crankcase Heater Operation {C}",
" 773.3, !- Unit Internal Static Air Pressure {Pa}",
" Discrete, !- Capacity Control Method",
" 0, !- Evaporative Condenser Basin Heater Capacity {W/K}",
" 2, !- Evaporative Condenser Basin Heater Setpoint Temperature {C}",
" Always On Discrete, !- Evaporative Condenser Basin Heater Operating Schedule Name",
" Electricity, !- Compressor Fuel Type",
" Coil Cooling DX Curve Fit Operating Mode 1; !- Base Operating Mode",

"Coil:Cooling:DX:CurveFit:OperatingMode,",
" Coil Cooling DX Curve Fit Operating Mode 1, !- Name",
" Autosize, !- Rated Gross Total Cooling Capacity {W}",
" Autosize, !- Rated Evaporator Air Flow Rate {m3/s}",
" Autosize, !- Rated Condenser Air Flow Rate {m3/s}",
" 0, !- Maximum Cycling Rate {cycles/hr}",
" 0, !- Ratio of Initial Moisture Evaporation Rate and Steady State Latent Capacity {dimensionless}",
" 0, !- Latent Capacity Time Constant {s}",
" 0, !- Nominal Time for Condensate Removal to Begin {s}",
" No, !- Apply Latent Degradation to Speeds Greater than 1",
" EvaporativelyCooled, !- Condenser Type",
" Autosize, !- Nominal Evaporative Condenser Pump Power {W}",
" 1, !- Nominal Speed Number",
" Coil Cooling DX Curve Fit Speed 1; !- Speed Name 1",
});
idf_objects += this->getSpeedObjectString("Coil Cooling DX Curve Fit Speed 1");
EXPECT_TRUE(process_idf( idf_objects, false ));
CoilCoolingDXCurveFitOperatingMode thisMode(state, "Coil Cooling DX Curve Fit Operating Mode 1");
EXPECT_EQ(CoilCoolingDXCurveFitOperatingMode::CondenserType::EVAPCOOLED, thisMode.condenserType);
EXPECT_EQ(DataSizing::AutoSize, thisMode.ratedEvapAirFlowRate);
EXPECT_EQ(DataSizing::AutoSize, thisMode.ratedGrossTotalCap);
EXPECT_EQ(DataSizing::AutoSize, thisMode.ratedCondAirFlowRate);
EXPECT_EQ(DataSizing::AutoSize, thisMode.nominalEvaporativePumpPower);


DataSizing::FinalZoneSizing.allocate(1);
DataSizing::ZoneEqSizing.allocate(1);
DataSizing::SysSizPeakDDNum.allocate(1);

DataSizing::CurSysNum = 0;
DataSizing::CurOASysNum = 0;
DataSizing::CurZoneEqNum = 1;
DataEnvironment::StdRhoAir = 1.0; // Prevent divide by zero in ReportSizingManager
DataEnvironment::StdBaroPress = 101325.0;

DataSizing::ZoneSizingRunDone = true;
DataSizing::ZoneEqSizing(DataSizing::CurZoneEqNum).DesignSizeFromParent = false;
DataSizing::ZoneEqSizing(DataSizing::CurZoneEqNum).SizingMethod.allocate(25);
DataSizing::ZoneEqSizing(DataSizing::CurZoneEqNum).SizingMethod(DataHVACGlobals::SystemAirflowSizing) = DataSizing::SupplyAirFlowRate;

Real64 ratedEvapAirFlowRate = 1.005;

DataSizing::FinalZoneSizing(DataSizing::CurZoneEqNum).DesCoolVolFlow = ratedEvapAirFlowRate;

DataSizing::FinalZoneSizing(DataSizing::CurZoneEqNum).DesCoolCoilInTemp = 30.0;
DataSizing::FinalZoneSizing(DataSizing::CurZoneEqNum).DesCoolCoilInHumRat = 0.001;
DataSizing::FinalZoneSizing(DataSizing::CurZoneEqNum).CoolDesTemp = 15.0;
DataSizing::FinalZoneSizing(DataSizing::CurZoneEqNum).CoolDesHumRat = 0.0006;

thisMode.size(state);

// We need to commit, so that the ComponentSizes is actually written
EnergyPlus::sqlite->sqliteCommit();

EXPECT_EQ(ratedEvapAirFlowRate, thisMode.ratedEvapAirFlowRate);
Real64 ratedGrossTotalCap = 18827.616766698276;
EXPECT_EQ(ratedGrossTotalCap, thisMode.ratedGrossTotalCap);
// Total Capacity * 0.000114 m3/s/w (850 cfm/ton)
Real64 ratedCondAirFlowRate = 0.000114 * ratedGrossTotalCap;
EXPECT_EQ(ratedCondAirFlowRate, thisMode.ratedCondAirFlowRate);
// Total Capacity * 0.004266 w/w (15 W/ton)
Real64 nominalEvaporativePumpPower = 0.004266 * ratedGrossTotalCap;
EXPECT_EQ(nominalEvaporativePumpPower, thisMode.nominalEvaporativePumpPower);

// Now check output tables to ensure that we also get the right units etc
const std::string compType = "Coil:Cooling:DX:CurveFit:OperatingMode";
const std::string compName = thisMode.name;
EXPECT_EQ(compName, "COIL COOLING DX CURVE FIT OPERATING MODE 1");

struct TestQuery
{
TestQuery(std::string t_description, std::string t_units, Real64 t_value)
: description(t_description), units(t_units), expectedValue(t_value),
displayString("Description='" + description + "'; Units='" + units + "'"){};

const std::string description;
const std::string units;
const Real64 expectedValue;
const std::string displayString;
};

std::vector<TestQuery> testQueries({
TestQuery("Design Size Rated Evaporator Air Flow Rate", "m3/s", ratedEvapAirFlowRate),
TestQuery("Design Size Rated Gross Total Cooling Capacity", "W", ratedGrossTotalCap),
TestQuery("Design Size Rated Condenser Air Flow Rate", "m3/s", ratedCondAirFlowRate),
TestQuery("Design Size Nominal Evaporative Condenser Pump Power", "W", nominalEvaporativePumpPower),
});

for (auto &testQuery : testQueries) {

std::string query("SELECT Value From ComponentSizes"
" WHERE CompType = '" +
compType +
"'"
" AND CompName = '" +
compName +
"'"
" AND Description = '" +
testQuery.description + "'" + " AND Units = '" + testQuery.units + "'");

// execAndReturnFirstDouble returns -10000.0 if not found
Real64 return_val = SQLiteFixture::execAndReturnFirstDouble(query);

if (return_val < 0) {
EXPECT_TRUE(false) << "Query returned nothing for " << testQuery.displayString;
} else {
EXPECT_NEAR(testQuery.expectedValue, return_val, 0.01) << "Failed for " << testQuery.displayString;
}
}

EnergyPlus::sqlite->sqliteCommit();

}
8 changes: 4 additions & 4 deletions tst/EnergyPlus/unit/Coils/CoilCoolingDXFixture.hh
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,14 @@
#include <gtest/gtest.h>

// EnergyPlus Headers
#include "../Fixtures/EnergyPlusFixture.hh"
#include "../Fixtures/SQLiteFixture.hh"
#include <EnergyPlus/Data/EnergyPlusData.hh>

class CoilCoolingDXTest : public EnergyPlus::EnergyPlusFixture {
class CoilCoolingDXTest : public EnergyPlus::SQLiteFixture {
public:
protected:
void SetUp() override {
EnergyPlus::EnergyPlusFixture::SetUp(); // Sets up the base fixture first.
EnergyPlus::SQLiteFixture::SetUp(); // Sets up the base fixture first.
}

std::string getSpeedObjectString(const std::string &speedObjectName) {
Expand Down Expand Up @@ -222,7 +222,7 @@ protected:
}

void TearDown() override {
EnergyPlus::EnergyPlusFixture::TearDown(); // Remember to tear down the base
EnergyPlus::SQLiteFixture::TearDown(); // Remember to tear down the base
// fixture after cleaning up
// derived fixture!
}
Expand Down

5 comments on commit de9073b

@nrel-bot-3
Copy link

Choose a reason for hiding this comment

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

develop (Myoldmopar) - x86_64-MacOS-10.15-clang-11.0.0: OK (2216 of 2217 tests passed, 0 test warnings)

Failures:\n

EnergyPlusFixture Test Summary

  • Passed: 1068
  • Failed: 1

Build Badge Test Badge

@nrel-bot
Copy link

Choose a reason for hiding this comment

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

develop (Myoldmopar) - Win64-Windows-10-VisualStudio-16: OK (2190 of 2190 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot-2b
Copy link

Choose a reason for hiding this comment

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

develop (Myoldmopar) - x86_64-Linux-Ubuntu-18.04-gcc-7.5: OK (2237 of 2237 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

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

develop (Myoldmopar) - x86_64-Linux-Ubuntu-18.04-gcc-7.5-UnitTestsCoverage-Debug: OK (1499 of 1499 tests passed, 0 test warnings)

Build Badge Test Badge Coverage Badge

@nrel-bot-2b
Copy link

Choose a reason for hiding this comment

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

develop (Myoldmopar) - x86_64-Linux-Ubuntu-18.04-gcc-7.5-IntegrationCoverage-Debug: OK (721 of 721 tests passed, 0 test warnings)

Build Badge Test Badge Coverage Badge

Please # to comment.