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