Separator - Nouman090/ThermoSim GitHub Wiki

A separator (flash drum) splits a two-phase mixture into saturated vapor and saturated liquid streams at the same pressure. The inlet must be in the two-phase region (0 < Q < 1).

Physics

Quality = x = ṁ_vapor / ṁ_total
ṁ_vapor = x × ṁ_in
ṁ_liquid = (1 - x) × ṁ_in

Vapor outlet:  Q = 1 (saturated vapor), P = P_in
Liquid outlet: Q = 0 (saturated liquid), P = P_in

Ex_D = Ex_in - Ex_vapor - Ex_liquid

Syntax

Separator(Model, ID, In_state, Out_vap_state, Out_liq_state, Calculate=False)
Parameter Type Default Description
Model ThermodynamicModel The model object
ID str Unique component name
In_state str Inlet state point name (must be two-phase)
Out_vap_state str Vapor outlet state point name
Out_liq_state str Liquid outlet state point name
Calculate bool False Solve immediately if True

Output Attributes

Attribute Type Unit Description
.Ex_D float/str W Exergy destruction
.Solution_Status bool True if solved
.In Prop Inlet state point object
.Out_vap Prop Vapor outlet object
.Out_liq Prop Liquid outlet object

Cases

Case 1: Flash Separator (Two-Phase Inlet)

Most common. Inlet is a saturated mixture; separator splits it into vapor and liquid.

from Thermosim import ThermodynamicModel, Separator

Model = ThermodynamicModel()
Model.set_dead_state()

# Inlet: two-phase mixture at 10 bar, quality = 0.3
Model.add_point('water', 'Mixture', P=10e5, Q=0.3, Mass_flowrate=1.0)

# Outlets
Model.add_point('water', 'Vapor', P=10e5)
Model.add_point('water', 'Liquid', P=10e5)

Separator(Model, 'FlashDrum', In_state='Mixture',
          Out_vap_state='Vapor', Out_liq_state='Liquid', Calculate=True)

print(f"Vapor flow:  {Model.Point['Vapor'].Mass_flowrate:.2f} kg/s")
print(f"Liquid flow: {Model.Point['Liquid'].Mass_flowrate:.2f} kg/s")
print(f"Vapor T:     {Model.Point['Vapor'].T - 273.15:.2f} °C")
print(f"Liquid T:    {Model.Point['Liquid'].T - 273.15:.2f} °C")

Case 2: After Expansion Valve (Refrigeration)

Expansion valve creates two-phase mixture; separator splits it.

Model = ThermodynamicModel()
Model.set_dead_state()

# After expansion valve: R134a at 2 bar, Q = 0.25
Model.add_point('R134a', 'AfterValve', P=2e5, Q=0.25, Mass_flowrate=0.1)

Model.add_point('R134a', 'Vap_out', P=2e5)
Model.add_point('R134a', 'Liq_out', P=2e5)

Separator(Model, 'Sep1', In_state='AfterValve',
          Out_vap_state='Vap_out', Out_liq_state='Liq_out', Calculate=True)

print(f"Vapor outlet: {Model.Point['Vap_out'].Mass_flowrate:.4f} kg/s")
print(f"Liquid outlet: {Model.Point['Liq_out'].Mass_flowrate:.4f} kg/s")

Case 3: Quality Close to 0 or 1

If quality is very close to 0 or 1, most flow goes to one outlet.

Model = ThermodynamicModel()
Model.set_dead_state()

# Nearly all liquid (Q = 0.05)
Model.add_point('water', 'MostlyLiq', P=5e5, Q=0.05, Mass_flowrate=2.0)
Model.add_point('water', 'Vap', P=5e5)
Model.add_point('water', 'Liq', P=5e5)

Separator(Model, 'Sep2', In_state='MostlyLiq',
          Out_vap_state='Vap', Out_liq_state='Liq', Calculate=True)

print(f"Vapor:  {Model.Point['Vap'].Mass_flowrate:.2f} kg/s (5%)")
print(f"Liquid: {Model.Point['Liq'].Mass_flowrate:.2f} kg/s (95%)")

Case 4: Non-Two-Phase Inlet (Warning)

If inlet is not two-phase (Q < 0 or Q > 1 or Q is a string), the separator issues a warning.

Model = ThermodynamicModel()
Model.set_dead_state()

# Superheated vapor (not two-phase)
Model.add_point('water', 'Superheated', P=5e5, T=500, Mass_flowrate=1.0)
Model.add_point('water', 'Vap', P=5e5)
Model.add_point('water', 'Liq', P=5e5)

Separator(Model, 'Sep3', In_state='Superheated',
          Out_vap_state='Vap', Out_liq_state='Liq', Calculate=True)
# Warning: [Sep3] Inlet 'Superheated' is not two-phase (Q = Superheated (27.00 K))

Print Component Data

print(Model.Component['FlashDrum'])

Output:

FlashDrum (Separator):
  Inlet flow       : 1.00 kg/s
  Vapour outlet    : 0.30 kg/s
  Liquid outlet    : 0.70 kg/s
  Exergy destr.    : XXXX.XX
  Solved           : True

Complete Example

from Thermosim import ThermodynamicModel, Separator

# Create model
Model = ThermodynamicModel()
Model.set_dead_state()

# Define two-phase inlet
Model.add_point('water', 'TwoPhase', P=10e5, Q=0.4, Mass_flowrate=5.0)

# Define outlets
Model.add_point('water', 'SatVapor', P=10e5)
Model.add_point('water', 'SatLiquid', P=10e5)

# Add separator
Separator(Model, 'FlashSeparator', In_state='TwoPhase',
          Out_vap_state='SatVapor', Out_liq_state='SatLiquid', Calculate=True)

# Access results
sep = Model.Component['FlashSeparator']
print(f"Inlet flow:         {Model.Point['TwoPhase'].Mass_flowrate:.2f} kg/s")
print(f"Vapor outlet flow:  {Model.Point['SatVapor'].Mass_flowrate:.2f} kg/s")
print(f"Liquid outlet flow: {Model.Point['SatLiquid'].Mass_flowrate:.2f} kg/s")
print(f"Exergy destruction: {sep.Ex_D:.2f} W")
print(f"Both outlets at:    {Model.Point['SatVapor'].T - 273.15:.2f} °C")

⚠️ **GitHub.com Fallback** ⚠️