-
Notifications
You must be signed in to change notification settings - Fork 466
Adjust SurfaceProperty:XXX IDD and fix/improve sunlit fraction schedule checks #11445
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
base: develop
Are you sure you want to change the base?
Changes from 7 commits
1840310
f889c1a
0d6bb5f
6a77e91
99ae2e9
1b6a01b
e3da607
1886efe
c8e2d9d
5527d24
1d01bae
937209b
e3475b7
929b663
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1809,11 +1809,11 @@ namespace HeatBalanceManager { | |
| // METHODOLOGY EMPLOYED: | ||
| // The GetObjectItem routines are employed to retrieve the data. | ||
|
|
||
| SolarShading::GetShadowingInput(state); | ||
|
|
||
| GetZoneData(state, ErrorsFound); // Read Zone data from input file | ||
|
|
||
| SurfaceGeometry::SetupZoneGeometry(state, ErrorsFound); | ||
|
|
||
| SolarShading::GetShadowingInput(state); | ||
|
Comment on lines
1817
to
+1819
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This PR inadvertently moved
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @RKStrand Are you OK with this change? I believe the only regression implication is to change the order of a few lines in the EIO file.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @joseph-robertson Um, yeah, as long as it doesn't trip any weird things in the unit tests, I'm guessing it will be okay. I seem to vaguely remember some recent work here and there were some issues with order dependence on some of the calls in this area of the code. I think I couldn't move something up as high as I thought because it caused other crashes because stuff wasn't read in yet. Anyway, if you move it an there are no unit test or test suite issues that pop up, then it's probably fine. |
||
| } | ||
|
|
||
| void GetZoneData(EnergyPlusData &state, bool &ErrorsFound) // If errors found in input | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -490,12 +490,15 @@ void GetShadowingInput(EnergyPlusData &state) | |
| format("Value entered=\"{}\" while no Schedule:File:Shading object is defined, InternalCalculation will be used.", | ||
| state.dataIPShortCut->cAlphaArgs(aNum))); | ||
| } | ||
| checkNotScheduledSurfacePresent(state); | ||
| } else if (Util::SameString(state.dataIPShortCut->cAlphaArgs(aNum), "PolygonClipping")) { | ||
| state.dataSysVars->shadingMethod = ShadingMethod::PolygonClipping; | ||
| state.dataIPShortCut->cAlphaArgs(aNum) = "PolygonClipping"; | ||
| checkNotScheduledSurfacePresent(state); | ||
| } else if (Util::SameString(state.dataIPShortCut->cAlphaArgs(aNum), "PixelCounting")) { | ||
| state.dataSysVars->shadingMethod = ShadingMethod::PixelCounting; | ||
| state.dataIPShortCut->cAlphaArgs(aNum) = "PixelCounting"; | ||
| checkNotScheduledSurfacePresent(state); | ||
| if (NumNumbers >= 3) { | ||
| pixelRes = (unsigned)state.dataIPShortCut->rNumericArgs(3); | ||
| } | ||
|
|
@@ -526,6 +529,7 @@ void GetShadowingInput(EnergyPlusData &state) | |
| } else { | ||
| state.dataIPShortCut->cAlphaArgs(aNum) = "PolygonClipping"; | ||
| state.dataSysVars->shadingMethod = ShadingMethod::PolygonClipping; | ||
| checkNotScheduledSurfacePresent(state); | ||
| } | ||
|
|
||
| aNum++; | ||
|
|
@@ -818,7 +822,7 @@ void processShadowingInput(EnergyPlusData &state) | |
|
|
||
| void checkScheduledSurfacePresent(EnergyPlusData &state) | ||
| { | ||
| // User has chosen "Scheduled" for sunlit fraction so check to see which surfaces don't have a schedule | ||
| // User has chosen "Scheduled" for sunlit fraction so check to see which surfaces don't have a schedule. | ||
| int numNotDef = 0; | ||
| int constexpr maxErrMessages = 50; | ||
| auto &surfData = state.dataSurface; | ||
|
|
@@ -831,16 +835,44 @@ void checkScheduledSurfacePresent(EnergyPlusData &state) | |
| if (!thisSurf.SurfSchedExternalShadingFrac) { | ||
| numNotDef += 1; | ||
| if (numNotDef == 1) { | ||
| ShowWarningError( | ||
| state, | ||
| format("ShadowCalculation specified Schedule for the Shading Calculation Method but no schedule provided for {}", thisSurf.Name)); | ||
| ShowWarningError(state, | ||
| format("ShadowCalculation specified Schedule for the Shading Calculation Method but no schedule provided for {}.", | ||
| thisSurf.Name)); | ||
| ShowContinueError( | ||
| state, "When Schedule is selected for the Shading Calculation Method and no schedule is provided for a particular surface,"); | ||
| ShowContinueError( | ||
| state, "EnergyPlus will assume that the surface is not shaded. Use SurfaceProperty:LocalEnvironment to specify a schedule"); | ||
| ShowContinueError(state, "for sunlit fraction if this was not desired. Otherwise, this surface will not be shaded at all."); | ||
| } else if (numNotDef <= maxErrMessages) { | ||
| ShowWarningError(state, format("No schedule was provided for {} either. See above error message for more details", thisSurf.Name)); | ||
| ShowWarningError(state, format("No schedule was provided for {} either. See above error message for more details.", thisSurf.Name)); | ||
| } | ||
| } | ||
| } | ||
| if (numNotDef > maxErrMessages) { | ||
| ShowContinueError(state, format("This message is only shown for the first {} occurrences of this issue.", maxErrMessages)); | ||
| } | ||
| } | ||
|
|
||
| void checkNotScheduledSurfacePresent(EnergyPlusData &state) | ||
|
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. New method for issuing a warning when a surface has a sunlit fraction schedule but the ShadowCalculation object has Shading Calculation Method != Scheduled. This is the contrapositive (?!) to |
||
| { | ||
| // User has *not* chosen "Scheduled" for sunlit fraction so check to see which surfaces *have* a schedule. | ||
| int numNotDef = 0; | ||
| int constexpr maxErrMessages = 50; | ||
| auto &surfData = state.dataSurface; | ||
| for (int surfNum = 1; surfNum <= surfData->TotSurfaces; ++surfNum) { | ||
| auto &thisSurf = surfData->Surface(surfNum); | ||
| if ((thisSurf.Class == SurfaceClass::Shading || thisSurf.Class == SurfaceClass::Detached_F || thisSurf.Class == SurfaceClass::Detached_B || | ||
| thisSurf.Class == SurfaceClass::Overhang || thisSurf.Class == SurfaceClass::Fin)) { | ||
| continue; // skip shading surfaces | ||
| } | ||
| if (thisSurf.SurfSchedExternalShadingFrac) { | ||
| numNotDef += 1; | ||
| if (numNotDef == 1) { | ||
| ShowWarningError(state, | ||
| format("ShadowCalculation did not specify Schedule for the Shading Calculation Method but schedule provided for {}.", | ||
| thisSurf.Name)); | ||
| } else if (numNotDef <= maxErrMessages) { | ||
| ShowWarningError(state, format("Schedule was also provided for {}. See above error message for more details.", thisSurf.Name)); | ||
| } | ||
| } | ||
| } | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -5262,7 +5262,7 @@ TEST_F(EnergyPlusFixture, SolarShadingTest_checkScheduledSurfacePresent) | |
| // Test of check to see if all surfaces have a sunlit schedule when shadow calculations are set to "Scheduled" | ||
| { | ||
| auto &surfData = state->dataSurface; | ||
| surfData->TotSurfaces = 5; | ||
| surfData->TotSurfaces = 6; | ||
| surfData->Surface.allocate(surfData->TotSurfaces); | ||
|
|
||
| // Set up data for test: three of five surfaces are non-shading and two are shading. Shading surfaces | ||
|
|
@@ -5283,17 +5283,57 @@ TEST_F(EnergyPlusFixture, SolarShadingTest_checkScheduledSurfacePresent) | |
| surfData->Surface(5).Class = SurfaceClass::Overhang; | ||
| surfData->Surface(5).SurfSchedExternalShadingFrac = false; | ||
| surfData->Surface(5).Name = "SHADING2NOTOK"; | ||
| surfData->Surface(6).Class = SurfaceClass::Window; | ||
| surfData->Surface(6).SurfSchedExternalShadingFrac = false; | ||
| surfData->Surface(6).Name = "WINDOW2NOTOK"; | ||
|
Comment on lines
+5286
to
+5288
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Just improving the existing unit test -- we should see an additional warning line for a second valid surface without sunlit fraction schedule. |
||
|
|
||
| checkScheduledSurfacePresent(*state); | ||
|
|
||
| std::string const error_string = delimited_string({ | ||
| " ** Warning ** ShadowCalculation specified Schedule for the Shading Calculation Method but no schedule provided for WINDOW1NOTOK", | ||
| " ** Warning ** ShadowCalculation specified Schedule for the Shading Calculation Method but no schedule provided for WINDOW1NOTOK.", | ||
| " ** ~~~ ** When Schedule is selected for the Shading Calculation Method and no schedule is provided for a particular surface,", | ||
| " ** ~~~ ** EnergyPlus will assume that the surface is not shaded. Use SurfaceProperty:LocalEnvironment to specify a schedule", | ||
| " ** ~~~ ** for sunlit fraction if this was not desired. Otherwise, this surface will not be shaded at all.", | ||
| " ** Warning ** No schedule was provided for WINDOW2NOTOK either. See above error message for more details.", | ||
| }); | ||
| EXPECT_TRUE(compare_err_stream(error_string, true)); | ||
| } | ||
|
|
||
| TEST_F(EnergyPlusFixture, SolarShadingTest_checkNotScheduledSurfacePresent) | ||
|
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. New unit test, much like the existing unit test, for checking the new |
||
| // Test of check to see if all surfaces do not have a sunlit schedule when shadow calculations are not set to "Scheduled" | ||
| { | ||
| auto &surfData = state->dataSurface; | ||
| surfData->TotSurfaces = 5; | ||
| surfData->Surface.allocate(surfData->TotSurfaces); | ||
|
|
||
| // Set up data for test: three of five surfaces are non-shading and two are shading. Shading surfaces | ||
| // are skipped so they should not report any errors. Two of the surfaces will be correctly defined while | ||
| // one surface will not be correctly defined and will generate an error. | ||
| surfData->Surface(1).Class = SurfaceClass::Wall; | ||
| surfData->Surface(1).SurfSchedExternalShadingFrac = true; | ||
| surfData->Surface(1).Name = "WALL1OK"; | ||
| surfData->Surface(2).Class = SurfaceClass::Roof; | ||
| surfData->Surface(2).SurfSchedExternalShadingFrac = true; | ||
| surfData->Surface(2).Name = "ROOF1OK"; | ||
| surfData->Surface(3).Class = SurfaceClass::Window; | ||
| surfData->Surface(3).SurfSchedExternalShadingFrac = false; | ||
| surfData->Surface(3).Name = "WINDOW1NOTOK"; | ||
| surfData->Surface(4).Class = SurfaceClass::Shading; | ||
| surfData->Surface(4).SurfSchedExternalShadingFrac = true; | ||
| surfData->Surface(4).Name = "SHADING1OK"; | ||
| surfData->Surface(5).Class = SurfaceClass::Overhang; | ||
| surfData->Surface(5).SurfSchedExternalShadingFrac = false; | ||
| surfData->Surface(5).Name = "SHADING2NOTOK"; | ||
|
|
||
| checkNotScheduledSurfacePresent(*state); | ||
|
|
||
| std::string const error_string = delimited_string({ | ||
| " ** Warning ** ShadowCalculation did not specify Schedule for the Shading Calculation Method but schedule provided for WALL1OK.", | ||
| " ** Warning ** Schedule was also provided for ROOF1OK. See above error message for more details.", | ||
| }); | ||
| EXPECT_TRUE(compare_err_stream(error_string, true)); | ||
| } | ||
|
|
||
| TEST_F(EnergyPlusFixture, SolarShadingTest_CalcBeamSolarOnWinRevealSurface) | ||
| { | ||
| state->dataGlobal->TimeStepsInHour = 6; | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I assume this change was made to include FenestrationSurface:Detailed in the list of object names in the IDF Editor. However, AllHeatTranSurfNames (and SurfaceNames) also includes objects that should not show up in that list provided by the IDF Editor. It may also be that the IO Ref description below does not include all valid surface types but I did not check that. The fix would be to add a new reference to the valid objects and use that here instead?
For example, what good would it do to use SurfaceProperty:LocalEnvironment with an adiabatic floor? Maybe I am overthinking this and this change is sufficient to at least include the relevant objects.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good point. For example currently if you open SolarShadingTest_ExternalFraction.idf in IDF Editor, the list of SurfaceProperty:LocalEnvironment objects will initially populate the Exterior Surface Name fields with:
But the dropdowns don't show any Shading:Site:Detailed or FenestrationSurface:Detailed objects. If we switched SurfaceNames -> AllHeatTranSurfNames we'd still be including invalid Floor:Adiabatic in the dropdowns. So assuming the docs are correct, we'd need a reference that is shared between only FenestrationSurface:Detailed and BuildingSurface:Detailed; if one doesn't already exist, we need to add a new one.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Be careful when thinking the docs are correct. I think as a user I would expect Wall:Detailed to be the same as BuildingSurface:Detailed in the context of SurfaceProperty:LocalEnvironment. Even an exterior door should be able to use the local environment properties? I am sure you can think of other use cases for this object.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
See 1886efe. Indeed Wall:Detailed, e.g., is a valid object (I checked locally). Based on the code, shading objects are certainly invalid. So I propose that we stick with the
\object-list AllHeatTranSurfNameschange (to pick up fenestration), but not get overly ambitious with a new reference as we may accidentally exclude a valid object type.