Line data Source code
1 : // EnergyPlus, Copyright (c) 1996-2024, The Board of Trustees of the University of Illinois,
2 : // The Regents of the University of California, through Lawrence Berkeley National Laboratory
3 : // (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge
4 : // National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other
5 : // contributors. All rights reserved.
6 : //
7 : // NOTICE: This Software was developed under funding from the U.S. Department of Energy and the
8 : // U.S. Government consequently retains certain rights. As such, the U.S. Government has been
9 : // granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable,
10 : // worldwide license in the Software to reproduce, distribute copies to the public, prepare
11 : // derivative works, and perform publicly and display publicly, and to permit others to do so.
12 : //
13 : // Redistribution and use in source and binary forms, with or without modification, are permitted
14 : // provided that the following conditions are met:
15 : //
16 : // (1) Redistributions of source code must retain the above copyright notice, this list of
17 : // conditions and the following disclaimer.
18 : //
19 : // (2) Redistributions in binary form must reproduce the above copyright notice, this list of
20 : // conditions and the following disclaimer in the documentation and/or other materials
21 : // provided with the distribution.
22 : //
23 : // (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory,
24 : // the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be
25 : // used to endorse or promote products derived from this software without specific prior
26 : // written permission.
27 : //
28 : // (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form
29 : // without changes from the version obtained under this License, or (ii) Licensee makes a
30 : // reference solely to the software portion of its product, Licensee must refer to the
31 : // software as "EnergyPlus version X" software, where "X" is the version number Licensee
32 : // obtained under this License and may not use a different name for the software. Except as
33 : // specifically required in this Section (4), Licensee shall not use in a company name, a
34 : // product name, in advertising, publicity, or other promotional activities any name, trade
35 : // name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly
36 : // similar designation, without the U.S. Department of Energy's prior written consent.
37 : //
38 : // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
39 : // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
40 : // AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
41 : // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
42 : // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
43 : // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
44 : // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
45 : // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
46 : // POSSIBILITY OF SUCH DAMAGE.
47 :
48 : #ifndef SolarShading_hh_INCLUDED
49 : #define SolarShading_hh_INCLUDED
50 :
51 : // C++ Headers
52 : #include <fstream>
53 : #include <memory>
54 :
55 : // ObjexxFCL Headers
56 : #include <ObjexxFCL/Array2D.hh>
57 : #include <ObjexxFCL/Array3D.hh>
58 :
59 : // Penumbra Headers
60 : #ifndef EP_NO_OPENGL
61 : #include <penumbra/penumbra.h>
62 : #endif
63 :
64 : // EnergyPlus Headers
65 : #include <EnergyPlus/DataBSDFWindow.hh>
66 : #include <EnergyPlus/DataSurfaces.hh>
67 : #include <EnergyPlus/DataVectorTypes.hh>
68 : #include <EnergyPlus/EnergyPlus.hh>
69 : #include <EnergyPlus/WindowEquivalentLayer.hh>
70 :
71 : namespace EnergyPlus {
72 :
73 : // Forward declarations
74 : struct EnergyPlusData;
75 :
76 : namespace SolarShading {
77 :
78 : // Using/Aliasing
79 : using DataBSDFWindow::BSDFGeomDescr;
80 : using DataBSDFWindow::BSDFWindowGeomDescr;
81 : using DataVectorTypes::Vector;
82 :
83 : struct SurfaceErrorTracking
84 : {
85 : // Members
86 : int SurfIndex1; // Tracking for main error message
87 : int SurfIndex2; // Tracking for Overlapping Figure Name or Surface # 1
88 : int MiscIndex; // Used for other pertinent information to be stored
89 :
90 : // Default Constructor
91 0 : SurfaceErrorTracking() : SurfIndex1(0), SurfIndex2(0), MiscIndex(0)
92 : {
93 0 : }
94 : };
95 :
96 : void InitSolarCalculations(EnergyPlusData &state);
97 :
98 : void checkShadingSurfaceSchedules(EnergyPlusData &state);
99 :
100 : void GetShadowingInput(EnergyPlusData &state);
101 :
102 : void processShadowingInput(EnergyPlusData &state);
103 :
104 : void checkScheduledSurfacePresent(EnergyPlusData &state);
105 :
106 : void AllocateModuleArrays(EnergyPlusData &state);
107 :
108 : void AnisoSkyViewFactors(EnergyPlusData &state);
109 :
110 : void CHKBKS(EnergyPlusData &state,
111 : int const NBS, // Surface Number of the potential back surface
112 : int const NRS // Surface Number of the potential shadow receiving surface
113 : );
114 :
115 : void CHKGSS(EnergyPlusData &state,
116 : int const NRS, // Surface number of the potential shadow receiving surface
117 : int const NSS, // Surface number of the potential shadow casting surface
118 : Real64 const ZMIN, // Lowest point of the receiving surface
119 : bool &CannotShade // TRUE if shadow casting surface cannot shade receiving surface.
120 : );
121 :
122 : void CHKSBS(EnergyPlusData &state,
123 : int const HTS, // Heat transfer surface number of the general receiving surf
124 : int const GRSNR, // Surface number of general receiving surface
125 : int const SBSNR // Surface number of subsurface
126 : );
127 :
128 : bool polygon_contains_point(int const nsides, // number of sides (vertices)
129 : Array1D<Vector> &polygon_3d, // points of polygon
130 : Vector const &point_3d, // point to be tested
131 : bool const ignorex,
132 : bool const ignorey,
133 : bool const ignorez);
134 :
135 : void ComputeIntSolarAbsorpFactors(EnergyPlusData &state);
136 :
137 : void CLIP(EnergyPlusData &state, int const NVT, Array1D<Real64> &XVT, Array1D<Real64> &YVT, Array1D<Real64> &ZVT);
138 :
139 : void CLIPLINE(Real64 &x0, Real64 &x1, Real64 &y0, Real64 &y1, Real64 maxX, Real64 minX, Real64 maxY, Real64 minY, bool &visible);
140 :
141 : void CTRANS(EnergyPlusData &state,
142 : int const NS, // Surface number whose vertex coordinates are being transformed
143 : int const NGRS, // Base surface number for surface NS
144 : int &NVT, // Number of vertices for surface NS
145 : Array1D<Real64> &XVT, // XYZ coordinates of vertices of NS in plane of NGRS
146 : Array1D<Real64> &YVT,
147 : Array1D<Real64> &ZVT);
148 :
149 : void HTRANS(EnergyPlusData &state,
150 : int const I, // Mode selector: 0 - Compute H.C. of sides
151 : int const NS, // Figure Number
152 : int const NumVertices // Number of vertices
153 : );
154 :
155 : void HTRANS0(EnergyPlusData &state,
156 : int const NS, // Figure Number
157 : int const NumVertices // Number of vertices
158 : );
159 :
160 : void HTRANS1(EnergyPlusData &state,
161 : int const NS, // Figure Number
162 : int const NumVertices // Number of vertices
163 : );
164 :
165 : void INCLOS(EnergyPlusData &state,
166 : int const N1, // Figure number of figure 1
167 : int const N1NumVert, // Number of vertices of figure 1
168 : int const N2, // Figure number of figure 2
169 : int const N2NumVert, // Number of vertices of figure 2
170 : int &NumVerticesOverlap, // Number of vertices which overlap
171 : int &NIN // Number of vertices of figure 1 within figure 2
172 : );
173 :
174 : void INTCPT(EnergyPlusData &state,
175 : int const NV1, // Number of vertices of figure NS1
176 : int const NV2, // Number of vertices of figure NS2
177 : int &NV3, // Number of vertices of figure NS3
178 : int const NS1, // Number of the figure being overlapped
179 : int const NS2 // Number of the figure doing overlapping
180 : );
181 :
182 : void CLIPPOLY(EnergyPlusData &state,
183 : int const NS1, // Figure number of figure 1 (The subject polygon)
184 : int const NS2, // Figure number of figure 2 (The clipping polygon)
185 : int const NV1, // Number of vertices of figure 1
186 : int const NV2, // Number of vertices of figure 2
187 : int &NV3 // Number of vertices of figure 3
188 : );
189 :
190 : void MULTOL(EnergyPlusData &state,
191 : int const NNN, // argument
192 : int const LOC0, // Location in the homogeneous coordinate array
193 : int const NRFIGS // Number of figures overlapped
194 : );
195 :
196 : void ORDER(EnergyPlusData &state,
197 : int const NV3, // Number of vertices of figure NS3
198 : int const NS3 // Location to place results of overlap
199 : );
200 :
201 : void DeterminePolygonOverlap(EnergyPlusData &state,
202 : int const NS1, // Number of the figure being overlapped
203 : int const NS2, // Number of the figure doing overlapping
204 : int const NS3 // Location to place results of overlap
205 : );
206 :
207 : void CalcPerSolarBeam(EnergyPlusData &state,
208 : Real64 const AvgEqOfTime, // Average value of Equation of Time for period
209 : Real64 const AvgSinSolarDeclin, // Average value of Sine of Solar Declination for period
210 : Real64 const AvgCosSolarDeclin // Average value of Cosine of Solar Declination for period
211 : );
212 :
213 : void FigureSunCosines(EnergyPlusData &state,
214 : int const iHour,
215 : int const iTimeStep,
216 : Real64 const EqOfTime, // value of Equation of Time for period
217 : Real64 const SinSolarDeclin, // value of Sine of Solar Declination for period
218 : Real64 const CosSolarDeclin // value of Cosine of Solar Declination for period
219 : );
220 :
221 : void FigureSolarBeamAtTimestep(EnergyPlusData &state, int const iHour, int const iTimeStep);
222 :
223 : void DetermineShadowingCombinations(EnergyPlusData &state);
224 :
225 : void SHADOW(EnergyPlusData &state,
226 : int const iHour, // Hour index
227 : int const TS // Time Step
228 : );
229 :
230 : void SHDBKS(EnergyPlusData &state,
231 : int const NGRS, // Number of the general receiving surface
232 : int const CurSurf,
233 : int const NBKS, // Number of back surfaces
234 : int const HTS // Heat transfer surface number of the general receiving surf
235 : );
236 :
237 : void SHDGSS(EnergyPlusData &state,
238 : int const NGRS,
239 : int const iHour, // Hour Counter
240 : int const TS, // TimeStep
241 : int const CurSurf, // Current Surface
242 : int const NGSS, // Number of general shadowing surfaces
243 : int const HTS // Heat transfer surface number of the general receiving surf
244 : );
245 :
246 : void CalcInteriorSolarOverlaps(EnergyPlusData &state,
247 : int const iHour, // Hour Index
248 : int const NBKS, // Number of back surfaces associated with this GRSNR (in general, only
249 : int const HTSS, // Surface number of the subsurface (exterior window)
250 : int const GRSNR, // General receiving surface number (base surface of the exterior window)
251 : int const TS // Time step Index
252 : );
253 :
254 : void CalcInteriorSolarDistribution(EnergyPlusData &state);
255 :
256 : void CalcAbsorbedOnExteriorOpaqueSurfaces(EnergyPlusData &state);
257 :
258 : void CalcInteriorSolarDistributionWCESimple(EnergyPlusData &state);
259 :
260 : int WindowScheduledSolarAbs(EnergyPlusData &state,
261 : int const SurfNum, // Surface number
262 : int const ConstNum // Construction number
263 : );
264 :
265 : int SurfaceScheduledSolarInc(EnergyPlusData &state,
266 : int const SurfNum, // Surface number
267 : int const ConstNum // Construction number
268 : );
269 :
270 : void PerformSolarCalculations(EnergyPlusData &state);
271 :
272 : void SHDRVL(EnergyPlusData &state,
273 : int const HTSS, // Heat transfer surface number of the subsurface
274 : int const SBSNR, // Subsurface number
275 : int const Hour,
276 : int const TS);
277 :
278 : void SHDSBS(EnergyPlusData &state,
279 : int const iHour, // Hour Index
280 : int const CurSurf,
281 : int const NBKS, // Number of back surfaces
282 : int const NSBS, // Number of subsurfaces
283 : int const HTS, // Heat transfer surface number of the general receiving surf
284 : int const TS // Time step Index
285 : );
286 :
287 : void SUN3(int const JulianDayOfYear, // Julian Day Of Year
288 : Real64 &SineOfSolarDeclination, // Sine of Solar Declination
289 : Real64 &EquationOfTime // Equation of Time (Degrees)
290 : );
291 :
292 : void SUN4(EnergyPlusData &state,
293 : Real64 const CurrentTime, // Time to use in shadowing calculations
294 : Real64 const EqOfTime, // Equation of time for current day
295 : Real64 const SinSolarDeclin, // Sine of the Solar declination (current day)
296 : Real64 const CosSolarDeclin // Cosine of the Solar declination (current day)
297 : );
298 :
299 : void WindowShadingManager(EnergyPlusData &state);
300 :
301 : void CheckGlazingShadingStatusChange(EnergyPlusData &state);
302 :
303 : DataSurfaces::WinShadingType findValueInEnumeration(Real64 controlValue);
304 :
305 : int selectActiveWindowShadingControlIndex(EnergyPlusData &state, int curSurface);
306 :
307 : void WindowGapAirflowControl(EnergyPlusData &state);
308 :
309 : void SkyDifSolarShading(EnergyPlusData &state);
310 :
311 : void CalcWindowProfileAngles(EnergyPlusData &state);
312 :
313 : void CalcFrameDividerShadow(EnergyPlusData &state,
314 : int const SurfNum, // Surface number
315 : int const FrDivNum, // Frame/divider number
316 : int const HourNum // Hour number
317 : );
318 :
319 : void CalcBeamSolarOnWinRevealSurface(EnergyPlusData &state);
320 :
321 : void ReportSurfaceShading(EnergyPlusData &state);
322 :
323 : void ReportSurfaceErrors(EnergyPlusData &state);
324 :
325 : void ComputeWinShadeAbsorpFactors(EnergyPlusData &state);
326 :
327 : void CalcWinTransDifSolInitialDistribution(EnergyPlusData &state);
328 :
329 : void CalcInteriorWinTransDifSolInitialDistribution(
330 : EnergyPlusData &state,
331 : int const IntWinEnclosureNum, // Interior Window Enclosure index number
332 : int const IntWinSurfNum, // Interior Window Surface number
333 : Real64 const IntWinDifSolarTransW // Diffuse Solar transmitted through Interior Window IntWinSurfNum from adjacent enclosure [W]
334 : );
335 :
336 : void CalcComplexWindowOverlap(EnergyPlusData &state,
337 : BSDFGeomDescr &Geom, // State Geometry
338 : BSDFWindowGeomDescr const &Window, // Window Geometry
339 : int const ISurf // Surface number of the complex fenestration
340 : );
341 :
342 : void TimestepInitComplexFenestration(EnergyPlusData &state);
343 :
344 : } // namespace SolarShading
345 :
346 : struct SolarShadingData : BaseGlobalStruct
347 : {
348 : Array1D_string const cOverLapStatus;
349 : int MaxHCV = 15; // Maximum number of HC vertices
350 : // (needs to be based on maxnumvertices)
351 : int MaxHCS = 15000; // 200 ! Maximum number of HC surfaces (was 56)
352 : // Following are initially set in AllocateModuleArrays
353 : int MAXHCArrayBounds = 0; // Bounds based on Max Number of Vertices in surfaces
354 : int MAXHCArrayIncrement = 0; // Increment based on Max Number of Vertices in surfaces
355 : // The following variable should be re-engineered to lower in module hierarchy but need more analysis
356 : int NVS; // Number of vertices of the shadow/clipped surface
357 : int NumVertInShadowOrClippedSurface;
358 : int CurrentSurfaceBeingShadowed;
359 : int CurrentShadowingSurface;
360 : int OverlapStatus; // Results of overlap calculation:
361 : // 1=No overlap; 2=NS1 completely within NS2
362 : // 3=NS2 completely within NS1; 4=Partial overlap
363 :
364 : Array1D<Real64> SurfSunCosTheta; // Cosine of angle of incidence of sun's rays on surface NS
365 : Array1D<Real64> SurfAnisoSkyMult; // Multiplier on exterior-surface sky view factor to account for
366 : // anisotropy of sky radiance; = 1.0 for for isotropic sky
367 : Array1D<Real64> SurfDifShdgRatioIsoSky; // Diffuse shading ratio (WithShdgIsoSky/WoShdgIsoSky)
368 : Array3D<Real64> SurfDifShdgRatioIsoSkyHRTS; // Diffuse shading ratio (WithShdgIsoSky/WoShdgIsoSky)
369 : Array1D<Real64> SurfCurDifShdgRatioIsoSky; // Diffuse shading ratio (WithShdgIsoSky/WoShdgIsoSky)
370 : Array1D<Real64> SurfDifShdgRatioHoriz; // Horizon shading ratio (WithShdgHoriz/WoShdgHoriz)
371 : Array3D<Real64> SurfDifShdgRatioHorizHRTS; // Horizon shading ratio (WithShdgHoriz/WoShdgHoriz)
372 : Array1D<Real64> SurfWithShdgIsoSky; // Diffuse solar irradiance from sky on surface, with shading
373 : Array1D<Real64> SurfWoShdgIsoSky; // Diffuse solar from sky on surface, without shading
374 : Array1D<Real64> SurfWithShdgHoriz; // Diffuse solar irradiance from horizon portion of sky on surface, with shading
375 : Array1D<Real64> SurfWoShdgHoriz; // Diffuse solar irradiance from horizon portion of sky on surface, without shading
376 : Array1D<Real64> SurfMultIsoSky; // Contribution to eff sky view factor from isotropic sky
377 : Array1D<Real64> SurfMultCircumSolar; // Contribution to eff sky view factor from circumsolar brightening
378 : Array1D<Real64> SurfMultHorizonZenith; // Contribution to eff sky view factor from horizon or zenith brightening
379 :
380 : int FBKSHC = 0; // HC location of first back surface
381 : int FGSSHC = 0; // HC location of first general shadowing surface
382 : int FINSHC = 0; // HC location of first back surface overlap
383 : int FRVLHC = 0; // HC location of first reveal surface
384 : int FSBSHC = 0; // HC location of first subsurface
385 : int LOCHCA = 0; // Location of highest data in the HC arrays
386 : int NBKSHC = 0; // Number of back surfaces in the HC arrays
387 : int NGSSHC = 0; // Number of general shadowing surfaces in the HC arrays
388 : int NINSHC = 0; // Number of back surface overlaps in the HC arrays
389 : int NRVLHC = 0; // Number of reveal surfaces in HC array
390 : int NSBSHC = 0; // Number of subsurfaces in the HC arrays
391 : bool CalcSkyDifShading = false; // True when sky diffuse solar shading is
392 : int ShadowingCalcFrequency = 0; // Frequency for Shadowing Calculations
393 : int ShadowingDaysLeft = 0; // Days left in current shadowing period
394 :
395 : Array1D_int HCNS; // Surface number of back surface HC figures
396 : Array1D_int HCNV; // Number of vertices of each HC figure
397 : Array2D<Int64> HCA; // 'A' homogeneous coordinates of sides
398 : Array2D<Int64> HCB; // 'B' homogeneous coordinates of sides
399 : Array2D<Int64> HCC; // 'C' homogeneous coordinates of sides
400 : Array2D<Int64> HCX; // 'X' homogeneous coordinates of vertices of figure.
401 : Array2D<Int64> HCY; // 'Y' homogeneous coordinates of vertices of figure.
402 : Array3D_int SurfWinRevealStatus;
403 : Array1D<Real64> HCAREA; // Area of each HC figure. Sign Convention: Base Surface
404 : // - Positive, Shadow - Negative, Overlap between two shadows
405 : // - positive, etc., so that sum of HC areas=base sunlit area
406 : Array1D<Real64> HCT; // Transmittance of each HC figure
407 : Array1D<Real64> SurfIntAbsFac; // For simple interior solar distribution (in which all beam
408 : // radiation entering zone is assumed to strike the floor),
409 : // fraction of beam radiation absorbed by each floor surface
410 : Array1D<Real64> SurfSunlitArea; // Sunlit area of heat transfer surface HTS
411 : // Excludes multiplier for windows
412 : // Shadowing combinations data structure...See ShadowingCombinations type
413 : int NumTooManyFigures = 0;
414 : int NumTooManyVertices = 0;
415 : int NumBaseSubSurround = 0;
416 : Vector3<Real64> SUNCOS; // Direction cosines of solar position
417 : Real64 XShadowProjection; // X projection of a shadow (formerly called C)
418 : Real64 YShadowProjection; // Y projection of a shadow (formerly called S)
419 : Array1D<Real64> XTEMP; // Temporary 'X' values for HC vertices of the overlap
420 : Array1D<Real64> XVC; // X-vertices of the clipped figure
421 : Array1D<Real64> XVS; // X-vertices of the shadow
422 : Array1D<Real64> YTEMP; // Temporary 'Y' values for HC vertices of the overlap
423 : Array1D<Real64> YVC; // Y-vertices of the clipped figure
424 : Array1D<Real64> YVS; // Y-vertices of the shadow
425 : Array1D<Real64> ZVC; // Z-vertices of the clipped figure
426 : // Used in Sutherland Hodman poly clipping
427 : Array1D<Real64> ATEMP; // Temporary 'A' values for HC vertices of the overlap
428 : Array1D<Real64> BTEMP; // Temporary 'B' values for HC vertices of the overlap
429 : Array1D<Real64> CTEMP; // Temporary 'C' values for HC vertices of the overlap
430 : Array1D<Real64> XTEMP1; // Temporary 'X' values for HC vertices of the overlap
431 : Array1D<Real64> YTEMP1; // Temporary 'Y' values for HC vertices of the overlap
432 : int maxNumberOfFigures = 0;
433 :
434 : #ifdef EP_NO_OPENGL
435 : bool penumbra = false;
436 : #else
437 : std::unique_ptr<Penumbra::Penumbra> penumbra = nullptr;
438 : std::pair<EnergyPlusData *, std::string> LoggerContext;
439 : #endif
440 :
441 : bool GetInputFlag = true;
442 : bool anyScheduledShadingSurface = false;
443 : bool firstTime = true;
444 : bool debugging = false;
445 : std::vector<unsigned> penumbraIDs;
446 :
447 : bool InitComplexOnce = true;
448 : bool ShadowOneTimeFlag = true;
449 : bool CHKSBSOneTimeFlag = true;
450 : bool ORDERFirstTimeFlag = true;
451 : bool TooManyFiguresMessage = false;
452 : bool TooManyVerticesMessage = false;
453 : bool SHDBKSOneTimeFlag = true;
454 : bool SHDGSSOneTimeFlag = true;
455 :
456 : Array1D<SolarShading::SurfaceErrorTracking> TrackTooManyFigures;
457 : Array1D<SolarShading::SurfaceErrorTracking> TrackTooManyVertices;
458 : Array1D<SolarShading::SurfaceErrorTracking> TrackBaseSubSurround;
459 :
460 : Real64 TolValue = 0.0003;
461 : Array1D<Real64> XVT; // X Vertices of
462 : Array1D<Real64> YVT; // Y vertices of
463 : Array1D<Real64> ZVT; // Z vertices of
464 : Array1D<Real64> SLOPE; // Slopes from left-most vertex to others.
465 : int MaxGSS = 50; // Current Max for GSS array
466 : int MaxBKS = 50; // Current Max for BKS array
467 : int MaxSBS = 50; // Current Max for SBS array
468 : int MaxDim = 0;
469 : Array1D<Real64> XVrt; // X Vertices of Shadows
470 : Array1D<Real64> YVrt; // Y vertices of Shadows
471 : Array1D<Real64> ZVrt; // Z vertices of Shadows
472 : Array1D<Real64> XVrtx; // X,Y,Z coordinates of vertices of
473 : Array1D<Real64> YVrtx; // back surfaces projected into system
474 : Array1D<Real64> ZVrtx; // relative to receiving surface
475 : Array1D<Real64> XVert;
476 : Array1D<Real64> YVert;
477 : Array1D<Real64> ZVert;
478 : Array1D<Real64> SurfWinAbsBeam; // Glass layer beam solar absorptance of a window
479 : Array1D<Real64> SurfWinAbsBeamEQL = Array1D<Real64>(DataWindowEquivalentLayer::CFSMAXNL + 1); // layers beam solar absorptance of a window
480 : Array1D<Real64> SurfWinExtBeamAbsByShadFac; // Factor for exterior beam radiation absorbed by shade (1/m2) (absorbed radation = beam incident *
481 : // ExtBeamAbsByShad
482 : Array1D<Real64> SurfWinIntBeamAbsByShadFac; // Like SurfWinExtBeamAbsByShadFac, but for interior beam radiation.
483 : Array1D<Real64>
484 : SurfWinTransBmSolar; // Factor for exterior beam solar transmitted through window, or window plus shade, into zone at current time (m2)
485 : Array1D<Real64>
486 : SurfWinTransDifSolar; // Factor for exterior diffuse solar transmitted through window, or window plus shade, into zone at current time (m2)
487 : Array1D<Real64> SurfWinTransDifSolarGnd; // Factor for exterior ground diffuse solar transmitted through window with horizontally-slatted blind
488 : // into zone at current time (m2)
489 : Array1D<Real64> SurfWinTransDifSolarSky; // Factor for exterior sky diffuse solar transmitted through window with horizontally-slatted blind into
490 : // zone at current time (m2)
491 : Array2D<Real64> SurfWinAbsSolBeamEQL =
492 : Array2D<Real64>(2, DataWindowEquivalentLayer::CFSMAXNL + 1); // absorbed exterior beam radiation by layers fraction
493 : Array2D<Real64> SurfWinAbsSolDiffEQL =
494 : Array2D<Real64>(2, DataWindowEquivalentLayer::CFSMAXNL + 1); // absorbed exterior diffuse radiation by layers fraction
495 : Array2D<Real64> SurfWinAbsSolBeamBackEQL =
496 : Array2D<Real64>(2, DataWindowEquivalentLayer::CFSMAXNL + 1); // absorbed interior beam radiation by layers fraction from back
497 : Array1D<Real64> SurfWinTransBmBmSolar; // Factor for exterior beam to beam solar transmitted through window, or window plus shade, into zone at
498 : // current time (m2)
499 : Array1D<Real64> SurfWinTransBmDifSolar; // Factor for exterior beam to diffuse solar transmitted through window, or window plus shade, into zone
500 : // at current time (m2)
501 : Real64 ThetaBig = 0.0; // Larger of ThetaBlock1 and ThetaBlock2 //Autodesk Used uninitialized in some runs
502 : Real64 ThetaSmall = 0.0; // Smaller of ThetaBlock1 and ThetaBlock2 //Autodesk Used uninitialized in some runs
503 : Real64 ThetaMin = 0.0; // Minimum allowed slat angle, resp. (rad) //Autodesk Used uninitialized in some runs
504 : Real64 ThetaMax = 0.0; // Maximum allowed slat angle, resp. (rad) //Autodesk Used uninitialized in some runs
505 : Array1D<Real64> XVertex; // X,Y,Z coordinates of vertices of
506 : Array1D<Real64> YVertex; // back surfaces projected into system
507 : Array1D<Real64> ZVertex; // relative to receiving surface
508 : std::vector<Real64> sin_Phi;
509 : std::vector<Real64> cos_Phi;
510 : std::vector<Real64> sin_Theta;
511 : std::vector<Real64> cos_Theta;
512 : std::unique_ptr<std::iostream> shd_stream; // Shading file stream
513 :
514 796 : void init_state([[maybe_unused]] EnergyPlusData &state) override
515 : {
516 796 : }
517 :
518 0 : void clear_state() override
519 : {
520 0 : this->MaxHCV = 15;
521 0 : this->MaxHCS = 1500;
522 0 : this->MAXHCArrayBounds = 0;
523 0 : this->MAXHCArrayIncrement = 0;
524 0 : this->NVS = 0;
525 0 : this->NumVertInShadowOrClippedSurface = 0;
526 0 : this->CurrentSurfaceBeingShadowed = 0;
527 0 : this->CurrentShadowingSurface = 0;
528 0 : this->OverlapStatus = 0;
529 0 : this->SurfSunCosTheta.deallocate();
530 0 : this->SurfAnisoSkyMult.deallocate();
531 0 : this->SurfDifShdgRatioIsoSky.deallocate();
532 0 : this->SurfDifShdgRatioIsoSkyHRTS.deallocate();
533 0 : this->SurfCurDifShdgRatioIsoSky.deallocate();
534 0 : this->SurfDifShdgRatioHoriz.deallocate();
535 0 : this->SurfDifShdgRatioHorizHRTS.deallocate();
536 0 : this->SurfWithShdgIsoSky.deallocate();
537 0 : this->SurfWoShdgIsoSky.deallocate();
538 0 : this->SurfWithShdgHoriz.deallocate();
539 0 : this->SurfWoShdgHoriz.deallocate();
540 0 : this->SurfMultIsoSky.deallocate();
541 0 : this->SurfMultCircumSolar.deallocate();
542 0 : this->SurfMultHorizonZenith.deallocate();
543 0 : this->FBKSHC = 0;
544 0 : this->FGSSHC = 0;
545 0 : this->FINSHC = 0;
546 0 : this->FRVLHC = 0;
547 0 : this->FSBSHC = 0;
548 0 : this->LOCHCA = 0;
549 0 : this->NBKSHC = 0;
550 0 : this->NGSSHC = 0;
551 0 : this->NINSHC = 0;
552 0 : this->NRVLHC = 0;
553 0 : this->NSBSHC = 0;
554 0 : this->CalcSkyDifShading = false;
555 0 : this->ShadowingCalcFrequency = 0; // Frequency for Shadowing Calculations
556 0 : this->ShadowingDaysLeft = 0; // Days left in current shadowing period
557 0 : this->debugging = false;
558 0 : this->GetInputFlag = true;
559 0 : this->anyScheduledShadingSurface = false;
560 0 : this->firstTime = true;
561 0 : this->HCNS.deallocate();
562 0 : this->HCNV.deallocate();
563 0 : this->HCA.deallocate();
564 0 : this->HCB.deallocate();
565 0 : this->HCC.deallocate();
566 0 : this->HCX.deallocate();
567 0 : this->HCY.deallocate();
568 0 : this->SurfWinRevealStatus.deallocate();
569 0 : this->HCAREA.deallocate();
570 0 : this->HCT.deallocate();
571 0 : this->SurfIntAbsFac.deallocate();
572 0 : this->SurfSunlitArea.deallocate();
573 0 : this->NumTooManyFigures = 0;
574 0 : this->NumTooManyVertices = 0;
575 0 : this->NumBaseSubSurround = 0;
576 0 : this->XShadowProjection = 0.0;
577 0 : this->YShadowProjection = 0.0;
578 0 : this->XTEMP.deallocate();
579 0 : this->XVC.deallocate();
580 0 : this->XVS.deallocate();
581 0 : this->YTEMP.deallocate();
582 0 : this->YVC.deallocate();
583 0 : this->YVS.deallocate();
584 0 : this->ZVC.deallocate();
585 0 : this->ATEMP.deallocate();
586 0 : this->BTEMP.deallocate();
587 0 : this->CTEMP.deallocate();
588 0 : this->XTEMP1.deallocate();
589 0 : this->YTEMP1.deallocate();
590 0 : this->maxNumberOfFigures = 0;
591 0 : this->TrackTooManyFigures.deallocate();
592 0 : this->TrackTooManyVertices.deallocate();
593 0 : this->TrackBaseSubSurround.deallocate();
594 0 : this->InitComplexOnce = true;
595 0 : this->ShadowOneTimeFlag = true;
596 0 : this->CHKSBSOneTimeFlag = true;
597 0 : this->ORDERFirstTimeFlag = true;
598 0 : this->TooManyFiguresMessage = false;
599 0 : this->TooManyVerticesMessage = false;
600 0 : this->SHDBKSOneTimeFlag = true;
601 0 : this->SHDGSSOneTimeFlag = true;
602 0 : this->TolValue = 0.0003;
603 0 : this->XVT.deallocate();
604 0 : this->YVT.deallocate();
605 0 : this->ZVT.deallocate();
606 0 : this->SLOPE.deallocate();
607 0 : this->MaxGSS = 50;
608 0 : this->MaxBKS = 50;
609 0 : this->MaxSBS = 50;
610 0 : this->MaxDim = 0;
611 0 : this->XVrt.deallocate();
612 0 : this->YVrt.deallocate();
613 0 : this->ZVrt.deallocate();
614 0 : this->XVrtx.deallocate();
615 0 : this->YVrtx.deallocate();
616 0 : this->ZVrtx.deallocate();
617 0 : this->XVert.deallocate();
618 0 : this->YVert.deallocate();
619 0 : this->ZVert.deallocate();
620 0 : this->SurfWinAbsBeam.deallocate();
621 0 : this->SurfWinAbsBeamEQL = Array1D<Real64>(DataWindowEquivalentLayer::CFSMAXNL + 1);
622 0 : this->SurfWinExtBeamAbsByShadFac.deallocate();
623 0 : this->SurfWinIntBeamAbsByShadFac.deallocate();
624 0 : this->SurfWinTransBmSolar.deallocate();
625 0 : this->SurfWinTransDifSolar.deallocate();
626 0 : this->SurfWinTransDifSolarGnd.deallocate();
627 0 : this->SurfWinTransDifSolarSky.deallocate();
628 0 : this->SurfWinAbsSolBeamEQL = Array2D<Real64>(2, DataWindowEquivalentLayer::CFSMAXNL + 1);
629 0 : this->SurfWinAbsSolDiffEQL = Array2D<Real64>(2, DataWindowEquivalentLayer::CFSMAXNL + 1);
630 0 : this->SurfWinAbsSolBeamBackEQL = Array2D<Real64>(2, DataWindowEquivalentLayer::CFSMAXNL + 1);
631 0 : this->SurfWinTransBmBmSolar.deallocate();
632 0 : this->SurfWinTransBmDifSolar.deallocate();
633 0 : this->ThetaBig = 0.0;
634 0 : this->ThetaSmall = 0.0;
635 0 : this->ThetaMin = 0.0;
636 0 : this->ThetaMax = 0.0;
637 0 : this->XVertex.deallocate();
638 0 : this->YVertex.deallocate();
639 0 : this->ZVertex.deallocate();
640 0 : this->sin_Phi.clear();
641 0 : this->cos_Phi.clear();
642 0 : this->sin_Theta.clear();
643 0 : this->cos_Theta.clear();
644 0 : this->shd_stream.reset();
645 0 : }
646 :
647 : // Default Constructor
648 796 : SolarShadingData()
649 796 : : cOverLapStatus(6, {"No-Overlap", "1st-Surf-within-2nd", "2nd-Surf-within-1st", "Partial-Overlap", "Too-Many-Vertices", "Too-Many-Figures"}),
650 1592 : SUNCOS(3)
651 : {
652 796 : }
653 : };
654 :
655 : } // namespace EnergyPlus
656 : #endif
|