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’.