From 18403107133251a9c45e43d35253716f4ab0fcb8 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Tue, 3 Mar 2026 10:32:16 -0700 Subject: [PATCH 01/10] IDD adjustments for SurfaceProperty:LocalEnvironment and SurfaceProperty:SurroundingSurfaces. --- idd/Energy+.idd.in | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/idd/Energy+.idd.in b/idd/Energy+.idd.in index ed80e986352..cb8e20c9018 100644 --- a/idd/Energy+.idd.in +++ b/idd/Energy+.idd.in @@ -18873,7 +18873,7 @@ SurfaceProperty:LocalEnvironment, \reference SurfaceLocalEnvironmentNames A2, \field Exterior Surface Name \type object-list - \object-list SurfaceNames + \object-list AllHeatTranSurfNames \note Enter the name of an exterior surface object A3, \field Sunlit Fraction Schedule Name \type object-list @@ -18920,7 +18920,8 @@ SurfaceProperty:SurroundingSurfaces, N1, \field Sky View Factor \minimum 0.0 \maximum 1.0 - \default 0.5 + \autocalculatable + \default autocalculate \note optional A2, \field Sky Temperature Schedule Name \type object-list @@ -18930,7 +18931,8 @@ SurfaceProperty:SurroundingSurfaces, N2, \field Ground View Factor \minimum 0.0 \maximum 1.0 - \default 0.5 + \autocalculatable + \default autocalculate \note optional A3, \field Ground Temperature Schedule Name \type object-list From f889c1ac1cb2abab707d8cdf6c5d69531972bfb8 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Tue, 3 Mar 2026 10:33:16 -0700 Subject: [PATCH 02/10] Move GetShadowingInput down below SetupZoneGeometry in GetBuildingData. --- src/EnergyPlus/HeatBalanceManager.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/EnergyPlus/HeatBalanceManager.cc b/src/EnergyPlus/HeatBalanceManager.cc index 6d2ec8c791e..1bd2bfd7f08 100644 --- a/src/EnergyPlus/HeatBalanceManager.cc +++ b/src/EnergyPlus/HeatBalanceManager.cc @@ -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); } void GetZoneData(EnergyPlusData &state, bool &ErrorsFound) // If errors found in input From 0d6bb5fc53f9fd58994dbb1f0a1dec3e7a297e29 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Tue, 3 Mar 2026 10:35:04 -0700 Subject: [PATCH 03/10] Add method for checking Shading Calc Method not Scheduled when surface has sunlit fraction schedule. --- src/EnergyPlus/SolarShading.cc | 38 +++++++++++++++++++++++++++++++--- src/EnergyPlus/SolarShading.hh | 2 ++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/EnergyPlus/SolarShading.cc b/src/EnergyPlus/SolarShading.cc index 6cf8bdd2b00..ece8b38a71e 100644 --- a/src/EnergyPlus/SolarShading.cc +++ b/src/EnergyPlus/SolarShading.cc @@ -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; @@ -833,14 +837,42 @@ void checkScheduledSurfacePresent(EnergyPlusData &state) if (numNotDef == 1) { ShowWarningError( state, - format("ShadowCalculation specified Schedule for the Shading Calculation Method but no schedule provided for {}", thisSurf.Name)); + 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) +{ + // 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)); } } } diff --git a/src/EnergyPlus/SolarShading.hh b/src/EnergyPlus/SolarShading.hh index bd6426e93f8..751930945d1 100644 --- a/src/EnergyPlus/SolarShading.hh +++ b/src/EnergyPlus/SolarShading.hh @@ -103,6 +103,8 @@ namespace SolarShading { void checkScheduledSurfacePresent(EnergyPlusData &state); + void checkNotScheduledSurfacePresent(EnergyPlusData &state); + void AllocateModuleArrays(EnergyPlusData &state); void AnisoSkyViewFactors(EnergyPlusData &state); From 6a77e9153827e6d558f57e5833758447d2520244 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Tue, 3 Mar 2026 10:35:32 -0700 Subject: [PATCH 04/10] Improve and add unit tests for solar shading. --- tst/EnergyPlus/unit/SolarShading.unit.cc | 44 ++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/tst/EnergyPlus/unit/SolarShading.unit.cc b/tst/EnergyPlus/unit/SolarShading.unit.cc index d880abdffa7..7dfe5f51a2e 100644 --- a/tst/EnergyPlus/unit/SolarShading.unit.cc +++ b/tst/EnergyPlus/unit/SolarShading.unit.cc @@ -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"; 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) +// 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; From 99ae2e97ea66c5b70f38eb19ba96ea82b08d2421 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Tue, 3 Mar 2026 10:56:05 -0700 Subject: [PATCH 05/10] Formatting. --- src/EnergyPlus/SolarShading.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/EnergyPlus/SolarShading.cc b/src/EnergyPlus/SolarShading.cc index ece8b38a71e..f4d999a13de 100644 --- a/src/EnergyPlus/SolarShading.cc +++ b/src/EnergyPlus/SolarShading.cc @@ -837,7 +837,8 @@ void checkScheduledSurfacePresent(EnergyPlusData &state) if (numNotDef == 1) { ShowWarningError( state, - format("ShadowCalculation specified Schedule for the Shading Calculation Method but no schedule provided for {}.", thisSurf.Name)); + 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( @@ -870,7 +871,8 @@ void checkNotScheduledSurfacePresent(EnergyPlusData &state) if (numNotDef == 1) { ShowWarningError( state, - format("ShadowCalculation did not specify Schedule for the Shading Calculation Method but schedule provided for {}.", thisSurf.Name)); + 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)); } From 1b6a01b9b5c0c44b0833fed0b48bc20472f789e8 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Tue, 3 Mar 2026 11:02:06 -0700 Subject: [PATCH 06/10] Formatting. Again. --- src/EnergyPlus/SolarShading.cc | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/EnergyPlus/SolarShading.cc b/src/EnergyPlus/SolarShading.cc index f4d999a13de..0baf657f549 100644 --- a/src/EnergyPlus/SolarShading.cc +++ b/src/EnergyPlus/SolarShading.cc @@ -835,10 +835,9 @@ 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( @@ -869,10 +868,9 @@ void checkNotScheduledSurfacePresent(EnergyPlusData &state) 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)); + 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)); } From e3da60722a2fbec0be32526bd8b357d0530008a0 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Tue, 3 Mar 2026 12:00:39 -0700 Subject: [PATCH 07/10] Update unit test expected values related to autocalculatable defaults. --- tst/EnergyPlus/unit/InputProcessor.unit.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tst/EnergyPlus/unit/InputProcessor.unit.cc b/tst/EnergyPlus/unit/InputProcessor.unit.cc index a08913495af..8ee9d9b2f26 100644 --- a/tst/EnergyPlus/unit/InputProcessor.unit.cc +++ b/tst/EnergyPlus/unit/InputProcessor.unit.cc @@ -4365,9 +4365,9 @@ TEST_F(InputProcessorFixture, reportIDFRecordsStats_extensible_fields) // 1 fields defaulted , 0 Autosizable, 0 Autocalculatable "SurfaceProperty:SurroundingSurfaces,", " SrdSurfs:Living:East, !- Name", - " 0.3, !- Sky View Factor", // Has numeric default + " 0.3, !- Sky View Factor", // Has autocalculate default " , !- Sky Temperature Schedule Name", - " 0.1, !- Ground View Factor", // Has numeric default + " 0.1, !- Ground View Factor", // Has autocalculate default " , !- Ground Temperature Schedule Name", " SurroundingSurface1, !- Surrounding Surface 1 Name", // (begin extensible) " 0.6, !- Surrounding Surface 1 View Factor", // Has numeric default @@ -4386,13 +4386,13 @@ TEST_F(InputProcessorFixture, reportIDFRecordsStats_extensible_fields) state->dataInputProcessing->inputProcessor->reportIDFRecordsStats(*state); // TOTAL: - // 16 fields with defaults, 0 Autosizable, 0 Autocalculatable + // 16 fields with defaults, 0 Autosizable, 2 Autocalculatable // 2 fields defaulted , 0 Autosized , 0 Autocalculated EXPECT_EQ(5, state->dataOutput->iNumberOfRecords); // Number of IDF Records (=Objects) EXPECT_EQ(16, state->dataOutput->iTotalFieldsWithDefaults); // Total number of fields that could be defaulted EXPECT_EQ(0, state->dataOutput->iTotalAutoSizableFields); // Total number of autosizeable fields - EXPECT_EQ(0, state->dataOutput->iTotalAutoCalculatableFields); // Total number of autocalculatable fields + EXPECT_EQ(2, state->dataOutput->iTotalAutoCalculatableFields); // Total number of autocalculatable fields EXPECT_EQ(2, state->dataOutput->iNumberOfDefaultedFields); // Number of defaulted fields in IDF EXPECT_EQ(0, state->dataOutput->iNumberOfAutoSizedFields); // Number of autosized fields in IDF EXPECT_EQ(0, state->dataOutput->iNumberOfAutoCalcedFields); // Number of autocalculated fields From 1886efeea951649bebe857defb9d3cbd8a9bc916 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Wed, 4 Mar 2026 10:51:30 -0700 Subject: [PATCH 08/10] Update SurfaceProperty:LocalEnvironment docs to generalize acceptable exterior surface and fenestration objects. --- .../src/overview/group-advanced-surface-concepts.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/input-output-reference/src/overview/group-advanced-surface-concepts.tex b/doc/input-output-reference/src/overview/group-advanced-surface-concepts.tex index 970a562e0ec..e4eb22c0817 100644 --- a/doc/input-output-reference/src/overview/group-advanced-surface-concepts.tex +++ b/doc/input-output-reference/src/overview/group-advanced-surface-concepts.tex @@ -2713,7 +2713,7 @@ \subsubsection{References}\label{references-gnd-srfs} \subsection{SurfaceProperty:LocalEnvironment}\label{surfacePropertylocalEnvironment} -The object links to an exterior surface object \textbf{BuildingSurface:Detailed} or an exterior fenestration object \textbf{FenestrationSurface:Detailed} and is used when there is a need to calculate surface level environmental data externally and import them into the simulation to override existing environmental data, including external solar shading fractions, local air velocity, temperature and humidity, and surrounding surface temperatures, sky view factor, ground surfaces view factors, ground surfaces temperature and ground surfaces reflectance. The object links to four optional objects including a schedule object declared by \textbf{Field: Sunlit Fraction Schedule Name}, a \textbf{\hyperref[surfacePropertySurroundingSurfaces]{SurfaceProperty:SurroundingSurfaces}} object declared by \textbf{Field: Surrounding Surfaces Object Name}, an \textbf{\hyperref[outdoorairnode]{OutdoorAir:Node}} object declared by \textbf{Field: Outdoor Air Node Name}, and a \textbf{\hyperref[surfacePropertyGroundSurfaces]{SurfaceProperty:GroundSurfaces}} object declared by +The object links to an exterior surface object (e.g., \textbf{BuildingSurface:Detailed}) or an exterior fenestration object (e.g., \textbf{FenestrationSurface:Detailed}) and is used when there is a need to calculate surface level environmental data externally and import them into the simulation to override existing environmental data, including external solar shading fractions, local air velocity, temperature and humidity, and surrounding surface temperatures, sky view factor, ground surfaces view factors, ground surfaces temperature and ground surfaces reflectance. The object links to four optional objects including a schedule object declared by \textbf{Field: Sunlit Fraction Schedule Name}, a \textbf{\hyperref[surfacePropertySurroundingSurfaces]{SurfaceProperty:SurroundingSurfaces}} object declared by \textbf{Field: Surrounding Surfaces Object Name}, an \textbf{\hyperref[outdoorairnode]{OutdoorAir:Node}} object declared by \textbf{Field: Outdoor Air Node Name}, and a \textbf{\hyperref[surfacePropertyGroundSurfaces]{SurfaceProperty:GroundSurfaces}} object declared by \textbf{Field: Ground Surfaces Object Name}. The object provides inputs to calculate shading, solar radiation, zone air balance, and surface exterior heat balance. \subsubsection{Field: Name}\label{field-surf-localenv-name} From c8e2d9d291a3f450d2c361a19122339d1b3cf745 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Wed, 4 Mar 2026 10:52:14 -0700 Subject: [PATCH 09/10] Remove SurfaceProperty:LocalEnvironment objects that reference shading objects in SolarShadingTest_ExternalFraction.idf. --- .../SolarShadingTest_ExternalFraction.idf | 209 ------------------ 1 file changed, 209 deletions(-) diff --git a/testfiles/SolarShadingTest_ExternalFraction.idf b/testfiles/SolarShadingTest_ExternalFraction.idf index a4695cd787d..482b44d64d0 100644 --- a/testfiles/SolarShadingTest_ExternalFraction.idf +++ b/testfiles/SolarShadingTest_ExternalFraction.idf @@ -670,215 +670,6 @@ , !- Sky Diffuse Modeling Algorithm Yes; !- Output External Shading Calculation Results - SurfaceProperty:LocalEnvironment, - LocEnv:EAST SIDE TREE, !- Name - EAST SIDE TREE, !- Exterior Surface Name - ExtShadingSch:EAST SIDE TREE, !- Sunlit Fraction Schedule Name - , !- Surrounding Surfaces Object Name - ; !- Outdoor Air Node Name - - Schedule:File, - ExtShadingSch:EAST SIDE TREE, !- Name - Fraction, !- Schedule Type Limits Name - SolarShadingTest_Shading_Data.csv, !- File Name - 2, !- Column Number - 1, !- Rows to Skip at Top - , !- Number of Hours of Data - , !- Column Separator - , !- Interpolate to Timestep - 15, !- Minutes per Item - ; !- Adjust Schedule for Daylight Savings - - SurfaceProperty:LocalEnvironment, - LocEnv:WEST SIDE TREE, !- Name - WEST SIDE TREE, !- Exterior Surface Name - ExtShadingSch:WEST SIDE TREE, !- Sunlit Fraction Schedule Name - , !- Surrounding Surfaces Object Name - ; !- Outdoor Air Node Name - - Schedule:File, - ExtShadingSch:WEST SIDE TREE, !- Name - Fraction, !- Schedule Type Limits Name - SolarShadingTest_Shading_Data.csv, !- File Name - 4, !- Column Number - 1, !- Rows to Skip at Top - , !- Number of Hours of Data - , !- Column Separator - , !- Interpolate to Timestep - 15, !- Minutes per Item - ; !- Adjust Schedule for Daylight Savings - - SurfaceProperty:LocalEnvironment, - LocEnv:ZN001:WALL001:SHADE001, !- Name - ZN001:WALL001:SHADE001, !- Exterior Surface Name - ExtShadingSch:ZN001:WALL001:SHADE001, !- Sunlit Fraction Schedule Name - , !- Surrounding Surfaces Object Name - ; !- Outdoor Air Node Name - - Schedule:File, - ExtShadingSch:ZN001:WALL001:SHADE001, !- Name - Fraction, !- Schedule Type Limits Name - SolarShadingTest_Shading_Data.csv, !- File Name - 6, !- Column Number - 1, !- Rows to Skip at Top - , !- Number of Hours of Data - , !- Column Separator - , !- Interpolate to Timestep - 15, !- Minutes per Item - ; !- Adjust Schedule for Daylight Savings - - SurfaceProperty:LocalEnvironment, - LocEnv:ZN002:WALL001:SHADE001, !- Name - ZN002:WALL001:SHADE001, !- Exterior Surface Name - ExtShadingSch:ZN002:WALL001:SHADE001, !- Sunlit Fraction Schedule Name - , !- Surrounding Surfaces Object Name - ; !- Outdoor Air Node Name - - Schedule:File, - ExtShadingSch:ZN002:WALL001:SHADE001, !- Name - Fraction, !- Schedule Type Limits Name - SolarShadingTest_Shading_Data.csv, !- File Name - 8, !- Column Number - 1, !- Rows to Skip at Top - , !- Number of Hours of Data - , !- Column Separator - , !- Interpolate to Timestep - 15, !- Minutes per Item - ; !- Adjust Schedule for Daylight Savings - - SurfaceProperty:LocalEnvironment, - LocEnv:ZN003:WALL001:SHADE001, !- Name - ZN003:WALL001:SHADE001, !- Exterior Surface Name - ExtShadingSch:ZN003:WALL001:SHADE001, !- Sunlit Fraction Schedule Name - , !- Surrounding Surfaces Object Name - ; !- Outdoor Air Node Name - - Schedule:File, - ExtShadingSch:ZN003:WALL001:SHADE001, !- Name - Fraction, !- Schedule Type Limits Name - SolarShadingTest_Shading_Data.csv, !- File Name - 10, !- Column Number - 1, !- Rows to Skip at Top - , !- Number of Hours of Data - , !- Column Separator - , !- Interpolate to Timestep - 15, !- Minutes per Item - ; !- Adjust Schedule for Daylight Savings - - SurfaceProperty:LocalEnvironment, - LocEnv:ZN004:WALL001:SHADE001, !- Name - ZN004:WALL001:SHADE001, !- Exterior Surface Name - ExtShadingSch:ZN004:WALL001:SHADE001, !- Sunlit Fraction Schedule Name - , !- Surrounding Surfaces Object Name - ; !- Outdoor Air Node Name - - Schedule:File, - ExtShadingSch:ZN004:WALL001:SHADE001, !- Name - Fraction, !- Schedule Type Limits Name - SolarShadingTest_Shading_Data.csv, !- File Name - 12, !- Column Number - 1, !- Rows to Skip at Top - , !- Number of Hours of Data - , !- Column Separator - , !- Interpolate to Timestep - 15, !- Minutes per Item - ; !- Adjust Schedule for Daylight Savings - - SurfaceProperty:LocalEnvironment, - LocEnv:ZN005:WALL001:SHADE001, !- Name - ZN005:WALL001:SHADE001, !- Exterior Surface Name - ExtShadingSch:ZN005:WALL001:SHADE001, !- Sunlit Fraction Schedule Name - , !- Surrounding Surfaces Object Name - ; !- Outdoor Air Node Name - - Schedule:File, - ExtShadingSch:ZN005:WALL001:SHADE001, !- Name - Fraction, !- Schedule Type Limits Name - SolarShadingTest_Shading_Data.csv, !- File Name - 14, !- Column Number - 1, !- Rows to Skip at Top - , !- Number of Hours of Data - , !- Column Separator - , !- Interpolate to Timestep - 15, !- Minutes per Item - ; !- Adjust Schedule for Daylight Savings - - SurfaceProperty:LocalEnvironment, - LocEnv:ZN006:WALL001:SHADE001, !- Name - ZN006:WALL001:SHADE001, !- Exterior Surface Name - ExtShadingSch:ZN006:WALL001:SHADE001, !- Sunlit Fraction Schedule Name - , !- Surrounding Surfaces Object Name - ; !- Outdoor Air Node Name - - Schedule:File, - ExtShadingSch:ZN006:WALL001:SHADE001, !- Name - Fraction, !- Schedule Type Limits Name - SolarShadingTest_Shading_Data.csv, !- File Name - 16, !- Column Number - 1, !- Rows to Skip at Top - , !- Number of Hours of Data - , !- Column Separator - , !- Interpolate to Timestep - 15, !- Minutes per Item - ; !- Adjust Schedule for Daylight Savings - - SurfaceProperty:LocalEnvironment, - LocEnv:ZN007:WALL001:SHADE001, !- Name - ZN007:WALL001:SHADE001, !- Exterior Surface Name - ExtShadingSch:ZN007:WALL001:SHADE001, !- Sunlit Fraction Schedule Name - , !- Surrounding Surfaces Object Name - ; !- Outdoor Air Node Name - - Schedule:File, - ExtShadingSch:ZN007:WALL001:SHADE001, !- Name - Fraction, !- Schedule Type Limits Name - SolarShadingTest_Shading_Data.csv, !- File Name - 18, !- Column Number - 1, !- Rows to Skip at Top - , !- Number of Hours of Data - , !- Column Separator - , !- Interpolate to Timestep - 15, !- Minutes per Item - ; !- Adjust Schedule for Daylight Savings - - SurfaceProperty:LocalEnvironment, - LocEnv:ZN008:WALL001:SHADE001, !- Name - ZN008:WALL001:SHADE001, !- Exterior Surface Name - ExtShadingSch:ZN008:WALL001:SHADE001, !- Sunlit Fraction Schedule Name - , !- Surrounding Surfaces Object Name - ; !- Outdoor Air Node Name - - Schedule:File, - ExtShadingSch:ZN008:WALL001:SHADE001, !- Name - Fraction, !- Schedule Type Limits Name - SolarShadingTest_Shading_Data.csv, !- File Name - 20, !- Column Number - 1, !- Rows to Skip at Top - , !- Number of Hours of Data - , !- Column Separator - , !- Interpolate to Timestep - 15, !- Minutes per Item - ; !- Adjust Schedule for Daylight Savings - - SurfaceProperty:LocalEnvironment, - LocEnv:ZN009:WALL001:SHADE001, !- Name - ZN009:WALL001:SHADE001, !- Exterior Surface Name - ExtShadingSch:ZN009:WALL001:SHADE001, !- Sunlit Fraction Schedule Name - , !- Surrounding Surfaces Object Name - ; !- Outdoor Air Node Name - - Schedule:File, - ExtShadingSch:ZN009:WALL001:SHADE001, !- Name - Fraction, !- Schedule Type Limits Name - SolarShadingTest_Shading_Data.csv, !- File Name - 22, !- Column Number - 1, !- Rows to Skip at Top - , !- Number of Hours of Data - , !- Column Separator - , !- Interpolate to Timestep - 15, !- Minutes per Item - ; !- Adjust Schedule for Daylight Savings - SurfaceProperty:LocalEnvironment, LocEnv:ZN001:WALL001, !- Name ZN001:WALL001, !- Exterior Surface Name From e3475b765c2110823112b719b3f59398daf1daff Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Fri, 6 Mar 2026 12:01:28 -0700 Subject: [PATCH 10/10] fixup new format messages --- src/EnergyPlus/SolarShading.cc | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/EnergyPlus/SolarShading.cc b/src/EnergyPlus/SolarShading.cc index 89fb6df0876..4e8eb888343 100644 --- a/src/EnergyPlus/SolarShading.cc +++ b/src/EnergyPlus/SolarShading.cc @@ -848,21 +848,23 @@ 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, + EnergyPlus::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, EnergyPlus::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)); + ShowContinueError(state, EnergyPlus::format("This message is only shown for the first {} occurrences of this issue.", maxErrMessages)); } } @@ -881,11 +883,13 @@ void checkNotScheduledSurfacePresent(EnergyPlusData &state) 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)); + ShowWarningError( + state, + EnergyPlus::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)); + ShowWarningError(state, + EnergyPlus::format("Schedule was also provided for {}. See above error message for more details.", thisSurf.Name)); } } }