Source code for idaes.core.util.unit_costing

##############################################################################
# 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".
##############################################################################
# =============================================================================

from pyomo.environ import (Constraint,
                           Expression,
                           Var,
                           Param,
                           exp,
                           log10)

def global_costing_parameters(self, year=None):
    if year is None:
        year='2018'
    # Cost index $/year (method argument or 2018 default)
    ce_index_dic = {'2019':680, '2018':671.1, '2017':567.5, '2016':541.7,
                '2015':556.8, '2014':576.1, '2013':567.3, '2012':584.6,
                '2011':585.7, '2010':550.8}
    
    self.CE_index = Param(mutable = True, initialize = ce_index_dic[year],
                          doc= 'CE cost index $ year')

[docs]def hx_costing(self, hx_type='U-tube', FM='stain_steel', FL = '12ft'): ''' Heat exchanger costing method Source: Process and Product Design Principles: Synthesis, Analysis, and Evaluation Seider, Seader, Lewin, Windagdo, 3rd Ed. John Wiley and Sons Chapter 22. Cost Accounting and Capital Cost Estimation 22.2 Cost Indexes and Capital Investment This method computes the purchase cost (CP) for a shell and tube heat exchanger (Eq. 22.43), the model computes the base cost (CB for 4 type of heat exchangers, such as floating head, fixed head, U-tube, and Kettle vaporizer), construction material factor (FM), pressure design factor (FP), and tube length correction factor (FL), using CE base cost index of 500. Cp = FP*FM*FL*CB Args: hx_type : 'floating_head', 'fixed_head', 'U-tube'*, 'Kettle_vap' material factor (FM): 'stain_steel'*, 'carb_steel' tube length (FL): '8ft'*, '12ft', '16ft', '20ft' * --> default options ''' # ------------------------ Heat Exchanger cost ------------------------ # heat exchanger cost self.base_cost = Var(initialize = 1e5, bounds=(0, 1e12), doc='Heat Exchanger Base Cost CB cost in $') self.purchase_cost = Var(initialize =1e4, bounds = (0,1e12), doc = 'Heat Exchanger Purchase Cost CP in $') self.FP = Var(initialize = 100, doc = 'hx Pressure factor') self.FL = Param(mutable = True, initialize = 1.12, doc='hx tube length correction factor') self.FM = Param(mutable = True, initialize = 3, doc= 'construction material correction factor') self.hx_os = Param(mutable = True, initialize = 1.1, doc= 'hx oversize factor 1.1 to 1.5') # select length correction factor c_fl = {'8ft':1.25, '12ft':1.12, '16ft':1.05, '20ft':1.00} self.FL = c_fl[FL] # select construction material (stainless steel default) c_material = {'stain_steel':3, 'carbon_steel':2} self.FM = c_material[FM] # ToDo (9/17/2019):FM can be calculated for advanced materials Eq.22.44 # i.e. Carbon Steel/Cr-Mo steel, Cr-Mo steel/Cr-Mo steel, Monel/Monel, # Titanium/titanium, etc. #-------------------------------------------------- # base cost calculation # # select heat exchanger type: alf1 = {'floating_head':11.9052,'fixed_head':11.2927, 'U-tube':11.3852,'Kettle_vap':12.2052} alf2 = {'floating_head':0.8709,'fixed_head':0.8228, 'U-tube':0.9186,'Kettle_vap':0.8709} alf3 = {'floating_head':0.09005,'fixed_head':0.09861, 'U-tube':0.09790,'Kettle_vap':0.09005} if (self.parent_block().config.tube.property_package.get_metadata(). default_units['length']) == 'm': area = self.parent_block().area*10.7639 elif (self.parent_block().config.tube.property_package.get_metadata(). default_units['length']) == 'ft': area = self.area else: raise Exception('area units not suported') def hx_cost_rule(self): return self.base_cost == self.FL * exp(alf1[hx_type] - alf2[hx_type]*log10(area*self.hx_os) + alf3[hx_type]*log10(area*self.hx_os)**2) self.base_cost_eq = Constraint(rule=hx_cost_rule) #------------------------------------------------------ # Pressure factor calculation # doublecheck units (higher pressure fluid should be tube side) if (self.parent_block().config.tube.property_package.get_metadata(). properties['pressure']['units']) == 'Pa': pressure = self.parent_block().tube.properties_in[0].pressure*14.69/1.01325e5 elif (self.parent_block().config.tube.property_package.get_metadata(). properties['pressure']['units']) == 'psig': pressure = self.tube.properties_in[0].pressure #units must be in psig #(ToDo(9/17/2019): check inlet pressure to select correlation) def hx_P_factor(self): # eq valid from 600 pisg to 3000 psig # return self.hx_FP == 0.8510 + 0.1292*(pressure/600) # + 0.0198*(pressure/600)**2 # eq valid from 100 pisg to 2000 psig return self.FP == 0.9803 + (0.018*(pressure*14.69/1.01325e5/100) + 0.0017*(pressure*14.69/1.01325e5/100)**2) self.p_factor_eq = Constraint(rule=hx_P_factor) #--------------------------------------------------------- # purchase cost equation def hx_CP_rule(self): return self.purchase_cost == (self.FP*self.FM*self.FL* (self.parent_block().flowsheet().costing.CE_index/500)*self.base_cost) self.cp_cost_eq = Constraint(rule=hx_CP_rule)