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.
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 GetCooltower
! SUBROUTINE INFORMATION:
! AUTHOR Daeho Kang
! DATE WRITTEN Aug 2008
! MODIFIED na
! RE-ENGINEERED na
! PURPOSE OF THIS SUBROUTINE:
! This subroutine gets input data for cooltower components
! and stores it in the Cooltower data structure.
! METHODOLOGY EMPLOYED:
! na
! REFERENCES:
! na
! USE STATEMENTS:
USE InputProcessor, ONLY: GetNumObjectsFound,GetObjectItem,FindItemInList,SameString,VerifyName,GetObjectDefMaxArgs
USE ScheduleManager, ONLY: GetScheduleIndex
USE WaterManager, ONLY: SetupTankDemandComponent
USE General, ONLY: RoundSigDigits
IMPLICIT NONE ! Enforce explicit typing of all variables in this routine
! SUBROUTINE ARGUMENT DEFINITIONS:
! SUBROUTINE PARAMETER DEFINITIONS:
CHARACTER(len=*), PARAMETER :: Blank = ' '
CHARACTER(len=*), PARAMETER :: CurrentModuleObject='ZoneCoolTower:Shower'
REAL(r64), PARAMETER :: MaximumWaterFlowRate = 0.016667d0 ! Maximum limit of water flow rate in m3/s (1000 l/min)
REAL(r64), PARAMETER :: MinimumWaterFlowRate = 0.0d0 ! Minimum limit of water flow rate
REAL(r64), PARAMETER :: MaxHeight = 30.0d0 ! Maximum effective tower height in m
REAL(r64), PARAMETER :: MinHeight = 1.0d0 ! Minimum effective tower height in m
REAL(r64), PARAMETER :: MaxValue = 100.0d0 ! Maximum limit of outlet area, airflow, and temperature
REAL(r64), PARAMETER :: MinValue = 0.0d0 ! Minimum limit of outlet area, airflow, and temperature
REAL(r64), PARAMETER :: MaxFrac = 1.0d0 ! Maximum fraction
REAL(r64), PARAMETER :: MinFrac = 0.0d0 ! Minimum fraction
! INTERFACE BLOCK SPECIFICATIONS
! na
! DERIVED TYPE DEFINITIONS
! na
! SUBROUTINE LOCAL VARIABLE DECLARATIONS:
LOGICAL :: ErrorsFound = .false. ! If errors detected in input
LOGICAL :: IsNotOK ! Flag to verify name
LOGICAL :: IsBlank ! Flag for blank name
INTEGER :: CoolTowerNum ! Cooltower number
INTEGER :: NumAlphas ! Number of Alphas for each GetobjectItem call
INTEGER :: NumNumbers ! Number of Numbers for each GetobjectItem call
INTEGER :: NumArgs
INTEGER :: IOStat
CHARACTER(len=MaxNameLength), ALLOCATABLE, DIMENSION(:) :: cAlphaArgs ! Alpha input items for object
CHARACTER(len=MaxNameLength), ALLOCATABLE, DIMENSION(:) :: cAlphaFields ! Alpha field names
CHARACTER(len=MaxNameLength), ALLOCATABLE, DIMENSION(:) :: cNumericFields ! Numeric field names
REAL(r64), ALLOCATABLE, DIMENSION(:) :: rNumericArgs ! Numeric input items for object
LOGICAL, ALLOCATABLE, DIMENSION(:) :: lAlphaBlanks ! Logical array, alpha field input BLANK = .true.
LOGICAL, ALLOCATABLE, DIMENSION(:) :: lNumericBlanks ! Logical array, numeric field input BLANK = .true.
! Initializations and allocations
CALL GetObjectDefMaxArgs(CurrentModuleObject,NumArgs,NumAlphas,NumNumbers)
ALLOCATE(cAlphaArgs(NumAlphas))
cAlphaArgs=' '
ALLOCATE(cAlphaFields(NumAlphas))
cAlphaFields=' '
ALLOCATE(cNumericFields(NumNumbers))
cNumericFields=' '
ALLOCATE(rNumericArgs(NumNumbers))
rNumericArgs=0.0d0
ALLOCATE(lAlphaBlanks(NumAlphas))
lAlphaBlanks=.true.
ALLOCATE(lNumericBlanks(NumNumbers))
lNumericBlanks=.true.
NumCoolTowers = GetNumObjectsFound(CurrentModuleObject)
ALLOCATE (CoolTowerSys(NumCoolTowers))
! Obtain inputs
DO CoolTowerNum = 1, NumCoolTowers
CALL GetObjectItem(CurrentModuleObject,CoolTowerNum,cAlphaArgs,NumAlphas,rNumericArgs,NumNumbers,IOStat, &
AlphaBlank=lAlphaBlanks,NumBlank=lNumericBlanks, &
AlphaFieldnames=cAlphaFields,NumericFieldNames=cNumericFields)
IsNotOK=.false.
IsBlank=.false.
CALL VerifyName(cAlphaArgs(1),CoolTowerSys%Name,CoolTowerNum,IsNotOK,IsBlank,CurrentModuleObject//' Name')
IF (IsNotOK) THEN
ErrorsFound = .true.
ENDIF
CoolTowerSys(CoolTowerNum)%Name = cAlphaArgs(1) ! Name of cooltower
CoolTowerSys(CoolTowerNum)%Schedule = cAlphaArgs(2) ! Get schedule
IF (lAlphaBlanks(2)) THEN
CoolTowerSys(CoolTowerNum)%SchedPtr = ScheduleAlwaysOn
ELSE
CoolTowerSys(CoolTowerNum)%SchedPtr = GetScheduleIndex(cAlphaArgs(2))
IF (CoolTowerSys(CoolTowerNum)%SchedPtr == 0) THEN
CALL ShowSevereError(trim(CurrentModuleObject)//'="'//trim(cAlphaArgs(1))//'" invalid data')
CALL ShowContinueError('Invalid-Schedule not found '//trim(cAlphaFields(2))//'="'//trim(cAlphaArgs(2))//'".')
ErrorsFound = .TRUE.
ENDIF
ENDIF
CoolTowerSys(CoolTowerNum)%ZoneName = cAlphaArgs(3) ! Name of zone where cooltower is serving
CoolTowerSys(CoolTowerNum)%ZonePtr = FindIteminList(cAlphaArgs(3),Zone%Name,NumOfZones)
IF (CoolTowerSys(CoolTowerNum)%ZonePtr == 0) THEN
IF (lAlphaBlanks(3)) THEN
CALL ShowSevereError(trim(CurrentModuleObject)//'="'//trim(cAlphaArgs(1))//'" invalid '// &
trim(cAlphaFields(3))//' is required but input is blank.')
ELSE
CALL ShowSevereError(trim(CurrentModuleObject)//'="'//trim(cAlphaArgs(1))//'" invalid '// &
trim(cAlphaFields(3))//'="'//trim(cAlphaArgs(3))//'" not found.')
END IF
ErrorsFound = .TRUE.
ENDIF
CoolTowerSys(CoolTowerNum)%CoolTWaterSupplyName = cAlphaArgs(4) ! Name of water storage tank
IF (lAlphaBlanks(4)) THEN
CoolTowerSys(CoolTowerNum)%CoolTWaterSupplyMode = WaterSupplyFromMains
ELSE IF (CoolTowerSys(CoolTowerNum)%CoolTWaterSupplyMode == WaterSupplyFromTank) THEN
CALL SetupTankDemandComponent(CoolTowerSys(CoolTowerNum)%Name, CurrentModuleObject, &
CoolTowerSys(CoolTowerNum)%CoolTWaterSupplyName, ErrorsFound, &
CoolTowersys(CoolTowerNum)%CoolTWaterSupTankID, &
CoolTowerSys(CoolTowerNum)%CoolTWaterTankDemandARRID)
ENDIF
SELECT CASE (cAlphaArgs(5)) ! Type of flow control
CASE ('WATERFLOWSCHEDULE')
CoolTowerSys(CoolTowerNum)%FlowCtrlType = WaterFlowSchedule
CASE ('WINDDRIVENFLOW','NONE',' ')
CoolTowerSys(CoolTowerNum)%FlowCtrlType = WindDrivenFlow
CASE DEFAULT
CALL ShowSevereError(trim(CurrentModuleObject)//'="'//trim(cAlphaArgs(1))//'" invalid '// &
trim(cAlphaFields(5))//'="'//trim(cAlphaArgs(5))//'".')
ErrorsFound = .TRUE.
END SELECT
CoolTowerSys(CoolTowerNum)%PumpSchedName = cAlphaArgs(6) !Get schedule for water pump
CoolTowerSys(CoolTowerNum)%PumpSchedPtr = GetScheduleIndex(cAlphaArgs(6))
IF (CoolTowerSys(CoolTowerNum)%PumpSchedPtr == 0) THEN
IF (lAlphaBlanks(6)) THEN
CALL ShowSevereError(trim(CurrentModuleObject)//'="'//trim(cAlphaArgs(1))//'" invalid '// &
trim(cAlphaFields(6))//' is required but input is blank.')
ELSE
CALL ShowSevereError(trim(CurrentModuleObject)//'="'//trim(cAlphaArgs(1))//'" invalid '// &
trim(cAlphaFields(6))//'="'//trim(cAlphaArgs(6))//'" not found.')
ENDIF
ErrorsFound = .TRUE.
ENDIF
CoolTowerSys(CoolTowerNum)%MaxWaterFlowRate = rNumericArgs(1) ! Maximum limit of water supply
IF (CoolTowerSys(CoolTowerNum)%MaxWaterFlowRate > MaximumWaterFlowRate) THEN
CoolTowerSys(CoolTowerNum)%MaxWaterFlowRate = MaximumWaterFlowRate
CALL ShowWarningError(trim(CurrentModuleObject)//'="'//trim(cAlphaArgs(1))//'" invalid '// &
trim(cNumericFields(1))//'=['//trim(RoundSigDigits(rNumericArgs(1),2))//'].')
CALL ShowContinueError('...Maximum Allowable=['//trim(RoundSigDigits(MaximumWaterFlowRate,2))//'].')
END IF
IF (CoolTowerSys(CoolTowerNum)%MaxWaterFlowRate < MinimumWaterFlowRate) THEN
CoolTowerSys(CoolTowerNum)%MaxWaterFlowRate = MinimumWaterFlowRate
CALL ShowWarningError(trim(CurrentModuleObject)//'="'//trim(cAlphaArgs(1))//'" invalid '// &
trim(cNumericFields(1))//'=['//trim(RoundSigDigits(rNumericArgs(1),2))//'].')
CALL ShowContinueError('...Minimum Allowable=['//trim(RoundSigDigits(MinimumWaterFlowRate,2))//'].')
END IF
CoolTowerSys(CoolTowerNum)%TowerHeight = rNumericArgs(2) ! Get effctive tower height
IF (CoolTowerSys(CoolTowerNum)%TowerHeight > MaxHeight) THEN
CoolTowerSys(CoolTowerNum)%TowerHeight = MaxHeight
CALL ShowWarningError(trim(CurrentModuleObject)//'="'//trim(cAlphaArgs(1))//'" invalid '// &
trim(cNumericFields(2))//'=['//trim(RoundSigDigits(rNumericArgs(2),2))//'].')
CALL ShowContinueError('...Maximum Allowable=['//trim(RoundSigDigits(MaxHeight,2))//'].')
END IF
IF (CoolTowerSys(CoolTowerNum)%TowerHeight < MinHeight) THEN
CoolTowerSys(CoolTowerNum)%TowerHeight = MinHeight
CALL ShowWarningError(trim(CurrentModuleObject)//'="'//trim(cAlphaArgs(1))//'" invalid '// &
trim(cNumericFields(2))//'=['//trim(RoundSigDigits(rNumericArgs(2),2))//'].')
CALL ShowContinueError('...Minimum Allowable=['//trim(RoundSigDigits(MinHeight,2))//'].')
END IF
CoolTowerSys(CoolTowerNum)%OutletArea = rNumericArgs(3) ! Get outlet area
IF (CoolTowerSys(CoolTowerNum)%OutletArea > MaxValue) THEN
CoolTowerSys(CoolTowerNum)%OutletArea = MaxValue
CALL ShowWarningError(trim(CurrentModuleObject)//'="'//trim(cAlphaArgs(1))//'" invalid '// &
trim(cNumericFields(3))//'=['//trim(RoundSigDigits(rNumericArgs(3),2))//'].')
CALL ShowContinueError('...Maximum Allowable=['//trim(RoundSigDigits(MaxValue,2))//'].')
END IF
IF (CoolTowerSys(CoolTowerNum)%OutletArea < MinValue) THEN
CoolTowerSys(CoolTowerNum)%OutletArea = MinValue
CALL ShowWarningError(trim(CurrentModuleObject)//'="'//trim(cAlphaArgs(1))//'" invalid '// &
trim(cNumericFields(3))//'=['//trim(RoundSigDigits(rNumericArgs(3),2))//'].')
CALL ShowContinueError('...Minimum Allowable=['//trim(RoundSigDigits(MinValue,2))//'].')
END IF
CoolTowerSys(CoolTowerNum)%MaxAirVolFlowRate = rNumericArgs(4) ! Maximum limit of air flow to the space
IF (CoolTowerSys(CoolTowerNum)%MaxAirVolFlowRate > MaxValue) THEN
CoolTowerSys(CoolTowerNum)%MaxAirVolFlowRate = MaxValue
CALL ShowWarningError(trim(CurrentModuleObject)//'="'//trim(cAlphaArgs(1))//'" invalid '// &
trim(cNumericFields(4))//'=['//trim(RoundSigDigits(rNumericArgs(4),2))//'].')
CALL ShowContinueError('...Maximum Allowable=['//trim(RoundSigDigits(MaxValue,2))//'].')
END IF
IF (CoolTowerSys(CoolTowerNum)%MaxAirVolFlowRate < MinValue) THEN
CoolTowerSys(CoolTowerNum)%MaxAirVolFlowRate = MinValue
CALL ShowWarningError(trim(CurrentModuleObject)//'="'//trim(cAlphaArgs(1))//'" invalid '// &
trim(cNumericFields(4))//'=['//trim(RoundSigDigits(rNumericArgs(4),2))//'].')
CALL ShowContinueError('...Minimum Allowable=['//trim(RoundSigDigits(MinValue,2))//'].')
END IF
CoolTowerSys(CoolTowerNum)%MinZoneTemp = rNumericArgs(5) ! Get minimum temp limit which gets this cooltower off
IF (CoolTowerSys(CoolTowerNum)%MinZoneTemp > MaxValue) THEN
CoolTowerSys(CoolTowerNum)%MinZoneTemp = MaxValue
CALL ShowWarningError(trim(CurrentModuleObject)//'="'//trim(cAlphaArgs(1))//'" invalid '// &
trim(cNumericFields(5))//'=['//trim(RoundSigDigits(rNumericArgs(5),2))//'].')
CALL ShowContinueError('...Maximum Allowable=['//trim(RoundSigDigits(MaxValue,2))//'].')
END IF
IF (CoolTowerSys(CoolTowerNum)%MinZoneTemp < MinValue) THEN
CoolTowerSys(CoolTowerNum)%MinZoneTemp = MinValue
CALL ShowWarningError(trim(CurrentModuleObject)//'="'//trim(cAlphaArgs(1))//'" invalid '// &
trim(cNumericFields(5))//'=['//trim(RoundSigDigits(rNumericArgs(5),2))//'].')
CALL ShowContinueError('...Minimum Allowable=['//trim(RoundSigDigits(MinValue,2))//'].')
END IF
CoolTowerSys(CoolTowerNum)%FracWaterLoss = rNumericArgs(6) ! Fraction of water loss
IF (CoolTowerSys(CoolTowerNum)%FracWaterLoss > MaxFrac) THEN
CoolTowerSys(CoolTowerNum)%FracWaterLoss = MaxFrac
CALL ShowWarningError(trim(CurrentModuleObject)//'="'//trim(cAlphaArgs(1))//'" invalid '// &
trim(cNumericFields(6))//'=['//trim(RoundSigDigits(rNumericArgs(6),2))//'].')
CALL ShowContinueError('...Maximum Allowable=['//trim(RoundSigDigits(MaxFrac,2))//'].')
END IF
IF (CoolTowerSys(CoolTowerNum)%FracWaterLoss < MinFrac) THEN
CoolTowerSys(CoolTowerNum)%FracWaterLoss = MinFrac
CALL ShowWarningError(trim(CurrentModuleObject)//'="'//trim(cAlphaArgs(1))//'" invalid '// &
trim(cNumericFields(6))//'=['//trim(RoundSigDigits(rNumericArgs(6),2))//'].')
CALL ShowContinueError('...Minimum Allowable=['//trim(RoundSigDigits(MinFrac,2))//'].')
END IF
CoolTowerSys(CoolTowerNum)%FracFlowSched = rNumericArgs(7) ! Fraction of loss of air flow
IF (CoolTowerSys(CoolTowerNum)%FracFlowSched > MaxFrac) THEN
CoolTowerSys(CoolTowerNum)%FracFlowSched = MaxFrac
CALL ShowWarningError(trim(CurrentModuleObject)//'="'//trim(cAlphaArgs(1))//'" invalid '// &
trim(cNumericFields(7))//'=['//trim(RoundSigDigits(rNumericArgs(7),2))//'].')
CALL ShowContinueError('...Maximum Allowable=['//trim(RoundSigDigits(MaxFrac,2))//'].')
END IF
IF (CoolTowerSys(CoolTowerNum)%FracFlowSched < MinFrac) THEN
CoolTowerSys(CoolTowerNum)%FracFlowSched = MinFrac
CALL ShowWarningError(trim(CurrentModuleObject)//'="'//trim(cAlphaArgs(1))//'" invalid '// &
trim(cNumericFields(7))//'=['//trim(RoundSigDigits(rNumericArgs(7),5))//'].')
CALL ShowContinueError('...Minimum Allowable=['//trim(RoundSigDigits(MinFrac,2))//'].')
END IF
CoolTowerSys(CoolTowerNum)%RatedPumpPower = rNumericArgs(8) ! Get rated pump power
END DO
DEALLOCATE(cAlphaArgs)
DEALLOCATE(cAlphaFields)
DEALLOCATE(cNumericFields)
DEALLOCATE(rNumericArgs)
DEALLOCATE(lAlphaBlanks)
DEALLOCATE(lNumericBlanks)
IF (ErrorsFound) Call ShowFatalError(CurrentModuleObject//' errors occurred in input. Program terminates.')
DO CoolTowerNum = 1, NumCoolTowers
CALL SetupOutputVariable('Zone Cooltower Sensible Heat Loss Energy [J]',CoolTowerSys(CoolTowerNum)%SenHeatLoss, &
'System','Sum',Zone(CoolTowerSys(CoolTowerNum)%ZonePtr)%Name)
CALL SetupOutputVariable('Zone Cooltower Sensible Heat Loss Rate [W]',CoolTowerSys(CoolTowerNum)%SenHeatPower, &
'System','Average',Zone(CoolTowerSys(CoolTowerNum)%ZonePtr)%Name)
CALL SetupOutputVariable('Zone Cooltower Latent Heat Loss Energy [J]',CoolTowerSys(CoolTowerNum)%LatHeatLoss, &
'System','Sum',Zone(CoolTowerSys(CoolTowerNum)%ZonePtr)%Name)
CALL SetupOutputVariable('Zone Cooltower Latent Heat Loss Rate [W]',CoolTowerSys(CoolTowerNum)%LatHeatPower, &
'System','Average',Zone(CoolTowerSys(CoolTowerNum)%ZonePtr)%Name)
CALL SetupOutputVariable('Zone Cooltower Air Volume [m3]',CoolTowerSys(CoolTowerNum)%CoolTAirVol, &
'System','Sum',Zone(CoolTowerSys(CoolTowerNum)%ZonePtr)%Name)
CALL SetupOutputVariable('Zone Cooltower Air Volume Flow Rate [m3/s]',CoolTowerSys(CoolTowerNum)%AirVolFlowRate, &
'System','Average',Zone(CoolTowerSys(CoolTowerNum)%ZonePtr)%Name)
CALL SetupOutputVariable('Zone Cooltower Air Mass [kg]',CoolTowerSys(CoolTowerNum)%CoolTAirMass, &
'System','Sum',Zone(CoolTowerSys(CoolTowerNum)%ZonePtr)%Name)
CALL SetupOutputVariable('Zone Cooltower Air Mass Flow Rate [kg/s]',CoolTowerSys(CoolTowerNum)%AirMassFlowRate, &
'System','Average',Zone(CoolTowerSys(CoolTowerNum)%ZonePtr)%Name)
CALL SetupOutputVariable('Zone Cooltower Air Inlet Temperature [C]',CoolTowerSys(CoolTowerNum)%InletDBTemp, &
'System','Average',Zone(CoolTowerSys(CoolTowerNum)%ZonePtr)%Name)
CALL SetupOutputVariable('Zone Cooltower Air Inlet Humidity Ratio [kgWater/kgDryAir]',CoolTowerSys(CoolTowerNum)%InletHumRat, &
'System','Average',Zone(CoolTowerSys(CoolTowerNum)%ZonePtr)%Name)
CALL SetupOutputVariable('Zone Cooltower Air Outlet Temperature [C]',CoolTowerSys(CoolTowerNum)%OutletTemp, &
'System','Average',Zone(CoolTowerSys(CoolTowerNum)%ZonePtr)%Name)
CALL SetupOutputVariable('Zone Cooltower Air Outlet Humidity Ratio [kgWater/kgDryAir]', &
CoolTowerSys(CoolTowerNum)%OutletHumRat, &
'System','Average',Zone(CoolTowerSys(CoolTowerNum)%ZonePtr)%Name)
CALL SetupOutputVariable('Zone Cooltower Pump Electric Power [W]',CoolTowerSys(CoolTowerNum)%PumpElecPower, &
'System','Average',Zone(CoolTowerSys(CoolTowerNum)%ZonePtr)%Name)
CALL SetupOutputVariable('Zone Cooltower Pump Electric Energy [J]',CoolTowerSys(CoolTowerNum)%PumpElecConsump, &
'System','Sum',Zone(CoolTowerSys(CoolTowerNum)%ZonePtr)%Name, &
ResourceTypeKey='Electric',EndUseKey='Cooling',GroupKey='System')
IF (CoolTowerSys(CoolTowerNum)%CoolTWaterSupplyMode == WaterSupplyFromMains) THEN
CALL SetupOutputVariable('Zone Cooltower Water Volume [m3]',CoolTowerSys(CoolTowerNum)%CoolTWaterConsump, &
'System','Sum',Zone(CoolTowerSys(CoolTowerNum)%ZonePtr)%Name)
CALL SetupOutputVariable('Zone Cooltower Mains Water Volume [m3]',CoolTowerSys(CoolTowerNum)%CoolTWaterConsump, &
'System','Sum',Zone(CoolTowerSys(CoolTowerNum)%ZonePtr)%Name, &
ResourceTypeKey='MainsWater',EndUseKey='Cooling',GroupKey='System')
ELSE IF (CoolTowerSys(CoolTowerNum)%CoolTWaterSupplyMode == WaterSupplyFromTank) THEN
CALL SetupOutputVariable('Zone Cooltower Water Volume [m3]',CoolTowerSys(CoolTowerNum)%CoolTWaterConsump, &
'System','Sum',Zone(CoolTowerSys(CoolTowerNum)%ZonePtr)%Name)
CALL SetupOutputVariable('Zone Cooltower Storage Tank Water Volume [m3]',CoolTowerSys(CoolTowerNum)%CoolTWaterConsump, &
'System','Sum',Zone(CoolTowerSys(CoolTowerNum)%ZonePtr)%Name)
CALL SetupOutputVariable('Zone Cooltower Starved Mains Water Volume [m3]', &
CoolTowerSys(CoolTowerNum)%CoolTWaterStarvMakeup, &
'System','Sum',Zone(CoolTowerSys(CoolTowerNum)%ZonePtr)%Name, &
ResourceTypeKey='MainsWater',EndUseKey='Cooling',GroupKey='System')
END IF
END DO
RETURN
END SUBROUTINE GetCoolTower