Source code for carbatpy.models.components.flow_devices

# -*- coding: utf-8 -*-
"""
Started a class for flow devices, especially mixing chambers, but could also be
used for heat exchangers or machines?

at the moment, the only device is for adiabtaic mixing, but also of
fluid mixtures of different compounds and composition.
ouputs as dictionary (state variables to be fixed?)
inputs=list of states (Fluid)
mix = list of 2 lists [[input 1(number), input 2 (number)], [output (number? or different?)]]

Created on Fri May 31 15:16:09 2024

@author: atakan
"""


import copy

# import src.models.fluids.fluid_props as fprop
import numpy as np
from scipy.optimize import minimize  # root, root_scalar
import matplotlib.pyplot as plt
import carbatpy as cb


[docs]class FlowDevice:
[docs] def __init__(self, inputs, outputs, flow_rates_in, mix=[], name="flow-device", **calc_parameters): """ Flow Device = mixing chamber At the moment the species, the mass balance, and the energy balance for an adiabatic chanber with given output pressure is calculated. Two fluids entering, at the moment only one is exiting. Parameters ---------- inputs : list of Fluids the (2) fluids entering with the correct states. outputs : List of Fluids the (actually single) fluid state exiting. flow_rates_in : list the mass flow rates in kg/s. mix : List of two lists, optional In the first list the input states are numbered, in the second the output states example: [[0,1],[0]]. The default is []. name : string, optional the name of the device. The default is "flow-device". **calc_parameters : dictionary example {"calc_type": "HP", "H": "const", "p_out": 1e5}, at the moment only p_out values should be changed. Returns ------- None. """ self.inputs = inputs self.outputs = outputs self.flow_rates_in = flow_rates_in self.name = name # print(mix) match len(mix): case 0: self.flow_rates_out = flow_rates_in case 2: self.molecular_weights = [] self.mix_species = {} spec_info = [] self.n_dot_total = 0 names = [] m_flows_list = [] self.flow_rate_out = [np.array(flow_rates_in).sum()] enthalpy_total = [] for i_in in mix[:][0]: act_info = [] state_act = inputs[i_in].state state_act = inputs[i_in].set_state([state_act[1], state_act[2]], "PH", cb.fprop._TRANS_STRING) molecular_weight = inputs[i_in].molecular_mass n_dot = molecular_weight * flow_rates_in[i_in] self.n_dot_total += n_dot names.extend(inputs[i_in].fluidmodel.fluid_to_list()) mole_frac = inputs[i_in].composition mol_flows = np.array(mole_frac) * n_dot m_flows_list.extend(list(mol_flows)) enthalpy_total.append(state_act[2] * n_dot) all_species = dict.fromkeys(names, 0) m_flows = np.array(m_flows_list) / self.n_dot_total enthalpy_out = (np.array(enthalpy_total) / self.n_dot_total).sum() # print(m_flows.sum(), m_flows, enthalpy_out) for i_spec, spec in enumerate(names): all_species[spec] += m_flows[i_spec] # all_species.extend(inputs[i_in].fluidmodel.fluid_to_list()) self.all_species = all_species rp_names = "*".join(list(self.all_species.keys())) st_mix = cb.fprop.init_fluid(rp_names, list(all_species.values())) # st_mix= cb.fprop.Fluid(fl_mix, # list(my_flow_dev.all_species.values())) self.outputs[mix[1][0]] = st_mix match calc_parameters["calc_type"]: case "HP": if calc_parameters["H"] == "const": self.st_out = st_mix.set_state([enthalpy_out, calc_parameters["p_out"]], calc_parameters["calc_type"]) case _: self.warning = 998 print( f"FlowDevice: calcukation type not implemented: {calc_parameters['calc_type']}") case _: self.warning = 999 print(f"FlowDevice: not implemented for length of mix: {mix}")
# if __name__ == "__main__":
[docs] FLUID = "Propane * Pentane"
comp = [.50, 0.5] myFluid = cb.fprop.init_fluid(FLUID, comp) calc_parameters_act = {"calc_type": "HP", "H": "const", "p_out": 1e5} st0 = myFluid.set_state([300., 1e5], "TP") FLUID2 = "Propane * Ethane" comp2 = [.50, 0.5] secFluid = cb.fprop.init_fluid(FLUID2, comp2) st0 = secFluid.set_state([400., 1e5], "TP") inputs_act = [myFluid, secFluid] outputs_act = [myFluid] mix_act = [[0, 1], [0]] flows_act = [.01, .02] my_flow_dev = FlowDevice(inputs_act, outputs_act, flows_act, mix_act, **calc_parameters_act) print(my_flow_dev.all_species, my_flow_dev.st_out)