Question-and-Answer Resource for the Building Energy Modeling Community
Get started with the Help page
Ask Your Question

Infinite Capacity Source/Sink Not Included in EUI

asked 2016-07-20 09:27:12 -0600

Adam Hilton's avatar

updated 2017-05-17 12:21:42 -0600

I need an infinite capacity object (that won't be factored in to the EUI in the default E+ report) to provide heating and cooling to a WSHP condenser loop. District Heating/Cooling won't work since that's included in the site EUI (which doesn't make any sense by the way since it's source energy, but I digress). I can't get the response I want from GroundHeatExchanger leaving the only other option I've found to be PlantComponent:TemperatureSource. Since this object can't be controlled by a setpoint manger I elected to created a heating and cooling primary loops that service the condenser loop through heat exchangers.

Cooling/Heating Loops (2 Unique Loops; bot with the same arragement)

image description

Heat Pump Loop

image description

Heat exchangers are set to ideal and cooling/heating setpoint modulated based on their respective loops. I've ensured all components have sufficiently large hard sized capacities.

I've tried MANY setups/combinations, but I've yet to come up with anything that responds how I'd like. Here is what the current setup yields...

image description

The loop works great when I a district heating/cooling setup in series. When I replace them with heat exchangers though, it all falls apart. Is there anything wrong with this setup that doesn't make any sense? Is there a better way to approach what I'm trying to do? I feel like this may be do to PlantOperationScheme:Uncontrolled, I feel like with all the explicit setpoint managers though that shouldn't be an issue.

edit retag flag offensive close merge delete


For one of our GSHP models we used a PlantComponent:TemperatureSource in conjunction with an EMS EnergyPlus measure to alter the schedule associated with the PlantComponent:TemperatureSource. If these is a solution you wan to try I can send some code from the EMS measure.

David Goldwasser's avatar David Goldwasser  ( 2016-07-20 09:46:21 -0600 )edit

Absolutely, I was just starting to look into that, if you already have something operational or skeletal that would fantastic.

Adam Hilton's avatar Adam Hilton  ( 2016-07-20 10:01:24 -0600 )edit

Does one of the combinations you tried include putting the heat pump loop heat exchangers in series on the outlet pipe? I am not sure they will get flow located inside the parallel branches with no operation scheme.

Archmage's avatar Archmage  ( 2016-07-20 12:41:34 -0600 )edit

Ya, I thought the parallel setup would be deficient in that respect. The series setup was was the one I worked the most with. I probably should have posted a screenshot of that.

Adam Hilton's avatar Adam Hilton  ( 2016-07-20 13:10:25 -0600 )edit

2 Answers

Sort by ยป oldest newest most voted

answered 2016-07-20 14:36:00 -0600

Adam Hilton's avatar

updated 2016-07-20 15:02:58 -0600

Let me preface this by saying I'm aware this is not the intended use for this object. However, I believe, this is the only option for an infinite capacity plant loop object that's not included in the default EUI reporting.

Loop Setup

  • There can't be a bypass pipe on the supply side.

image description

Rudimentary EMS Code

  CW_Loop_Outlet_Setpoint,              !- Name
  CW Loop Outlet,                       !- Output:Variable Index Key Name
  System Node Setpoint Temperature;     !- Output:Variable Name

  Temperature_Source_Setpoint,          !- Name
  HP-Loop-Temp-Schedule,                !- Unique Component Name
  Schedule:Year,                        !- Actuated Component Type
  Schedule Value;                       !- Actuated Component Control Type

  TemperatureSourceControl,             !- Name
  SET Temperature_Source_Setpoint = CW_Loop_Outlet_Setpoint;

  TemperatureSourceControlCall,         !- Name
  AfterPredictorAfterHVACManagers,      !- EnergyPlus Model Calling Point
  TemperatureSourceControl;             !- Program Name 1


  • Outlet Temperature = Outlet Setpoint WHEN Outlet Mass Flow > 0
  • Outlet Temperature = Inlet Temperature WHEN Outlet Mass Flow = 0

image description

edit flag offensive delete link more

answered 2016-07-20 23:57:23 -0600

updated 2016-07-21 06:12:20 -0600

@adhilton, this EMS code isn't too different from yours. The model this was used on has PlantComponent:TemperatureSource object on the supply side, and then cooling and heating water to air heat pumps on the demand side.

image description

Here is the full run section of the measure that adds EMS. Code wasn't modeling infinite capacity. You could modify this to use the ES code from your answer.

# use the built-in error checking 
if !runner.validateUserArguments(arguments(workspace), user_arguments)
  return false

# reporting initial condition of model
runner.registerInitialCondition("The building started with #{workspace.objects.size} Energy Management  objects.")

# Get the last openstudio model
model = runner.lastOpenStudioModel
if model.empty?
  runner.registerError("Could not load last OpenStudio model, cannot apply measure.")
  return false
model = model.get

plant_component_temperature_source = model.getPlantComponentTemperatureSources.first
inlet_port = plant_component_temperature_source.inletModelObject.get # todo - confirm this exists
schedule = plant_component_temperature_source.sourceTemperatureSchedule.get # todo - confirm this exists

string_objects = []

string_objects << "
  #{},                   !- Key Value
  System Node Temperature,              !- Variable Name
  Hourly;                               !- Reporting Frequency

string_objects << "
  Ground_HX_Inlet_Temp,                   !- Name
  #{},                     !- Output:Variable or Output:Meter Index Key Name
  System Node Temperature;                !- Output:Variable or Output:Meter Name

string_objects << "
  Ground_HX_Schedule_Actuator,            !- Name
  #{},                       !- Actuated Component Unique Name
  Schedule:Constant,                      !- Actuated Component Type
  Schedule Value;                         !- Actuated Component Control Type

string_objects << "
  Ground_HX,                              !- Name
  SET Tin = Ground_HX_Inlet_Temp,         !- Program Line 1
  IF Tin < 15.556,                        !- Program Line 2
  SET Tout = Tin + 5.556,                 !- Program Line 3
  ELSE,                                   !- Program Line 4
  SET Tout = Tin - 5.556,                 !- Program Line 5
  ENDIF,                                  !- Program Line 6
  SET Ground_HX_Schedule_Actuator = Tout; !- Program Line 7

string_objects << "
  Ground HX,                              !- Name
  InsideHVACSystemIterationLoop,          !- EnergyPlus Model Calling Point
  Ground_HX;                              !- Program Name 1

# add all of the strings to workspace
string_objects.each do |string_object|
  idfObject = OpenStudio::IdfObject::load(string_object)
  object = idfObject.get
  wsObject = workspace.addObject(object)

# report final condition of model
runner.registerFinalCondition("The finished started with #{workspace.objects.size} Energy Management objects.")

return true
edit flag offensive delete link more


Awesome, thanks David. This worked with a bypass pipe too? I wonder why mine behaves strangely.

Adam Hilton's avatar Adam Hilton  ( 2016-07-21 08:58:01 -0600 )edit

I noticed that David's model has a SPM on the outlet node of the TemperatureSource, which OS translates into a PlantEquipmentOperation:ComponentSetpoint. If you don't have an SPM on the outlet node, OS puts the TemperatureSource on a PlantEquipmentOperation:Uncontrolled. In the E+ example file, the TemperatureSource is on a PlantEquipmentOperation:CoolingLoad. @Kyle Benne maybe we should beef up the translator to put a temp source on a heating or cooling operation instead based on the Source Temperature listed in the object?

aparker's avatar aparker  ( 2016-07-21 09:55:54 -0600 )edit

@aparker was your comment on the TemperatureSource translation ever implemented? I could not find an issue on the Github repo.

Luis Lara's avatar Luis Lara  ( 2019-04-19 10:10:49 -0600 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower


Asked: 2016-07-20 09:27:12 -0600

Seen: 215 times

Last updated: Jul 21 '16