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:
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.
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:
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 |
|---|---|---|
|
Node location in the rotor model |
- |
|
Radius of the shaft |
m |
|
Total inlet pressure at hole-pattern entrance |
Pa |
|
Final outlet pressure at labyrinth exit |
Pa |
|
Inlet temperature |
K |
|
Shaft rotational speed(s) |
rad/s |
|
Gas composition dictionary (optional) |
- |
|
Molecular mass (required if no gas_composition) |
kg/kgmol |
|
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 |
|---|---|---|
|
Seal clearance |
m |
|
Length of the seal |
m |
|
Surface roughness ratio (ε/D) |
- |
|
Axial length of each cell |
m |
|
Circumferential width of each cell |
m |
|
Depth of each cell |
m |
|
Inlet swirl ratio |
- |
|
Entrance loss coefficient |
- |
|
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 |
|---|---|---|
|
Nominal radial clearance |
m |
|
Number of teeth (throttlings) |
- |
|
Axial cavity length (land length) |
m |
|
Height of seal strip |
m |
|
Thickness of throttle (tip-width) |
m |
|
Location of teeth: ‘rotor’, ‘stator’, or ‘inter’ |
- |
|
Inlet swirl velocity ratio |
- |
|
Temperature at states [T1, T2] (required if no gas_composition) |
K |
|
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:
Convergence History: The relative leakage error decreasing with each iteration
Leakage Rate Convergence: How the leakage rates from both seals approach each other
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 |