Skip to content
Open
Show file tree
Hide file tree
Changes from 2 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
54 changes: 29 additions & 25 deletions src/EnergyPlus/HybridEvapCoolingModel.cc
Original file line number Diff line number Diff line change
Expand Up @@ -143,12 +143,14 @@ namespace HybridEvapCoolingModel {
Maximum_Outdoor_Air_Relative_Humidity = max;
return true;
}
bool CMode::InitializeReturnAirTemperatureConstraints(Real64 min, Real64 max)
bool CMode::InitializeReturnAirTemperatureConstraints(Real64 min, Real64 max, bool minBlank, bool maxBlank)
{
// will not be considered when the return air temperature is below the value in this field.
// If this field is blank, there will be no lower constraint on return air temperature
Minimum_Return_Air_Temperature = min;
Maximum_Return_Air_Temperature = max;
Minimum_Return_Air_Temperature_Blank = minBlank;
Maximum_Return_Air_Temperature_Blank = maxBlank;
return true;
}
bool CMode::InitializeReturnAirHumidityRatioConstraints(Real64 min, Real64 max)
Expand Down Expand Up @@ -398,11 +400,21 @@ namespace HybridEvapCoolingModel {
Array1D<Real64> Numbers,
Array1D_string cNumericFields,
Array1D<bool> lAlphaBlanks,
Array1D<bool> lNumericBlanks,
std::string cCurrentModuleObject)
{
CMode newMode;
bool error = newMode.ParseMode(
state, ModeCounter, &OperatingModes, ScalingFactor, Alphas, cAlphaFields, Numbers, cNumericFields, lAlphaBlanks, cCurrentModuleObject);
bool error = newMode.ParseMode(state,
ModeCounter,
&OperatingModes,
ScalingFactor,
Alphas,
cAlphaFields,
Numbers,
cNumericFields,
lAlphaBlanks,
lNumericBlanks,
cCurrentModuleObject);
ModeCounter++;
return error;
}
Expand All @@ -416,6 +428,7 @@ namespace HybridEvapCoolingModel {
Array1D<Real64> Numbers,
Array1D_string cNumericFields,
Array1D<bool> lAlphaBlanks,
Array1D<bool> lNumericBlanks,
std::string cCurrentModuleObject)
{
// SUBROUTINE INFORMATION:
Expand Down Expand Up @@ -620,7 +633,8 @@ namespace HybridEvapCoolingModel {
inter_Number = inter_Number + 2;
// N14, \field Mode1 Minimum Return Air Temperature
// N15, \field Mode1 Maximum Return Air Temperature
ok = InitializeReturnAirTemperatureConstraints(Numbers(inter_Number), Numbers(inter_Number + 1));
ok = InitializeReturnAirTemperatureConstraints(
Numbers(inter_Number), Numbers(inter_Number + 1), lNumericBlanks(inter_Number), lNumericBlanks(inter_Number + 1));
if (!ok) {
ShowSevereError(state, EnergyPlus::format("Invalid {}Or Invalid{}", cNumericFields(inter_Number), cNumericFields(inter_Number + 1)));
ShowContinueError(state, EnergyPlus::format("Entered in {}", cCurrentModuleObject));
Expand Down Expand Up @@ -674,7 +688,7 @@ namespace HybridEvapCoolingModel {
return ErrorsFound;
}

bool CMode::MeetsOAEnvConstraints(Real64 Tosa, Real64 Wosa, Real64 RHosa)
bool CMode::MeetsConstraints(Real64 Tosa, Real64 Wosa, Real64 RHosa, Real64 Tra, Real64 Wra, Real64 RHra)
{
// SUBROUTINE INFORMATION:
// AUTHOR Spencer Maxwell Dutton
Expand All @@ -683,7 +697,7 @@ namespace HybridEvapCoolingModel {
// RE-ENGINEERED na

// PURPOSE OF THIS SUBROUTINE:
// To check to see if this mode of operation is able to operate given the specified outdoor environmental conditions.
// To check to see if this mode of operation is able to operate given the specified environmental conditions.

// METHODOLOGY EMPLOYED:
// Constraining certain modes to only operate over certain environmental conditions gives the user greater control in which
Expand All @@ -692,26 +706,16 @@ namespace HybridEvapCoolingModel {
// REFERENCES:
// na

// Using/Aliasing
bool OATempConstraintmet = false;
bool OAHRConstraintmet = false;
bool OARHConstraintmet = false;

if (Tosa >= Minimum_Outdoor_Air_Temperature && Tosa <= Maximum_Outdoor_Air_Temperature) {
OATempConstraintmet = true;
}
bool OATempConstraintMet = (Tosa >= Minimum_Outdoor_Air_Temperature && Tosa <= Maximum_Outdoor_Air_Temperature);
Comment thread
rraustad marked this conversation as resolved.
Outdated
bool OAHRConstraintMet = (Wosa >= Minimum_Outdoor_Air_Humidity_Ratio && Wosa <= Maximum_Outdoor_Air_Humidity_Ratio);
bool OARHConstraintMet = (RHosa >= Minimum_Outdoor_Air_Relative_Humidity && RHosa <= Maximum_Outdoor_Air_Relative_Humidity);

if (Wosa >= Minimum_Outdoor_Air_Humidity_Ratio && Wosa <= Maximum_Outdoor_Air_Humidity_Ratio) {
OAHRConstraintmet = true;
}
bool RATempConstraintMet = (Minimum_Return_Air_Temperature_Blank || Tra >= Minimum_Return_Air_Temperature) &&
(Minimum_Return_Air_Temperature_Blank || Tra <= Maximum_Return_Air_Temperature);
Comment thread
rraustad marked this conversation as resolved.
Outdated
bool RAHRConstraintMet = (Wra >= Minimum_Return_Air_Humidity_Ratio && Wra <= Maximum_Return_Air_Humidity_Ratio);
bool RARHConstraintMet = (RHra >= Minimum_Return_Air_Relative_Humidity && RHra <= Maximum_Return_Air_Relative_Humidity);

if (RHosa >= Minimum_Outdoor_Air_Relative_Humidity && RHosa <= Maximum_Outdoor_Air_Relative_Humidity) {
OARHConstraintmet = true;
}
if (OATempConstraintmet && OAHRConstraintmet && OARHConstraintmet) {
return true;
}
return false;
return OATempConstraintMet && OAHRConstraintMet && OARHConstraintMet && RATempConstraintMet && RAHRConstraintMet && RARHConstraintMet;
}

bool Model::MeetsSupplyAirTOC([[maybe_unused]] EnergyPlusData &state, Real64 Tsupplyair)
Expand Down Expand Up @@ -1294,7 +1298,7 @@ namespace HybridEvapCoolingModel {

// Check that in this mode the //Outdoor Air Relative Humidity(0 - 100 % ) //Outdoor Air Humidity Ratio(g / g)//Outdoor Air
// Temperature(degC)
if (Mode.MeetsOAEnvConstraints(StepIns.Tosa, Wosa, 100 * StepIns.RHosa)) {
if (Mode.MeetsConstraints(StepIns.Tosa, Wosa, 100 * StepIns.RHosa, StepIns.Tra, Wra, 100 * StepIns.RHra)) {
EnvironmentConditionsMet = EnvironmentConditionsMetOnce = true;
} else {
EnvironmentConditionsMet = false;
Expand Down
8 changes: 6 additions & 2 deletions src/EnergyPlus/HybridEvapCoolingModel.hh
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,8 @@ namespace HybridEvapCoolingModel {
Real64 Maximum_Outdoor_Air_Relative_Humidity;
Real64 Minimum_Return_Air_Temperature;
Real64 Maximum_Return_Air_Temperature;
bool Minimum_Return_Air_Temperature_Blank;
bool Maximum_Return_Air_Temperature_Blank;
Real64 Minimum_Return_Air_Humidity_Ratio;
Real64 Maximum_Return_Air_Humidity_Ratio;
Real64 Minimum_Return_Air_Relative_Humidity;
Expand All @@ -148,6 +150,7 @@ namespace HybridEvapCoolingModel {
Array1D<Real64> Numbers,
Array1D_string cNumericFields,
Array1D<bool> lAlphaBlanks,
Array1D<bool> lNumericBlanks,
std::string cCurrentModuleObject);
void InitializeCurve(int curveType, int CurveID);
Real64 CalculateCurveVal(EnergyPlusData &state, Real64 Tosa, Real64 Wosa, Real64 Tra, Real64 Wra, Real64 Msa, Real64 OSAF, int curveType);
Expand All @@ -156,11 +159,11 @@ namespace HybridEvapCoolingModel {
bool InitializeOutdoorAirTemperatureConstraints(Real64 min, Real64 max);
bool InitializeOutdoorAirHumidityRatioConstraints(Real64 min, Real64 max);
bool InitializeOutdoorAirRelativeHumidityConstraints(Real64 min, Real64 max);
bool InitializeReturnAirTemperatureConstraints(Real64 min, Real64 max);
bool InitializeReturnAirTemperatureConstraints(Real64 min, Real64 max, bool minBlank, bool maxBlank);
bool InitializeReturnAirHumidityRatioConstraints(Real64 min, Real64 max);
bool InitializeReturnAirRelativeHumidityConstraints(Real64 min, Real64 max);
void GenerateSolutionSpace();
bool MeetsOAEnvConstraints(Real64 Tosa, Real64 Wosa, Real64 RHos);
bool MeetsConstraints(Real64 Tosa, Real64 Wosa, Real64 RHosa, Real64 Tra, Real64 Wra, Real64 RHra);

private:
};
Expand Down Expand Up @@ -385,6 +388,7 @@ namespace HybridEvapCoolingModel {
Array1D<Real64> Numbers,
Array1D_string cNumericFields,
Array1D<bool> lAlphaBlanks,
Array1D<bool> lNumericBlanks,
std::string cCurrentModuleObject);
void doStep(EnergyPlusData &state,
Real64 RequestedLoad,
Expand Down
3 changes: 2 additions & 1 deletion src/EnergyPlus/HybridUnitaryAirConditioners.cc
Original file line number Diff line number Diff line change
Expand Up @@ -675,7 +675,8 @@ void GetInputZoneHybridUnitaryAirConditioners(EnergyPlusData &state, bool &Error
}

for (int modeIter = 0; modeIter <= Numberofoperatingmodes - 1; ++modeIter) {
ErrorsFound = hybridUnitaryAC.ParseMode(state, Alphas, cAlphaFields, Numbers, cNumericFields, lAlphaBlanks, cCurrentModuleObject);
ErrorsFound = hybridUnitaryAC.ParseMode(
state, Alphas, cAlphaFields, Numbers, cNumericFields, lAlphaBlanks, lNumericBlanks, cCurrentModuleObject);
if (ErrorsFound) {
ShowFatalError(state, EnergyPlus::format("{}: Errors found parsing modes", routineName));
ShowContinueError(state, "... Preceding condition causes termination.");
Expand Down
30 changes: 24 additions & 6 deletions tst/EnergyPlus/unit/UnitaryHybridAirConditioner.unit.cc
Original file line number Diff line number Diff line change
Expand Up @@ -574,8 +574,8 @@ TEST_F(EnergyPlusFixture, Test_UnitaryHybridAirConditioner_ValidateFieldsParsing
"0.03, !- Mode1 Maximum Outside Air Humidity Ratio {kgWater/kgDryAir}",
"0, !- Mode1 Minimum Outside Air Relative Humidity {percent}",
"100, !- Mode1 Maximum Outside Air Relative Humidity {percent}",
"-20, !- Mode1 Minimum Return Air Temperature {C}",
"100, !- Mode1 Maximum Return Air Temperature {C}",
", !- Mode1 Minimum Return Air Temperature {C}",
", !- Mode1 Maximum Return Air Temperature {C}",
"0, !- Mode1 Minimum Return Air Humidity Ratio {kgWater/kgDryAir}",
"0.03, !- Mode1 Maximum Return Air Humidity Ratio {kgWater/kgDryAir}",
"0, !- Mode1 Minimum Return Air Relative Humidity {percent}",
Expand All @@ -591,12 +591,30 @@ TEST_F(EnergyPlusFixture, Test_UnitaryHybridAirConditioner_ValidateFieldsParsing
bool ErrorsFound = false;
GetInputZoneHybridUnitaryAirConditioners(*state, ErrorsFound);
unsigned long expectedOperatingModesSize = 2;
auto &hybridUnit1 = state->dataHybridUnitaryAC->ZoneHybridUnitaryAirConditioner(1);
auto &hybridUnit2 = state->dataHybridUnitaryAC->ZoneHybridUnitaryAirConditioner(2);
// check the number of operating modes
EXPECT_EQ(state->dataHybridUnitaryAC->ZoneHybridUnitaryAirConditioner(1).OperatingModes.size(), expectedOperatingModesSize);
EXPECT_EQ(state->dataHybridUnitaryAC->ZoneHybridUnitaryAirConditioner(2).OperatingModes.size(), expectedOperatingModesSize);
EXPECT_EQ(hybridUnit1.OperatingModes.size(), expectedOperatingModesSize);
EXPECT_EQ(hybridUnit2.OperatingModes.size(), expectedOperatingModesSize);
// check if names for HybridUnitaryAC are converted to upper case
EXPECT_EQ("HYBRID UNIT 1", state->dataHybridUnitaryAC->ZoneHybridUnitaryAirConditioner(1).Name);
EXPECT_EQ("HYBRID UNIT 2", state->dataHybridUnitaryAC->ZoneHybridUnitaryAirConditioner(2).Name);
EXPECT_EQ(hybridUnit1.Name, "HYBRID UNIT 1");
EXPECT_EQ(hybridUnit2.Name, "HYBRID UNIT 2");
// check return air temperature constraints for hybrid unit 1, mode 1
auto &mode1 = hybridUnit1.OperatingModes[1];
EXPECT_EQ(mode1.Minimum_Return_Air_Temperature_Blank, false);
EXPECT_EQ(mode1.Minimum_Return_Air_Temperature, -20);
EXPECT_EQ(mode1.Maximum_Return_Air_Temperature_Blank, false);
EXPECT_EQ(mode1.Maximum_Return_Air_Temperature, 100);
EXPECT_EQ(mode1.MeetsConstraints(120, 0.01, 30, 120, 0.01, 30), false);
EXPECT_EQ(mode1.MeetsConstraints(20, 0.01, 30, 20, 0.01, 30), true);
// check return air temperature constraints for hybrid unit 2, mode 1
mode1 = hybridUnit2.OperatingModes[1];
EXPECT_EQ(mode1.Minimum_Return_Air_Temperature_Blank, true);
EXPECT_EQ(mode1.Minimum_Return_Air_Temperature, 0);
EXPECT_EQ(mode1.Maximum_Return_Air_Temperature_Blank, true);
EXPECT_EQ(mode1.Maximum_Return_Air_Temperature, 0);
EXPECT_EQ(mode1.MeetsConstraints(120, 0.01, 30, 120, 0.01, 30), false);
EXPECT_EQ(mode1.MeetsConstraints(20, 0.01, 30, 120, 0.01, 30), true);
}

TEST_F(EnergyPlusFixture, Test_UnitaryHybridAirConditioner_ValidateMinimumIdfInput)
Expand Down
Loading