Пример #1
0
    def test_simple_input(self):
        A = 1
        m_dot = 1
        rho = 1

        exp = 1
        res = chamber.velocity_from_mass_flow(A=A, m_dot=m_dot, rho=rho)
        self.assertEqual(exp, res)

        A = 2
        exp = 0.5
        res = chamber.velocity_from_mass_flow(A=A, m_dot=m_dot, rho=rho)
        self.assertEqual(exp, res)

        rho = 5
        exp = 0.1
        res = chamber.velocity_from_mass_flow(A=A, m_dot=m_dot, rho=rho)
        self.assertEqual(exp, res)

        m_dot = 100
        exp = 10
        res = chamber.velocity_from_mass_flow(A=A, m_dot=m_dot, rho=rho)
        self.assertEqual(exp, res)
Пример #2
0
def two_phase_single_channel(T_wall,
                             w_channel,
                             Nu_func_gas,
                             Nu_func_liquid,
                             T_inlet,
                             T_chamber,
                             p_ref,
                             m_dot,
                             h_channel,
                             fp: FluidProperties,
                             print_info=True):
    """ Function that calculates the total power consumption of a specific chamber, in order to optimize the chamber

    Args:
        T_wall (K): Wall temperature
        w_channel (m): Channel width
        Nu_func_gas (-): Nusselt function for gas phase
        Nu_func_liquid (-) Nusselt function for liquid phase
        T_inlet (K): Chamber inlet temperature
        T_chamber (K): Chamber outlet temperature (same as T_c in IRT)
        p_ref (Pa): Reference pressure for the Nusselt relation and flow similary parameters (same as inlet pressure as no pressure drop is assumed)
        m_dot (kg/s): Mass flow
        h_channel (m): Channel height
        w_channel_margin (m): The amount of margin around the chamber for structural reasons. Important because it also radiates heat
        fp (-  ): [description]
        print_info(Bool): for debugging purposes
    """

    # Calculate saturation temperature, to determine where transition from gas to liquid occurs
    T_sat = fp.get_saturation_temperature(p=p_ref)  # [K]
    # Sanity check on input
    assert (T_chamber > T_sat)
    assert (T_wall > T_chamber)

    # Calculate the two reference temperatures for the separated phases
    T_bulk_gas = (T_sat + T_chamber) / 2  # [K] Bulk temperature gas phase
    T_bulk_liquid_multi = (
        T_inlet +
        T_sat) / 2  # [K] Bulk temperature of liquid and multi-phase flow
    # Calculate the density at these reference points
    rho_bulk_gas = fp.get_density(T=T_bulk_gas, p=p_ref)  # [kg/m^3]
    rho_bulk_liquid_multi = fp.get_density(T=T_bulk_liquid_multi,
                                           p=p_ref)  # [kg/m^3]

    # Channel geometry
    A_channel = w_channel * h_channel  # [m^2] Area through which the fluid flows
    wetted_perimeter = wetted_perimeter_rectangular(
        w_channel=w_channel, h_channel=h_channel
    )  # [m] Distance of channel cross-section in contact with fluid
    D_hydraulic = hydraulic_diameter_rectangular(
        w_channel=w_channel, h_channel=h_channel)  # [m] Hydraulic diameter

    # Flow similarity parameters (for debugging and Nu calculatoin purposes)
    Re_bulk_gas = fp.get_Reynolds_from_mass_flow(
        m_dot=m_dot, p=p_ref, T=T_bulk_gas, L_ref=D_hydraulic,
        A=A_channel)  # [-] Bulk Reynolds number in the gas phase
    Re_bulk_liquid_multi = fp.get_Reynolds_from_mass_flow(
        m_dot=m_dot,
        p=p_ref,
        T=T_bulk_liquid_multi,
        L_ref=D_hydraulic,
        A=A_channel)  # [-] Bulk Reynolds number in the liquid/multi-phase
    Pr_bulk_gas = fp.get_Prandtl(
        T=T_bulk_gas, p=p_ref)  # [-] Prandtl number in the gas phase
    Pr_bulk_liquid_multi = fp.get_Prandtl(
        T=T_bulk_liquid_multi,
        p=p_ref)  # [-] Prandtl number in liquid/multi-phase
    Bo_sat = fp.get_Bond_number(
        p_sat=p_ref, L_ref=D_hydraulic
    )  # [-] Bond number at saturation pressure (assumed to be p_ref)

    # Calculate Nusselt number in both sections
    args_gas = {
        'Re': Re_bulk_gas,  # Arguments for Nusselt function (gas phase) 
        'Pr': Pr_bulk_gas,
        'Bo': Bo_sat,
    }

    args_liquid_multi = { # Arguments for Nusselt function (liquid/multi phase)
        'Re': Re_bulk_liquid_multi,
        'Pr': Pr_bulk_liquid_multi,
        'Bo': Bo_sat,
        }

    Nu_gas = Nu_func_gas(args=args_gas)
    Nu_liquid_multi = Nu_func_liquid(args=args_liquid_multi)
    # Calculate Stanton number in both sections
    St_gas = Stanton_from_Nusselt_and_velocity(
        Nu=Nu_gas,
        T_ref=T_bulk_gas,
        p_ref=p_ref,
        L_ref=D_hydraulic,
        m_dot=m_dot,
        A=A_channel,
        fp=fp)  # [-] Stanton number in gas phase
    St_liquid_multi = Stanton_from_Nusselt_and_velocity(
        Nu_liquid_multi,
        T_ref=T_bulk_liquid_multi,
        p_ref=p_ref,
        L_ref=D_hydraulic,
        m_dot=m_dot,
        A=A_channel,
        fp=fp)  # [-] Stanton number in liquid phase
    # Calculate velocity for convection parameter (bulk temp used as reference for phase)
    u_bulk_gas = velocity_from_mass_flow(
        A=A_channel, m_dot=m_dot,
        rho=rho_bulk_gas)  # [m/s] Velocity at the gas bulk reference state
    u_bulk_liquid_multi = velocity_from_mass_flow(
        A=A_channel, m_dot=m_dot, rho=rho_bulk_liquid_multi
    )  # [m/s] Velocity at the liquid/multi-phase bulk reference state
    # Convective parameter
    h_conv_gas = h_conv_from_Stanton(
        Stanton=St_gas, u=u_bulk_gas, T_ref=T_bulk_gas, p_ref=p_ref, fp=fp
    )  # [W/(m^2*K)] Convective heat transfer coefficient at bulk gas state
    h_conv_liquid_multi = h_conv_from_Stanton(
        Stanton=St_liquid_multi,
        u=u_bulk_liquid_multi,
        T_ref=T_bulk_liquid_multi,
        p_ref=p_ref,
        fp=fp
    )  # [W/(m^2*K)] Convective heat transfer coefficient at bulk liquid/multi-phase state
    # Required specific enthalpy change for heating the separate sections
    h_outlet = fp.get_enthalpy(
        T=T_chamber, p=p_ref)  # [J/kg] Specific enthalpy at the outlet
    h_sat_gas = fp.get_saturation_enthalpy_gas(
        p=p_ref)  # [J/kg] Specific enthalpy of saturated gas
    h_inlet = fp.get_enthalpy(T=T_inlet, p=p_ref)  # [J/kg]
    # Required specific enthalpy increases
    delta_h_gas = h_outlet - h_sat_gas  # [J/kg] Enthalpy increase needed to go from saturated gas to outlet enthalpy
    delta_h_liquid_multi = h_sat_gas - h_inlet  # [J/k] Enthalpy increase needed to go from inlet enthalpy to saturated gas
    # Required power for those enthalpy changes at the given mass flow
    Q_dot_gas = required_power(m_dot=m_dot, delta_h=delta_h_gas)  # [W]
    Q_dot_liquid_multi = required_power(m_dot=m_dot,
                                        delta_h=delta_h_liquid_multi)  # [W]
    # Required heater area to achieve the required power
    A_heater_gas = required_heater_area(Q_dot=Q_dot_gas,
                                        h_conv=h_conv_gas,
                                        T_wall=T_wall,
                                        T_ref=T_bulk_gas)  # [m^2]
    A_heater_liquid_multi = required_heater_area(
        Q_dot=Q_dot_liquid_multi,
        h_conv=h_conv_liquid_multi,
        T_wall=T_wall,
        T_ref=T_bulk_liquid_multi)  # [m^2]
    # Required length to achieve desired area
    L_channel_gas = A_heater_gas / wetted_perimeter  # [m] Length of channel after gas is saturated
    L_channel_liquid_multi = A_heater_liquid_multi / wetted_perimeter  # [m] Length of channel after heater
    L_channel = L_channel_gas + L_channel_liquid_multi  # [m]
    L_hydrodynamic_entrance = D_hydraulic * Re_bulk_liquid_multi * 0.04  # [m] Hydrodynamic entrance to estimate if the flow is fully developed

    assert (h_outlet > h_sat_gas)
    assert (h_sat_gas > h_inlet)

    if (print_info):
        print("\n--- SPECIFIC ENTHALPY AT DIFFERENT STATIONS ---")
        print("h_outlet: {:4.3f} J/kg".format(h_outlet))
        print("h_sat_gas: {:4.3f} J/kg".format(h_sat_gas))
        print("h_inlet: {:4.3f} J/kg".format(h_inlet))

        print("\n --- REQUIRED POWER ---")
        print("Q_dot_gas: {:2.5f} W".format(Q_dot_gas))
        print("Q_dot_liquid_multi: {:2.5f} W".format(Q_dot_liquid_multi))

        print("\n --- BULK GAS PHASE PARAMETERS --- ")
        print("u: {:3.2f} m/s".format(u_bulk_gas))
        print("Nu: {}".format(Nu_gas))
        print("Re: {}".format(Re_bulk_gas))
        print("Pr: {}".format(Pr_bulk_gas))
        print("St: {}".format(St_gas))
        print("Bo_sat: {}".format(Bo_sat))

        print("\n --- BULK LIQUID/MULTI-PHASE PARAMETERS ---")
        print("u: {:3.4f} m/s".format(u_bulk_liquid_multi))
        print("Nu: {}".format(Nu_liquid_multi))
        print("Re: {}".format(Re_bulk_liquid_multi))
        print("Pr: {}".format(Pr_bulk_liquid_multi))
        print("St: {}".format(St_liquid_multi))

        print("\n --- CHARACTERISTIC GEOMETRIC VALUES --- ")
        print("Hydrodynamic entance length: {:3.3f} micron".format(
            L_hydrodynamic_entrance * 1e6))
        print("Hydraulic diameter: {:3.3f} micron".format(D_hydraulic * 1e6))
        print("L/D: {:4.2f} ".format(L_channel / D_hydraulic))
        print("L/X_T {:4.2f}".format(L_channel / L_hydrodynamic_entrance))

        print("\n --- RESULTING GEOMETRY ---")
        print("Total length: {:3.3f} mm".format(L_channel * 1e3))
        print("Length (liquid/multi): {:3.3f} mm".format(
            L_channel_liquid_multi * 1e3))
        print("Length (gas): {:3.4f} mm".format(L_channel_gas * 1e3))
        print("Relative length (gas) {:3.3f} \%".format(L_channel_gas /
                                                        L_channel * 100))

        ## Return a dictionary with results and interesting intermediate values
    res = {
        "L_channel": L_channel,  # [m] Total length of channel
        "D_hydraulic": D_hydraulic,  # [m] Hydraulic diameter of channel
        "Nu_liquid_multi":
        Nu_liquid_multi,  # [-] Nusselt number of liquid/multi-phase flow
        "Pr_bulk_liquid_multi":
        Pr_bulk_liquid_multi,  # [-] Prandlt number of liquid/multi-phase flow
        "Re_bulk_liquid_multi":
        Re_bulk_liquid_multi,  # [-] Reynolds number of liquid/multi-phase flow
        "St_liquid_multi":
        St_liquid_multi,  # [-] Stanton number of liquid/multi-phase flow
        "h_conv_liquid_multi":
        h_conv_liquid_multi,  # [W/(m^2*K)] Heat transfer coefficient
        "A_heater_liquid_multi":
        A_heater_liquid_multi,  # [m^2] Required heater area for liquid/multi-phase flow
        "L_channel_liquid_multi":
        L_channel_liquid_multi,  # [m] Length of channel to get required heater area
        "u_bulk_liquid_multi":
        u_bulk_liquid_multi,  # [m/s] Bulk flow velocity of liquid/multi-phase flow
        "rho_bulk_liquid_multi":
        rho_bulk_liquid_multi,  # [kg/m^3] Bulk density of liquid/multi-phase flow
        "T_bulk_liquid_multi":
        T_bulk_liquid_multi,  # [K] Bulk temperature of liquid/multi-phase flow
        "delta_h_liquid_multi":
        delta_h_liquid_multi,  # [J/kg] Enthalpy change from inlet to saturated gas
        "Q_dot_liquid_multi":
        Q_dot_liquid_multi,  # [W] Power required for enthalpy change
        ## Same thing but for gas values
        "Nu_gas": Nu_gas,  # [-]
        "Pr_bulk_gas": Pr_bulk_gas,  # [-]
        "Re_bulk_gas": Re_bulk_gas,  # [-]
        "St_gas": St_gas,  # [-]
        "h_conv_gas": h_conv_gas,  # [W/(m^2*K)]
        "A_heater_gas": A_heater_gas,  # [m^2]
        "L_channel_gas": L_channel_gas,  # [m]
        "u_bulk_gas": u_bulk_gas,  # [m/s]
        "rho_bulk_gas": rho_bulk_gas,  # [kg/m^3]
        "T_bulk_gas": T_bulk_gas,  # [K]
        "delta_h_gas": delta_h_gas,  # [J/kg]
        "Q_dot_gas": Q_dot_gas,  # [W]
    }
    return res
Пример #3
0
def chamber_performance_from_Nu(Nu_func, T_inlet, T_chamber, T_ref, T_wall,
                                p_ref, m_dot, A_channel, L_ref,
                                fp: FluidProperties):
    """ Function that calculates the power consumption and heating area for a specific chamber

    Args:
        Nu_func (-): Nusselt function, that implement the emperical relation of choice
        T_inlet (K): Chamber inlet temperature
        T_chamber (K): Chamber outlet temperature (same as T_chamber for IRT)
        T_ref (K): Reference temperature for the Nusselt relation and flow similary parameters
        T_wall (K): Wall temperature
        p_ref (Pa): Chamber pressure (no pressure drop assumed)
        m_dot (kg/s): Mass flow
        A_channel (m^2): Cross-sectional area of the chamber, through which the fluid flows
        L_ref (m): Reference length for Nusselt relation and flow similarty parameters
        fp (FluidProperties): Object from which Fluid Properties are determined

    Returns:
        dictionary with heater area, power required to heat up flow and Nusselt number
    """
    ## Make sure all parameters are calculated at the same reference state (including velocity!)
    # Pr and Re parameters needed for most Nusselt relation
    rho_ref = fp.get_density(T=T_ref, p=p_ref)  # [kg/m^3] Reference density
    u_ref = velocity_from_mass_flow(
        A=A_channel, m_dot=m_dot,
        rho=rho_ref)  # [m/s] Speed at reference state
    print("u_ref {} m/s".format(u_ref))
    Re_ref = fp.get_Reynolds_from_mass_flow(
        T=T_ref, p=p_ref, L_ref=L_ref, m_dot=m_dot,
        A=A_channel)  # [-] Reynolds number at reference state
    Pr_ref = fp.get_Prandtl(T=T_ref,
                            p=p_ref)  # [-] Prandtl number at reference state
    # Now the Nusselt can be determined
    Nusselt = Nu_func(args={
        'Re': Re_ref,
        'Pr': Pr_ref
    })  # [-] Nusselt number at given state (used for plotting purposes)
    Stanton = Stanton_from_Nusselt_func_and_velocity(
        Nu_func=Nu_func,
        m_dot=m_dot,
        A=A_channel,
        T_ref=T_ref,
        p_ref=p_ref,
        L_ref=L_ref,
        fp=fp)  # [-] Stanton number at reference state
    h_conv = h_conv_from_Stanton(Stanton=Stanton,
                                 u=u_ref,
                                 T_ref=T_ref,
                                 p_ref=p_ref,
                                 fp=fp)
    # Now determine how much energy must be convected
    delta_h = ideal_enthalpy_change(T_inlet=T_inlet,
                                    p_inlet=p_ref,
                                    T_outlet=T_chamber,
                                    p_outlet=p_ref,
                                    fp=fp)  # [J/kg]
    Q_dot = required_power(
        m_dot=m_dot, delta_h=delta_h)  # [W] Required power to achieve delta_h
    A_heater = required_heater_area(Q_dot=Q_dot,
                                    h_conv=h_conv,
                                    T_wall=T_wall,
                                    T_ref=T_ref)  # [m^2]
    assert (A_heater > 0)
    # Return a dictionary with interesting values
    return {
        'A_heater': A_heater,
        'Q_dot': Q_dot,
        'Nusselt': Nusselt,
        'Re_ref': Re_ref,
        'Pr_ref': Pr_ref
    }
Пример #4
0
m_dot = td['m_dot'] / td['channel_amount']  # [kg/s] Mass flow
h_channel = td['h_channel']  # [m] Channel height/depth
w_channel = td['w_channel']  # [m] Channel width
L_channel = td['L_channel']  # [m] Channel length
T_outlet = td['T_chamber']  # [K] Outlet of channel
p_inlet = td['p_inlet']  # [Pa]
p_outlet = p_inlet  # [Pa] Outlet pressure (assumed roughly equal to inlet)
T_inlet = td['T_inlet']  # [K]

# Geometry calculations
D_h = hydraulic_diameter_rectangular(
    w_channel=w_channel, h_channel=h_channel)  # [m] Hydraulic diameter
A_channel = w_channel * h_channel
# Inlet conditions
rho_inlet = fp.get_density(T=T_inlet, p=p_inlet)  # [kg/m^3]
u_inlet = velocity_from_mass_flow(A=A_channel, m_dot=m_dot, rho=rho_inlet)
# Outlet conditions
rho_outlet = fp.get_density(T=T_outlet, p=p_outlet)
u_outlet = velocity_from_mass_flow(A=A_channel, m_dot=m_dot, rho=rho_outlet)
Re_outlet = fp.get_Reynolds_from_mass_flow(T=T_outlet,
                                           p=p_outlet,
                                           L_ref=D_h,
                                           m_dot=m_dot,
                                           A=A_channel)

print("\n\nTHRUSTER NAME: {}".format(td['name']))
print("\n --- GEOMETRY ---")
print("Channel length: {:4.3f} mm".format(L_channel * 1e3))
print("Hydraulic diameter: {:4.3f} um".format(D_h * 1e6))
print("L/D: {:3.2f} ".format(L_channel / D_h))
Пример #5
0
w_channel_min = 0.5e-5  # [m] Minimum channel width
w_channel_max = 5e-5  # [m] Maximum channel width
w_channel = np.linspace(
    start=w_channel_min,
    stop=w_channel_max)  # [m] Range of channel widths to evaluate

# Calculate some basic channel geometry
A_channel = w_channel * h_channel  # [m^2] Cross-sectional area of channel
Dh_channel = hydraulic_diameter_rectangular(
    w_channel=w_channel,
    h_channel=h_channel)  # [m] Hydraulic diameter of rectangular channels

# Calculate some basic flow parameter at the inlet
rho_inlet = fp.get_density(T=T_inlet, p=p_inlet)  # [kg/m^3]
u_inlet = velocity_from_mass_flow(
    m_dot=m_dot, rho=rho_inlet,
    A=A_channel)  # [m/s] Flow velocity inside channel

# Storing results
Re_bulk = np.zeros(
    (T_wall.shape[0], w_channel.shape[0]))  # [-] Bulk Reynolds number
Pr_bulk = np.zeros_like(Re_bulk)  # [-] Bulk Prandtl number
u_bulk = np.zeros_like(Re_bulk)  # [-] Velocity under bulk condition
Nusselt = np.zeros_like(Re_bulk)  # [-] Nusselt number
Stanton = np.zeros_like(Re_bulk)  # [-] Stanton number
h_conv = np.zeros_like(
    Re_bulk)  # [W/(m^2*K)] Convective heat transfer coefficient
A_heater = np.zeros_like(
    Re_bulk
)  # [m^2] Heater area required to raise temperature to T_chamber with temperature T_wall
L_channel = np.zeros_like(
Пример #6
0
def calc_channel_single_phase(T, Q_dot, rho, Pr, kappa, mu, p_ref, m_dot, T_wall, D_hydr, wetted_perimeter, A_channel, Nu_func, fp: FluidProperties, wall_args=None):
    """ Calculate channel length and intermediate variables by using a constant temperature step DT
        Using DT should give the best accuracy for computation time
        Must be a single-phase channel.

        NOTE: for optimization, this calculation should be preceded by a prepatory calculations, which really only needed to be once (enthalpy, etc..)

    Args:
        T_0 (K): Temperature  at channel entrance
        T_n (K): Temperature at channel exit 
        steps (-): Temperature steps into which channel is divided (dT = (T_n - T_0)/steps)
        p_ref (Pa): Assume pressure is constant through channel, p_ref = p_inlet
        m_dot (kg/s): Mass flow
        wetted_perimeter (m): Channel perimeter through which heat can be conducted
        A_channel (m^2): Area through which fluid flows
        fp (FluidProperties): Object to access fluid properties with
    """

    u = velocity_from_mass_flow(A=A_channel, m_dot=m_dot, rho=rho) # [m/s]
    # Reynold's is not calculated with FluidProperties to avoid the issues at the saturation point (which sohuld have been handled in the prepare_single_phase function)
    Re = Reynolds_from_mass_flow(m_dot=m_dot, A_channel=A_channel, L_ref=D_hydr, mu=mu) # [-]
    # The Nusselt number is calculated with pre-calculated Prandtl number, and the geometry-specific Reynolds number
    Nu = Nu_func(args=  { 
        "Re": Re,
        "Pr": Pr,
        })
    # Convective heat transfer parameter
    h_conv = heat_transfer_coefficient_from_Nu(Nu=Nu, kappa=kappa, L_ref=D_hydr)

    # For backwards compatability with test code, effect of wall temperature thickness can be activate separetly and is off by default
    we = None # Pass nothing to end result, if no wall arguments are passed
    if wall_args is not None: # If no information about wall is provided, skip this part
        # Call function to get dictionary of relevant wall effect parameters
        we = calc_wall_effect_parameters(\
            h_conv=h_conv,
            w_channel_spacing=wall_args['w_channel_spacing'],
            kappa_wall=wall_args['kappa_wall'], # Thermal conductivity of the wall
            h_channel=wall_args['h_channel'], # NOTE: these arguments were not already passed to this function, due to earlier design choices
            w_channel=wall_args['w_channel'],
            T_wall_top=T_wall, # The temperature of the top is simply the heater temperature at the top, which was earlier set to T_wall
            T_wall_bottom=wall_args['T_wall_bottom'], # IMPORTANT: The bottom wall temperature is the one that must be guessed or iterated towards!
            T_fluid=T) # The fluid temperature keeps changing
            
        T_wall = we['T_wall_effective'] # [K]

    #print("(Effective) wall temperature (K): ")
    assert(np.all(T_wall>T))
    #print(T_wall-T)
    # Calculate the heat flux in a channel section
    A_heating = required_heater_area(Q_dot=Q_dot, h_conv=h_conv, T_wall=T_wall, T_ref=T) # [m^2] Heating area required to deliver Q_dot
    assert(np.all(A_heating>=0))
    assert(wetted_perimeter >0)
    delta_L = A_heating / wetted_perimeter # [m] Length of channel sections to obtain A_heating
    assert(np.all(delta_L>=0))
    L = np.cumsum(delta_L)

    # Note, now the channel length is known, the heat transfer in the plane of the bottom wall can be calculated (which must be equal to radiation heat loss)
    # This is only necessary if wall effects are taken into account
    Q_bottom_plane_heat_balance = None # [W] Is None unless calculated to prevent use if not actually calculated
    if we is not None:
        Q_bottom_plane_heat_balance = calc_bottom_plane_heat_balance( 
            h_conv=h_conv,
            T_fluid=T,
            we=we,
            wall_args=wall_args,
            delta_L=delta_L) 
    
    # Return a dictionary with values of interest
    return {
        # All values are for given temperature T
        'L': L, # Distance along channel at temperature T
        'Nu': Nu, # [-] Nusselt number (based on L_ref)
        'Re': Re, # [-] Reynolds number (based on L_ref)
        'u': u, # [m/s] Flow velocity
        'h_conv': h_conv, # [W/(m*K)] Convective heat transfer parameter 
        'delta_L': delta_L, # [m] Length of each section
        'Q_bottom_plane_heat_balance': Q_bottom_plane_heat_balance, # [W] Difference in power in the bottom plane heat balance
    }
Пример #7
0
w_channel = 212e-6  # [m] Channel width
channel_amount = 5  # [-]
m_dot = 0.55e-6 / channel_amount  # [kg/s]

# Hydraulic diameter and area
A_channel = h_channel * w_channel  # [m^2] Channel area through which fluid flows
wetted_perimeter = wetted_perimeter_rectangular(
    w_channel=w_channel, h_channel=h_channel)  # [m] Wetted perimeter
D_h = hydraulic_diameter(A=A_channel, wetted_perimeter=wetted_perimeter)  # [m]

print("\n Hydraulic diameter: {:4.4f} um".format(D_h * 1e6))

# Determine remaining variables at inlet
rho_inlet = fp.get_density(T=T_inlet, p=p_inlet)  # [kg/m^3]
cp_inlet = fp.get_cp(T=T_inlet, p=p_inlet)  # [J/(kg*K)]
u_inlet = velocity_from_mass_flow(m_dot=m_dot, rho=rho_inlet,
                                  A=A_channel)  # [m/s]
mass_flux = m_dot / A_channel  # [kg/(m^2*s)]
Re_Dh_inlet = fp.get_Reynolds_from_velocity(
    T=T_inlet, p=p_inlet, L_ref=D_h,
    u=u_inlet)  # [-] Reynolds number at inlet, based on hydraulic diameter
Pr_inlet = fp.get_Prandtl(T=T_inlet, p=p_inlet)  # [-] Prandtl number at inlet

print("\n-----     INLET     -----")
print("Density: {:4.8f} kg/m^3".format(rho_inlet))
print("C_p: {:4.8f} kJ/(kg*K)".format(cp_inlet * 1e-3))
print("Flow velocity: {:3.4f} m/s".format(u_inlet))
print("Mass flux: {:3.2f} kg/(m^2*s)".format(mass_flux))
print("Re_Dh: {:4.4f}".format(Re_Dh_inlet))
print("Pr {:4.4f}".format(Pr_inlet))

rho_outlet = fp.get_density(T=T_outlet, p=p_inlet)  # [kg/m^3]