Units Operations Package

This section documents all process unit classes in SPROCLIB.

Base Classes

Base classes for SPROCLIB - Standard Process Control Library

This module imports the ProcessModel abstract base class from ProcessModel.py.

Author: Thorsten Gressling <gressling@paramus.ai> License: MIT License

class sproclib.unit.base.ProcessModel(name='ProcessModel')[source]

Bases: ABC

Abstract base class for process models.

Parameters:

name (str)

__init__(name='ProcessModel')[source]

Initialize process model.

Parameters:

name (str) – Model name for identification

abstract dynamics(t, x, u)[source]

Define the process dynamics dx/dt = f(t, x, u).

Parameters:
  • t (float) – Time

  • x (<MagicMock id='130137683462864'>) – State variables

  • u (<MagicMock id='130137683462528'>) – Input variables

Returns:

State derivatives dx/dt

Return type:

<MagicMock id=’130137683461856’>

abstract steady_state(u)[source]

Calculate steady-state values for given inputs.

Parameters:

u (<MagicMock id='130137683462192'>) – Input variables

Returns:

Steady-state values

Return type:

<MagicMock id=’130137683464208’>

simulate(t_span, x0, u_func, t_eval=None)[source]

Simulate the process model.

Parameters:
  • t_span (Tuple[float, float]) – Time span (t_start, t_end)

  • x0 (<MagicMock id='130137683464544'>) – Initial conditions

  • u_func (Callable[[float], <MagicMock id='130137683464880'>]) – Function returning inputs as function of time

  • t_eval (<MagicMock id='130137683465888'> | None) – Time points for output (optional)

Returns:

Dictionary with ‘t’, ‘x’, ‘u’ arrays

Return type:

Dict[str, <MagicMock id=’130137683466896’>]

get_info()[source]

Get model information summary.

Returns:

Dictionary with model information

Return type:

Dict[str, Any]

update_parameters(**kwargs)[source]

Update model parameters.

Parameters:

**kwargs – Parameter updates

Pumps and Compressors

Pump module for SPROCLIB - Standard Process Control Library

This module contains various pump models for liquid pumping operations.

class sproclib.unit.pump.Pump(eta=0.7, rho=1000.0, flow_nominal=1.0, delta_P_nominal=200000.0, name='Pump')[source]

Bases: ProcessModel

Generic liquid pump model (steady-state and dynamic).

Parameters:
__init__(eta=0.7, rho=1000.0, flow_nominal=1.0, delta_P_nominal=200000.0, name='Pump')[source]

Initialize process model.

Parameters:
  • name (str) – Model name for identification

  • eta (float)

  • rho (float)

  • flow_nominal (float)

  • delta_P_nominal (float)

steady_state(u)[source]

Calculate steady-state outlet pressure and power for given inlet conditions and flow. :param u: [P_inlet, flow]

Returns:

[P_outlet, Power]

Parameters:

u (<MagicMock id='130137682161888'>)

Return type:

<MagicMock id=’130137682162224’>

dynamics(t, x, u)[source]

Dynamic model: first-order lag for outlet pressure. State: [P_out] Input: [P_inlet, flow]

Parameters:
  • t (float)

  • x (<MagicMock id='130137682162560'>)

  • u (<MagicMock id='130137682162896'>)

Return type:

<MagicMock id=’130137682163232’>

describe()[source]

Introspect metadata for documentation and algorithm querying.

Returns:

Metadata about the model including algorithms,

parameters, equations, and usage information.

Return type:

dict

class sproclib.unit.pump.CentrifugalPump(H0=50.0, K=20.0, eta=0.7, rho=1000.0, name='CentrifugalPump')[source]

Bases: Pump

Centrifugal pump with quadratic head-flow curve.

Parameters:
__init__(H0=50.0, K=20.0, eta=0.7, rho=1000.0, name='CentrifugalPump')[source]

Initialize process model.

Parameters:
steady_state(u)[source]

Calculate outlet pressure and power for given flow using pump curve. :param u: [P_inlet, flow]

Returns:

[P_outlet, Power]

Parameters:

u (<MagicMock id='130137682164912'>)

Return type:

<MagicMock id=’130137682165248’>

describe()[source]

Introspect metadata for documentation and algorithm querying.

Returns:

Metadata about the model including algorithms,

parameters, equations, and usage information.

Return type:

dict

class sproclib.unit.pump.PositiveDisplacementPump(flow_rate=1.0, eta=0.8, rho=1000.0, name='PositiveDisplacementPump')[source]

Bases: Pump

Positive displacement pump (constant flow, variable pressure).

Parameters:
__init__(flow_rate=1.0, eta=0.8, rho=1000.0, name='PositiveDisplacementPump')[source]

Initialize process model.

Parameters:
steady_state(u)[source]

Calculate outlet pressure and power for given inlet pressure. :param u: [P_inlet]

Returns:

[P_outlet, Power]

Parameters:

u (<MagicMock id='130137682625936'>)

Return type:

<MagicMock id=’130137682626272’>

dynamics(t, x, u)[source]

Dynamic model: first-order lag for outlet pressure. State: [P_out] Input: [P_inlet]

Parameters:
  • t (float)

  • x (<MagicMock id='130137682626608'>)

  • u (<MagicMock id='130137682626944'>)

Return type:

<MagicMock id=’130137682164576’>

describe()[source]

Introspect metadata for documentation and algorithm querying.

Returns:

Metadata about the model including algorithms,

parameters, equations, and usage information.

Return type:

dict

Compressor module for SPROCLIB - Standard Process Control Library

This module imports the Compressor class from Compressor.py.

class sproclib.unit.compressor.Compressor(eta_isentropic=0.75, P_suction=100000.0, P_discharge=300000.0, T_suction=300.0, gamma=1.4, R=8.314, M=0.028, flow_nominal=1.0, name='Compressor')[source]

Bases: ProcessModel

Generic gas compressor model (steady-state and dynamic).

Parameters:
__init__(eta_isentropic=0.75, P_suction=100000.0, P_discharge=300000.0, T_suction=300.0, gamma=1.4, R=8.314, M=0.028, flow_nominal=1.0, name='Compressor')[source]

Initialize process model.

Parameters:
steady_state(u)[source]

Calculate steady-state outlet temperature and power for given inlet conditions and flow. :param u: [P_suction, T_suction, P_discharge, flow]

Returns:

[T_out, Power]

Parameters:

u (<MagicMock id='130137682632992'>)

Return type:

<MagicMock id=’130137682633328’>

dynamics(t, x, u)[source]

Dynamic model: simple first-order lag for outlet temperature. State: [T_out] Input: [P_suction, T_suction, P_discharge, flow]

Parameters:
  • t (float)

  • x (<MagicMock id='130137682633664'>)

  • u (<MagicMock id='130137682634000'>)

Return type:

<MagicMock id=’130137682634336’>

describe()[source]

Introspect metadata for documentation and algorithm querying.

Returns:

Metadata about the model including algorithms,

parameters, equations, and usage information.

Return type:

dict

Tanks and Vessels

Tank Models for SPROCLIB

This package contains tank models for liquid storage and processing applications in chemical process simulation and control.

Available Tank Models: - Tank: Single gravity-drained tank - InteractingTanks: Two tanks in series

Author: Thorsten Gressling <gressling@paramus.ai> License: MIT License

class sproclib.unit.tank.Tank(A=1.0, C=1.0, name='GravityTank')[source]

Bases: ProcessModel

Gravity-drained tank model.

Parameters:
__init__(A=1.0, C=1.0, name='GravityTank')[source]

Initialize gravity-drained tank.

Parameters:
  • A (float) – Cross-sectional area [m²]

  • C (float) – Discharge coefficient [m²/min]

  • name (str) – Model name

dynamics(t, x, u)[source]

Tank dynamics: dh/dt = (q_in - C*sqrt(h))/A

Parameters:
  • t (float) – Time

  • x (<MagicMock id='130137682158192'>) – [height]

  • u (<MagicMock id='130137682158528'>) – [q_in] - inlet flow rate

Returns:

[dh/dt]

Return type:

<MagicMock id=’130137683475296’>

steady_state(u)[source]

Steady-state height: h = (q_in/C)²

Parameters:

u (<MagicMock id='130137683473952'>) – [q_in] - inlet flow rate

Returns:

[h_ss] - steady-state height

Return type:

<MagicMock id=’130137683474624’>

calculate_outlet_flow(h)[source]

Calculate outlet flow rate based on tank height.

Parameters:

h (float) – Tank height [m]

Returns:

Outlet flow rate [m³/min]

Return type:

float

calculate_volume(h)[source]

Calculate tank volume based on height.

Parameters:

h (float) – Tank height [m]

Returns:

Tank volume [m³]

Return type:

float

calculate_time_constant(h_op)[source]

Calculate linearized time constant at operating point.

Parameters:

h_op (float) – Operating height [m]

Returns:

Time constant [min]

Return type:

float

describe()[source]

Introspect metadata for documentation and algorithm querying.

Returns:

Metadata about the Tank model including

algorithms, parameters, equations, and usage information.

Return type:

dict

get_performance_metrics(x, u)[source]

Calculate performance metrics.

Parameters:
  • x (<MagicMock id='130137683474288'>) – [h] - current height

  • u (<MagicMock id='130137683463872'>) – [q_in] - inlet flow

Returns:

Dictionary with performance metrics

Return type:

Dict[str, float]

class sproclib.unit.tank.InteractingTanks(A1=1.0, A2=1.0, C1=1.0, C2=1.0, name='InteractingTanks')[source]

Bases: ProcessModel

Two interacting tanks in series.

Parameters:
__init__(A1=1.0, A2=1.0, C1=1.0, C2=1.0, name='InteractingTanks')[source]

Initialize interacting tanks model.

Parameters:
  • A1 (float) – Cross-sectional areas [m²]

  • A2 (float) – Cross-sectional areas [m²]

  • C1 (float) – Discharge coefficients [m²/min]

  • C2 (float) – Discharge coefficients [m²/min]

  • name (str) – Model name

dynamics(t, x, u)[source]

Interacting tanks dynamics: dh1/dt = (q_in - C1*sqrt(h1))/A1 dh2/dt = (C1*sqrt(h1) - C2*sqrt(h2))/A2

Parameters:
  • t (float) – Time

  • x (<MagicMock id='130137682154160'>) – [h1, h2] - tank heights

  • u (<MagicMock id='130137682153824'>) – [q_in] - inlet flow rate

Returns:

[dh1/dt, dh2/dt]

Return type:

<MagicMock id=’130137682153488’>

describe()[source]

Introspect metadata for documentation and algorithm querying.

Returns:

Metadata about the InteractingTanks model including

algorithms, parameters, equations, and usage information.

Return type:

dict

steady_state(u)[source]

Steady-state heights for interacting tanks.

Parameters:

u (<MagicMock id='130137682151136'>) – [q_in] - inlet flow rate

Returns:

[h1_ss, h2_ss] - steady-state heights

Return type:

<MagicMock id=’130137682151808’>

Valves and Flow Control

Valve Models for SPROCLIB

This package contains valve models for flow control and process regulation in chemical process simulation and control.

Available Valve Models: - ControlValve: Variable control valve for flow regulation - ThreeWayValve: Three-way valve for flow routing

Author: Thorsten Gressling <gressling@paramus.ai> License: MIT License

class sproclib.unit.valve.ControlValve(Cv_max=100.0, valve_type='linear', dead_time=0.5, time_constant=2.0, rangeability=50.0, name='ControlValve')[source]

Bases: ProcessModel

Control valve model with flow coefficient (Cv) characteristics and dead-time.

Features: - Flow coefficient-based flow calculations - Valve position dead-time modeling - Pressure drop compensation - Valve characteristics (linear, equal percentage, quick opening) - Saturation limits

Parameters:
__init__(Cv_max=100.0, valve_type='linear', dead_time=0.5, time_constant=2.0, rangeability=50.0, name='ControlValve')[source]

Initialize control valve model.

Parameters:
  • Cv_max (float) – Maximum flow coefficient (gpm/psi^0.5)

  • valve_type (str) – Valve characteristic (‘linear’, ‘equal_percentage’, ‘quick_opening’)

  • dead_time (float) – Valve position dead-time (seconds)

  • time_constant (float) – Valve actuator time constant (seconds)

  • rangeability (float) – Valve rangeability (Cv_max/Cv_min)

  • name (str) – Valve identifier

dynamics(t, x, u)[source]

Valve dynamics with dead-time and first-order lag.

State: [actual_position, flow_rate] Input: [position_command, upstream_pressure, downstream_pressure, density]

Parameters:
  • t (float) – Time

  • x (<MagicMock id='130137682625600'>) – [actual_position, flow_rate]

  • u (<MagicMock id='130137682625264'>) – [position_command, P_upstream, P_downstream, rho]

Returns:

[d(position)/dt, d(flow)/dt]

Return type:

<MagicMock id=’130137682624592’>

steady_state(u)[source]

Calculate steady-state valve position and flow.

Parameters:

u (<MagicMock id='130137682627280'>) – [position_command, P_upstream, P_downstream, rho]

Returns:

[position, flow_rate]

Return type:

<MagicMock id=’130137682627616’>

get_flow_coefficient(position)[source]

Get flow coefficient for given valve position.

Parameters:

position (float)

Return type:

float

get_valve_sizing_info()[source]

Get valve sizing information.

Return type:

Dict[str, float]

describe()[source]

Introspect metadata for documentation and algorithm querying.

Returns:

Metadata about the model including algorithms,

parameters, equations, and usage information.

Return type:

dict

class sproclib.unit.valve.ThreeWayValve(Cv_max=100.0, valve_config='mixing', dead_time=0.5, time_constant=2.0, name='ThreeWayValve')[source]

Bases: ProcessModel

Three-way control valve model for flow splitting/mixing applications.

Features: - Mixing and diverting configurations - Flow coefficient-based calculations - Dead-time in valve position - Flow distribution control

Parameters:
__init__(Cv_max=100.0, valve_config='mixing', dead_time=0.5, time_constant=2.0, name='ThreeWayValve')[source]

Initialize three-way valve model.

Parameters:
  • Cv_max (float) – Maximum flow coefficient

  • valve_config (str) – “mixing” (two inlets, one outlet) or “diverting” (one inlet, two outlets)

  • dead_time (float) – Position dead-time (seconds)

  • time_constant (float) – Actuator time constant (seconds)

  • name (str) – Valve identifier

dynamics(t, x, u)[source]

Three-way valve dynamics.

For mixing: u = [position_command, P1_in, P2_in, P_out, rho] For diverting: u = [position_command, P_in, P1_out, P2_out, rho]

Parameters:
  • t (float)

  • x (<MagicMock id='130137682629968'>)

  • u (<MagicMock id='130137682630304'>)

Return type:

<MagicMock id=’130137682630640’>

steady_state(u)[source]

Calculate steady-state flows.

Parameters:

u (<MagicMock id='130137682163568'>)

Return type:

<MagicMock id=’130137682164240’>

get_flow_split(position)[source]

Get flow split percentages for given position.

Parameters:

position (float)

Return type:

Tuple[float, float]

describe()[source]

Introspect metadata for documentation and algorithm querying.

Returns:

Metadata about the model including algorithms,

parameters, equations, and usage information.

Return type:

dict

Heat Exchangers

Heat Exchanger Module for SPROCLIB

This module imports heat exchanger classes.

Author: Thorsten Gressling <gressling@paramus.ai> License: MIT License

class sproclib.unit.heat_exchanger.HeatExchanger(U=500.0, A=10.0, m_hot=1.0, m_cold=1.2, cp_hot=4180.0, cp_cold=4180.0, V_hot=0.1, V_cold=0.1, rho_hot=1000.0, rho_cold=1000.0, name='HeatExchanger')[source]

Bases: ProcessModel

Counter-current heat exchanger model with thermal dynamics.

Parameters:
__init__(U=500.0, A=10.0, m_hot=1.0, m_cold=1.2, cp_hot=4180.0, cp_cold=4180.0, V_hot=0.1, V_cold=0.1, rho_hot=1000.0, rho_cold=1000.0, name='HeatExchanger')[source]

Initialize counter-current heat exchanger.

Parameters:
  • U (float) – Overall heat transfer coefficient [W/m²·K]

  • A (float) – Heat transfer area [m²]

  • m_hot (float) – Hot fluid mass flow rate [kg/s]

  • m_cold (float) – Cold fluid mass flow rate [kg/s]

  • cp_hot (float) – Hot fluid specific heat [J/kg·K]

  • cp_cold (float) – Cold fluid specific heat [J/kg·K]

  • V_hot (float) – Hot fluid volume [m³]

  • V_cold (float) – Cold fluid volume [m³]

  • rho_hot (float) – Hot fluid density [kg/m³]

  • rho_cold (float) – Cold fluid density [kg/m³]

  • name (str) – Model name

dynamics(t, x, u)[source]

Heat exchanger dynamics with thermal time constants.

Parameters:
  • t (float) – Time

  • x (<MagicMock id='130137682159872'>) – [T_hot_out, T_cold_out]

  • u (<MagicMock id='130137682160208'>) – [T_hot_in, T_cold_in, m_hot_new, m_cold_new]

Returns:

[dT_hot_out/dt, dT_cold_out/dt]

Return type:

<MagicMock id=’130137682160544’>

steady_state(u)[source]

Calculate steady-state outlet temperatures.

Parameters:

u (<MagicMock id='130137682160880'>) – [T_hot_in, T_cold_in, m_hot, m_cold]

Returns:

[T_hot_out_ss, T_cold_out_ss]

Return type:

<MagicMock id=’130137682161216’>

calculate_heat_transfer_rate(T_hot_in, T_cold_in, T_hot_out, T_cold_out)[source]

Calculate the actual heat transfer rate.

Parameters:
  • T_hot_in (float) – Hot fluid inlet temperature [K]

  • T_cold_in (float) – Cold fluid inlet temperature [K]

  • T_hot_out (float) – Hot fluid outlet temperature [K]

  • T_cold_out (float) – Cold fluid outlet temperature [K]

Returns:

Heat transfer rate [W]

Return type:

float

calculate_lmtd(T_hot_in, T_cold_in, T_hot_out, T_cold_out)[source]

Calculate Log Mean Temperature Difference (LMTD).

Parameters:
  • T_hot_in (float) – Hot fluid inlet temperature [K]

  • T_cold_in (float) – Cold fluid inlet temperature [K]

  • T_hot_out (float) – Hot fluid outlet temperature [K]

  • T_cold_out (float) – Cold fluid outlet temperature [K]

Returns:

LMTD [K]

Return type:

float

get_performance_metrics(x, u)[source]

Calculate performance metrics.

Parameters:
  • x (<MagicMock id='130137682161552'>) – [T_hot_out, T_cold_out] - outlet temperatures

  • u (<MagicMock id='130137682159200'>) – [T_hot_in, T_cold_in, …] - inlet conditions

Returns:

Dictionary with performance metrics

Return type:

Dict[str, float]

describe()[source]

Introspect metadata for documentation and algorithm querying.

Returns:

Metadata about the model including algorithms,

parameters, equations, and usage information.

Return type:

dict

Reactors

Reactor Models for SPROCLIB

This package contains various reactor models for chemical process simulation and control design. Each reactor type is organized in its own subpackage containing the class definition, documentation, tests, and examples.

Available Reactors: - CSTR: Continuous Stirred Tank Reactor - BatchReactor: Batch reactor with heating/cooling - PlugFlowReactor: Plug Flow Reactor with axial discretization - FixedBedReactor: Fixed bed catalytic reactor - SemiBatchReactor: Semi-batch reactor with feed control - FluidizedBedReactor: Fluidized bed reactor with two-phase modeling

Author: Thorsten Gressling <gressling@paramus.ai> License: MIT License

class sproclib.unit.reactor.CSTR(V=100.0, k0=72000000000.0, Ea=72750.0, R=8.314, rho=1000.0, Cp=0.239, dHr=-50000.0, UA=50000.0, name='CSTR')[source]

Bases: ProcessModel

Continuous Stirred Tank Reactor model.

Parameters:
__init__(V=100.0, k0=72000000000.0, Ea=72750.0, R=8.314, rho=1000.0, Cp=0.239, dHr=-50000.0, UA=50000.0, name='CSTR')[source]

Initialize CSTR model.

Parameters:
  • V (float) – Reactor volume [L]

  • k0 (float) – Arrhenius pre-exponential factor [1/min]

  • Ea (float) – Activation energy [J/gmol]

  • R (float) – Gas constant [J/gmol/K]

  • rho (float) – Density [g/L]

  • Cp (float) – Heat capacity [J/g/K]

  • dHr (float) – Heat of reaction [J/gmol]

  • UA (float) – Heat transfer coefficient [J/min/K]

  • name (str) – Model name

reaction_rate(T)[source]

Calculate reaction rate constant k(T) = k0 * exp(-Ea/RT)

Parameters:

T (float)

Return type:

float

dynamics(t, x, u)[source]

CSTR dynamics: dCA/dt = q/V*(CAi - CA) - k(T)*CA dT/dt = q/V*(Ti - T) + (-dHr)*k(T)*CA/(rho*Cp) + UA*(Tc - T)/(V*rho*Cp)

Parameters:
  • t (float) – Time

  • x (<MagicMock id='130137683468912'>) – [CA, T] - concentration and temperature

  • u (<MagicMock id='130137683469248'>) – [q, CAi, Ti, Tc] - flow rate, inlet concentration, inlet temp, coolant temp

Returns:

[dCA/dt, dT/dt]

Return type:

<MagicMock id=’130137683469584’>

steady_state(u)[source]

Calculate steady-state for CSTR (requires numerical solution).

Parameters:

u (<MagicMock id='130137683469920'>) – [q, CAi, Ti, Tc] - operating conditions

Returns:

[CA_ss, T_ss] - steady-state concentration and temperature

Return type:

<MagicMock id=’130137683470256’>

calculate_conversion(CA, CAi)[source]

Calculate conversion: X = (CAi - CA) / CAi

Parameters:
  • CA (float) – Outlet concentration [mol/L]

  • CAi (float) – Inlet concentration [mol/L]

Returns:

Conversion fraction

Return type:

float

calculate_residence_time(q)[source]

Calculate residence time: tau = V / q

Parameters:

q (float) – Flow rate [L/min]

Returns:

Residence time [min]

Return type:

float

calculate_heat_generation(CA, T)[source]

Calculate heat generation rate from reaction.

Parameters:
  • CA (float) – Concentration [mol/L]

  • T (float) – Temperature [K]

Returns:

Heat generation rate [J/min]

Return type:

float

get_performance_metrics(x, u)[source]

Calculate key performance metrics.

Parameters:
  • x (<MagicMock id='130137683470592'>) – [CA, T] - current state

  • u (<MagicMock id='130137683470928'>) – [q, CAi, Ti, Tc] - inputs

Returns:

Dictionary with performance metrics

Return type:

Dict[str, float]

describe()[source]

Introspect metadata for documentation and algorithm querying.

Returns:

Metadata about the CSTR model including

algorithms, parameters, equations, and usage information.

Return type:

dict

class sproclib.unit.reactor.BatchReactor(V=100.0, k0=72000000000.0, Ea=72750.0, delta_H=-52000.0, rho=1000.0, cp=4180.0, U=500.0, A=5.0, name='BatchReactor')[source]

Bases: ProcessModel

Batch reactor model with heating/cooling.

Parameters:
__init__(V=100.0, k0=72000000000.0, Ea=72750.0, delta_H=-52000.0, rho=1000.0, cp=4180.0, U=500.0, A=5.0, name='BatchReactor')[source]

Initialize batch reactor.

Parameters:
  • V (float) – Reactor volume [L]

  • k0 (float) – Pre-exponential factor [1/min]

  • Ea (float) – Activation energy [J/mol]

  • delta_H (float) – Heat of reaction [J/mol]

  • rho (float) – Density [kg/m³]

  • cp (float) – Heat capacity [J/kg·K]

  • U (float) – Heat transfer coefficient [W/m²·K]

  • A (float) – Heat transfer area [m²]

  • name (str) – Model name

reaction_rate(CA, T)[source]

Calculate reaction rate using Arrhenius equation.

Parameters:
  • CA (float) – Concentration [mol/L]

  • T (float) – Temperature [K]

Returns:

Reaction rate [mol/L·min]

Return type:

float

dynamics(t, x, u)[source]

Batch reactor dynamics.

State variables: x[0]: Concentration [mol/L] x[1]: Temperature [K]

Input variables: u[0]: Jacket temperature [K]

Parameters:
  • t (float) – Time

  • x (<MagicMock id='130137683472272'>) – [CA, T]

  • u (<MagicMock id='130137683472608'>) – [Tj]

Returns:

[dCA/dt, dT/dt]

Return type:

<MagicMock id=’130137683472944’>

steady_state(u)[source]

Batch reactor doesn’t have a traditional steady state. Returns initial conditions for given jacket temperature.

Parameters:

u (<MagicMock id='130137683473280'>) – [Tj]

Returns:

Initial conditions [CA0, T0]

Return type:

<MagicMock id=’130137683473616’>

calculate_conversion(CA, CA0=1.0)[source]

Calculate conversion based on initial and current concentration.

Parameters:
  • CA (float) – Current concentration [mol/L]

  • CA0 (float) – Initial concentration [mol/L]

Returns:

Conversion fraction

Return type:

float

batch_time_to_conversion(target_conversion, CA0=1.0, T_avg=350.0)[source]

Estimate time to reach target conversion (isothermal approximation).

Parameters:
  • target_conversion (float) – Target conversion fraction

  • CA0 (float) – Initial concentration [mol/L]

  • T_avg (float) – Average temperature [K]

Returns:

Time to reach conversion [min]

Return type:

float

describe()[source]

Introspect metadata for documentation and algorithm querying.

Returns:

Metadata about the BatchReactor model including

algorithms, parameters, equations, and usage information.

Return type:

dict

class sproclib.unit.reactor.PlugFlowReactor(L=10.0, A_cross=0.1, n_segments=20, k0=72000000000.0, Ea=72750.0, delta_H=-52000.0, rho=1000.0, cp=4180.0, U=500.0, D_tube=0.1, name='PlugFlowReactor')[source]

Bases: ProcessModel

Plug Flow Reactor (PFR) model with axial discretization.

Parameters:
__init__(L=10.0, A_cross=0.1, n_segments=20, k0=72000000000.0, Ea=72750.0, delta_H=-52000.0, rho=1000.0, cp=4180.0, U=500.0, D_tube=0.1, name='PlugFlowReactor')[source]

Initialize plug flow reactor with axial discretization.

Parameters:
  • L (float) – Reactor length [m]

  • A_cross (float) – Cross-sectional area [m²]

  • n_segments (int) – Number of axial segments for discretization

  • k0 (float) – Pre-exponential factor [1/min]

  • Ea (float) – Activation energy [J/mol]

  • delta_H (float) – Heat of reaction [J/mol]

  • rho (float) – Density [kg/m³]

  • cp (float) – Heat capacity [J/kg·K]

  • U (float) – Heat transfer coefficient [W/m²·K]

  • D_tube (float) – Tube diameter [m]

  • name (str) – Model name

reaction_rate(CA, T)[source]

Calculate reaction rate using Arrhenius equation.

Parameters:
  • CA (float) – Concentration [mol/L]

  • T (float) – Temperature [K]

Returns:

Reaction rate [mol/L·min]

Return type:

float

dynamics(t, x, u)[source]

PFR dynamics with axial discretization.

State variables (for each segment): x[0:n_segments]: Concentration in each segment [mol/L] x[n_segments:2*n_segments]: Temperature in each segment [K]

Input variables: u[0]: Inlet flow rate [L/min] u[1]: Inlet concentration [mol/L] u[2]: Inlet temperature [K] u[3]: Coolant temperature [K]

Parameters:
  • t (float) – Time

  • x (<MagicMock id='130137683471936'>) – State vector [CA_segments, T_segments]

  • u (<MagicMock id='130137683471600'>) – [q, CAi, Ti, Tc]

Returns:

State derivatives

Return type:

<MagicMock id=’130137683471264’>

steady_state(u)[source]

Calculate steady-state concentration and temperature profile.

Parameters:

u (<MagicMock id='130137683468576'>) – [q, CAi, Ti, Tc]

Returns:

Steady-state values [CA_segments, T_segments]

Return type:

<MagicMock id=’130137683463536’>

calculate_conversion(x)[source]

Calculate conversion at reactor exit.

Parameters:

x (<MagicMock id='130137683467904'>) – State vector [CA_segments, T_segments]

Returns:

Conversion fraction

Return type:

float

describe()[source]

Introspect metadata for documentation and algorithm querying.

Returns:

Metadata about the PlugFlowReactor model including

algorithms, parameters, equations, and usage information.

Return type:

dict

class sproclib.unit.reactor.FixedBedReactor(L=5.0, D=1.0, epsilon=0.4, rho_cat=1500.0, dp=0.005, k0=1000000.0, Ea=50000.0, delta_H=-50000.0, rho=1000.0, cp=4180.0, U=100.0, n_segments=20, name='FixedBedReactor')[source]

Bases: ProcessModel

Fixed bed catalytic reactor model.

Parameters:
__init__(L=5.0, D=1.0, epsilon=0.4, rho_cat=1500.0, dp=0.005, k0=1000000.0, Ea=50000.0, delta_H=-50000.0, rho=1000.0, cp=4180.0, U=100.0, n_segments=20, name='FixedBedReactor')[source]

Initialize fixed bed reactor.

Parameters:
  • L (float) – Bed length [m]

  • D (float) – Bed diameter [m]

  • epsilon (float) – Bed porosity [-]

  • rho_cat (float) – Catalyst density [kg/m³]

  • dp (float) – Particle diameter [m]

  • k0 (float) – Pre-exponential factor [m³/kg·s]

  • Ea (float) – Activation energy [J/mol]

  • delta_H (float) – Heat of reaction [J/mol]

  • rho (float) – Fluid density [kg/m³]

  • cp (float) – Heat capacity [J/kg·K]

  • U (float) – Overall heat transfer coefficient [W/m²·K]

  • n_segments (int) – Number of axial segments

  • name (str) – Model name

reaction_rate(CA, T)[source]

Calculate reaction rate per unit catalyst mass.

Parameters:
  • CA (float) – Concentration [mol/m³]

  • T (float) – Temperature [K]

Returns:

Reaction rate [mol/kg·s]

Return type:

float

dynamics(t, x, u)[source]

Fixed bed reactor dynamics with axial discretization.

State variables (for each segment): x[0:n_segments]: Concentration in each segment [mol/m³] x[n_segments:2*n_segments]: Temperature in each segment [K]

Input variables: u[0]: Inlet volumetric flow rate [m³/s] u[1]: Inlet concentration [mol/m³] u[2]: Inlet temperature [K] u[3]: Wall temperature [K]

Parameters:
  • t (float) – Time

  • x (<MagicMock id='130137683475968'>) – State vector [CA_segments, T_segments]

  • u (<MagicMock id='130137682149456'>) – [Q, CAi, Ti, Tw]

Returns:

State derivatives

Return type:

<MagicMock id=’130137682149792’>

steady_state(u)[source]

Calculate steady-state concentration and temperature profile.

Parameters:

u (<MagicMock id='130137682150128'>) – [Q, CAi, Ti, Tw]

Returns:

Steady-state values [CA_segments, T_segments]

Return type:

<MagicMock id=’130137682150464’>

calculate_conversion(x)[source]

Calculate conversion at reactor exit.

Parameters:

x (<MagicMock id='130137682150800'>) – State vector [CA_segments, T_segments]

Returns:

Conversion fraction

Return type:

float

describe()[source]

Introspect metadata for documentation and algorithm querying.

Returns:

Metadata about the FixedBedReactor model including

algorithms, parameters, equations, and usage information.

Return type:

dict

class sproclib.unit.reactor.SemiBatchReactor(V_max=200.0, k0=72000000000.0, Ea=72750.0, delta_H=-52000.0, rho=1000.0, cp=4180.0, U=500.0, A_heat=5.0, name='SemiBatchReactor')[source]

Bases: ProcessModel

Semi-batch reactor model with fed-batch operation.

Parameters:
__init__(V_max=200.0, k0=72000000000.0, Ea=72750.0, delta_H=-52000.0, rho=1000.0, cp=4180.0, U=500.0, A_heat=5.0, name='SemiBatchReactor')[source]

Initialize semi-batch reactor.

Parameters:
  • V_max (float) – Maximum reactor volume [L]

  • k0 (float) – Pre-exponential factor [1/min]

  • Ea (float) – Activation energy [J/mol]

  • delta_H (float) – Heat of reaction [J/mol]

  • rho (float) – Density [kg/m³]

  • cp (float) – Heat capacity [J/kg·K]

  • U (float) – Heat transfer coefficient [W/m²·K]

  • A_heat (float) – Heat transfer area [m²]

  • name (str) – Model name

reaction_rate(CA, T)[source]

Calculate reaction rate using Arrhenius equation.

Parameters:
  • CA (float) – Concentration [mol/L]

  • T (float) – Temperature [K]

Returns:

Reaction rate [mol/L·min]

Return type:

float

dynamics(t, x, u)[source]

Semi-batch reactor dynamics.

State variables: x[0]: Total moles of A [mol] x[1]: Temperature [K] x[2]: Volume [L]

Input variables: u[0]: Feed flow rate [L/min] u[1]: Feed concentration [mol/L] u[2]: Feed temperature [K] u[3]: Jacket temperature [K]

Parameters:
  • t (float) – Time

  • x (<MagicMock id='130137682152144'>) – [nA, T, V]

  • u (<MagicMock id='130137682152480'>) – [qf, CAf, Tf, Tj]

Returns:

[dnA/dt, dT/dt, dV/dt]

Return type:

<MagicMock id=’130137682152816’>

steady_state(u)[source]

Semi-batch reactor doesn’t have a traditional steady state. Returns initial conditions.

Parameters:

u (<MagicMock id='130137682153152'>) – [qf, CAf, Tf, Tj]

Returns:

Initial conditions [nA0, T0, V0]

Return type:

<MagicMock id=’130137683475632’>

calculate_concentration(nA, V)[source]

Calculate current concentration.

Parameters:
  • nA (float) – Total moles [mol]

  • V (float) – Volume [L]

Returns:

Concentration [mol/L]

Return type:

float

calculate_conversion(nA, nA0=1.0)[source]

Calculate conversion based on initial and current moles.

Parameters:
  • nA (float) – Current moles [mol]

  • nA0 (float) – Initial moles [mol]

Returns:

Conversion fraction

Return type:

float

describe()[source]

Introspect metadata for documentation and algorithm querying.

Returns:

Metadata about the SemiBatchReactor model including

algorithms, parameters, equations, and usage information.

Return type:

dict

class sproclib.unit.reactor.FluidizedBedReactor(H=3.0, D=2.0, U_mf=0.1, rho_cat=1500.0, dp=0.0005, epsilon_mf=0.5, k0=100000.0, Ea=60000.0, delta_H=-80000.0, K_bc=5.0, K_ce=20.0, name='FluidizedBedReactor')[source]

Bases: ProcessModel

Fluidized bed catalytic reactor model with bubble and emulsion phases.

Parameters:
__init__(H=3.0, D=2.0, U_mf=0.1, rho_cat=1500.0, dp=0.0005, epsilon_mf=0.5, k0=100000.0, Ea=60000.0, delta_H=-80000.0, K_bc=5.0, K_ce=20.0, name='FluidizedBedReactor')[source]

Initialize fluidized bed reactor with two-phase model.

Parameters:
  • H (float) – Bed height [m]

  • D (float) – Bed diameter [m]

  • U_mf (float) – Minimum fluidization velocity [m/s]

  • rho_cat (float) – Catalyst density [kg/m³]

  • dp (float) – Particle diameter [m]

  • epsilon_mf (float) – Voidage at minimum fluidization [-]

  • k0 (float) – Pre-exponential factor [m³/kg·s]

  • Ea (float) – Activation energy [J/mol]

  • delta_H (float) – Heat of reaction [J/mol]

  • K_bc (float) – Bubble-cloud mass transfer coefficient [1/s]

  • K_ce (float) – Cloud-emulsion mass transfer coefficient [1/s]

  • name (str) – Model name

fluidization_properties(U_g)[source]

Calculate fluidization properties.

Parameters:

U_g (float) – Superficial gas velocity [m/s]

Returns:

Dictionary with fluidization properties

Return type:

Dict[str, float]

reaction_rate(CA, T)[source]

Calculate reaction rate in emulsion phase.

Parameters:
  • CA (float) – Concentration in emulsion phase [mol/m³]

  • T (float) – Temperature [K]

Returns:

Reaction rate [mol/kg·s]

Return type:

float

dynamics(t, x, u)[source]

Fluidized bed reactor dynamics with two-phase model.

State variables: [CA_bubble, CA_emulsion, T] Input variables: [CA_in, T_in, U_g, T_coolant]

Parameters:
  • t (float) – Time [s]

  • x (<MagicMock id='130137682155168'>) – State variables

  • u (<MagicMock id='130137682155504'>) – Input variables

Returns:

State derivatives

Return type:

<MagicMock id=’130137682155840’>

steady_state(u)[source]

Calculate steady-state concentrations and temperature.

Parameters:

u (<MagicMock id='130137682156176'>) – Input variables [CA_in, T_in, U_g, T_coolant]

Returns:

Steady-state values [CA_bubble, CA_emulsion, T]

Return type:

<MagicMock id=’130137682156512’>

calculate_conversion(CA_in, CA_out)[source]

Calculate overall conversion.

Parameters:
Return type:

float

describe()[source]

Introspect metadata for documentation and algorithm querying.

Returns:

Metadata about the FluidizedBedReactor model including

algorithms, parameters, equations, and usage information.

Return type:

dict

Distillation

Distillation Models for SPROCLIB

This package contains distillation models for separation process simulation and control design.

Available Distillation Models: - DistillationTray: Individual tray model for binary systems - BinaryDistillationColumn: Complete column model

Author: Thorsten Gressling <gressling@paramus.ai> License: MIT License

class sproclib.unit.distillation.DistillationTray(tray_number=1, holdup=1.0, alpha=2.5, name='DistillationTray')[source]

Bases: ProcessModel

Individual distillation tray model for binary systems.

Parameters:
__init__(tray_number=1, holdup=1.0, alpha=2.5, name='DistillationTray')[source]

Initialize distillation tray.

Parameters:
  • tray_number (int) – Tray number (1 = top)

  • holdup (float) – Liquid holdup on tray [kmol]

  • alpha (float) – Relative volatility (light/heavy) [-]

  • name (str) – Model name

vapor_liquid_equilibrium(x)[source]

Calculate vapor composition using relative volatility.

Parameters:

x (float) – Liquid mole fraction of light component

Returns:

Vapor mole fraction of light component

Return type:

float

describe()[source]

Introspect metadata for documentation and algorithm querying.

Returns:

Metadata about the model including algorithms,

parameters, equations, and usage information.

Return type:

dict

dynamics(t, x, u)[source]

Tray dynamics: component material balance.

State variables: x[0]: Liquid mole fraction of light component on tray

Input variables: u[0]: Liquid flow rate from tray above [kmol/min] u[1]: Liquid composition from tray above [mole fraction] u[2]: Vapor flow rate from tray below [kmol/min] u[3]: Vapor composition from tray below [mole fraction] u[4]: Liquid flow rate from this tray [kmol/min] u[5]: Vapor flow rate from this tray [kmol/min]

Parameters:
  • t (float) – Time

  • x (<MagicMock id='130137681087520'>) – [x_tray] - liquid composition on tray

  • u (<MagicMock id='130137681087856'>) – [L_in, x_in, V_in, y_in, L_out, V_out]

Returns:

[dx_tray/dt]

Return type:

<MagicMock id=’130137681088192’>

steady_state(u)[source]

Calculate steady-state composition.

For steady state: dx/dt = 0 Light_in = Light_out L_in * x_in + V_in * y_in = L_out * x + V_out * y

Parameters:

u (<MagicMock id='130137681088528'>) – [L_in, x_in, V_in, y_in, L_out, V_out]

Returns:

[x_tray_ss] - steady-state liquid composition

Return type:

<MagicMock id=’130137681088864’>

class sproclib.unit.distillation.BinaryDistillationColumn(N_trays=20, feed_tray=10, alpha=2.5, tray_holdup=1.0, reflux_drum_holdup=5.0, reboiler_holdup=10.0, feed_flow=100.0, feed_composition=0.5, name='BinaryDistillationColumn')[source]

Bases: ProcessModel

Simplified binary distillation column model for control design.

Parameters:
__init__(N_trays=20, feed_tray=10, alpha=2.5, tray_holdup=1.0, reflux_drum_holdup=5.0, reboiler_holdup=10.0, feed_flow=100.0, feed_composition=0.5, name='BinaryDistillationColumn')[source]

Initialize binary distillation column.

Parameters:
  • N_trays (int) – Total number of trays (including reboiler, excluding condenser)

  • feed_tray (int) – Feed tray number (1 = top tray)

  • alpha (float) – Relative volatility (light/heavy) [-]

  • tray_holdup (float) – Liquid holdup per tray [kmol]

  • reflux_drum_holdup (float) – Reflux drum holdup [kmol]

  • reboiler_holdup (float) – Reboiler holdup [kmol]

  • feed_flow (float) – Feed flow rate [kmol/min]

  • feed_composition (float) – Feed composition (mole fraction light component)

  • name (str) – Model name

describe()[source]

Introspect metadata for documentation and algorithm querying.

Returns:

Metadata about the model including algorithms,

parameters, equations, and usage information.

Return type:

dict

vapor_liquid_equilibrium(x)[source]

Calculate vapor composition using relative volatility.

Parameters:

x (float) – Liquid mole fraction of light component

Returns:

Vapor mole fraction of light component

Return type:

float

dynamics(t, x, u)[source]

Column dynamics: material balances for all trays.

State variables: x[0:N_trays]: Liquid compositions on trays (light component) x[N_trays]: Reflux drum composition x[N_trays+1]: Reboiler composition

Input variables: u[0]: Reflux ratio [-] u[1]: Reboiler heat duty [energy/time] u[2]: Distillate flow rate [kmol/min] u[3]: Bottoms flow rate [kmol/min]

Parameters:
  • t (float) – Time

  • x (<MagicMock id='130137681090880'>) – State vector [tray compositions, drum composition, reboiler composition]

  • u (<MagicMock id='130137681091216'>) – [R, Q_reboiler, D, B]

Returns:

State derivatives

Return type:

<MagicMock id=’130137681091552’>

steady_state(u)[source]

Calculate steady-state with distillation column.

Parameters:

u (<MagicMock id='130137681091888'>) – Input variables [R, Q_reboiler, D, B] - reflux ratio, heat duty, distillate, bottoms

Returns:

Steady-state values

Return type:

<MagicMock id=’130137681092224’>

calculate_separation_metrics(compositions)[source]

Calculate key separation performance metrics.

Parameters:

compositions (<MagicMock id='130137681092560'>) – Current composition profile

Returns:

Dictionary with separation metrics

Return type:

Dict[str, float]

calculate_minimum_reflux()[source]

Calculate minimum reflux ratio using simplified approximation.

Returns:

Minimum reflux ratio

Return type:

float

update_parameters(**kwargs)[source]

Update column parameters and recalculate derived values.

Parameters:

**kwargs – Parameter updates

Utilities

LinearApproximation module for SPROCLIB - Standard Process Control Library

This module imports the LinearApproximation class from LinearApproximation.py.

class sproclib.unit.utilities.LinearApproximation(model)[source]

Bases: object

Linear approximation of nonlinear process models.

Parameters:

model (ProcessModel)

__init__(model)[source]

Initialize linearization utility.

Parameters:

model (ProcessModel) – Nonlinear process model to linearize

linearize(u_ss, x_ss=None, epsilon=1e-06)[source]

Linearize model around operating point using finite differences.

Parameters:
  • u_ss (<MagicMock id='130137682636016'>) – Steady-state inputs

  • x_ss (<MagicMock id='130137682635680'> | None) – Steady-state states (calculated if None)

  • epsilon (float) – Perturbation size for finite differences

Returns:

A, B matrices for linear model dx/dt = A*x + B*u

Return type:

Tuple[<MagicMock id=’130137682627952’>, <MagicMock id=’130137682629632’>]

get_transfer_function(output_idx=0, input_idx=0, s_values=None)[source]

Get transfer function from linearized model.

Parameters:
  • output_idx (int) – Output variable index

  • input_idx (int) – Input variable index

  • s_values (<MagicMock id='130137682640384'> | None) – Frequency values for evaluation

Returns:

Dictionary with transfer function information

Return type:

Dict[str, Any]

step_response(input_idx=0, step_size=1.0, t_final=10.0, n_points=100)[source]

Calculate step response of linearized model.

Parameters:
  • input_idx (int) – Input index for step

  • step_size (float) – Magnitude of step

  • t_final (float) – Final time

  • n_points (int) – Number of time points

Returns:

Dictionary with time and response arrays

Return type:

Dict[str, <MagicMock id=’130137681085168’>]