Source code for biosteam.units._junction

# -*- coding: utf-8 -*-
# BioSTEAM: The Biorefinery Simulation and Techno-Economic Analysis Modules
# Copyright (C) 2020-2023, Yoel Cortes-Pena <yoelcortes@gmail.com>
# 
# This module is under the UIUC open-source license. See 
# github.com/BioSTEAMDevelopmentGroup/biosteam/blob/master/LICENSE.txt
# for license details.
"""
"""
from .._unit import Unit
from thermosteam._graphics import junction_graphics
from .._power_utility import PowerUtility
from ..exceptions import UndefinedChemical
from ..utils.piping import Inlets, Outlets

__all__ = ('Junction',)


# %% Connect between different property packages

[docs] class Junction(Unit): """ Create a Junction object that copies data from `upstream` to `downstream`. This serves to connect streams with different property packages. Parameters ---------- upstream=None : Stream or str, defaults to missing stream Stream that will be copied to `downstream`. downstream="" : Stream or str, defaults to missing stream Flow rate, T, P, and phase information will be copied from `upstream` to this stream. If None, stream will be missing. Examples -------- Create a Junction object and connect streams with different chemicals: >>> from biosteam import * >>> settings.set_thermo(['Water']) >>> s1 = Stream('s1', Water=20) >>> settings.set_thermo(['Ethanol', 'Water'], cache=True) >>> s2 = Stream('s2') # Note that s2 and s1 have different chemicals defined >>> J1 = units.Junction('J1', s1, s2) >>> J1.simulate() >>> J1.show() Junction: J1 ins... [0] s1 phase: 'l', T: 298.15 K, P: 101325 Pa flow (kmol/hr): Water 20 outs... [0] s2 phase: 'l', T: 298.15 K, P: 101325 Pa flow (kmol/hr): Water 20 """ _stacklevel = Unit._stacklevel _graphics = junction_graphics power_utility = PowerUtility() design_results = {} baseline_purchase_cost = 0. baseline_purchase_costs = {} purchase_cost = 0. purchase_costs = {} installed_cost = 0. installed_costs = {} utility_cost = 0. prioritize = False def __init__(self, ID="", upstream=None, downstream=None, thermo=None): self._register(ID) thermo = self._load_thermo(thermo) self._init_specifications() self._isdynamic = False self.heat_utilities = [] self._ins = Inlets(self, 1, upstream, thermo, True, self._stacklevel) self._outs = Outlets(self, 1, downstream, thermo, True, self._stacklevel) @property def upstream(self): return self._ins[0] @upstream.setter def upstream(self, upstream): self._ins[0] = upstream @property def downstream(self): return self._outs[0] @downstream.setter def downstream(self, downstream): self._outs[0] = downstream def _setup(self): for ps in self._specifications: ps.compile(self) def _run(self): upstream = self._ins[0] downstream = self._outs[0] try: downstream.copy_like(upstream) except UndefinedChemical: self._reset_thermo(self._ins[0]._thermo) downstream.copy_like(upstream) simulate = Unit.run def _get_tooltip_string(self): return f"{type(self).__name__}: {self.ID}" @property def _inlet_utility_indices(self): return {} @property def _outlet_utility_indices(self): return {}