Skip to content

Commit 1ec1ae6

Browse files
committed
Break MaterialGas and MaterialScreen from MaterialChild, reformulate screen to use static beam trans-abs-refl map and interpolation rather that direct calculation, following pattern used for blinds
1 parent 7b8d195 commit 1ec1ae6

16 files changed

+1673
-1432
lines changed

src/EnergyPlus/DataHeatBalance.cc

Lines changed: 85 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -353,20 +353,19 @@ void CheckAndSetConstructionProperties(EnergyPlusData &state,
353353
thisConstruct.DayltPropPtr = 0;
354354
int InsideMaterNum = thisConstruct.LayerPoint(InsideLayer); // Material "number" of the Inside layer
355355
if (InsideMaterNum != 0) {
356-
auto const *thisMaterialInside = dynamic_cast<const Material::MaterialChild *>(state.dataMaterial->Material(InsideMaterNum));
357-
thisConstruct.InsideAbsorpVis = thisMaterialInside->AbsorpVisible;
358-
thisConstruct.InsideAbsorpSolar = thisMaterialInside->AbsorpSolar;
356+
auto const *mat = state.dataMaterial->Material(InsideMaterNum);
357+
thisConstruct.InsideAbsorpVis = mat->AbsorpVisible;
358+
thisConstruct.InsideAbsorpSolar = mat->AbsorpSolar;
359359

360360
// Following line applies only to opaque surfaces; it is recalculated later for windows.
361-
thisConstruct.ReflectVisDiffBack = 1.0 - thisMaterialInside->AbsorpVisible;
361+
thisConstruct.ReflectVisDiffBack = 1.0 - mat->AbsorpVisible;
362362
}
363363

364364
int OutsideMaterNum = thisConstruct.LayerPoint(1); // Material "number" of the Outside layer
365365
if (OutsideMaterNum != 0) {
366-
auto const *thisMaterialOutside = dynamic_cast<const Material::MaterialChild *>(state.dataMaterial->Material(OutsideMaterNum));
367-
assert(thisMaterialOutside != nullptr);
368-
thisConstruct.OutsideAbsorpVis = thisMaterialOutside->AbsorpVisible;
369-
thisConstruct.OutsideAbsorpSolar = thisMaterialOutside->AbsorpSolar;
366+
auto const *mat = state.dataMaterial->Material(OutsideMaterNum);
367+
thisConstruct.OutsideAbsorpVis = mat->AbsorpVisible;
368+
thisConstruct.OutsideAbsorpSolar = mat->AbsorpSolar;
370369
}
371370

372371
thisConstruct.TotSolidLayers = 0;
@@ -397,9 +396,9 @@ void CheckAndSetConstructionProperties(EnergyPlusData &state,
397396
}
398397

399398
if (InsideMaterNum == 0) return;
400-
auto const *thisMaterialInside = dynamic_cast<const Material::MaterialChild *>(state.dataMaterial->Material(InsideMaterNum));
399+
auto const *thisMaterialInside = state.dataMaterial->Material(InsideMaterNum);
401400
if (OutsideMaterNum == 0) return;
402-
auto const *thisMaterialOutside = dynamic_cast<const Material::MaterialChild *>(state.dataMaterial->Material(OutsideMaterNum));
401+
auto const *thisMaterialOutside = state.dataMaterial->Material(OutsideMaterNum);
403402

404403
if (thisConstruct.TypeIsWindow) {
405404

@@ -500,14 +499,19 @@ void CheckAndSetConstructionProperties(EnergyPlusData &state,
500499

501500
// If there is a diffusing glass layer no shade, screen or blind is allowed
502501
for (int Layer = 1; Layer <= TotLayers; ++Layer) {
503-
int const MaterNum = thisConstruct.LayerPoint(Layer);
504-
if (MaterNum == 0) continue; // error -- has been caught will stop program later
505-
auto const *thisMaterial = dynamic_cast<Material::MaterialChild *>(state.dataMaterial->Material(MaterNum));
506-
assert(thisMaterial != nullptr);
507-
if (thisMaterial->SolarDiffusing && TotShadeLayers > 0) {
502+
int const MatNum = thisConstruct.LayerPoint(Layer);
503+
if (MatNum == 0) continue; // error -- has been caught will stop program later
504+
auto const *mat = state.dataMaterial->Material(MatNum);
505+
if (mat->group != Material::Group::WindowGlass && mat->group != Material::Group::WindowSimpleGlazing &&
506+
mat->group != Material::Group::GlassEquivalentLayer)
507+
continue;
508+
509+
auto const *matGlass = dynamic_cast<Material::MaterialChild const *>(mat);
510+
assert(matGlass != nullptr);
511+
if (matGlass->SolarDiffusing && TotShadeLayers > 0) {
508512
ErrorsFound = true;
509513
ShowSevereError(state, format("CheckAndSetConstructionProperties: Window construction={}", thisConstruct.Name));
510-
ShowContinueError(state, format("has diffusing glass={} and a shade, screen or blind layer.", thisMaterial->Name));
514+
ShowContinueError(state, format("has diffusing glass={} and a shade, screen or blind layer.", matGlass->Name));
511515
break;
512516
}
513517
}
@@ -516,17 +520,18 @@ void CheckAndSetConstructionProperties(EnergyPlusData &state,
516520
if (TotGlassLayers > 1) {
517521
int GlassLayNum = 0;
518522
for (int Layer = 1; Layer <= TotLayers; ++Layer) {
519-
int const MaterNum = thisConstruct.LayerPoint(Layer);
520-
if (MaterNum == 0) continue; // error -- has been caught will stop program later
521-
auto const *thisMaterial = dynamic_cast<Material::MaterialChild *>(state.dataMaterial->Material(MaterNum));
522-
assert(thisMaterial != nullptr);
523-
if (thisMaterial->group == Material::Group::WindowGlass) {
524-
++GlassLayNum;
525-
if (GlassLayNum < TotGlassLayers && thisMaterial->SolarDiffusing) {
526-
ErrorsFound = true;
527-
ShowSevereError(state, format("CheckAndSetConstructionProperties: Window construction={}", thisConstruct.Name));
528-
ShowContinueError(state, format("has diffusing glass={} that is not the innermost glass layer.", thisMaterial->Name));
529-
}
523+
int const MatNum = thisConstruct.LayerPoint(Layer);
524+
if (MatNum == 0) continue; // error -- has been caught will stop program later
525+
auto const *mat = state.dataMaterial->Material(MatNum);
526+
if (mat->group != Material::Group::WindowGlass) continue;
527+
528+
auto const *matGlass = dynamic_cast<Material::MaterialChild const *>(mat);
529+
assert(matGlass != nullptr);
530+
++GlassLayNum;
531+
if (GlassLayNum < TotGlassLayers && matGlass->SolarDiffusing) {
532+
ErrorsFound = true;
533+
ShowSevereError(state, format("CheckAndSetConstructionProperties: Window construction={}", thisConstruct.Name));
534+
ShowContinueError(state, format("has diffusing glass={} that is not the innermost glass layer.", matGlass->Name));
530535
}
531536
}
532537
}
@@ -599,8 +604,8 @@ void CheckAndSetConstructionProperties(EnergyPlusData &state,
599604
// Gas on either side of a between-glass shade/blind must be the same
600605
int const MatGapL = thisConstruct.LayerPoint(LayNumSh - 1);
601606
int const MatGapR = thisConstruct.LayerPoint(LayNumSh + 1);
602-
auto const *thisMaterialGapL = dynamic_cast<const Material::MaterialChild *>(state.dataMaterial->Material(MatGapL));
603-
auto const *thisMaterialGapR = dynamic_cast<const Material::MaterialChild *>(state.dataMaterial->Material(MatGapR));
607+
auto const *thisMaterialGapL = dynamic_cast<const Material::MaterialGasMixture *>(state.dataMaterial->Material(MatGapL));
608+
auto const *thisMaterialGapR = dynamic_cast<const Material::MaterialGasMixture *>(state.dataMaterial->Material(MatGapR));
604609
for (int IGas = 1; IGas <= 5; ++IGas) {
605610
if ((thisMaterialGapL->gasTypes(IGas) != thisMaterialGapR->gasTypes(IGas)) ||
606611
(thisMaterialGapL->GasFract(IGas) != thisMaterialGapR->GasFract(IGas)))
@@ -939,6 +944,7 @@ void AddVariableSlatBlind(EnergyPlusData &state,
939944
}
940945
}
941946

947+
#ifdef GET_OUT
942948
void CalcScreenTransmittance(EnergyPlusData &state,
943949
int const SurfaceNum,
944950
ObjexxFCL::Optional<Real64 const> Phi, // Optional sun altitude relative to surface outward normal (radians)
@@ -1072,7 +1078,7 @@ void CalcScreenTransmittance(EnergyPlusData &state,
10721078
}
10731079
SunAltitude = SunAltitudeToScreenNormal;
10741080
} else {
1075-
SunAltitude = (Constant::PiOvr2 - std::acos(state.dataEnvrn->SOLCOS(3)));
1081+
SunAltitude = (Constant::PiOvr2 - std::acos(state.dataEnvrn->SOLCOS.z));
10761082
SurfaceTilt = state.dataSurface->Surface(SurfaceNum).Tilt * Constant::DegToRadians;
10771083
SunAltitudeToScreenNormal = std::abs(SunAltitude + (SurfaceTilt - Constant::PiOvr2));
10781084
if (SunAltitudeToScreenNormal > Constant::PiOvr2) {
@@ -1096,10 +1102,10 @@ void CalcScreenTransmittance(EnergyPlusData &state,
10961102
IncidentAngle = 0.0;
10971103
}
10981104

1099-
auto &thisScreen = state.dataMaterial->Screens(ScNum);
1100-
11011105
// ratio of screen material diameter to screen material spacing
1102-
Gamma = thisScreen.ScreenDiameterToSpacingRatio;
1106+
auto *screen = dynamic_cast<Material::MaterialScreen*>(state.dataMaterial->Material(ScNum));
1107+
assert(screen != nullptr);
1108+
Gamma = screen->diameterToSpacingRatio;
11031109

11041110
// ************************************************************************************************
11051111
// * calculate transmittance of totally absorbing screen material (beam passing through open area)*
@@ -1148,8 +1154,8 @@ void CalcScreenTransmittance(EnergyPlusData &state,
11481154
// * calculate transmittance of scattered beam due to reflecting screen material *
11491155
// *******************************************************************************
11501156

1151-
ReflectCyl = thisScreen.ReflectCylinder;
1152-
ReflectCylVis = thisScreen.ReflectCylinderVis;
1157+
ReflectCyl = screen->CylinderRefl;
1158+
ReflectCylVis = screen->CylinderReflVis;
11531159

11541160
if (std::abs(SunAzimuthToScreenNormal - Constant::PiOvr2) < Small || std::abs(SunAltitudeToScreenNormal - Constant::PiOvr2) < Small) {
11551161
Tscattered = 0.0;
@@ -1188,65 +1194,69 @@ void CalcScreenTransmittance(EnergyPlusData &state,
11881194
Tscattered = max(0.0, Tscattered);
11891195
TscatteredVis = max(0.0, TscatteredVis);
11901196

1191-
if (thisScreen.screenBeamReflectanceModel == Material::ScreenBeamReflectanceModel::DoNotModel) {
1197+
if (screen->beamReflectanceModel == Material::ScreenBeamReflectanceModel::DoNotModel) {
11921198
if (std::abs(IncidentAngle) <= Constant::PiOvr2) {
1193-
thisScreen.BmBmTrans = Tdirect;
1194-
thisScreen.BmBmTransVis = Tdirect;
1195-
thisScreen.BmBmTransBack = 0.0;
1199+
screen->BmBmTrans = Tdirect;
1200+
screen->BmBmTransVis = Tdirect;
1201+
screen->BmBmTransBack = 0.0;
11961202
} else {
1197-
thisScreen.BmBmTrans = 0.0;
1198-
thisScreen.BmBmTransVis = 0.0;
1199-
thisScreen.BmBmTransBack = Tdirect;
1203+
screen->BmBmTrans = 0.0;
1204+
screen->BmBmTransVis = 0.0;
1205+
screen->BmBmTransBack = Tdirect;
12001206
}
12011207
Tscattered = 0.0;
12021208
TscatteredVis = 0.0;
1203-
} else if (thisScreen.screenBeamReflectanceModel == Material::ScreenBeamReflectanceModel::DirectBeam) {
1209+
} else if (screen->beamReflectanceModel == Material::ScreenBeamReflectanceModel::DirectBeam) {
12041210
if (std::abs(IncidentAngle) <= Constant::PiOvr2) {
1205-
thisScreen.BmBmTrans = Tdirect + Tscattered;
1206-
thisScreen.BmBmTransVis = Tdirect + TscatteredVis;
1207-
thisScreen.BmBmTransBack = 0.0;
1211+
screen->BmBmTrans = Tdirect + Tscattered;
1212+
screen->BmBmTransVis = Tdirect + TscatteredVis;
1213+
screen->BmBmTransBack = 0.0;
12081214
} else {
1209-
thisScreen.BmBmTrans = 0.0;
1210-
thisScreen.BmBmTransVis = 0.0;
1211-
thisScreen.BmBmTransBack = Tdirect + Tscattered;
1215+
screen->BmBmTrans = 0.0;
1216+
screen->BmBmTransVis = 0.0;
1217+
screen->BmBmTransBack = Tdirect + Tscattered;
12121218
}
12131219
Tscattered = 0.0;
12141220
TscatteredVis = 0.0;
1215-
} else if (thisScreen.screenBeamReflectanceModel == Material::ScreenBeamReflectanceModel::Diffuse) {
1221+
} else if (screen->beamReflectanceModel == Material::ScreenBeamReflectanceModel::Diffuse) {
12161222
if (std::abs(IncidentAngle) <= Constant::PiOvr2) {
1217-
thisScreen.BmBmTrans = Tdirect;
1218-
thisScreen.BmBmTransVis = Tdirect;
1219-
thisScreen.BmBmTransBack = 0.0;
1223+
screen->BmBmTrans = Tdirect;
1224+
screen->BmBmTransVis = Tdirect;
1225+
screen->BmBmTransBack = 0.0;
12201226
} else {
1221-
thisScreen.BmBmTrans = 0.0;
1222-
thisScreen.BmBmTransVis = 0.0;
1223-
thisScreen.BmBmTransBack = Tdirect;
1227+
screen->BmBmTrans = 0.0;
1228+
screen->BmBmTransVis = 0.0;
1229+
screen->BmBmTransBack = Tdirect;
12241230
}
12251231
}
12261232

12271233
if (std::abs(IncidentAngle) <= Constant::PiOvr2) {
1228-
thisScreen.BmDifTrans = Tscattered;
1229-
thisScreen.BmDifTransVis = TscatteredVis;
1230-
thisScreen.BmDifTransBack = 0.0;
1231-
thisScreen.ReflectSolBeamFront = max(0.0, ReflectCyl * (1.0 - Tdirect) - Tscattered);
1232-
thisScreen.ReflectVisBeamFront = max(0.0, ReflectCylVis * (1.0 - Tdirect) - TscatteredVis);
1233-
thisScreen.AbsorpSolarBeamFront = max(0.0, (1.0 - Tdirect) * (1.0 - ReflectCyl));
1234-
thisScreen.ReflectSolBeamBack = 0.0;
1235-
thisScreen.ReflectVisBeamBack = 0.0;
1236-
thisScreen.AbsorpSolarBeamBack = 0.0;
1234+
screen->BmDifTrans = Tscattered;
1235+
screen->BmDifTransVis = TscatteredVis;
1236+
screen->BmDifTransBack = 0.0;
1237+
screen->ReflectSolBeamFront = max(0.0, ReflectCyl * (1.0 - Tdirect) - Tscattered);
1238+
screen->ReflectVisBeamFront = max(0.0, ReflectCylVis * (1.0 - Tdirect) - TscatteredVis);
1239+
screen->AbsorpSolarBeamFront = max(0.0, (1.0 - Tdirect) * (1.0 - ReflectCyl));
1240+
screen->ReflectSolBeamBack = 0.0;
1241+
screen->ReflectVisBeamBack = 0.0;
1242+
screen->AbsorpSolarBeamBack = 0.0;
12371243
} else {
1238-
thisScreen.BmDifTrans = 0.0;
1239-
thisScreen.BmDifTransVis = 0.0;
1240-
thisScreen.BmDifTransBack = Tscattered;
1241-
thisScreen.ReflectSolBeamBack = max(0.0, ReflectCyl * (1.0 - Tdirect) - Tscattered);
1242-
thisScreen.ReflectVisBeamBack = max(0.0, ReflectCylVis * (1.0 - Tdirect) - TscatteredVis);
1243-
thisScreen.AbsorpSolarBeamBack = max(0.0, (1.0 - Tdirect) * (1.0 - ReflectCyl));
1244-
thisScreen.ReflectSolBeamFront = 0.0;
1245-
thisScreen.ReflectVisBeamFront = 0.0;
1246-
thisScreen.AbsorpSolarBeamFront = 0.0;
1244+
screen->BmDifTrans = 0.0;
1245+
screen->BmDifTransVis = 0.0;
1246+
screen->BmDifTransBack = Tscattered;
1247+
screen->ReflectSolBeamBack = max(0.0, ReflectCyl * (1.0 - Tdirect) - Tscattered);
1248+
screen->ReflectVisBeamBack = max(0.0, ReflectCylVis * (1.0 - Tdirect) - TscatteredVis);
1249+
screen->AbsorpSolarBeamBack = max(0.0, (1.0 - Tdirect) * (1.0 - ReflectCyl));
1250+
screen->ReflectSolBeamFront = 0.0;
1251+
screen->ReflectVisBeamFront = 0.0;
1252+
screen->AbsorpSolarBeamFront = 0.0;
12471253
}
1248-
}
1254+
} // CalcScreenTransmittance()
1255+
#else // GET_OUT
12491256

1257+
1258+
#endif // GET_OUT
1259+
12501260
Real64 ComputeNominalUwithConvCoeffs(EnergyPlusData &state,
12511261
int const numSurf, // index for Surface array.
12521262
bool &isValid // returns true if result is valid

0 commit comments

Comments
 (0)