Axial Turbine Mean Line - Aungier Model¶
Model description¶
The model is based on the model presented in the thesis [1].
Class description¶
Example of use¶
# -*- coding: utf-8 -*-
"""
Created on Wed Dec 17 12:50:00 2025
@author: Basile
"""
import matplotlib.pyplot as plt
import numpy as np
from labothappy.toolbox.turbomachinery.mean_line_axial_turbine_mapping import map_plot, map_plot_clean, plot_power_eta_vs_mdot, filter_sparse_by_proximity
from labothappy.component.expander.turbine_mean_line_Aungier import AxialTurbineMeanLine, generate_map_processes
if __name__ == "__main__":
case_study = "TCO2_ORC"
if case_study == "Salah_Case":
Turb_OD = AxialTurbineMeanLine('CO2')
Turb_OD.set_inputs(
m_dot = 655.18,
P_su = 25000000.0,
T_su = 923,
N_rot = 1506.9946780513785, # 996.4330963327212,
fluid = 'CO2',
P_ex = 100*1e5
)
Turb_OD.set_parameters(
r_m = 0.261423771889,
nStages = 12,
mdot_rated = 655.18,
DP_rated = 2.5,
damping = 0.5,
delta_tip = 0.0004,
N_lw = 0,
D_lw = 0,
e_blade = 2e-06
)
Turb_OD.set_stage_parameters(
h_blade_S = [0.05893535333, 0.06254061127, 0.06644686421, 0.07068270152, 0.07527979324, 0.08027326565, 0.08570212832, 0.09160976073, 0.09804446776, 0.105060115, 0.1127168568, 0.1210819728, 0.1254195395],
chord_S = [0.008645525688, 0.009066896935, 0.009520522543, 0.01000898242, 0.01053510451, 0.01110199118, 0.0117130487, 0.0123720203, 0.0130830232, 0.01385059029, 0.01467971707, 0.01557591465, 0.01603830059],
xhi_S1 = [-0.6455466816, -0.6455466816, -0.6455466816, -0.6455466816, -0.6455466816, -0.6455466816, -0.6455466816, -0.6455466816, -0.6455466816, -0.6455466816, -0.6455466816, -0.6455466816, -0.6455466816],
xhi_S2 = [1.146678265, 1.146678265, 1.146678265, 1.146678265, 1.146678265, 1.146678265, 1.146678265, 1.146678265, 1.146678265, 1.146678265, 1.146678265, 1.146678265, 1.146678265],
pitch_S = [0.006966193979, 0.007305716867, 0.007671228935, 0.008064808966, 0.008488735591, 0.008945508564, 0.009437872521, 0.009968843587, 0.01054173924, 0.0111602119, 0.01182828672, 0.01255040431, 0.01292297508],
o_S = [0.001744270233, 0.001829283609, 0.001920804434, 0.002019353216, 0.002125500504, 0.002239872211, 0.00236315557, 0.002496105791, 0.002639553539, 0.002794413345, 0.00296169307, 0.003142504605, 0.003235792862],
t_TE_S = [0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005],
t_blade_S = [0.003025933991, 0.003173413927, 0.00333218289, 0.003503143847, 0.003687286579, 0.003885696912, 0.004099567045, 0.004330207105, 0.00457905812, 0.004847706601, 0.005137900974, 0.005451570129, 0.005613405206],
n_blade_S = [236, 225, 214, 204, 194, 184, 174, 165, 156, 147, 139, 131, 127],
R_c_S = [0.01352981312, 0.01418923794, 0.01489913922, 0.01566355437, 0.01648690899, 0.01737405813, 0.01833033244, 0.01936158987, 0.02047427367, 0.02167547758, 0.02297301932, 0.02437552349, 0.02509913423],
h_blade_R = [0.06085456338, 0.06461845758, 0.06869830659, 0.07312430505, 0.07792992342, 0.08315231023, 0.08883274986, 0.09501718485, 0.1017568126, 0.1091087686, 0.1171369103, 0.1259127187, None],
chord_R = [0.008870626618, 0.009309055087, 0.009781089003, 0.01028943789, 0.01083707309, 0.01142725573, 0.01206356808, 0.01274994866, 0.01349073167, 0.01429069144, 0.01515509243, 0.01608974592, None],
xhi_R1 = [0.5693595771, 0.5693595771, 0.5693595771, 0.5693595771, 0.5693595771, 0.5693595771, 0.5693595771, 0.5693595771, 0.5693595771, 0.5693595771, 0.5693595771, 0.5693595771, None],
xhi_R2 = [-1.17766032, -1.17766032, -1.17766032, -1.17766032, -1.17766032, -1.17766032, -1.17766032, -1.17766032, -1.17766032, -1.17766032, -1.17766032, -1.17766032, None],
pitch_R = [0.007763880051, 0.008147607851, 0.008560748305, 0.009005672883, 0.009484982197, 0.01000153051, 0.01055845315, 0.01115919723, 0.01180755622, 0.01250770875, 0.01326426248, 0.01408230362, None],
o_R = [0.00229560867, 0.002409068546, 0.002531225097, 0.002662779514, 0.002804500743, 0.002957232725, 0.003121902507, 0.003299529328, 0.003491234828, 0.00369825454, 0.003921950849, 0.004163827632, None],
t_TE_R = [0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, None],
t_blade_R = [0.003104719316, 0.00325816928, 0.003423381151, 0.003601303262, 0.00379297558, 0.003999539504, 0.004222248827, 0.00446248203, 0.004721756085, 0.005001742002, 0.005304282352, 0.00563141107, None],
n_blade_R = [212, 202, 192, 182, 173, 164, 156, 147, 139, 131, 124, 117, None],
R_c_R = [0.01388208476, 0.01456820328, 0.01530691263, 0.01610245309, 0.01695947464, 0.0178830808, 0.01887887765, 0.01995302875, 0.02111231693, 0.02236421375, 0.02371695786, 0.02517964358, None],
)
elif case_study == "TCO2_ORC":
Turb_OD = AxialTurbineMeanLine('CO2')
Turb_OD.set_inputs(
m_dot = 5*100, # kg/s
P_su = 140*1e5, # Pa
T_su = 273.15 + 121, # K
fluid = 'CO2',
N_rot = 1985.8640516476623, # RPM
P_ex = 39.8*1e5, # Pa
)
Turb_OD.set_parameters(
r_m = 0.234769017407,
nStages = 7,
mdot_rated = 500,
DP_rated = 3.5175879397,
N_rot_rated = 1985.8640516476623, # RPM
damping = 0.3,
delta_tip = 0.0004,
N_lw = 0,
D_lw = 0,
e_blade = 2e-06
)
Turb_OD.set_stage_parameters(
# --- Stage geometry vectors ---
h_blade_S = [0.03073202408, 0.03537496698, 0.04115667196, 0.04836565367, 0.05737105876, 0.06865150342, 0.08283598027, 0.09050678143],
chord_S = [0.01152290153, 0.01225265229, 0.01317314506, 0.01431411044, 0.01571068703, 0.01740581498, 0.01945280172, 0.0205316737],
xhi_S1 = [-0.4167759648, -0.4167759648, -0.4167759648, -0.4167759648, -0.4167759648, -0.4167759648, -0.4167759648, -0.4167759648],
xhi_S2 = [1.118475049, 1.118475049, 1.118475049, 1.118475049, 1.118475049, 1.118475049, 1.118475049, 1.118475049],
pitch_S = [0.009902812531, 0.0105299623, 0.01132103625, 0.01230158497, 0.01350180664, 0.01495860415, 0.01671779005, 0.01764497553],
o_S = [0.003461958607, 0.00368120607, 0.003957760359, 0.004300553789, 0.00472014345, 0.005229430348, 0.005844430254, 0.006168568244],
t_TE_S = [0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005],
t_blade_S = [0.004033015536, 0.004288428303, 0.00461060077, 0.005009938655, 0.005498740461, 0.006092035242, 0.006808480601, 0.007186085794],
n_blade_S = [149, 140, 130, 120, 109, 99, 88, 84],
R_c_S = [0.01610761461, 0.0171277174, 0.01841445431, 0.02000938512, 0.0219616293, 0.02433121196, 0.02719265041, 0.0287007822],
h_blade_R = [0.03286726306, 0.03802117726, 0.04444130041, 0.05245106386, 0.06246706441, 0.07503276664, 0.09086996303, None],
chord_R = [0.01185991693, 0.0126774635, 0.01369903834, 0.0149566343, 0.01648881371, 0.01834300018, 0.0205794408, None],
xhi_R1 = [0.4954042518, 0.4954042518, 0.4954042518, 0.4954042518, 0.4954042518, 0.4954042518, 0.4954042518, None],
xhi_R2 = [-1.121246962, -1.121246962, -1.121246962, -1.121246962, -1.121246962, -1.121246962, -1.121246962, None],
pitch_R = [0.009443352635, 0.01009431677, 0.01090773658, 0.0119090861, 0.01312907023, 0.0146054496, 0.01638619542, None],
o_R = [0.002868459972, 0.003066193195, 0.003313273048, 0.003617437378, 0.003988012932, 0.004436469671, 0.004977379059, None],
t_TE_R = [0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, None],
t_blade_R = [0.004043826837, 0.004364071844, 0.004722759647, 0.005103811805, 0.005554855605, 0.006018210679, 0.006547971457, None],
n_blade_R = [156, 146, 135, 124, 112, 101, 90, None],
R_c_R = [0.01657872114, 0.01772155179, 0.01914958914, 0.02090755531, 0.02304935574, 0.02564128287, 0.0287675548, None],
)
map_case = 0
if map_case == 1 and case_study == "TCO2_ORC":
df_map = generate_map_processes(
Turb_OD,
m_grid=np.linspace(0.6*Turb_OD.params['mdot_rated'], 1.4*Turb_OD.params['mdot_rated'], 30),
N_grid=np.linspace(0.1*Turb_OD.params['N_rot_rated'], 1.5*Turb_OD.params['N_rot_rated'], 30),
max_workers=-2
)
df_clean = filter_sparse_by_proximity(df_map, rp_col=None, group_by='N_rot',
rp_tol_rel=0.6, m_tol_rel=0.6, min_neighbors=2)
fig, ax = map_plot(
df_clean, rp_col='RP_calc',
use_grid=True, nx=600, ny=600,
# triangulation cleaning
min_circle_ratio=0.01, # less aggressive
max_area_factor=50.0, # allow larger cells before masking
long_edge_q=1, # drop triangles that bridge big gaps
# hole filling + smoothing
fill_holes=True, hole_method='nearest', hole_smooth_sigma=0.8,
smooth_sigma=0.6, # gentle overall blur
# cosmetics
show_points=True, # hide all raw dots (see patch below for "used" only)
levels=24, focus_high=True, max_iso_speeds=4,
figsize=(9,6), dpi=220
)
plt.show()
# fig, ax = map_plot_clean(
# df_clean,
# rp_col='RP_calc', # or 'RP_calc' if that’s your chosen column
# levels=24,
# nx=500, ny=500,
# min_circle_ratio=0.01,
# long_edge_q=0.92, # tighten to 0.90 if you still see bridging
# smooth_sigma=0.6 # small smoothing of the gridded field
# )
# plt.show()
_ = plot_power_eta_vs_mdot(df_map, speeds=None, max_lines=5) # auto-picks up to 5 speeds
plt.show()
else:
Turb_OD.solve()
References¶
[1] S. Salah, ‘Design and analysis of supercritical carbon-dixoide axial turbines’.