Issues with Gas Turbine off-design modeling/simulation #580
-
Hello, First, regarding the system's aim and application, it is assumed that this gas turbine drives an electric generator (electricity generation application), so its spool speed should always remain fixed (constant with load variation) at its design point value. Therefore, only two basic load control strategies could be implemented in this particular case. Either the fuel flow part-load strategy (i.e., controlling the gas turbine's electric load by changing the fuel mass flow rate) or the VIGVs part-load strategy (i.e., controlling the gas turbine's electric load by varying the compressor's variable inlet guide vanes angle/opening). Having run the gas turbine's design case successfully (compared to the published data and the respective results from an identical simulation in the commercial software GasTurb), I tried to implement both part-load strategies in TESPy (of course, in separate scripts). In particular, the gas turbine's off-design simulation when applying the fuel flow part-load strategy seems to give the desired results (compared to the GasTurb results), almost over the entire range of fuel mass flow rate values of interest (i.e., from the full-load/design value to 60% of that value, with a stepsize of 5%). But, from 60% to 50% of the design fuel mass flow rate value (including the 60% value), the TESPy solver cannot converge, with the following error messages popping up: I assume this happens because, in these cases, the gas turbine operating point has moved outside of the compressor's characteristic map feasible range. So, is there something that could be made in this case for the solver to converge (given that, unlike the characteristic line class, the characteristic map class doesn't include an "extrapolate" parameter in the TESPy source code)? Regarding the VIGVs part-load strategy, I've created two independent and slightly different off-design setups for this case (each one is a separate script, of course). Their difference is that in the first one, I explicitly set/consider the compressor's variable inlet guide vanes angle ("igva" parameter in TESPy) as the control variable of the off-design simulation. As a result, I iterate over a range of VIGV angle values (beginning from the full-load/design value of 0 degrees) to simulate the gas turbine's part-load behavior. In the second off-design setup instead, the simulation's control variable is the (incoming) air mass flow rate, and the VIGV angle is a dependent variable (its value will be a result of the off-design simulation), using TESPy's keyword "var" (igva="var"). This time, I iterate over air mass flow rate values (beginning from the full-load/design value) to simulate the gas turbine's part-load behavior. Unfortunately, for both off-design setups, the solver fails to converge (offering unreliable results) over the entire range of iteration values, with the following error message popping up: Does this happen only because the gas turbine operating point has moved outside the compressor's characteristic map feasible range? Or does it have to do with something I'm missing (e.g., an issue in the model's parametrization process)? Also, to be sure that I adequately understand TESPy's source code, when providing the "igva" parameter with a value, does this value always reflect the degree of change in the VIGV angle/opening from its original (default) position of 0 degrees (fully-open position)? For example, does the setting "igva=-20" imply that the VIGV opening has closed by 20 degrees from its fully open position of 0 degrees? Sorry for my lengthy description of the issue, but my goal was for this to become as clear as possible. Any help or suggestion for these issues would be much appreciated! Fuel flow part-load strategy: # Modeling/simulation of a simple cycle, single-spool turboshaft (gas turbine)
# Design data of SGT-800 (SIEMENS) industrial gas turbine
from tespy.networks import Network
from tespy.components import (
Sink, Source, Compressor, Turbine, DiabaticCombustionChamber)
from tespy.connections import Connection, Bus, Ref
# %% network
nw = Network(p_unit='bar', T_unit='C', h_unit='kJ / kg')
# %% components
# gas turbine
comp = Compressor('compressor')
cc = DiabaticCombustionChamber('combustion chamber')
turb = Turbine('turbine')
fs = Source('fuel source')
aas = Source('ambient air source')
ch = Sink('chimney')
# %% connections
# ambient air path
c1 = Connection(aas, 'out1', comp, 'in1', label="1")
c2 = Connection(comp, 'out1', cc, 'in1', label="2")
# fuel path
c5 = Connection(fs, 'out1', cc, 'in2', label="5")
# flue gas path
c3 = Connection(cc, 'out1', turb, 'in1', label="3")
c4 = Connection(turb, 'out1', ch, 'in1', label="4")
nw.add_conns(c1, c2, c5, c3, c4)
# %% busses
power = Bus('power output')
power.add_comps({'comp': turb, 'char': 1}, {'comp': comp, 'char': 1, 'base': 'bus'})
heat_in = Bus('heat input')
heat_in.add_comps({'comp': cc})
nw.add_busses(power, heat_in)
# %% component parametrization
comp.set_attr(pr=21.1, eta_s=0.9, igva=0, design=['pr', 'eta_s'], offdesign=['char_map_pr', 'char_map_eta_s'])
# default value in TESPy for compressor's VIGVs: igva=0 (so, it's not necessary to be given here)
turb.set_attr(eta_s=0.89, design=['eta_s'], offdesign=['eta_s_char', 'cone'])
cc.set_attr(pr=0.98, eta=1, lamb=1.5, ti=None)
# %% connection parametrization
c1.set_attr(
T=15, p=1.01325, m=None, fluid={
"N2": 0.755, "O2": 0.2315, "Ar": 0.0129, "CO2": 0.0006
}
) # m=134.3
c3.set_attr(T=None)
c4.set_attr(p=Ref(c1, 1.03, 0)) # assuming incomplete exhaust gas expansion to the ambient conditions
c5.set_attr(
T=Ref(c1, 1, 0), p=Ref(c2, 1.05, 0), m=3.00649, fluid={
"CH4": 0.96, "ETHANE": 0.04, "H2": 0
}
)
# 1st run
nw.solve("design")
print(f"Brayton cycle thermal input = {round(abs(cc.ti.val)/1e6, 3)} MW", "\n")
print(f"Brayton cycle net electric power output = {round(abs(power.P.val)/1e6, 3)} MWe", "\n")
el_eff = (abs(power.P.val) / cc.ti.val) * 100 # Brayton cycle (electric) efficiency
print(f"Brayton cycle (electric) efficiency = {round(el_eff, 2)} %", "\n")
# 2nd run
cc.set_attr(lamb=None)
c3.set_attr(m=135.502) # from GasTurb
nw.solve("design")
print(f"Brayton cycle thermal input = {round(abs(cc.ti.val)/1e6, 3)} MW", "\n")
print(f"Brayton cycle net electric power output = {round(abs(power.P.val)/1e6, 3)} MWe", "\n")
el_eff = (abs(power.P.val) / cc.ti.val) * 100 # Brayton cycle (electric) efficiency
print(f"Brayton cycle (electric) efficiency = {round(el_eff, 2)} %", "\n")
# 3rd run
c3.set_attr(m=None, T=1306.85, design=['T']) # or m=135.502 (from GasTurb)
nw.solve(mode='design')
nw.print_results()
print(f"Brayton cycle thermal input = {round(abs(cc.ti.val)/1e6, 3)} MW", "\n")
print(f"Brayton cycle net electric power output = {round(abs(power.P.val)/1e6, 3)} MWe", "\n")
el_eff = (abs(power.P.val) / cc.ti.val) * 100 # Brayton cycle (electric) efficiency
print(f"Brayton cycle (electric) efficiency = {round(el_eff, 2)} %", "\n")
nw.save('design_point_2')
# off-design performance (for fuel mass flow rate control strategy)
# comp.set_attr(igva="var")
print("Off-design performance")
nw.solve('offdesign', design_path='design_point_2')
nw.print_results()
print(f"Brayton cycle thermal input = {round(abs(cc.ti.val)/1e6, 3)} MW", "\n")
print(f"Brayton cycle net electric power output = {round(abs(power.P.val)/1e6, 3)} MWe", "\n")
el_eff = (abs(power.P.val) / cc.ti.val) * 100 # Brayton cycle (electric) efficiency
print(f"Brayton cycle (electric) efficiency = {round(el_eff, 2)} %", "\n")
# preparation for part-load performance
nw.set_attr(iterinfo=False)
# part-load performance
print(f"Part-load performance")
import numpy as np
# Gas turbine's fuel mass flow rate
partload_m_fuel_range = np.linspace(3.00649, 3.00649/2, 11) # [kg/s],
# fuel mass flow rate range from the full-load (design) value of 3.00649 kg/s to only 50% of that value
# (part-load operating conditions)
# Gas turbine's net electric power output
GT_power = []
n = 1
for m in partload_m_fuel_range:
print(f"Relative fuel mass flow rate = {round((m / 3.00649) * 100, 2)} %", "\n")
c5.set_attr(m=m)
nw.solve("offdesign", design_path='design_point_2', max_iter=100)
GT_power += [abs(power.P.val) / 1e6] # [MWe]
nw.print_results()
print(f"Gas Turbine's net electric power output = {round(abs(power.P.val) / 1e6, 3)} MWe")
print(f"Part-load ratio (electric) = {round(((abs(power.P.val) / 1e6) / 62.136) * 100, 2)} %")
el_eff = (abs(power.P.val) / cc.ti.val) * 100 # Gas Turbine's (electric) efficiency
print(f"Gas Turbine's (electric) efficiency = {round(el_eff, 2)} %")
print(f"Relative (electric) efficiency = {round((el_eff / 41.4) * 100, 2)} %", "\n")
print(f"Gas Turbine's turbine power output = {round(abs(turb.P.val) / 1e6, 3)} MW")
print(f"Gas Turbine's turbine pressure ratio = {round(abs(turb.pr.val), 6)}")
print(f"Gas Turbine's turbine isentropic efficiency = {round(abs(turb.eta_s.val), 5)}")
print("\n")
n += 1
# plotting
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, figsize=(16, 8), sharex='col')
ax.grid()
ax.scatter(partload_m_fuel_range, GT_power, s=100, color="#1f567d")
ax.set_ylabel("Gas turbine's net electric power output [MWe]")
ax.set_xlabel("Gas turbine's fuel mass flow rate [kg/s]")
plt.tight_layout()
fig.savefig('Part-load performance_CHP_new_2.svg')
plt.close() VIGVs part-load strategy (explicit): # Modeling/simulation of a simple cycle, single-spool turboshaft (gas turbine)
# Design data of SGT-800 (SIEMENS) industrial gas turbine
from tespy.networks import Network
from tespy.components import (
Sink, Source, Compressor, Turbine, DiabaticCombustionChamber)
from tespy.connections import Connection, Bus, Ref
# %% network
nw = Network(p_unit='bar', T_unit='C', h_unit='kJ / kg')
# %% components
# gas turbine
comp = Compressor('compressor')
cc = DiabaticCombustionChamber('combustion chamber')
turb = Turbine('turbine')
fs = Source('fuel source')
aas = Source('ambient air source')
ch = Sink('chimney')
# %% connections
# ambient air path
c1 = Connection(aas, 'out1', comp, 'in1', label="1")
c2 = Connection(comp, 'out1', cc, 'in1', label="2")
# fuel path
c5 = Connection(fs, 'out1', cc, 'in2', label="5")
# flue gas path
c3 = Connection(cc, 'out1', turb, 'in1', label="3")
c4 = Connection(turb, 'out1', ch, 'in1', label="4")
nw.add_conns(c1, c2, c5, c3, c4)
# %% busses
power = Bus('power output')
power.add_comps({'comp': turb, 'char': 1}, {'comp': comp, 'char': 1, 'base': 'bus'})
heat_in = Bus('heat input')
heat_in.add_comps({'comp': cc})
nw.add_busses(power, heat_in)
# %% component parametrization
comp.set_attr(pr=21.1, eta_s=0.9, igva=0, design=['pr', 'eta_s'], offdesign=['char_map_pr', 'char_map_eta_s']) # eta_s_char
turb.set_attr(eta_s=0.89, design=['eta_s'], offdesign=['eta_s_char', 'cone'])
cc.set_attr(pr=0.98, eta=1, lamb=1.5, ti=None)
# %% connection parametrization
c1.set_attr(
T=15, p=1.01325, m=None, fluid={
"N2": 0.755, "O2": 0.2315, "Ar": 0.0129, "CO2": 0.0006
}
) # m=134.3
c3.set_attr(T=None)
c4.set_attr(p=Ref(c1, 1.03, 0)) # assuming incomplete exhaust gas expansion to the ambient conditions
c5.set_attr(
T=Ref(c1, 1, 0), p=Ref(c2, 1.05, 0), m=3.00649, fluid={
"CH4": 0.96, "ETHANE": 0.04, "H2": 0
}, design=['m']
)
# 1st run
nw.solve("design")
print(f"Brayton cycle thermal input = {round(abs(cc.ti.val)/1e6, 3)} MW", "\n")
print(f"Brayton cycle net electric power output = {round(abs(power.P.val)/1e6, 3)} MWe", "\n")
print(f"Gas Turbine's air mass flow rate = {round(c1.m.val, 3)} kg/s", "\n")
el_eff = (abs(power.P.val) / cc.ti.val) * 100 # Brayton cycle (electric) efficiency
print(f"Brayton cycle (electric) efficiency = {round(el_eff, 2)} %", "\n")
# 2nd run
cc.set_attr(lamb=None)
c3.set_attr(m=135.502) # from GasTurb
nw.solve("design")
print(f"Brayton cycle thermal input = {round(abs(cc.ti.val)/1e6, 3)} MW", "\n")
print(f"Brayton cycle net electric power output = {round(abs(power.P.val)/1e6, 3)} MWe", "\n")
print(f"Gas Turbine's air mass flow rate = {round(c1.m.val, 3)} kg/s", "\n")
el_eff = (abs(power.P.val) / cc.ti.val) * 100 # Brayton cycle (electric) efficiency
print(f"Brayton cycle (electric) efficiency = {round(el_eff, 2)} %", "\n")
# 3rd run
c3.set_attr(m=None, T=1306.85, design=['T']) # or m=135.502 (from GasTurb)
c4.set_attr(offdesign=['T'])
# gas turbine's TIT or TET should remain constant (at design value) in VIGVs' angle control strategy
nw.solve(mode='design')
nw.print_results()
print(f"Brayton cycle thermal input = {round(abs(cc.ti.val)/1e6, 3)} MW", "\n")
print(f"Brayton cycle net electric power output = {round(abs(power.P.val)/1e6, 3)} MWe", "\n")
print(f"Gas Turbine's air mass flow rate = {round(c1.m.val, 3)} kg/s", "\n")
el_eff = (abs(power.P.val) / cc.ti.val) * 100 # Brayton cycle (electric) efficiency
print(f"Brayton cycle (electric) efficiency = {round(el_eff, 2)} %", "\n")
nw.save('design_point_3')
# off-design performance (for VIGVs' angle control strategy)
#comp.set_attr(igva="var")
print("Off-design performance")
nw.solve('offdesign', design_path='design_point_3')
nw.print_results()
print(f"Brayton cycle thermal input = {round(abs(cc.ti.val)/1e6, 3)} MW", "\n")
print(f"Brayton cycle net electric power output = {round(abs(power.P.val)/1e6, 3)} MWe", "\n")
print(f"Gas Turbine's air mass flow rate = {round(c1.m.val, 3)} kg/s", "\n")
el_eff = (abs(power.P.val) / cc.ti.val) * 100 # Brayton cycle (electric) efficiency
print(f"Brayton cycle (electric) efficiency = {round(el_eff, 2)} %", "\n")
# preparation for part-load performance
nw.set_attr(iterinfo=False)
# part-load performance
print(f"Part-load performance")
import numpy as np
# Gas turbine's VIGVs angle
partload_igva_range = np.linspace(0, -50, 11) # [degrees]
#partload_igva_range = np.linspace(-5, 15, 13) # [degrees],
#partload_igva_range = np.linspace(-90, 90, 13) # [degrees],
# VIGVs angle/opening range from the full-load (design) value of 0 degrees (change of VIGVs positioning in degrees) to 60 degrees
# typical VIGVs' operating range (for heavy-duty gas turbines): 32° (min position/opening) - 88° (max position/opening) ->
# maximum change of VIGVs positioning = 56 degrees
# (part-load operating conditions)
# Gas turbine's net electric power output
GT_power = []
n = 1
for igva in partload_igva_range:
print(f"VIGVs angle repositioning = {igva}°", "\n")
comp.set_attr(igva=igva)
#comp.set_attr(igva="var")
nw.solve("offdesign", design_path='design_point_3', max_iter=100)
GT_power += [abs(power.P.val) / 1e6] # [MWe]
nw.print_results()
print(f"Gas Turbine's net electric power output = {round(abs(power.P.val) / 1e6, 3)} MWe")
print(f"Part-load ratio (electric) = {round(((abs(power.P.val) / 1e6) / 62.136) * 100, 2)} %")
el_eff = (abs(power.P.val) / cc.ti.val) * 100 # Gas Turbine's (electric) efficiency
print(f"Gas Turbine's (electric) efficiency = {round(el_eff, 2)} %", "\n")
print(f"Gas Turbine's air mass flow rate = {round(c1.m.val, 3)} kg/s")
print(f"Gas Turbine's turbine power output = {round(abs(turb.P.val) / 1e6, 3)} MW")
print(f"Gas Turbine's turbine pressure ratio = {round(abs(turb.pr.val), 6)}")
print(f"Gas Turbine's turbine isentropic efficiency = {round(abs(turb.eta_s.val), 5)}")
print("\n")
n += 1
# plotting
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, figsize=(16, 8), sharex='col')
ax.grid()
ax.scatter(partload_igva_range, GT_power, s=100, color="#1f567d")
ax.set_ylabel("Gas turbine's net electric power output [MWe]")
ax.set_xlabel("Gas turbine's VIGVs angle repositioning [°]")
plt.tight_layout()
fig.savefig('Part-load performance_CHP_new_3.svg')
plt.close() VIGVs part-load strategy (implicit): # Modeling/simulation of a simple cycle, single-spool turboshaft (gas turbine)
# Design data of SGT-800 (SIEMENS) industrial gas turbine
from tespy.networks import Network
from tespy.components import (
Sink, Source, Compressor, Turbine, DiabaticCombustionChamber)
from tespy.connections import Connection, Bus, Ref
# %% network
nw = Network(p_unit='bar', T_unit='C', h_unit='kJ / kg')
# %% components
# gas turbine
comp = Compressor('compressor')
cc = DiabaticCombustionChamber('combustion chamber')
turb = Turbine('turbine')
fs = Source('fuel source')
aas = Source('ambient air source')
ch = Sink('chimney')
# %% connections
# ambient air path
c1 = Connection(aas, 'out1', comp, 'in1', label="1")
c2 = Connection(comp, 'out1', cc, 'in1', label="2")
# fuel path
c5 = Connection(fs, 'out1', cc, 'in2', label="5")
# flue gas path
c3 = Connection(cc, 'out1', turb, 'in1', label="3")
c4 = Connection(turb, 'out1', ch, 'in1', label="4")
nw.add_conns(c1, c2, c5, c3, c4)
# %% busses
power = Bus('power output')
power.add_comps({'comp': turb, 'char': 1}, {'comp': comp, 'char': 1, 'base': 'bus'})
heat_in = Bus('heat input')
heat_in.add_comps({'comp': cc})
nw.add_busses(power, heat_in)
# %% component parametrization
comp.set_attr(pr=21.1, eta_s=0.9, igva=0, design=['pr', 'eta_s'], offdesign=['char_map_pr', 'char_map_eta_s']) # eta_s_char
turb.set_attr(eta_s=0.89, design=['eta_s'], offdesign=['eta_s_char', 'cone'])
cc.set_attr(pr=0.98, eta=1, lamb=1.5, ti=None)
# %% connection parametrization
c1.set_attr(
T=15, p=1.01325, m=None, fluid={
"N2": 0.755, "O2": 0.2315, "Ar": 0.0129, "CO2": 0.0006
}
) # m=134.3
c3.set_attr(T=None)
c4.set_attr(p=Ref(c1, 1.03, 0), offdesign=['T']) # assuming incomplete exhaust gas expansion to the ambient conditions
# gas turbine's TIT or TET should remain constant (at design value) in VIGVs' angle control strategy
c5.set_attr(
T=Ref(c1, 1, 0), p=Ref(c2, 1.05, 0), m=3.00649, fluid={
"CH4": 0.96, "ETHANE": 0.04, "H2": 0
}, design=['m']
)
# 1st run
nw.solve("design")
print(f"Brayton cycle thermal input = {round(abs(cc.ti.val)/1e6, 3)} MW", "\n")
print(f"Brayton cycle net electric power output = {round(abs(power.P.val)/1e6, 3)} MWe", "\n")
el_eff = (abs(power.P.val) / cc.ti.val) * 100 # Brayton cycle (electric) efficiency
print(f"Brayton cycle (electric) efficiency = {round(el_eff, 2)} %", "\n")
# 2nd run
cc.set_attr(lamb=None)
c1.set_attr(m=134.332) # from GasTurb
nw.solve("design")
nw.print_results()
print(f"Brayton cycle thermal input = {round(abs(cc.ti.val)/1e6, 3)} MW", "\n")
print(f"Brayton cycle net electric power output = {round(abs(power.P.val)/1e6, 3)} MWe", "\n")
el_eff = (abs(power.P.val) / cc.ti.val) * 100 # Brayton cycle (electric) efficiency
print(f"Brayton cycle (electric) efficiency = {round(el_eff, 2)} %", "\n")
nw.save('design_point_4')
# off-design performance (for VIGVs' angle control strategy)
comp.set_attr(igva="var")
print("Off-design performance")
nw.solve('offdesign', design_path='design_point_4')
nw.print_results()
print(f"Brayton cycle thermal input = {round(abs(cc.ti.val)/1e6, 3)} MW", "\n")
print(f"Brayton cycle net electric power output = {round(abs(power.P.val)/1e6, 3)} MWe", "\n")
el_eff = (abs(power.P.val) / cc.ti.val) * 100 # Brayton cycle (electric) efficiency
print(f"Brayton cycle (electric) efficiency = {round(el_eff, 2)} %", "\n")
# preparation for part-load performance
nw.set_attr(iterinfo=False)
# part-load performance
print(f"Part-load performance")
import numpy as np
# Gas turbine's air mass flow rate
partload_m_air_range = np.linspace(134.332, 134.332/2, 11) # [kg/s],
# air mass flow rate range from the full-load (design) value of 134.332 kg/s to only 50% of that value
# (part-load operating conditions)
# Gas turbine's net electric power output
GT_power = []
n = 1
for m in partload_m_air_range:
print(f"Relative air mass flow rate = {round((m / 134.332) * 100, 2)} %", "\n")
#comp.set_attr(igva=igva)
c1.set_attr(m=m)
nw.solve("offdesign", design_path='design_point_4', max_iter=100)
GT_power += [abs(power.P.val) / 1e6] # [MWe]
nw.print_results()
print(f"Gas Turbine's net electric power output = {round(abs(power.P.val) / 1e6, 3)} MWe")
print(f"Part-load ratio (electric) = {round(((abs(power.P.val) / 1e6) / 62.136) * 100, 2)} %")
el_eff = (abs(power.P.val) / cc.ti.val) * 100 # Gas Turbine's (electric) efficiency
print(f"Gas Turbine's (electric) efficiency = {round(el_eff, 2)} %", "\n")
print(f"Gas Turbine's turbine power output = {round(abs(turb.P.val) / 1e6, 3)} MW")
print(f"Gas Turbine's turbine pressure ratio = {round(abs(turb.pr.val), 6)}")
print(f"Gas Turbine's turbine isentropic efficiency = {round(abs(turb.eta_s.val), 5)}")
print("\n")
n += 1
# plotting
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, figsize=(16, 8), sharex='col')
ax.grid()
ax.scatter(partload_m_air_range, GT_power, s=100, color="#1f567d")
ax.set_ylabel("Gas turbine's net electric power output [MWe]")
ax.set_xlabel("Gas turbine's air mass flow rate [kg/s]")
plt.tight_layout()
fig.savefig('Part-load performance_CHP_new_4.svg')
plt.close() |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 2 replies
-
Hi @MikeSennis, thank you for reaching out, these are certainly very interesting use cases! Would you have time for an online meeting next week or the week after? I would like to discuss/understand the requirements of the use cases better (also what Gasturb does), because I never had a license, therefore only know what they (claim to) do from their documentation. The maps and characteristics available in tespy are example data, which should be replaced by the actual data you have based on your equipment, that could also be an issue. You can contact me: Line 31 in 66b3787 Best Francesco |
Beta Was this translation helpful? Give feedback.
For anyone who may have a similar issue in the future, Francesco (@fwitte) found that the real reason for the TESPy solver convergence failure during the off-design simulation process of my gas turbine model was the small number of iterations used. In other words, the step size from the last "converged" point (i.e., the previous operational point for which the solver converges) should be much smaller than the one initially used (e.g., for the explicit VIGVs part-load strategy mentioned above, over 100 iterations should be used for the off-design simulation, instead of 11 initially used).
Of course, importing your (custom) compressor characteristic map in TESPy may considerably improve the…