Inserting
the New Module into the Program[LINK]
Let us return to our example new module NewHVACComponent.
Since the module gets its own input and output, adding the
NewHVACComponent model to the program simply means adding a
call to the driver routine SimNewHVACComponent from the
correct place in EnergyPlus. In the simplest case, there is
only one location from which the driver routine should be
called. In some cases, though, more than one HVAC simulation
block will need to use the new component model.
SimulateWaterCoilComponents, for instance, can be used in both
zone equipment and air systems for heating, reheating and
cooling coils. In the air system simulation it is called from
two places: the main air system simulation, and the mixed air
simulation – the outside air duct might contain a separate
cooling coil.
Let us assume that the NewHVACComponent will be part of the
air system – perhaps it is a solid desiccant wheel. Examining
the air system calling tree we see that SimAirLoopComponent is
one routine that will invoke the new component, and - if we
want the component to possibly be in the outside air stream –
then SimOAComponent is the other routine that will need to
call the new component simulation. Generally, all that is
involved is adding a new CASE statement to a Fortran SELECT
construct. For instance in SimAirLoopComponent this would
look like:
SELECT CASE(CompType_Num)
CASE(OAMixer_Num) ! ‘OUTSIDE AIR SYSTEM’
CALL ManageOutsideAirSystem( …)
! Fan Types for the air sys simulation
CASE(Fan_Simple_CV) ! ‘FAN:SIMPLE:CONSTVOLUME’
CALL SimulateFanComponents(…)
CASE(Fan_Simple_VAV) ! ‘FAN:SIMPLE:VARIABLEVOLUME’
CALL SimulateFanComponents(…)
! Coil Types for the air sys simulation
!
‘COIL:DX:COOLINGHEATEXCHANGERASSISTED’
CASE(DXCoil_CoolingHXAsst)
CALL SimHXAssistedCoolingCoil(…)
!
‘COIL:WATER:COOLINGHEATEXCHANGERASSISTED’
CASE(WaterCoil_CoolingHXAsst)
CALL SimHXAssistedCoolingCoil(…)
CASE(WaterCoil_SimpleHeat) !
‘COIL:WATER:SIMPLEHEATING’
CALL SimulateWaterCoilComponents(…)
CASE(SteamCoil_AirHeat) ! ‘COIL:STEAM:AIRHEATING’
CALL SimulateSteamCoilComponents(…)
CASE(WaterCoil_DetailedCool) !
‘COIL:WATER:DETAILEDFLATCOOLING’
CALL SimulateWaterCoilComponents(…)
CASE(WaterCoil_Cooling) ! ‘COIL:WATER:COOLING’
CALL SimulateWaterCoilComponents(…)
CASE(Coil_ElectricHeat) ! ‘COIL:ELECTRIC:HEATING’
CALL SimulateHeatingCoilComponents(…)
CASE(Coil_GasHeat) ! ‘COIL:GAS:HEATING’
CALL SimulateHeatingCoilComponents(…)
! Heat reclaim
CASE(Coil_DeSuperHeat) !
‘COIL:DESUPERHEATER:HEATING’
CALL SimulateHeatingCoilComponents(…)
CASE(DXSystem) ! ‘DXSYSTEM:AIRLOOP’
CALL SimDXCoolingSystem(…)
CASE(Furnace_UnitarySys) !
‘FURNACE:BLOWTHRU:HEATONLY’,
!
‘FURNACE:BLOWTHRU:HEATCOOL’,
!
‘UNITARYSYSTEM:BLOWTHRU:HEATONLY’,
!
‘UNITARYSYSTEM:BLOWTHRU:HEATCOOL’
!
‘UNITARYSYSTEM:HEATPUMP:AIRTOAIR’,
!
‘UNITARYSYSTEM:HEATPUMP:WATERTOAIR’
CALL SimFurnace(…)
! Humidifier Types for the air system simulation
CASE(Humidifier) ! ‘HUMIDIFIER:STEAM:ELECTRICAL’
CALL SimHumidifier(…)
! Evap Cooler Types for the air system simulation
CASE(EvapCooler) ! ‘EVAPCOOLER:DIRECT:CELDEKPAD’,
! ‘EVAPCOOLER:INDIRECT:CELDEKPAD’
! ‘EVAPCOOLER:INDIRECT:WETCOIL’,
! ‘EVAPCOOLER:INDIRECT:RDDSPECIAL’
CALL SimEvapCooler(…)
! Desiccant Dehumidifier Types for the air system
simulation
CASE(Desiccant) ! ‘DESICCANT DEHUMIDIFIER:SOLID’
CALL SimDesiccantDehumidifier(…)
! Heat recovery
CASE(HeatXchngr) ! ‘HEAT EXCHANGER:AIR TO AIR:FLAT
PLATE’
CALL SimHeatRecovery(…)
! Ducts
CASE(Duct) ! ‘DUCT’
CALL SimDuct(…)
! New HVAC Component
CASE (NewHVACCompNum) ! ‘NEW HVAC COMPONENT’
CALL SimNewHVACComponent(…)
DEFAULT
END SELECT
The new code is italicized. Do the same thing in
SimOAComponent and you are done! Note that “NEW HVAC
COMPONENT” is the class name (keyword) for the new component
in the IDD file. The class names are converted to upper case
in EnergyPlus, so the CASE statement must have the class name
in upper case. The actual class name on the IDD file would
probably be “New HVAC Component”.
If the new HVAC component is a piece of zone equipment – a
cooled beam system, for instance – then the zone equipment
calling tree indicates that the call to SimNewHVACComponent
would be in SimZoneEquipment. If the new component is a gas
fired absorption chiller, the call would be in
SimPlantEquip.
In every case, since NewHVACComponent is a new module, a
USE statement must be added to the calling subroutine. For
instance in SimAirLoopComponent this would look like:
SUBROUTINE SimAirLoopComponent(CompType, CompName,
FirstHVACIteration, LastSim)
! SUBROUTINE INFORMATION
! AUTHOR: Russ Taylor, Dan Fisher,
Fred Buhl
! DATE WRITTEN: Oct 1997
! MODIFIED: Dec 1997 Fred Buhl
! RE-ENGINEERED: This is new code, not
reengineered
! PURPOSE OF THIS SUBROUTINE:
! Calls the individual air loop component
simulation routines
! METHODOLOGY EMPLOYED: None
! REFERENCES: None
! USE Statements
USE Fans, Only:SimulateFanComponents
USE WaterCoils, Only:SimulateWaterCoilComponents
USE MixedAir, Only:ManageOutsideAirSystem
USE NewHVACComponent,
Only:SimNewHVACComponent
Inserting the New Module into the Program[LINK]
Let us return to our example new module NewHVACComponent. Since the module gets its own input and output, adding the NewHVACComponent model to the program simply means adding a call to the driver routine SimNewHVACComponent from the correct place in EnergyPlus. In the simplest case, there is only one location from which the driver routine should be called. In some cases, though, more than one HVAC simulation block will need to use the new component model. SimulateWaterCoilComponents, for instance, can be used in both zone equipment and air systems for heating, reheating and cooling coils. In the air system simulation it is called from two places: the main air system simulation, and the mixed air simulation – the outside air duct might contain a separate cooling coil.
Let us assume that the NewHVACComponent will be part of the air system – perhaps it is a solid desiccant wheel. Examining the air system calling tree we see that SimAirLoopComponent is one routine that will invoke the new component, and - if we want the component to possibly be in the outside air stream – then SimOAComponent is the other routine that will need to call the new component simulation. Generally, all that is involved is adding a new CASE statement to a Fortran SELECT construct. For instance in SimAirLoopComponent this would look like:
SELECT CASE(CompType_Num)
CASE(OAMixer_Num) ! ‘OUTSIDE AIR SYSTEM’
CALL ManageOutsideAirSystem( …)
! Fan Types for the air sys simulation
CASE(Fan_Simple_CV) ! ‘FAN:SIMPLE:CONSTVOLUME’
CALL SimulateFanComponents(…)
CASE(Fan_Simple_VAV) ! ‘FAN:SIMPLE:VARIABLEVOLUME’
CALL SimulateFanComponents(…)
! Coil Types for the air sys simulation
! ‘COIL:DX:COOLINGHEATEXCHANGERASSISTED’
CASE(DXCoil_CoolingHXAsst)
CALL SimHXAssistedCoolingCoil(…)
! ‘COIL:WATER:COOLINGHEATEXCHANGERASSISTED’ CASE(WaterCoil_CoolingHXAsst)
CALL SimHXAssistedCoolingCoil(…)
CASE(WaterCoil_SimpleHeat) ! ‘COIL:WATER:SIMPLEHEATING’
CALL SimulateWaterCoilComponents(…)
CASE(SteamCoil_AirHeat) ! ‘COIL:STEAM:AIRHEATING’
CALL SimulateSteamCoilComponents(…)
CASE(WaterCoil_DetailedCool) ! ‘COIL:WATER:DETAILEDFLATCOOLING’
CALL SimulateWaterCoilComponents(…)
CASE(WaterCoil_Cooling) ! ‘COIL:WATER:COOLING’
CALL SimulateWaterCoilComponents(…)
CASE(Coil_ElectricHeat) ! ‘COIL:ELECTRIC:HEATING’
CALL SimulateHeatingCoilComponents(…)
CASE(Coil_GasHeat) ! ‘COIL:GAS:HEATING’
CALL SimulateHeatingCoilComponents(…)
! Heat reclaim
CASE(Coil_DeSuperHeat) ! ‘COIL:DESUPERHEATER:HEATING’
CALL SimulateHeatingCoilComponents(…)
CASE(DXSystem) ! ‘DXSYSTEM:AIRLOOP’
CALL SimDXCoolingSystem(…)
CASE(Furnace_UnitarySys) ! ‘FURNACE:BLOWTHRU:HEATONLY’,
! ‘FURNACE:BLOWTHRU:HEATCOOL’,
! ‘UNITARYSYSTEM:BLOWTHRU:HEATONLY’,
! ‘UNITARYSYSTEM:BLOWTHRU:HEATCOOL’
! ‘UNITARYSYSTEM:HEATPUMP:AIRTOAIR’,
! ‘UNITARYSYSTEM:HEATPUMP:WATERTOAIR’
CALL SimFurnace(…)
! Humidifier Types for the air system simulation
CASE(Humidifier) ! ‘HUMIDIFIER:STEAM:ELECTRICAL’
CALL SimHumidifier(…)
! Evap Cooler Types for the air system simulation
CASE(EvapCooler) ! ‘EVAPCOOLER:DIRECT:CELDEKPAD’,
! ‘EVAPCOOLER:INDIRECT:CELDEKPAD’
! ‘EVAPCOOLER:INDIRECT:WETCOIL’,
! ‘EVAPCOOLER:INDIRECT:RDDSPECIAL’
CALL SimEvapCooler(…)
! Desiccant Dehumidifier Types for the air system simulation
CASE(Desiccant) ! ‘DESICCANT DEHUMIDIFIER:SOLID’
CALL SimDesiccantDehumidifier(…)
! Heat recovery
CASE(HeatXchngr) ! ‘HEAT EXCHANGER:AIR TO AIR:FLAT PLATE’
CALL SimHeatRecovery(…)
! Ducts
CASE(Duct) ! ‘DUCT’
CALL SimDuct(…)
! New HVAC Component
CASE (NewHVACCompNum) ! ‘NEW HVAC COMPONENT’
CALL SimNewHVACComponent(…)
DEFAULT
END SELECT
The new code is italicized. Do the same thing in SimOAComponent and you are done! Note that “NEW HVAC COMPONENT” is the class name (keyword) for the new component in the IDD file. The class names are converted to upper case in EnergyPlus, so the CASE statement must have the class name in upper case. The actual class name on the IDD file would probably be “New HVAC Component”.
If the new HVAC component is a piece of zone equipment – a cooled beam system, for instance – then the zone equipment calling tree indicates that the call to SimNewHVACComponent would be in SimZoneEquipment. If the new component is a gas fired absorption chiller, the call would be in SimPlantEquip.
In every case, since NewHVACComponent is a new module, a USE statement must be added to the calling subroutine. For instance in SimAirLoopComponent this would look like:
SUBROUTINE SimAirLoopComponent(CompType, CompName, FirstHVACIteration, LastSim)
! SUBROUTINE INFORMATION
! AUTHOR: Russ Taylor, Dan Fisher, Fred Buhl
! DATE WRITTEN: Oct 1997
! MODIFIED: Dec 1997 Fred Buhl
! RE-ENGINEERED: This is new code, not reengineered
! PURPOSE OF THIS SUBROUTINE:
! Calls the individual air loop component simulation routines
! METHODOLOGY EMPLOYED: None
! REFERENCES: None
! USE Statements
USE Fans, Only:SimulateFanComponents
USE WaterCoils, Only:SimulateWaterCoilComponents
USE MixedAir, Only:ManageOutsideAirSystem
USE NewHVACComponent, Only:SimNewHVACComponent
Documentation content copyright © 1996-2026 The Board of Trustees of the University of Illinois and the Regents of the University of California through the Ernest Orlando Lawrence Berkeley National Laboratory. All rights reserved. EnergyPlus is a trademark of the US Department of Energy.
This documentation is made available under the EnergyPlus Open Source License v1.0.