Nodes of different colours represent the following:
Solid arrows point from a parent (sub)module to the submodule which is descended from it. Dashed arrows point from a module being used to the module or program unit using it. Where possible, edges connecting nodes are given different colours to make them easier to distinguish in large graphs.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer, | intent(in) | :: | RadSysNum | |||
real(kind=r64), | intent(inout) | :: | LoadMet |
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 CalcLowTempHydrRadSysComps(RadSysNum,LoadMet)
! SUBROUTINE INFORMATION:
! AUTHOR Rick Strand
! DATE WRITTEN November 2000
! MODIFIED Sep 2011 LKL/BG - resimulate only zones needing it for Radiant systems
! RE-ENGINEERED na
! PURPOSE OF THIS SUBROUTINE:
! This subroutine solves the radiant system based on how much water is (and
! the conditions of the water) supplied to the radiant system.
! METHODOLOGY EMPLOYED:
! Use heat exchanger formulas to obtain the heat source/sink for the radiant
! system based on the inlet conditions and flow rate of water. Once that is
! determined, recalculate the surface heat balances to reflect this heat
! addition/subtraction. The load met by the system is determined by the
! difference between the convection from all surfaces in the zone when
! there was no radiant system output and with a source/sink added.
! REFERENCES:
! IBLAST-QTF research program, completed in January 1995 (unreleased)
! Strand, R.K. 1995. "Heat Source Transfer Functions and Their Application to
! Low Temperature Radiant Heating Systems", Ph.D. dissertation, University
! of Illinois at Urbana-Champaign, Department of Mechanical and Industrial
! Engineering.
! USE STATEMENTS:
USE DataEnvironment, ONLY : OutBaroPress
USE General, ONLY : RoundSigDigits
USE DataHeatBalance, ONLY : Construct, Zone
USE DataHeatBalFanSys, ONLY : RadSysTiHBConstCoef, &
RadSysTiHBToutCoef,RadSysTiHBQsrcCoef, &
RadSysToHBConstCoef,RadSysToHBTinCoef, &
RadSysToHBQsrcCoef,CTFTsrcConstPart, &
ZoneAirHumRat
USE DataHeatBalSurface, ONLY : TH
USE DataLoopNode, ONLY : Node
USE DataSurfaces, ONLY : Surface, HeatTransferModel_CondFD, HeatTransferModel_CTF
USE PlantUtilities, ONLY : SetComponentFlowRate
IMPLICIT NONE ! Enforce explicit typing of all variables in this routine
! SUBROUTINE ARGUMENT DEFINITIONS:
INTEGER, INTENT(IN) :: RadSysNum ! Index for the low temperature radiant system under consideration
REAL(r64), INTENT(INOUT) :: LoadMet ! Load met by the low temperature radiant system, in Watts
! SUBROUTINE PARAMETER DEFINITIONS:
REAL(r64), PARAMETER :: CondDeltaTemp = 1.0d0 ! How close the surface temperatures can get to the dewpoint temperature of a space
! before the radiant cooling system shuts off the flow.
! INTERFACE BLOCK SPECIFICATIONS
! na
! DERIVED TYPE DEFINITIONS
! na
! SUBROUTINE LOCAL VARIABLE DECLARATIONS:
INTEGER :: CondSurfNum ! Surface number (in radiant array) of
INTEGER :: ConstrNum ! Index for construction number in Construct derived type
REAL(r64) :: DewPointTemp ! Dew-point temperature based on the zone air conditions
REAL(r64) :: EpsMdotCp ! Epsilon (heat exchanger terminology) times water mass flow rate times water specific heat
REAL(r64) :: FullWaterMassFlow ! Original water mass flow rate before reducing the flow for condensation concerns
REAL(r64) :: LowestRadSurfTemp ! Lowest surface temperature of a radiant system (when condensation is a concern)
REAL(r64) :: PredictedCondTemp ! Temperature at which condensation is predicted (includes user parameter)
INTEGER :: RadSurfNum ! DO loop counter for the surfaces that comprise a particular radiant system
INTEGER :: RadSurfNum2 ! DO loop counter for the surfaces that comprise a particular radiant system
INTEGER :: RadSurfNum3 ! DO loop counter for the surfaces that comprise a particular radiant system
REAL(r64) :: ReductionFrac ! Fraction that the flow should be reduced to avoid condensation
INTEGER :: SurfNum ! Index for radiant surface in Surface derived type
INTEGER :: SurfNum2 ! Index for radiant surface in Surface derived type
REAL(r64) :: SysWaterMassFlow ! System level water mass flow rate (includes effect of zone multiplier)
REAL(r64) :: WaterMassFlow ! Water mass flow rate in the radiant system, kg/s
INTEGER :: WaterNodeIn ! Node number of the water entering the radiant system
REAL(r64) :: WaterTempIn ! Temperature of the water entering the radiant system, in C
REAL(r64) :: ZeroFlowSurfTemp ! Temperature of radiant surface when flow is zero
INTEGER :: ZoneNum ! Zone pointer for this radiant system
REAL(r64) :: Ca,Cb,Cc,Cd,Ce,Cf,Cg,Ch,Ci,Cj,Ck,Cl ! Coefficients to relate the inlet water temperature to the heat source
! For more info on Ca through Cl, see comments below
! FLOW:
! First, apply heat exchanger logic to find the heat source/sink to the system.
! This involves finding out the heat transfer characteristics of the hydronic
! loop and then applying the equations derived on pp. 113-118 of the dissertation.
! Set the conditions on the water side inlet
SELECT CASE(OperatingMode)
CASE (HeatingMode)
WaterNodeIn = HydrRadSys(RadSysNum)%HotWaterInNode
CASE (CoolingMode)
WaterNodeIn = HydrRadSys(RadSysNum)%ColdWaterInNode
CASE DEFAULT
CALL ShowSevereError('Illegal low temperature radiant system operating mode')
CALL ShowContinueError('Occurs in Radiant System='//TRIM(HydrRadSys(RadSysNum)%Name))
CALL ShowFatalError('Preceding condition causes termination.')
END SELECT
ZoneNum = HydrRadSys(RadSysNum)%ZonePtr
SysWaterMassFlow = Node(WaterNodeIn)%MassFlowRate
WaterMassFlow = Node(WaterNodeIn)%MassFlowRate/REAL(Zone(ZoneNum)%Multiplier*Zone(ZoneNum)%ListMultiplier,r64)
WaterTempIn = Node(WaterNodeIn)%Temp
IF (WaterMassFlow <= 0.0d0) THEN
! No flow or below minimum allowed so there is no heat source/sink
! This is possible with a mismatch between system and plant operation
! or a slight mismatch between zone and system controls. This is not
! necessarily a "problem" so this exception is necessary in the code.
DO RadSurfNum = 1, HydrRadSys(RadSysNum)%NumOfSurfaces
SurfNum = HydrRadSys(RadSysNum)%SurfacePtr(RadSurfNum)
QRadSysSource(SurfNum) = 0.0D0
IF (Surface(SurfNum)%ExtBoundCond > 0 .AND. Surface(SurfNum)%ExtBoundCond /= SurfNum) &
QRadSysSource(Surface(SurfNum)%ExtBoundCond) = 0.0D0 ! Also zero the other side of an interzone
END DO
ELSE
DO RadSurfNum = 1, HydrRadSys(RadSysNum)%NumOfSurfaces
SurfNum = HydrRadSys(RadSysNum)%SurfacePtr(RadSurfNum)
! Determine the heat exchanger "effectiveness" term
EpsMdotCp = CalcRadSysHXEffectTerm(RadSysNum, HydronicSystem ,WaterTempIn,WaterMassFlow, &
HydrRadSys(RadSysNum)%SurfaceFlowFrac(RadSurfNum), &
HydrRadSys(RadSysNum)%NumCircuits(RadSurfNum), &
HydrRadSys(RadSysNum)%TubeLength, &
HydrRadSys(RadSysNum)%TubeDiameter, &
HydrRadSys(RadSysNum)%GlycolIndex)
! Obtain the heat balance coefficients and calculate the intermediate coefficients
! linking the inlet water temperature to the heat source/sink to the radiant system.
! The coefficients are based on the following development...
! The heat balance equations at the outside and inside surfaces are of the form:
! Tinside = Ca + Cb*Toutside + Cc*q"
! Toutside = Cd + Ce*Tinside + Cf*q"
! Tsource = Cg + Ch*q" + Ci*Tinside + Cj*Toutside
! where:
! Tinside is the temperature at the inside surface
! Toutside is the temperature at the outside surface
! Tsource is the temperature within the radiant system at the location of the source/sink
! Ca is all of the other terms in the inside heat balance (solar, LW exchange, conduction history terms, etc.)
! Cb is the current cross CTF term
! Cc is the QTF inside term for the current heat source/sink
! Cd is all of the other terms in the outside heat balance (solar, LW exchange, conduction history terms, etc.)
! Ce is the current cross CTF term (should be equal to Cb)
! Cf is the QTF outside term for the current heat source/sink
! Cg is the summation of all temperature and source history terms at the source/sink location
! Ch is the QTF term at the source/sink location for the current heat source/sink
! Ci is the CTF inside term for the current inside surface temperature
! Cj is the CTF outside term for the current outside surface temperature
! Note that it is necessary to not use "slow conduction" assumptions because the
! source/sink has an impact on BOTH the inside and outside surface heat balances.
! Hence the more general formulation.
! The first two T equations above can be solved to remove the other surface temperature.
! This results in the following equations:
! Tinside = Ca + Cb*(Cd + Ce*Tinside + Cf*q") + Cc*q" or...
! Tinside = (Ca + Cb*Cd + (Cc+Cb*Cf)*q") / (1 - Ce*Cb)
! Toutside = Cd + Ce*(Ca + Cb*Toutside + Cc*q") + Cf*q" or...
! Toutside = (Cd + Ce*Ca + (Cf+Ce*Cc)*q") / (1 - Ce*Cb)
! Substituting the new equations for Tinside and Toutside as a function of C and q"
! into the equation for Tsource...
! Tsource = Cg + Ch*q" + Ci*((Ca + Cb*Cd + (Cc+Cb*Cf)*q") / (1 - Ce*Cb)) &
! + Cj*((Cd + Ce*Ca + (Cf+Ce*Cc)*q") / (1 - Ce*Cb))
! Or rearranging this to get Tsource as a function of q", we get...
! Tsource = Cg + ((Ci*(Ca + Cb*Cd) + Cj*(Cd + Ce*Ca))/(1-Ce*Cb)) &
! +(Ch + ((Ci*(Cc + Cb*Cf) + Cj*(Cf + Ce*Cc))/(1-Ce*Cb)))*q"
! Or in a slightly simpler form...
! Tsource = Ck + Cl*q"
! where:
! Ck = Cg + ((Ci*(Ca + Cb*Cd) + Cj*(Cd + Ce*Ca))/(1-Ce*Cb))
! Cl = Ch + ((Ci*(Cc + Cb*Cf) + Cj*(Cf + Ce*Cc))/(1-Ce*Cb))
! Note also that from heat exchanger "algebra", we have:
! q = epsilon*qmax and qmax = Mdot*Cp*(Twaterin-Tsource)
! So...
! q" = q/Area = (epsilon*Mdot*Cp/Area)*(Twaterin-Tsource)
! Or rearranging this equation:
! Tsource = -(q"*A/(epsilon*Mdot*Cp)) + Twaterin
! Setting this equation equal to the other equation for Tsource a couple lines up
! and rearranging to solve for q"...
! q" = (Twaterin - Ck) / (Cl + (A/(epsilon*Mdot*Cp))
! or
! q = (Twaterin - Ck) / ((Cl/A) + (1/epsilon*Mdot*Cp))
! or
! q = epsilon*Mdot*Cp*(Twaterin - Ck) / (1+(epsilon*Mdot*Cp*Cl/A))
! which is the desired result, that is the heat source or sink to the radiant
! system as a function of the water inlet temperature (flow rate is also in there
! as well as all of the heat balance terms "hidden" in Ck and Cl).
ConstrNum = Surface(SurfNum)%Construction
IF (Surface(SurfNum)%HeatTransferAlgorithm == HeatTransferModel_CTF) THEN
Ca = RadSysTiHBConstCoef(SurfNum)
Cb = RadSysTiHBToutCoef(SurfNum)
Cc = RadSysTiHBQsrcCoef(SurfNum)
Cd = RadSysToHBConstCoef(SurfNum)
Ce = RadSysToHBTinCoef(SurfNum)
Cf = RadSysToHBQsrcCoef(SurfNum)
Cg = CTFTsrcConstPart(SurfNum)
Ch = Construct(ConstrNum)%CTFTSourceQ(0)
Ci = Construct(ConstrNum)%CTFTSourceIn(0)
Cj = Construct(ConstrNum)%CTFTSourceOut(0)
Ck = Cg + ( ( Ci*(Ca+Cb*Cd) + Cj*(Cd+Ce*Ca) ) / ( 1.0d0 - Ce*Cb ) )
Cl = Ch + ( ( Ci*(Cc+Cb*Cf) + Cj*(Cf+Ce*Cc) ) / ( 1.0d0 - Ce*Cb ) )
QRadSysSource(SurfNum) = EpsMdotCp * (WaterTempIn - Ck) &
/(1.d0 + (EpsMdotCp*Cl/Surface(SurfNum)%Area) )
ELSE IF (Surface(SurfNum)%HeatTransferAlgorithm == HeatTransferModel_CondFD) THEN
QRadSysSource(SurfNum) = EpsMdotCp * (WaterTempIn - TCondFDSourceNode(SurfNum))
ENDIF
IF (Surface(SurfNum)%ExtBoundCond > 0 .AND. Surface(SurfNum)%ExtBoundCond /= SurfNum) &
QRadSysSource(Surface(SurfNum)%ExtBoundCond) = QRadSysSource(SurfNum) ! Also set the other side of an interzone
END DO
! "Temperature Comparison" Cut-off:
DO RadSurfNum = 1, HydrRadSys(RadSysNum)%NumOfSurfaces
! Check to see whether or not the system should really be running. If
! QRadSysSource is negative when we are in heating mode or QRadSysSource
! is positive when we are in cooling mode, then the radiant system will
! be doing the opposite of its intention. In this case, the flow rate
! is set to zero to avoid heating in cooling mode or cooling in heating
! mode.
SurfNum = HydrRadSys(RadSysNum)%SurfacePtr(RadSurfNum)
IF ( ((OperatingMode==HeatingMode).AND.(QRadSysSource(SurfNum)<=0.0d0)) .OR. &
((OperatingMode==CoolingMode).AND.(QRadSysSource(SurfNum)>=0.0d0)) ) THEN
WaterMassFlow = 0.d0
IF (OperatingMode==HeatingMode) THEN
CALL SetComponentFlowRate ( WaterMassFlow , &
HydrRadSys(RadSysNum)%HotWaterInNode, &
HydrRadSys(RadSysNum)%HotWaterOutNode, &
HydrRadSys(RadSysNum)%HWLoopNum, &
HydrRadSys(RadSysNum)%HWLoopSide, &
HydrRadSys(RadSysNum)%HWBranchNum, &
HydrRadSys(RadSysNum)%HWCompNum )
ELSEIF (OperatingMode==CoolingMode) THEN
CALL SetComponentFlowRate ( WaterMassFlow , &
HydrRadSys(RadSysNum)%ColdWaterInNode, &
HydrRadSys(RadSysNum)%ColdWaterOutNode, &
HydrRadSys(RadSysNum)%CWLoopNum, &
HydrRadSys(RadSysNum)%CWLoopSide, &
HydrRadSys(RadSysNum)%CWBranchNum, &
HydrRadSys(RadSysNum)%CWCompNum )
ENDIF
HydrRadSys(RadSysNum)%WaterMassFlowRate = WaterMassFlow
DO RadSurfNum2 = 1, HydrRadSys(RadSysNum)%NumOfSurfaces
SurfNum2 = HydrRadSys(RadSysNum)%SurfacePtr(RadSurfNum2)
QRadSysSource(SurfNum2) = 0.0D0
IF (Surface(SurfNum2)%ExtBoundCond > 0 .AND. Surface(SurfNum2)%ExtBoundCond /= SurfNum2) &
QRadSysSource(Surface(SurfNum2)%ExtBoundCond) = 0.0D0 ! Also zero the other side of an interzone
END DO
EXIT ! outer do loop
END IF
END DO
! Condensation Cut-off:
! Check to see whether there are any surface temperatures within the radiant system that have
! dropped below the dew-point temperature. If so, we need to shut off this radiant system.
! A safety parameter is added (hardwired parameter) to avoid getting too close to condensation
! conditions.
HydrRadSys(RadSysNum)%CondCausedShutDown = .FALSE.
DewPointTemp = PsyTdpFnWPb(ZoneAirHumRat(ZoneNum),OutBaroPress)
IF ( (OperatingMode == CoolingMode) .AND. (HydrRadSys(RadSysNum)%CondCtrlType == CondCtrlSimpleOff) ) THEN
DO RadSurfNum2 = 1, HydrRadSys(RadSysNum)%NumOfSurfaces
IF (TH(HydrRadSys(RadSysNum)%SurfacePtr(RadSurfNum2),1,2) < (DewPointTemp+HydrRadSys(RadSysNum)%CondDewPtDeltaT)) THEN
! Condensation warning--must shut off radiant system
HydrRadSys(RadSysNum)%CondCausedShutDown = .TRUE.
WaterMassFlow = 0.0d0
CALL SetComponentFlowRate ( WaterMassFlow , &
HydrRadSys(RadSysNum)%ColdWaterInNode, &
HydrRadSys(RadSysNum)%ColdWaterOutNode, &
HydrRadSys(RadSysNum)%CWLoopNum, &
HydrRadSys(RadSysNum)%CWLoopSide, &
HydrRadSys(RadSysNum)%CWBranchNum, &
HydrRadSys(RadSysNum)%CWCompNum )
HydrRadSys(RadSysNum)%WaterMassFlowRate = WaterMassFlow
DO RadSurfNum3 = 1, HydrRadSys(RadSysNum)%NumOfSurfaces
SurfNum2 = HydrRadSys(RadSysNum)%SurfacePtr(RadSurfNum3)
QRadSysSource(SurfNum2) = 0.0D0
IF (Surface(SurfNum2)%ExtBoundCond > 0 .AND. Surface(SurfNum2)%ExtBoundCond /= SurfNum2) &
QRadSysSource(Surface(SurfNum2)%ExtBoundCond) = 0.0D0 ! Also zero the other side of an interzone
END DO
! Produce a warning message so that user knows the system was shut-off due to potential for condensation
IF (.not. WarmUpFlag) THEN
IF (HydrRadSys(RadSysNum)%CondErrIndex == 0) THEN ! allow errors up to number of radiant systems
CALL ShowWarningMessage(cHydronicSystem//' ['//TRIM(HydrRadSys(RadSysNum)%Name)//']')
CALL ShowContinueError('Surface ['//trim(Surface(HydrRadSys(RadSysNum)%SurfacePtr(RadSurfNum2))%Name)// &
'] temperature below dew-point temperature--potential for condensation exists')
CALL ShowContinueError('Flow to the radiant system will be shut-off to avoid condensation')
CALL ShowContinueError('Predicted radiant system surface temperature = '// &
trim(RoundSigDigits(TH(HydrRadSys(RadSysNum)%SurfacePtr(RadSurfNum2),1,2),2)))
CALL ShowContinueError('Zone dew-point temperature + safety delta T= '// &
trim(RoundSigDigits(DewPointTemp+HydrRadSys(RadSysNum)%CondDewPtDeltaT,2)))
CALL ShowContinueErrorTimeStamp(' ')
CALL ShowContinueError('Note that a '//TRIM(RoundSigDigits(HydrRadSys(RadSysNum)%CondDewPtDeltaT,4))// &
' C safety was chosen in the input for the shut-off criteria')
CALL ShowContinueError('Note also that this affects all surfaces that are part of this radiant system')
END IF
CALL ShowRecurringWarningErrorAtEnd(cHydronicSystem//' ['//TRIM(HydrRadSys(RadSysNum)%Name)// &
'] condensation shut-off occurrence continues.', &
HydrRadSys(RadSysNum)%CondErrIndex,ReportMinOf=DewPointTemp,ReportMaxOf=DewPointTemp, &
ReportMaxUnits='C',ReportMinUnits='C')
END IF
EXIT ! outer do loop
END IF
END DO
ELSE IF ( (OperatingMode == CoolingMode) .AND. (HydrRadSys(RadSysNum)%CondCtrlType == CondCtrlNone) ) THEN
DO RadSurfNum2 = 1, HydrRadSys(RadSysNum)%NumOfSurfaces
IF (TH(HydrRadSys(RadSysNum)%SurfacePtr(RadSurfNum2),1,2) < DewPointTemp) THEN
! Condensation occurring but user does not want to shut radiant system off ever
HydrRadSys(RadSysNum)%CondCausedShutDown = .TRUE.
END IF
END DO
ELSE IF ( (OperatingMode == CoolingMode) .AND. (HydrRadSys(RadSysNum)%CondCtrlType == CondCtrlVariedOff) ) THEN
LowestRadSurfTemp = 999.9d0
CondSurfNum = 0
DO RadSurfNum2 = 1, HydrRadSys(RadSysNum)%NumOfSurfaces
IF (TH(HydrRadSys(RadSysNum)%SurfacePtr(RadSurfNum2),1,2) < (DewPointTemp+HydrRadSys(RadSysNum)%CondDewPtDeltaT)) THEN
IF (TH(HydrRadSys(RadSysNum)%SurfacePtr(RadSurfNum2),1,2) < LowestRadSurfTemp) THEN
LowestRadSurfTemp = TH(HydrRadSys(RadSysNum)%SurfacePtr(RadSurfNum2),1,2)
CondSurfNum = RadSurfNum2
END IF
END IF
END DO
IF (CondSurfNum > 0) THEN ! Condensation predicted so let's deal with it
! Process here is: turn everything off and see what the resulting surface temperature is for
! the surface that was causing the lowest temperature. Then, interpolate to find the flow that
! would still allow the system to operate without producing condensation. Rerun the heat balance
! and recheck for condensation. If condensation still exists, shut everything down. This avoids
! excessive iteration and still makes an attempt to vary the flow rate.
! First, shut everything off...
FullWaterMassFlow = WaterMassFlow
WaterMassFlow = 0.0d0
CALL SetComponentFlowRate (WaterMassFlow , &
HydrRadSys(RadSysNum)%ColdWaterInNode, &
HydrRadSys(RadSysNum)%ColdWaterOutNode, &
HydrRadSys(RadSysNum)%CWLoopNum, &
HydrRadSys(RadSysNum)%CWLoopSide, &
HydrRadSys(RadSysNum)%CWBranchNum, &
HydrRadSys(RadSysNum)%CWCompNum)
HydrRadSys(RadSysNum)%WaterMassFlowRate = WaterMassFlow
DO RadSurfNum3 = 1, HydrRadSys(RadSysNum)%NumOfSurfaces
SurfNum2 = HydrRadSys(RadSysNum)%SurfacePtr(RadSurfNum3)
QRadSysSource(SurfNum2) = 0.0D0
IF (Surface(SurfNum2)%ExtBoundCond > 0 .AND. Surface(SurfNum2)%ExtBoundCond /= SurfNum2) &
QRadSysSource(Surface(SurfNum2)%ExtBoundCond) = 0.0D0 ! Also zero the other side of an interzone
END DO
! Redo the heat balances since we have changed the heat source (set it to zero)
CALL CalcHeatBalanceOutsideSurf(ZoneNum)
CALL CalcHeatBalanceInsideSurf(ZoneNum)
! Now check all of the surface temperatures. If any potentially have condensation, leave the system off.
DO RadSurfNum2 = 1, HydrRadSys(RadSysNum)%NumOfSurfaces
IF (TH(HydrRadSys(RadSysNum)%SurfacePtr(RadSurfNum2),1,2) < (DewPointTemp+HydrRadSys(RadSysNum)%CondDewPtDeltaT)) THEN
HydrRadSys(RadSysNum)%CondCausedShutDown = .TRUE.
END IF
END DO
! If the system does not need to be shut down, then let's see if we can vary the flow based
! on the lowest temperature surface from before. This will use interpolation to try a new
! flow rate.
IF (.NOT. HydrRadSys(RadSysNum)%CondCausedShutDown) THEN
PredictedCondTemp = DewPointTemp+HydrRadSys(RadSysNum)%CondDewPtDeltaT
ZeroFlowSurfTemp = TH(HydrRadSys(RadSysNum)%SurfacePtr(CondSurfNum),1,2)
ReductionFrac = (ZeroFlowSurfTemp-PredictedCondTemp)/ABS(ZeroFlowSurfTemp-LowestRadSurfTemp)
IF (ReductionFrac < 0.0d0) ReductionFrac = 0.0d0 ! Shouldn't happen as the above check should have screened this out
IF (ReductionFrac > 1.0d0) ReductionFrac = 1.0d0 ! Shouldn't happen either because condensation doesn't exist then
WaterMassFlow = ReductionFrac*FullWaterMassFlow
SysWaterMassFlow = REAL(Zone(ZoneNum)%Multiplier*Zone(ZoneNum)%ListMultiplier,r64)*WaterMassFlow
! Got a new reduced flow rate that should work...reset loop variable and resimulate the system
CALL SetComponentFlowRate (SysWaterMassFlow, &
HydrRadSys(RadSysNum)%ColdWaterInNode, &
HydrRadSys(RadSysNum)%ColdWaterOutNode, &
HydrRadSys(RadSysNum)%CWLoopNum, &
HydrRadSys(RadSysNum)%CWLoopSide, &
HydrRadSys(RadSysNum)%CWBranchNum, &
HydrRadSys(RadSysNum)%CWCompNum)
HydrRadSys(RadSysNum)%WaterMassFlowRate = SysWaterMassFlow
! Go through all of the surfaces again with the new flow rate...
DO RadSurfNum3 = 1, HydrRadSys(RadSysNum)%NumOfSurfaces
SurfNum = HydrRadSys(RadSysNum)%SurfacePtr(RadSurfNum3)
! Determine the heat exchanger "effectiveness" term
EpsMdotCp = CalcRadSysHXEffectTerm(RadSysNum,HydronicSystem,WaterTempIn,WaterMassFlow, &
HydrRadSys(RadSysNum)%SurfaceFlowFrac(RadSurfNum3), &
HydrRadSys(RadSysNum)%NumCircuits(RadSurfNum3), &
HydrRadSys(RadSysNum)%TubeLength, &
HydrRadSys(RadSysNum)%TubeDiameter, &
HydrRadSys(RadSysNum)%GlycolIndex)
IF (Surface(SurfNum)%HeatTransferAlgorithm == HeatTransferModel_CTF) THEN
! For documentation on coefficients, see code earlier in this subroutine
Ca = RadSysTiHBConstCoef(SurfNum)
Cb = RadSysTiHBToutCoef(SurfNum)
Cc = RadSysTiHBQsrcCoef(SurfNum)
Cd = RadSysToHBConstCoef(SurfNum)
Ce = RadSysToHBTinCoef(SurfNum)
Cf = RadSysToHBQsrcCoef(SurfNum)
Cg = CTFTsrcConstPart(SurfNum)
Ch = Construct(ConstrNum)%CTFTSourceQ(0)
Ci = Construct(ConstrNum)%CTFTSourceIn(0)
Cj = Construct(ConstrNum)%CTFTSourceOut(0)
Ck = Cg + ( ( Ci*(Ca+Cb*Cd) + Cj*(Cd+Ce*Ca) ) / ( 1.0d0 - Ce*Cb ) )
Cl = Ch + ( ( Ci*(Cc+Cb*Cf) + Cj*(Cf+Ce*Cc) ) / ( 1.0d0 - Ce*Cb ) )
QRadSysSource(SurfNum) = EpsMdotCp * (WaterTempIn - Ck) &
/(1.0d0 + (EpsMdotCp*Cl/Surface(SurfNum)%Area) )
ELSE IF (Surface(SurfNum)%HeatTransferAlgorithm == HeatTransferModel_CondFD) THEN
QRadSysSource(SurfNum) = EpsMdotCp * (WaterTempIn - TCondFDSourceNode(SurfNum))
END IF
IF (Surface(SurfNum)%ExtBoundCond > 0 .AND. Surface(SurfNum)%ExtBoundCond /= SurfNum) &
QRadSysSource(Surface(SurfNum)%ExtBoundCond) = QRadSysSource(SurfNum) ! Also set the other side of an interzone
END DO
! Redo the heat balances since we have changed the heat source
CALL CalcHeatBalanceOutsideSurf(ZoneNum)
CALL CalcHeatBalanceInsideSurf(ZoneNum)
! Check for condensation one more time. If no condensation, we are done. If there is
! condensation, shut things down and be done.
DO RadSurfNum2 = 1, HydrRadSys(RadSysNum)%NumOfSurfaces
IF (HydrRadSys(RadSysNum)%CondCausedShutDown) EXIT
IF (TH(HydrRadSys(RadSysNum)%SurfacePtr(RadSurfNum2),1,2) < (PredictedCondTemp)) THEN
! Condensation still present--must shut off radiant system
HydrRadSys(RadSysNum)%CondCausedShutDown = .TRUE.
WaterMassFlow = 0.0d0
RadSurfNum = RadSurfNum2
CALL SetComponentFlowRate (WaterMassFlow , &
HydrRadSys(RadSysNum)%ColdWaterInNode, &
HydrRadSys(RadSysNum)%ColdWaterOutNode, &
HydrRadSys(RadSysNum)%CWLoopNum, &
HydrRadSys(RadSysNum)%CWLoopSide, &
HydrRadSys(RadSysNum)%CWBranchNum, &
HydrRadSys(RadSysNum)%CWCompNum)
HydrRadSys(RadSysNum)%WaterMassFlowRate = WaterMassFlow
DO RadSurfNum3 = 1, HydrRadSys(RadSysNum)%NumOfSurfaces
SurfNum2 = HydrRadSys(RadSysNum)%SurfacePtr(RadSurfNum3)
QRadSysSource(SurfNum2) = 0.0D0
IF (Surface(SurfNum2)%ExtBoundCond > 0 .AND. Surface(SurfNum2)%ExtBoundCond /= SurfNum2) &
QRadSysSource(Surface(SurfNum2)%ExtBoundCond) = 0.0D0 ! Also zero the other side of an interzone
END DO
END IF
END DO
END IF
IF (HydrRadSys(RadSysNum)%CondCausedShutDown) THEN
! Produce a warning message so that user knows the system was shut-off due to potential for condensation
IF (.not. WarmUpFlag) THEN
IF (HydrRadSys(RadSysNum)%CondErrIndex == 0) THEN ! allow errors up to number of radiant systems
CALL ShowWarningMessage(cHydronicSystem//' ['//TRIM(HydrRadSys(RadSysNum)%Name)//']')
CALL ShowContinueError('Surface ['//trim(Surface(HydrRadSys(RadSysNum)%SurfacePtr(CondSurfNum))%Name)// &
'] temperature below dew-point temperature--potential for condensation exists')
CALL ShowContinueError('Flow to the radiant system will be shut-off to avoid condensation')
CALL ShowContinueError('Predicted radiant system surface temperature = '// &
trim(RoundSigDigits(TH(HydrRadSys(RadSysNum)%SurfacePtr(CondSurfNum),1,2),2)))
CALL ShowContinueError('Zone dew-point temperature + safety delta T= '// &
trim(RoundSigDigits(DewPointTemp+HydrRadSys(RadSysNum)%CondDewPtDeltaT,2)))
CALL ShowContinueErrorTimeStamp(' ')
CALL ShowContinueError('Note that a '//TRIM(RoundSigDigits(HydrRadSys(RadSysNum)%CondDewPtDeltaT,4))// &
' C safety was chosen in the input for the shut-off criteria')
CALL ShowContinueError('Note also that this affects all surfaces that are part of this radiant system')
END IF
CALL ShowRecurringWarningErrorAtEnd(cHydronicSystem//' ['//TRIM(HydrRadSys(RadSysNum)%Name)// &
'] condensation shut-off occurrence continues.', &
HydrRadSys(RadSysNum)%CondErrIndex,ReportMinOf=DewPointTemp,ReportMaxOf=DewPointTemp, &
ReportMaxUnits='C',ReportMinUnits='C')
END IF
END IF
END IF ! Condensation Predicted in Variable Shut-Off Control Type
END IF ! In cooling mode and one of the condensation control types
END IF ! There was a non-zero flow
! Now that we have the source/sink term, we must redo the heat balances to obtain
! the new SumHATsurf value for the zone. Note that the difference between the new
! SumHATsurf and the value originally calculated by the heat balance with a zero
! source for all radiant systems in the zone is the load met by the system (approximately).
CALL CalcHeatBalanceOutsideSurf(ZoneNum)
CALL CalcHeatBalanceInsideSurf(ZoneNum)
LoadMet = SumHATsurf(ZoneNum) - ZeroSourceSumHATsurf(ZoneNum)
RETURN
END SUBROUTINE CalcLowTempHydrRadSysComps