diff --git a/src/EnergyPlus/HeatBalFiniteDiffManager.cc b/src/EnergyPlus/HeatBalFiniteDiffManager.cc index e1b29ca3df5..be70cd8fc41 100644 --- a/src/EnergyPlus/HeatBalFiniteDiffManager.cc +++ b/src/EnergyPlus/HeatBalFiniteDiffManager.cc @@ -630,8 +630,11 @@ namespace HeatBalFiniteDiffManager { } for (ConstrNum = 1; ConstrNum <= state.dataHeatBal->TotConstructs; ++ConstrNum) { - // Need to skip window constructions and eventually window materials + // Need to skip window constructions, IRT, air wall and construction not in use. if (state.dataConstruction->Construct(ConstrNum).TypeIsWindow) continue; + if (state.dataConstruction->Construct(ConstrNum).TypeIsIRT) continue; + if (state.dataConstruction->Construct(ConstrNum).TypeIsAirBoundary) continue; + if (!state.dataConstruction->Construct(ConstrNum).IsUsed) continue; ConstructFD(ConstrNum).Name.allocate(state.dataConstruction->Construct(ConstrNum).TotLayers); ConstructFD(ConstrNum).Thickness.allocate(state.dataConstruction->Construct(ConstrNum).TotLayers); @@ -1274,6 +1277,8 @@ namespace HeatBalFiniteDiffManager { if (state.dataConstruction->Construct(ThisNum).TypeIsWindow) continue; if (state.dataConstruction->Construct(ThisNum).TypeIsIRT) continue; + if (state.dataConstruction->Construct(ThisNum).TypeIsAirBoundary) continue; + if (!state.dataConstruction->Construct(ThisNum).IsUsed) continue; static constexpr auto Format_700(" Construction CondFD,{},{},{},{},{:.6R}\n"); print(state.files.eio, diff --git a/tst/EnergyPlus/unit/HeatBalFiniteDiffManager.unit.cc b/tst/EnergyPlus/unit/HeatBalFiniteDiffManager.unit.cc index 6b9aaeeea50..ccc0406dd67 100644 --- a/tst/EnergyPlus/unit/HeatBalFiniteDiffManager.unit.cc +++ b/tst/EnergyPlus/unit/HeatBalFiniteDiffManager.unit.cc @@ -51,15 +51,19 @@ #include // EnergyPlus Headers +#include #include #include #include +#include #include #include #include "Fixtures/EnergyPlusFixture.hh" using namespace EnergyPlus::HeatBalFiniteDiffManager; +using namespace EnergyPlus::HeatBalanceManager; + namespace EnergyPlus { @@ -188,7 +192,7 @@ TEST_F(EnergyPlusFixture, HeatBalFiniteDiffManager_CalcNodeHeatFluxTest) } TEST_F(EnergyPlusFixture, HeatBalFiniteDiffManager_adjustPropertiesForPhaseChange) -{ +{ // create a single PCM object in the input and process it std::string const idf_objects = delimited_string( {" MaterialProperty:PhaseChangeHysteresis,", " PCMNAME, !- Name", @@ -233,4 +237,106 @@ TEST_F(EnergyPlusFixture, HeatBalFiniteDiffManager_adjustPropertiesForPhaseChang SurfaceFD.deallocate(); } + + +TEST_F(EnergyPlusFixture, HeatBalFiniteDiffManager_skipNotUsedConstructionAndAirLayer) +{ + bool ErrorsFound(false); + int thisConstructNum; + int thisTotalLayers; + // create three construction objects with one object not in use and another object assigned to surfaces, and one object as air wall. + std::string const idf_objects = delimited_string( + { + "Material,", + " MAT - CC05 4 HW CONCRETE, !- Name", + " Rough, !- Roughness", + " 0.1016, !- Thickness{ m }", + " 1.311, !- Conductivity{ W / m - K }", + " 2240, !- Density{ kg / m3 }", + " 836.800000000001, !- Specific Heat{ J / kg - K }", + " 0.9, !- Thermal Absorptance", + " 0.85, !- Solar Absorptance", + " 0.85; !- Visible Absorptance", + "Material:AirGap,", + " F05 Ceiling air space resistance, !- Name", + " 0.18; !- Thermal Resistance{ m2 - K / W }", + "Material:NoMass,", + " CP02 CARPET PAD, !- Name", + " Smooth, !- Roughness", + " 0.1, !- Thermal Resistance{ m2 - K / W }", + " 0.9, !- Thermal Absorptance", + " 0.8, !- Solar Absorptance", + " 0.8; !- Visible Absorptance", + + "Material,", + " F16 Acoustic tile, !- Name", + " MediumSmooth, !- Roughness", + " 0.0191, !- Thickness{ m }", + " 0.06, !- Conductivity{ W / m - K }", + " 368, !- Density{ kg / m3 }", + " 590.000000000002, !- Specific Heat{ J / kg - K }", + " 0.9, !- Thermal Absorptance", + " 0.3, !- Solar Absorptance", + " 0.3; !- Visible Absorptance", + + "Material,", + " M11 100mm lightweight concrete, !- Name", + " MediumRough, !- Roughness", + " 0.1016, !- Thickness{ m }", + " 0.53, !- Conductivity{ W / m - K }", + " 1280, !- Density{ kg / m3 }", + " 840.000000000002, !- Specific Heat{ J / kg - K }", + " 0.9, !- Thermal Absorptance", + " 0.5, !- Solar Absorptance", + " 0.5; !- Visible Absorptance", + + "Construction,", + " ExtSlabCarpet 4in ClimateZone 1 - 8, !- Name", + " MAT - CC05 4 HW CONCRETE, !- Outside Layer", + " CP02 CARPET PAD; !- Layer 2", + "Construction,", + " Interior Floor, !- Name", + " F16 Acoustic tile, !- Outside Layer", + " F05 Ceiling air space resistance, !- Layer 2", + " M11 100mm lightweight concrete; !- Layer 3", + "Construction:AirBoundary,", + " Air Wall_ConstructionAirBoundary, !- Name", + " None, !- Air Exchange Method", + " 0; !- Simple Mixing Air Changes per Hour {1 / hr}", + "Output:Constructions,", + "Constructions;", + "Output:Constructions,", + "Materials;", }); + + ASSERT_TRUE(process_idf(idf_objects)); + + ErrorsFound = false; + GetMaterialData(*state, ErrorsFound); // read material data + EXPECT_FALSE(ErrorsFound); // expect no errors + + ErrorsFound = false; + GetConstructData(*state, ErrorsFound); // read construction data + EXPECT_FALSE(ErrorsFound); // expect no errors + + // allocate properties for construction objects when it is used or not for building surfaces in the model + + state->dataConstruction->Construct(1).IsUsed=false; + state->dataConstruction->Construct(2).IsUsed = true; + state->dataConstruction->Construct(3).IsUsed = true; + + //call the function for initialization of finite difference calculation + InitialInitHeatBalFiniteDiff(*state); + + // check the values are correct + EXPECT_EQ(0, ConstructFD(1).Name.size()); + EXPECT_EQ(3, ConstructFD(2).Name.size()); + EXPECT_EQ(0, ConstructFD(3).Name.size()); + EXPECT_EQ("F16 ACOUSTIC TILE", ConstructFD(2).Name(1)); + EXPECT_EQ("F05 CEILING AIR SPACE RESISTANCE", ConstructFD(2).Name(2)); + EXPECT_EQ("M11 100MM LIGHTWEIGHT CONCRETE", ConstructFD(2).Name(3)); + + // deallocate + ConstructFD.deallocate(); +} + } // namespace EnergyPlus