Tutorial - Hybrid Seal Analysis#

This tutorial demonstrates how to use the HybridSeal class to model a hybrid seal that combines a hole-pattern seal (damping section) with a labyrinth seal (throttling section). The hybrid seal model iteratively determines the interface pressure between the two seal stages by matching their leakage rates, then combines their rotordynamic coefficients.

The hybrid seal configuration in ROSS consists of:

  1. Hole-Pattern Seal (Damping Stage): Located upstream, this section provides significant direct damping to improve rotor stability. The honeycomb-like surface increases energy dissipation due to recirculation and cavity pressurization effects, producing high damping.

  2. Labyrinth Seal (Throttling Stage): Located downstream, this section provides the primary pressure drop through a series of throttling cavities (teeth). The labyrinth geometry creates a tortuous flow path that minimizes leakage.

Iterative Pressure Matching#

The model uses a bisection method to find the interface pressure (\(P_{int}\)) between the two seal stages that satisfies mass conservation:

\[\dot{m}_{hole-pattern}(P_{in}, P_{int}) = \dot{m}_{labyrinth}(P_{int}, P_{out})\]

where:

  • \(P_{in}\) is the inlet pressure (upstream of hole-pattern seal)

  • \(P_{out}\) is the outlet pressure (downstream of labyrinth seal)

  • \(\dot{m}\) represents the mass flow rate (leakage)

import ross as rs
from ross.units import Q_
import numpy as np

# Make sure the default renderer is set to 'notebook' for inline plots in Jupyter
import plotly.io as pio

pio.renderers.default = "notebook"
/home/jguarato/Documents/GitHub/ROSS_Code/ross/venv/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
  from .autonotebook import tqdm as notebook_tqdm

Section 1: Hybrid Seal Parameters#

The HybridSeal requires parameters for both the hole-pattern and labyrinth seal sections, as well as common operating conditions.

1.1 Common Parameters#

These parameters are shared between both seal stages:

Parameter

Description

Unit

n

Node location in the rotor model

-

shaft_radius

Radius of the shaft

m

inlet_pressure

Total inlet pressure at hole-pattern entrance

Pa

outlet_pressure

Final outlet pressure at labyrinth exit

Pa

inlet_temperature

Inlet temperature

K

frequency

Shaft rotational speed(s)

rad/s

gas_composition

Gas composition dictionary (optional)

-

molar

Molecular mass (required if no gas_composition)

kg/kgmol

gamma

Specific heat ratio Cp/Cv (required if no gas_composition)

-

# Common parameters for the hybrid seal
n = 3  # Node location
shaft_radius = Q_(25, "mm")  # 25 mm shaft radius
inlet_pressure = 500000  # 5 bar inlet pressure (Pa)
outlet_pressure = 100000  # 1 bar outlet pressure (Pa)
inlet_temperature = 300.0  # 300 K (~27°C)
frequency = Q_([2000, 3000, 4000, 5000], "RPM")  # Operating speeds

# Gas composition for air
gas_composition = {
    "Nitrogen": 0.7812,
    "Oxygen": 0.2096,
    "Argon": 0.0092,
}

1.2 Hole-Pattern Seal Parameters#

The hole-pattern seal (damping stage) parameters define the geometry of the porous surface:

Parameter

Description

Unit

radial_clearance

Seal clearance

m

length

Length of the seal

m

roughness

Surface roughness ratio (ε/D)

-

cell_length

Axial length of each cell

m

cell_width

Circumferential width of each cell

m

cell_depth

Depth of each cell

m

preswirl

Inlet swirl ratio

-

entr_coef

Entrance loss coefficient

-

exit_coef

Exit loss coefficient

-

# Hole-pattern seal parameters
hole_pattern_params = {
    "radial_clearance": 0.0003,  # 0.3 mm clearance
    "length": 0.04,  # 40 mm length
    "roughness": 0.0001,  # Relative roughness
    "cell_length": 0.003,  # 3 mm cell length
    "cell_width": 0.003,  # 3 mm cell width
    "cell_depth": 0.002,  # 2 mm cell depth
    "preswirl": 0.8,  # 80% preswirl
    "entr_coef": 0.5,  # Entrance loss coefficient
    "exit_coef": 1.0,  # Exit loss coefficient
}

1.3 Labyrinth Seal Parameters#

The labyrinth seal (throttling stage) parameters define the tooth geometry:

Parameter

Description

Unit

radial_clearance

Nominal radial clearance

m

n_teeth

Number of teeth (throttlings)

-

pitch

Axial cavity length (land length)

m

tooth_height

Height of seal strip

m

tooth_width

Thickness of throttle (tip-width)

m

seal_type

Location of teeth: ‘rotor’, ‘stator’, or ‘inter’

-

preswirl

Inlet swirl velocity ratio

-

tz

Temperature at states [T1, T2] (required if no gas_composition)

K

muz

Dynamic viscosity at states [μ1, μ2] (required if no gas_composition)

kg/(m·s)

# Labyrinth seal parameters
labyrinth_params = {
    "radial_clearance": Q_(0.25, "mm"),  # 0.25 mm clearance
    "n_teeth": 10,  # 10 teeth
    "pitch": Q_(3, "mm"),  # 3 mm pitch
    "tooth_height": Q_(3, "mm"),  # 3 mm tooth height
    "tooth_width": Q_(0.15, "mm"),  # 0.15 mm tooth width
    "seal_type": "inter",  # Interlocking type
    "preswirl": 0.9,  # 90% preswirl
    "tz": [300.0, 299.5],  # Temperature at states (K)
    "muz": [1.85e-05, 1.84e-05],  # Dynamic viscosity (kg/(m·s))
}

Section 2: Creating the Hybrid Seal#

Now we can create the HybridSeal object:

# Create the hybrid seal
hybrid_seal = rs.HybridSeal(
    n=n,
    shaft_radius=shaft_radius,
    inlet_pressure=inlet_pressure,
    outlet_pressure=outlet_pressure,
    inlet_temperature=inlet_temperature,
    frequency=frequency,
    gas_composition=gas_composition,
    hole_pattern_parameters=hole_pattern_params,
    labyrinth_parameters=labyrinth_params,
)

Section 3: Analyzing the Results#

3.1 Summary Results#

The summary_results() method provides a quick overview of the hybrid seal analysis:

hybrid_seal.summary_results()
Parameter Value
Number of Iterations 21
Final Convergence 1.017071e-07
Interface Pressure (Pa) 219426.92
Seal Leakage (kg/s) 3.488871e-02

3.2 Rotordynamic Coefficients#

The format_table() method displays the frequency-dependent rotordynamic coefficients:

hybrid_seal.format_table(frequency_units="RPM")
Frequency [RPM] kxx [N/m] kyy [N/m] kxy [N/m] kyx [N/m] kzz [N/m] cxx [N*s/m] cyy [N*s/m] cxy [N*s/m] cyx [N*s/m] czz [N*s/m]
2000.0 203520.14078 203520.14078 11480.88762 -11480.88762 0.0 63.12145 63.12145 -3.01923 3.01923 0.0
2750.0 -38108251815657.45 -38108251815657.45 -206109703184914.06 206109703184914.06 0.0 -393811810162.45264 -393811810162.45264 72243363913.25085 -72243363913.25085 0.0
3500.0 60976982906612.05 60976982906612.05 329795396911917.75 -329795396911917.75 0.0 630146145225.9446 630146145225.9446 -115599131573.92926 115599131573.92926 0.0
4250.0 -114296397313057.11 -114296397313057.11 -618180034526354.5 618180034526354.5 0.0 -1181080942626.331 -1181080942626.331 216656955593.13354 -216656955593.13354 0.0
5000.0 -975480494158051.4 -975480494158051.4 -5275931332328064.0 5275931332328064.0 0.0 -10080447882573.934 -10080447882573.934 1849196067472.1335 -1849196067472.1335 0.0

3.3 Convergence Analysis#

The plot_convergence() method shows how the iterative solution converges to the final interface pressure. The convergence plot shows:

  1. Convergence History: The relative leakage error decreasing with each iteration

  2. Leakage Rate Convergence: How the leakage rates from both seals approach each other

  3. Interface Pressure Evolution: The bisection method narrowing down to the correct interface pressure

fig_conv = hybrid_seal.plot_convergence()
fig_conv.show()

3.4 Pressure Distribution#

The plot_pressure_distribution() method shows the pressure profile through both seal stages:

fig_pressure = hybrid_seal.plot_pressure_distribution(pressure_units="bar")
fig_pressure.show()

Section 4: Integrating with a Rotor Model#

The HybridSeal can be used directly in a rotor assembly, just like any other seal or bearing element:

# Define material
steel = rs.materials.steel

# Create shaft elements
shaft = [rs.ShaftElement(0.25, 0, 0.05, material=steel) for _ in range(6)]

# Create disk elements
disk0 = rs.DiskElement.from_geometry(2, steel, 0.07, 0.05, 0.28)
disk1 = rs.DiskElement.from_geometry(4, steel, 0.07, 0.05, 0.28)

# Create bearing elements
bearing0 = rs.BearingElement(0, kxx=1e6, cxx=1e3)
bearing1 = rs.BearingElement(6, kxx=1e6, cxx=1e3)

# Assemble rotor with hybrid seal
rotor = rs.Rotor(shaft, [disk0, disk1], [bearing0, bearing1, hybrid_seal])

# Plot rotor model
fig_rotor = rotor.plot_rotor()
fig_rotor.show()

Section 5: Alternative Configuration#

5.1 Using Manual Gas Properties#

If CoolProp is not available or you prefer to specify gas properties manually, you can omit the gas_composition parameter and provide molar and gamma instead. In this case, you also need to provide viscosity model parameters for the hole-pattern seal (b_suther, s_suther).

# Hole-pattern parameters with manual viscosity model
hole_pattern_params_manual = {
    "radial_clearance": 0.0003,
    "length": 0.04,
    "roughness": 0.0001,
    "cell_length": 0.003,
    "cell_width": 0.003,
    "cell_depth": 0.002,
    "preswirl": 0.8,
    "entr_coef": 0.5,
    "exit_coef": 1.0,
    "b_suther": 1.458e-6,  # Sutherland viscosity coefficient b
    "s_suther": 110.4,  # Sutherland viscosity coefficient s
}

# Create hybrid seal with manual gas properties
hybrid_seal_manual = rs.HybridSeal(
    n=3,
    shaft_radius=Q_(25, "mm"),
    inlet_pressure=500000,
    outlet_pressure=100000,
    inlet_temperature=300.0,
    frequency=Q_([3000], "RPM"),
    molar=28.97,  # Air molecular mass (kg/kgmol)
    gamma=1.4,  # Air specific heat ratio
    hole_pattern_parameters=hole_pattern_params_manual,
    labyrinth_parameters=labyrinth_params,
)

hybrid_seal_manual.summary_results()
Parameter Value
Number of Iterations 20
Final Convergence 3.400348e-07
Interface Pressure (Pa) 219426.35
Seal Leakage (kg/s) 3.488258e-02