Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer | :: | SurfNum | ||||
real(kind=r64) | :: | tout | ||||
real(kind=r64) | :: | tin | ||||
real(kind=r64) | :: | HOutConv | ||||
real(kind=r64) | :: | HInConv | ||||
real(kind=r64) | :: | outir | ||||
integer | :: | ConstrNum |
Nodes of different colours represent the following:
Solid arrows point from a procedure to one which it calls. Dashed arrows point from an interface to procedures which implement that interface. This could include the module procedures in a generic interface or the implementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are given different colours to make them easier to distinguish in large graphs.
Nodes of different colours represent the following:
Solid arrows point from a procedure to one which it calls. Dashed arrows point from an interface to procedures which implement that interface. This could include the module procedures in a generic interface or the implementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are given different colours to make them easier to distinguish in large graphs.
SUBROUTINE CalcWinFrameAndDividerTemps(SurfNum,tout,tin,HOutConv,HInConv,outir,ConstrNum)
! SUBROUTINE INFORMATION:
! AUTHOR F. Winkelmann
! DATE WRITTEN May 2000
! MODIFIED Aug 2000, FCW: Add effect of frame and divider projections
! Jun 2001, FCW: Add frame/divider contribution to WinHeatGain
! Aug 2003, FCW: Fix calculation of divider outside temp: frame
! inside temp was being used instead of divider inside temp
! RE-ENGINEERED na
! PURPOSE OF THIS SUBROUTINE:
! Calculates window frame divider face temperatures from a linearized
! heat balance on the inside and outside faces
! METHODOLOGY EMPLOYED:
! na
! REFERENCES:
! na
IMPLICIT NONE ! Enforce explicit typing of all variables in this routine
! SUBROUTINE ARGUMENT DEFINITIONS:
INTEGER :: SurfNum ! Surface number
REAL(r64) :: tout ! Outside air temperature (K)
REAL(r64) :: tin ! Inside air temperature (K)
REAL(r64) :: HOutConv ! Outside convective air film conductance (W/m2-K)
REAL(r64) :: HInConv ! Inside convective air film conductance (W/m2-K)
REAL(r64) :: outir ! Exterior IR irradiance from sky and ground
INTEGER :: ConstrNum ! Construction number of window
! SUBROUTINE PARAMETER DEFINITIONS:
! na
! INTERFACE BLOCK SPECIFICATIONS:
! na
! DERIVED TYPE DEFINITIONS:
! na
! SUBROUTINE LOCAL VARIABLE DECLARATIONS:
REAL(r64) :: HInRad ! Inside radiative conductance (W/m2-K)
REAL(r64) :: HOutRad ! Outside radiative conductance (W/m2-K)
INTEGER :: FrDivNum ! Frame/divider number
REAL(r64) :: TInRad ! Inside radiative temperature (K)
REAL(r64) :: TInRadFr ! Effective inside radiative temperature for frame (K)
REAL(r64) :: TInRadDiv ! Effective inside radiative temperature for divider (K)
REAL(r64) :: TOutRad ! Outside radiative temperature (K)
REAL(r64) :: TOutRadFr ! Effective outside radiative temperature for frame (K)
REAL(r64) :: TOutRadDiv ! Effective outside radiative temperature for divider (K)
INTEGER :: ShadeFlag ! Window shading flag
REAL(r64) :: FrameCon ! Frame conductance (W/m2-K)
REAL(r64) :: Afac,Bfac,Dfac,Efac ! Intermediate calculation variables
INTEGER :: DivType ! Divider type
REAL(r64) :: DivCon ! Divider conductance (W/m2-K)
REAL(r64) :: DivEmisIn ! Inside divider emissivity
REAL(r64) :: DivEmisOut ! Outside divider emissivity
REAL(r64) :: ProjCorrFrOut ! Outside correction factor for absorbed radiation
! for frame with outside projection
REAL(r64) :: ProjCorrFrIn ! Inside correction factor for absorbed radiation
! for frame with inside projection
REAL(r64) :: HOutConvFr ! Effective outside convective coeff for frame
! with outside projection (W/m2-K)
REAL(r64) :: HOutConvDiv ! Effective outside convective coeff for divider
! with outside projection (W/m2-K)
REAL(r64) :: HInConvFr ! Effective inside convective coeff for frame
! with inside projection (W/m2-K)
REAL(r64) :: HInConvDiv ! Effective inside convective coeff for divider
! with inside projection (W/m2-K)
REAL(r64) :: EmisGlassOut ! Outside surface emissivity of window glazing
REAL(r64) :: EmisGlassIn ! Inside surface emissivity of window glazing
INTEGER :: TotGlassLayers ! Total number of glass layers
INTEGER :: TotLayers ! Total number of layers in unshaded construction
REAL(r64) :: DivTempOut ! Outside surface divider temperature (K)
REAL(r64) :: FrameHeatGain ! Heat gain to zone from frame (W)
REAL(r64) :: ProjCorrWinHeatGain ! Inside projection correction to IR from divider to zone
! for window heat gain calculation
REAL(r64) :: DividerConduction ! Conduction through divider from outside to inside face (W)
REAL(r64) :: DividerConvHeatGain ! Convective heat gain from divider to zone (W)
REAL(r64) :: DividerRadHeatGain ! Convective IR radiative gain from divider to zone (W)
REAL(r64) :: DividerHeatGain ! Heat gain from divider to zone (W)
TInRad = (SurfaceWindow(SurfNum)%IRfromParentZone/sigma)**0.25d0
TOutRad = (outir/sigma)**0.25d0
ShadeFlag = SurfaceWindow(SurfNum)%ShadingFlag
FrDivNum = Surface(SurfNum)%FrameDivider
TotLayers = Construct(ConstrNum)%TotLayers
TotGlassLayers = Construct(ConstrNum)%TotSolidLayers
EmisGlassOut = Material(Construct(ConstrNum)%LayerPoint(1))%AbsorpThermalFront
EmisGlassIn = Material(Construct(ConstrNum)%LayerPoint(TotLayers))%AbsorpThermalBack
FrameHeatGain = 0.0d0
DividerConduction = 0.0d0
SurfaceWindow(SurfNum)%FrameHeatGain = 0.0d0
SurfaceWindow(SurfNum)%FrameHeatLoss = 0.0d0
SurfaceWindow(SurfNum)%DividerHeatGain = 0.0d0
SurfaceWindow(SurfNum)%DividerHeatLoss = 0.0d0
IF(SurfaceWindow(SurfNum)%FrameArea > 0.0d0) THEN
! Window has a frame. Note that if a shade, screen or blind is present it covers only the glazed part of the
! window and is assumed not to shadow long- or short-wave radiation incident on the frame elements.
ProjCorrFrOut = SurfaceWindow(SurfNum)%ProjCorrFrOut
ProjCorrFrIn = SurfaceWindow(SurfNum)%ProjCorrFrIn
TOutRadFr = TOutRad * ((1.d0+0.5d0*ProjCorrFrOut)/(1.d0+ProjCorrFrOut))**0.25d0
TInRadFr = TInRad * ((1.d0+0.5d0*ProjCorrFrIn)/(1.d0+ProjCorrFrIn))**0.25d0
FrameCon = SurfaceWindow(SurfNum)%FrameConductance
HInRad = 0.5d0 * SurfaceWindow(SurfNum)%FrameEmis * sigma * &
(TInRadFr + SurfaceWindow(SurfNum)%FrameTempSurfIn + TKelvin)**3
HInConvFr = 0.0d0
HOutRad = 0.5d0 * SurfaceWindow(SurfNum)%FrameEmis * sigma * &
(TOutRadFr + SurfaceWindow(SurfNum)%FrameTempSurfOut + TKelvin)**3
HOutConvFr = HOutConv
IF(FrameDivider(FrDivNum)%FrameProjectionOut > 0.0d0) THEN
HOutRad = HOutRad * (1.d0+ProjCorrFrOut)
HOutConvFr = HOutConv * (1.d0+ProjCorrFrOut)
! Add long-wave from outside window surface absorbed by frame outside projection
SurfaceWindow(SurfNum)%FrameQRadOutAbs = SurfaceWindow(SurfNum)%FrameQRadOutAbs + &
0.5d0 * SurfaceWindow(SurfNum)%ProjCorrFrOut * FrameDivider(FrDivNum)%FrameEmis * &
EmisGlassOut * sigma * SurfaceWindow(SurfNum)%ThetaFace(1)**4
END IF
IF(FrameDivider(FrDivNum)%FrameProjectionIn > 0.0d0) THEN
HInRad = HInRad * (1.d0+ProjCorrFrIn)
HInConvFr = HInConv * (1.d0+ProjCorrFrIn)
! Add long-wave from inside window surface absorbed by frame inside projection
SurfaceWindow(SurfNum)%FrameQRadInAbs = SurfaceWindow(SurfNum)%FrameQRadInAbs + &
0.5d0 * SurfaceWindow(SurfNum)%ProjCorrFrIn * FrameDivider(FrDivNum)%FrameEmis * &
EmisGlassIn * sigma * SurfaceWindow(SurfNum)%ThetaFace(2*TotGlassLayers)**4
END IF
Afac = (HOutRad*TOutRadFr + HOutConvFr*tout + SurfaceWindow(SurfNum)%FrameQRadOutAbs) / &
(HOutRad + FrameCon + HOutConvFr)
Bfac = FrameCon / (HOutRad + FrameCon + HOutConvFr)
Dfac = (HInRad*TInRadFr + HInConvFr*tin + SurfaceWindow(SurfNum)%FrameQRadInAbs) / &
(HInRad + FrameCon + HInConvFr)
Efac = FrameCon / (HInRad + FrameCon + HInConvFr)
SurfaceWindow(SurfNum)%FrameTempSurfIn = (Dfac + Efac*Afac)/(1.d0 - Efac*Bfac) - TKelvin
SurfaceWindow(SurfNum)%FrameTempSurfOut = Afac + &
Bfac*(SurfaceWindow(SurfNum)%FrameTempSurfIn+TKelvin) - TKelvin
! Heat gain to zone from frame
! FrameHeatGain = SurfaceWindow(SurfNum)%FrameArea * (1.+SurfaceWindow(SurfNum)%ProjCorrFrIn) * &
! ( SurfaceWindow(SurfNum)%FrameEmis*(sigma*(SurfaceWindow(SurfNum)%FrameTempSurfIn+TKelvin)**4 - rmir) + &
! hcin*(SurfaceWindow(SurfNum)%FrameTempSurfIn+TKelvin - tin) )
FrameHeatGain = SurfaceWindow(SurfNum)%FrameArea * (1.d0+SurfaceWindow(SurfNum)%ProjCorrFrIn) * &
( hcin*(SurfaceWindow(SurfNum)%FrameTempSurfIn+TKelvin - tin) )
IF (FrameHeatGain > 0.0d0) THEN
SurfaceWindow(SurfNum)%FrameHeatGain = FrameHeatGain
ELSE
SurfaceWindow(SurfNum)%FrameHeatLoss = ABS(FrameHeatGain)
ENDIF
WinHeatGain(SurfNum) = WinHeatGain(SurfNum) + FrameHeatGain
WinGainFrameDividerToZoneRep(SurfNum) = FrameHeatGain
END IF ! End of check if window has a frame
IF(SurfaceWindow(SurfNum)%DividerArea > 0.0d0 .AND. SurfaceWindow(SurfNum)%StormWinFlag < 1) THEN
! Window has divider. Note that if the window has a storm window layer in place (StormWinFlag = 1)
! the divider heat transfer calculation is not done.
DivType = SurfaceWindow(SurfNum)%DividerType
DivCon = SurfaceWindow(SurfNum)%DividerConductance
IF(DivType == DividedLite) THEN ! Divided lite
DivEmisIn = SurfaceWindow(SurfNum)%DividerEmis
DivEmisOut = DivEmisIn
ELSE ! Suspended (between-glass) divider
DivEmisOut = Material(Construct(ConstrNum)%LayerPoint(1))%AbsorpThermalFront
DivEmisIn = Material(Construct(ConstrNum)%LayerPoint(Construct(ConstrNum)%TotLayers))%AbsorpThermalBack
END IF
TOutRadDiv = TOutRad* &
((1.d0+SurfaceWindow(SurfNum)%ProjCorrDivOut)/(1.d0+2.d0*SurfaceWindow(SurfNum)%ProjCorrDivOut))**0.25d0
TInRadDiv = TInRad* &
((1.d0+SurfaceWindow(SurfNum)%ProjCorrDivIn)/(1.d0+2.d0*SurfaceWindow(SurfNum)%ProjCorrDivIn))**0.25d0
HInRad = 0.5d0 * DivEmisIn * sigma * &
(TInRadDiv + SurfaceWindow(SurfNum)%DividerTempSurfIn + TKelvin)**3
HOutRad = 0.5d0 * DivEmisOut * sigma * &
(TOutRadDiv + SurfaceWindow(SurfNum)%DividerTempSurfOut + TKelvin)**3
HOutConvDiv = HOutConv
IF(FrameDivider(FrDivNum)%DividerProjectionOut > 0.0d0) THEN
HOutRad = HOutRad * (1.d0+2.d0*SurfaceWindow(SurfNum)%ProjCorrDivOut)
IF(SurfaceWindow(SurfNum)%ShadingFlag == ExtShadeOn) HOutConvDiv = &
SurfaceWindow(SurfNum)%ConvCoeffWithShade
HOutConvDiv = HOutConvDiv * (1.d0+2.d0*SurfaceWindow(SurfNum)%ProjCorrDivOut)
! Add long-wave from outside window surface absorbed by divider outside projection
SurfaceWindow(SurfNum)%DividerQRadOutAbs = SurfaceWindow(SurfNum)%DividerQRadOutAbs + &
SurfaceWindow(SurfNum)%ProjCorrDivOut * FrameDivider(FrDivNum)%DividerEmis * &
EmisGlassOut * sigma * SurfaceWindow(SurfNum)%ThetaFace(1)**4
END IF
HInConvDiv = HInConv
IF(FrameDivider(FrDivNum)%DividerProjectionIn > 0.0d0) THEN
HInRad = HInRad * (1.d0+2.d0*SurfaceWindow(SurfNum)%ProjCorrDivIn)
IF(SurfaceWindow(SurfNum)%ShadingFlag == IntShadeOn) HInConvDiv = &
SurfaceWindow(SurfNum)%ConvCoeffWithShade
HInConvDiv = HInConvDiv * (1.d0+2.d0*SurfaceWindow(SurfNum)%ProjCorrDivIn)
! Add long-wave from inside window surface absorbed by divider inside projection
SurfaceWindow(SurfNum)%DividerQRadInAbs = SurfaceWindow(SurfNum)%DividerQRadInAbs + &
SurfaceWindow(SurfNum)%ProjCorrDivIn * FrameDivider(FrDivNum)%DividerEmis * &
EmisGlassIn * sigma * SurfaceWindow(SurfNum)%ThetaFace(2*TotGlassLayers)**4
END IF
Afac = (HOutRad*TOutRadDiv + HOutConvDiv*tout + SurfaceWindow(SurfNum)%DividerQRadOutAbs) / &
(HOutRad + DivCon + HOutConvDiv)
Bfac = DivCon / (HOutRad + DivCon + HOutConvDiv)
Dfac = (HInRad*TInRadDiv + HInConvDiv*tin + SurfaceWindow(SurfNum)%DividerQRadInAbs) / &
(HInRad + DivCon + HInConvDiv)
Efac = DivCon / (HInRad + DivCon + HInConvDiv)
SurfaceWindow(SurfNum)%DividerTempSurfIn = (Dfac + Efac*Afac)/(1 - Efac*Bfac) - TKelvin
SurfaceWindow(SurfNum)%DividerTempSurfOut = Afac + Bfac*(SurfaceWindow(SurfNum)%DividerTempSurfIn &
+ TKelvin) - TKelvin
! Contribution of divider to window heat gain
ProjCorrWinHeatGain = 1.d0 + 2.d0*SurfaceWindow(SurfNum)%ProjCorrDivIn
DividerConduction = SurfaceWindow(SurfNum)%DividerArea * DivCon * &
(SurfaceWindow(SurfNum)%DividerTempSurfOut - SurfaceWindow(SurfNum)%DividerTempSurfin)
IF (DividerConduction > 0.0d0) THEN
SurfaceWindow(SurfNum)%DividerHeatGain = DividerConduction
ELSE
SurfaceWindow(SurfNum)%DividerHeatLoss = ABS(DividerConduction)
ENDIF
WinHeatGain(SurfNum) = WinHeatGain(SurfNum) + DividerConduction
WinGainFrameDividerToZoneRep(SurfNum) = WinGainFrameDividerToZoneRep(SurfNum) + DividerConduction
! The following three statements are for debugging purposes only
DividerConvHeatGain = SurfaceWindow(SurfNum)%DividerArea * &
HInConvDiv * (SurfaceWindow(SurfNum)%DividerTempSurfIn + TKelvin - tin)
DividerRadHeatGain = SurfaceWindow(SurfNum)%DividerArea * &
HInRad * (SurfaceWindow(SurfNum)%DividerTempSurfIn + TKelvin - TInRadDiv) &
- SurfaceWindow(SurfNum)%DividerArea * SurfaceWindow(SurfNum)%DividerQRadInAbs
DividerHeatGain = DividerConvHeatGain + DividerRadHeatGain
! If interior shade is present it is assumed that both the convective and IR radiative gain
! from the inside surface of the divider goes directly into the zone air -- i.e., the IR radiative
! interaction between divider and shade is ignored due to the difficulty of calculating this interaction
! at the same time that the interaction between glass and shade is calculated.
IF (SurfaceWindow(SurfNum)%ShadingFlag == IntShadeOn .OR. SurfaceWindow(SurfNum)%ShadingFlag == IntBlindOn) &
SurfaceWindow(SurfNum)%DividerConduction = DividerConduction
DivTempOut = SurfaceWindow(SurfNum)%DividerTempSurfOut + TKelvin
END IF ! End of check if window has dividers
END SUBROUTINE CalcWinFrameAndDividerTemps