Source code for idaes.models.temperature_changer

##############################################################################
# Institute for the Design of Advanced Energy Systems Process Systems
# Engineering Framework (IDAES PSE Framework) Copyright (c) 2018, by the
# software owners: The Regents of the University of California, through
# Lawrence Berkeley National Laboratory,  National Technology & Engineering
# Solutions of Sandia, LLC, Carnegie Mellon University, West Virginia
# University Research Corporation, et al. All rights reserved.
# 
# Please see the files COPYRIGHT.txt and LICENSE.txt for full copyright and
# license information, respectively. Both files are also available online
# at the URL "https://github.com/IDAES/idaes".
##############################################################################
"""
Standard IDAES temperature changer model.
"""
from __future__ import division

# Import Python libraries
import logging

# Import Pyomo libraries
from pyomo.environ import value, Var
from pyomo.common.config import ConfigValue, In

# Import IDAES cores
from idaes.core import UnitBlockData, declare_process_block_class, \
                        Holdup0D, CONFIG_Base
from idaes.core.util.config import is_parameter_block, list_of_strings
from idaes.core.util.misc import add_object_ref

__author__ = "Andrew Lee"

# Set up logger
logger = logging.getLogger('idaes.unit_model')


[docs]@declare_process_block_class("TemperatureChanger") class TemperatureChangerData(UnitBlockData): """ Standard Temperature Changer Unit Model Class """ CONFIG = CONFIG_Base() # Set default values of inherited attributes CONFIG.get("has_phase_equilibrium")._default = True CONFIG.get("has_heat_transfer")._default = True # Add unit model attributes CONFIG.declare("property_package", ConfigValue( default=None, domain=is_parameter_block, description="Property package to use for holdup", doc="""Property parameter object used to define property calculations (default = 'use_parent_value') - 'use_parent_value' - get package from parent (default = None) - a ParameterBlock object""")) CONFIG.declare("property_package_args", ConfigValue( default={}, description="Arguments to use for constructing property packages", doc="""A dict of arguments to be passed to the PropertyBlockData and used when constructing these (default = 'use_parent_value') - 'use_parent_value' - get package from parent (default = None) - a dict (see property package for documentation)""")) CONFIG.declare("inlet_list", ConfigValue( domain=list_of_strings, description="List of inlet names", doc="""A list containing names of inlets (default = None) - None - default single inlet - list - a list of names for inlets""")) CONFIG.declare("num_inlets", ConfigValue( domain=int, description="Number of inlets to unit", doc="""Argument indication number (int) of inlets to construct (default = None). Not used if inlet_list arg is provided. - None - use inlet_list arg instead - int - Inlets will be named with sequential numbers from 1 to num_inlets""")) CONFIG.declare("outlet_list", ConfigValue( domain=list_of_strings, description="List of outlet names", doc="""A list containing names of outlets (default = None) - None - default single outlet - list - a list of names for outlets""")) CONFIG.declare("num_outlets", ConfigValue( domain=int, description="Number of outlets to unit", doc="""Argument indication number (int) of outlets to construct (default = None). Not used if outlet_list arg is provided. - None - use outlet_list arg instead - int - Outlets will be named with sequential numbers from 1 to num_outlets""")) CONFIG.declare("heater", ConfigValue( default=True, domain=In([True, False]), description="Heater flag", doc="""Indicates whether this unit should be considered a heater (True (default), temperature increase) or a cooler (False, temperature decrease)."""))
[docs] def build(self): """ Begin building model (pre-DAE transformation) Args: None Returns: None """ # Call UnitModel.build to setup dynamics super(TemperatureChangerData, self).build() # Build Holdup Block self.holdup = Holdup0D() # Set Unit Geometry and Holdup Volume self._set_geometry() # Construct performance equations self._make_performance()
[docs] def post_transform_build(self): """ Continue model construction after DAE transformation Args: None Returns: None """ # Construct Inlets self.build_inlets(inlets=self.config.inlet_list, num_inlets=self.config.num_inlets) # Build Outlets self.build_outlets(outlets=self.config.outlet_list, num_outlets=self.config.num_outlets)
def _set_geometry(self): """ Define the geometry of the unit as necessary, and link to holdup volume Args: None Returns: None """ # For this case, just create a reference to holdup volume if self.config.include_holdup is True: add_object_ref(self, "volume", self.holdup.volume) def _make_performance(self): """ Define constraints which describe the behaviour of the unit model. Args: None Returns: None """ # Add reference to heat term add_object_ref(self, "heat", self.holdup.heat) # Add performance variables self.deltaT = Var(self.time, doc="Temperature difference in unit") # detaT constraint @self.Constraint(self.time, doc="Temperature difference calculation") def temperature_difference(b, t): return b.deltaT[t] == (b.holdup.properties_out[t].temperature - b.holdup.properties_in[t].temperature)
[docs] def model_check(blk): """ Check that temperature change matches with heater argument (i.e. if heater = True, temperature should increase). Args: None Returns: None """ if blk.config.heater: # Heater # Check that temperature does not decrease if any(blk.deltaT[t].fixed and (value(blk.deltaT[t]) < 0.0) for t in blk.time): logger.warning('{} Heater set with negative deltaT.' .format(blk.name)) if any(blk.holdup.properties_out[t].temperature.fixed and (value(blk.holdup.properties_in[t].temperature) > value(blk.holdup.properties_out[t].temperature)) for t in blk.time): logger.warning('{} Heater set with temperature decrease.' .format(blk.name)) # Check that work is not negative if any(blk.heat[t].fixed and (value(blk.heat[t]) < 0.0) for t in blk.time): logger.warning('{} Heater maybe set with negative heat duty.' .format(blk.name)) else: # Cooler # Check that temperature does not increase if any(blk.deltaT[t].fixed and (value(blk.deltaT[t]) > 0.0) for t in blk.time): logger.warning('{} Cooler set with positive deltaT.' .format(blk.name)) if any(blk.holdup.properties_out[t].temperature.fixed and (value(blk.holdup.properties_in[t].temperature) < value(blk.holdup.properties_out[t].temperature)) for t in blk.time): logger.warning('{} Cooler maybe set with temperature ', 'increase.'.format(blk.name)) # Check that heat is not positive if any(blk.heat[t].fixed and (value(blk.heat[t]) > 0.0) for t in blk.time): logger.warning('{} Cooler maybe set with positive heat duty.' .format(blk.name)) # Run holdup block model checks blk.holdup.model_check()