Intercooled Cycle (propulsion/gas-turbine-cycle/intercooled-cycle)
Use when the task is intercooled gas turbine cycle analysis: splitting the
total pressure ratio into two compression stages around an intercooler,
computing the intercooler exit temperature from its effectiveness, taking
the equal-split optimum pi_1 = pi_2 = sqrt(pi_total), and comparing net
specific work and thermal efficiency against the simple single-stage
cycle. This leaf implements the air-standard two-stage analysis in pure
Python, stdlib only. It pairs with propulsion/gas-turbine-cycle/
gas-turbine-cycle for the simple cycle baseline and with
propulsion/gas-turbine-cycle/regenerative-cycle, the heat-recovery
variant that recovers the efficiency penalty this cycle accepts. It does
not cover the single-stage baseline analysis, heat recovery, exhaust
augmentation, or non-ideal component behavior; those belong to the
sibling leaves above.
Domain quick reference
- Cycle layout: stage 1 compresses from T_1 to the intercooler at
pressure ratio pi_1, the intercooler cools the discharge toward T_1,
stage 2 compresses from the intercooler exit to the combustor at pi_2,
with pi_1 * pi_2 = pi_total.
- Optimum pressure split: pi_1 = pi_2 = sqrt(pi_total) minimizes the
total compressor work for a fixed total ratio when intercooling
returns the air to the ambient temperature (equal stage split).
- Stage discharge temperature: T_exit = T_in * (1 + (pi_stage**((GAMMA-1)/
GAMMA) - 1) / eta_c), the real discharge with the stage isentropic
efficiency applied once (stage_exit_temperature).
- Intercooler exit: T_ic_exit = T_2a - eps_ic * (T_2a - T_1); eps_ic = 0
leaves the discharge uncooled, eps_ic = 1 returns the ambient
temperature (intercooler_exit_temperature).
- Compressor work: per stage w_c = cp * (T_exit - T_in), equal to
cp * T_in * (pi_stage**((GAMMA-1)/GAMMA) - 1) / eta_c; the total is the
sum over the two stages (compressor_work_total).
- Turbine work: w_t = cp * eta_t * T_3 * (1 - pi_total**(-(GAMMA-1)/
GAMMA)) expands through the FULL total ratio (turbine_work).
- Cycle: q_in = cp * (T_3 - T_2b), w_net = w_t - w_c_total,
eta_th = w_net / q_in (intercooled_cycle).
- Comparison baseline: the simple cycle with one compression stage at
pi_total (simple_cycle); gain = (w_net_i - w_net_s)/w_net_s * 100
percent and eta_delta = (eta_th_i - eta_th_s) * 100 percentage points
(cycle_comparison).
- Trade: intercooling lowers the compressor work and raises the net
specific work, but at fixed T_3 it also raises q_in through the lower
T_2b, so the thermal efficiency falls slightly when no heat recovery
is present. Units are SI: K, J/kg for specific work, dimensionless
ratios and efficiencies.
- FAR-33 frames the aircraft engine certification context (reference
only, standards-map.yaml); the relations above are standard
air-standard methodology, summary-only.
Workflow
- Fix the operating point: inlet temperature T_1, turbine inlet
temperature T_3, total pressure ratio pi_total, intercooler
effectiveness eps_ic, and efficiencies eta_c and eta_t.
- Take the optimum split with optimum_intercooler_pressure_ratio:
pi_1 = pi_2 = sqrt(pi_total).
- Run compressor_work_total(T_1, pi_total, eps_ic, eta_c) to get the
station temperatures T_2a, T_ic_exit, T_2b and the stage works w_c1,
w_c2, w_c_total.
- Get the expansion side with turbine_work(T_3, pi_total, eta_t).
- Assemble the intercooled cycle with intercooled_cycle(T_1, T_3,
pi_total, eps_ic, eta_c, eta_t) for w_net, q_in and eta_th.
- Run the baseline with simple_cycle(T_1, T_3, pi_total, eta_c,
eta_t) and compare with cycle_comparison to get the specific work
gain in percent and the efficiency change in percentage points.
- Judge the trade: accept the efficiency slip only when the work gain
or the downstream heat-recovery option justifies it.
- Confirm the deterministic checks with the contract test
scripts/test_intercooled_cycle.py.
Worked example
Air-standard intercooled cycle at T_1 = 288 K, T_3 = 1500 K,
pi_total = 30, eps_ic = 0.8, eta_c = 0.85, eta_t = 0.9 (GAMMA 1.4,
cp 1005 J/(kg K)). Module real outputs:
- Optimum split: pi_1 = pi_2 = 5.4772 (sqrt of 30).
- Stations: T_2a = 499.97 K; T_ic_exit = 330.39 K (cooled 169.6 K
toward ambient); T_2b = 573.57 K.
- Compressor: w_c1 = 213.03 kJ/kg; w_c2 = 244.39 kJ/kg;
w_c_total = 457.42 kJ/kg.
- Turbine: w_t = 843.34 kJ/kg (full pi_total expansion).
- Cycle: w_net = 385.91 kJ/kg; q_in = 931.06 kJ/kg;
eta_th = 0.4145.
- Simple cycle baseline: w_net = 284.0 kJ/kg; eta_th = 0.4311.
- Comparison: work_gain_pct = +35.9 percent;
eta_delta_pp = -1.66 percentage points. Intercooling raises the
specific work by about a third while the thermal efficiency slips by
1.66 points without heat recovery, the documented intercooling trade.
Verification
- Confirm the anchors: T_2a = 499.97 K, T_ic_exit = 330.39 K,
T_2b = 573.57 K, w_c_total = 457.42 kJ/kg, w_net = 385.91 kJ/kg,
q_in = 931.06 kJ/kg, eta_th = 0.4145, gain +35.9 percent,
eta_delta -1.66 pp, each within 1 percent of the module output.
- Confirm optimum_intercooler_pressure_ratio(36) == 6.0 and (30) ==
5.4772; the exit temperature rises with pi_stage and falls with
eta_c; eps_ic = 0 returns the hot inlet and eps_ic = 1 the coolant.
- Confirm a higher-effectiveness intercooler reduces w_c_total at fixed
pi_total, and that eta_th sits strictly between 0 and 1 here.
- Confirm the eps_ic = 0 degeneration: the no-cooling two-stage total
work approximates the single-stage work (the two differ by the
stage-2 cascade term, which vanishes as eta_c -> 1).
- Confirm every non-physical input raises ValueError: T_1 <= 0,
T_3 <= T_1, pi_total <= 1, eta_c or eta_t outside (0, 1], eps_ic
outside [0, 1], and coolant at or above the intercooler hot inlet.
- Run the contract test offline: python3
scripts/test_intercooled_cycle.py (33 tests, deterministic).
Related leaves
- propulsion/gas-turbine-cycle/gas-turbine-cycle: the single-stage
cycle analysis that supplies the comparison baseline.
- propulsion/gas-turbine-cycle/regenerative-cycle: the heat-recovery
variant that recovers the efficiency this cycle gives up.
- propulsion/gas-turbine-cycle/propelling-nozzle: nozzle expansion
downstream of the turbine.
- propulsion/gas-turbine-cycle/afterburner-cycle: the augmentation
variant for thrust beyond the turbine limit.
- propulsion/gas-turbine-cycle/real-cycle-effects: loss accounting
beyond the constant-efficiency assumption used here.
Pitfalls
- Quoting the pressure split as the work split: pi_1 = pi_2 =
sqrt(pi_total) is the optimum only for the ideal case; with eps_ic =
0.8 the second stage still does more work (244.39 against 213.03
kJ/kg) because its inlet sits at 330.39 K, above ambient.
- Reporting the work gain without the efficiency cost: at the worked
point the net work rises +35.9 percent while eta_th falls 1.66
points, and the gain alone is what sells an intercooled design.
- Dividing the efficiency in twice: stage_exit_temperature already
applies eta_c to return the real discharge, so the stage work is
cp * (T_exit - T_in) and not that value divided by eta_c again;
the spec anchors pin the single application.
- Reading the eps_ic = 0 case as a free win: without intercooling the
two-stage chain charges the stage-2 inefficiency on the real stage-1
discharge, so its work (582.9 kJ/kg) slightly exceeds the
single-stage value (559.3 kJ/kg); the two coincide only as eta_c
tends to 1. This is a modeling artifact, not a physical gain.
- Expanding the turbine at the stage ratio: the turbine sees the full
pi_total (843.34 kJ/kg here), never the per-stage sqrt value, so
mixing the two ratios understates the expansion work.
- Mixing units: the module returns specific work in J/kg; the worked
example tables divide by 1000 to quote kJ/kg.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_intercooled_cycle.py
The test covers the module constants, the optimum pressure ratio (36 ->
6.0, 30 -> 5.4772), stage and intercooler exit temperatures with their
limits (eps_ic 0 and 1) and monotonicity, the worked-example anchors
within 1 percent, the compressor total as the stage-work sum, the
effectiveness work-reduction relation, the full cycle and simple-cycle
baseline dicts with their identities (w_net = w_t - w_c_total,
eta_th = w_net / q_in), the comparison signs and closed forms, the
eps_ic = 0 degeneration identity, determinism, and ValueError rejection
of every non-physical input class.
Contract test
Run from the leaf root: python3 scripts/test_intercooled_cycle.py.
The logic module is scripts/intercooled_cycle_logic.py, pure stdlib with
module constants GAMMA = 1.4 and CP = 1005.0. The test file is stdlib
unittest, offline and deterministic, 33 methods, and asserts the module
outputs against the prep-verified worked-example anchors plus the
magnitude bounds of the spec (works within 1 percent, eta_th between 0
and 1). Exit code 0 means the leaf contract holds.
Compliance
- Standards referenced, not reproduced: FAR-33 (14 CFR Part 33) frames
aircraft engine certification context; the intercooled cycle
relations above are standard air-standard engineering methodology,
summary-only per standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.
1---2name: intercooled-cycle3description: Use when you must analyze a gas turbine cycle with intercooling: split the total pressure ratio into two compression stages with an intercooler between them, compute the intercooler exit temperature from the stage pressure ratio and effectiveness, determine the optimum intercooler pressure ratio minimizing total compressor work, and quantify net specific work and thermal efficiency against the simple non-intercooled cycle. Produces the intercooled cycle efficiency, the simple cycle baseline efficiency, the optimum intercooler pressure ratio, the specific work gain, and the station temperatures that gate an engine cycle comparison. Trigger: intercooled cycle, two-stage compression, intercooler effectiveness, intercooler pressure ratio, compression work split, cycle work gain.4license: Apache-2.05---67# Intercooled Cycle (propulsion/gas-turbine-cycle/intercooled-cycle)89Use when the task is intercooled gas turbine cycle analysis: splitting the10total pressure ratio into two compression stages around an intercooler,11computing the intercooler exit temperature from its effectiveness, taking12the equal-split optimum pi_1 = pi_2 = sqrt(pi_total), and comparing net13specific work and thermal efficiency against the simple single-stage14cycle. This leaf implements the air-standard two-stage analysis in pure15Python, stdlib only. It pairs with propulsion/gas-turbine-cycle/16gas-turbine-cycle for the simple cycle baseline and with17propulsion/gas-turbine-cycle/regenerative-cycle, the heat-recovery18variant that recovers the efficiency penalty this cycle accepts. It does19not cover the single-stage baseline analysis, heat recovery, exhaust20augmentation, or non-ideal component behavior; those belong to the21sibling leaves above.2223## Domain quick reference2425- Cycle layout: stage 1 compresses from T_1 to the intercooler at26 pressure ratio pi_1, the intercooler cools the discharge toward T_1,27 stage 2 compresses from the intercooler exit to the combustor at pi_2,28 with pi_1 * pi_2 = pi_total.29- Optimum pressure split: pi_1 = pi_2 = sqrt(pi_total) minimizes the30 total compressor work for a fixed total ratio when intercooling31 returns the air to the ambient temperature (equal stage split).32- Stage discharge temperature: T_exit = T_in * (1 + (pi_stage**((GAMMA-1)/33 GAMMA) - 1) / eta_c), the real discharge with the stage isentropic34 efficiency applied once (stage_exit_temperature).35- Intercooler exit: T_ic_exit = T_2a - eps_ic * (T_2a - T_1); eps_ic = 036 leaves the discharge uncooled, eps_ic = 1 returns the ambient37 temperature (intercooler_exit_temperature).38- Compressor work: per stage w_c = cp * (T_exit - T_in), equal to39 cp * T_in * (pi_stage**((GAMMA-1)/GAMMA) - 1) / eta_c; the total is the40 sum over the two stages (compressor_work_total).41- Turbine work: w_t = cp * eta_t * T_3 * (1 - pi_total**(-(GAMMA-1)/42 GAMMA)) expands through the FULL total ratio (turbine_work).43- Cycle: q_in = cp * (T_3 - T_2b), w_net = w_t - w_c_total,44 eta_th = w_net / q_in (intercooled_cycle).45- Comparison baseline: the simple cycle with one compression stage at46 pi_total (simple_cycle); gain = (w_net_i - w_net_s)/w_net_s * 10047 percent and eta_delta = (eta_th_i - eta_th_s) * 100 percentage points48 (cycle_comparison).49- Trade: intercooling lowers the compressor work and raises the net50 specific work, but at fixed T_3 it also raises q_in through the lower51 T_2b, so the thermal efficiency falls slightly when no heat recovery52 is present. Units are SI: K, J/kg for specific work, dimensionless53 ratios and efficiencies.54- FAR-33 frames the aircraft engine certification context (reference55 only, standards-map.yaml); the relations above are standard56 air-standard methodology, summary-only.5758## Workflow59601. Fix the operating point: inlet temperature T_1, turbine inlet61 temperature T_3, total pressure ratio pi_total, intercooler62 effectiveness eps_ic, and efficiencies eta_c and eta_t.632. Take the optimum split with optimum_intercooler_pressure_ratio:64 pi_1 = pi_2 = sqrt(pi_total).653. Run compressor_work_total(T_1, pi_total, eps_ic, eta_c) to get the66 station temperatures T_2a, T_ic_exit, T_2b and the stage works w_c1,67 w_c2, w_c_total.684. Get the expansion side with turbine_work(T_3, pi_total, eta_t).695. Assemble the intercooled cycle with intercooled_cycle(T_1, T_3,70 pi_total, eps_ic, eta_c, eta_t) for w_net, q_in and eta_th.716. Run the baseline with simple_cycle(T_1, T_3, pi_total, eta_c,72 eta_t) and compare with cycle_comparison to get the specific work73 gain in percent and the efficiency change in percentage points.747. Judge the trade: accept the efficiency slip only when the work gain75 or the downstream heat-recovery option justifies it.768. Confirm the deterministic checks with the contract test77 scripts/test_intercooled_cycle.py.7879## Worked example8081Air-standard intercooled cycle at T_1 = 288 K, T_3 = 1500 K,82pi_total = 30, eps_ic = 0.8, eta_c = 0.85, eta_t = 0.9 (GAMMA 1.4,83cp 1005 J/(kg K)). Module real outputs:8485- Optimum split: pi_1 = pi_2 = 5.4772 (sqrt of 30).86- Stations: T_2a = 499.97 K; T_ic_exit = 330.39 K (cooled 169.6 K87 toward ambient); T_2b = 573.57 K.88- Compressor: w_c1 = 213.03 kJ/kg; w_c2 = 244.39 kJ/kg;89 w_c_total = 457.42 kJ/kg.90- Turbine: w_t = 843.34 kJ/kg (full pi_total expansion).91- Cycle: w_net = 385.91 kJ/kg; q_in = 931.06 kJ/kg;92 eta_th = 0.4145.93- Simple cycle baseline: w_net = 284.0 kJ/kg; eta_th = 0.4311.94- Comparison: work_gain_pct = +35.9 percent;95 eta_delta_pp = -1.66 percentage points. Intercooling raises the96 specific work by about a third while the thermal efficiency slips by97 1.66 points without heat recovery, the documented intercooling trade.9899## Verification100101- Confirm the anchors: T_2a = 499.97 K, T_ic_exit = 330.39 K,102 T_2b = 573.57 K, w_c_total = 457.42 kJ/kg, w_net = 385.91 kJ/kg,103 q_in = 931.06 kJ/kg, eta_th = 0.4145, gain +35.9 percent,104 eta_delta -1.66 pp, each within 1 percent of the module output.105- Confirm optimum_intercooler_pressure_ratio(36) == 6.0 and (30) ==106 5.4772; the exit temperature rises with pi_stage and falls with107 eta_c; eps_ic = 0 returns the hot inlet and eps_ic = 1 the coolant.108- Confirm a higher-effectiveness intercooler reduces w_c_total at fixed109 pi_total, and that eta_th sits strictly between 0 and 1 here.110- Confirm the eps_ic = 0 degeneration: the no-cooling two-stage total111 work approximates the single-stage work (the two differ by the112 stage-2 cascade term, which vanishes as eta_c -> 1).113- Confirm every non-physical input raises ValueError: T_1 <= 0,114 T_3 <= T_1, pi_total <= 1, eta_c or eta_t outside (0, 1], eps_ic115 outside [0, 1], and coolant at or above the intercooler hot inlet.116- Run the contract test offline: python3117 scripts/test_intercooled_cycle.py (33 tests, deterministic).118119## Related leaves120121- propulsion/gas-turbine-cycle/gas-turbine-cycle: the single-stage122 cycle analysis that supplies the comparison baseline.123- propulsion/gas-turbine-cycle/regenerative-cycle: the heat-recovery124 variant that recovers the efficiency this cycle gives up.125- propulsion/gas-turbine-cycle/propelling-nozzle: nozzle expansion126 downstream of the turbine.127- propulsion/gas-turbine-cycle/afterburner-cycle: the augmentation128 variant for thrust beyond the turbine limit.129- propulsion/gas-turbine-cycle/real-cycle-effects: loss accounting130 beyond the constant-efficiency assumption used here.131132## Pitfalls133134- Quoting the pressure split as the work split: pi_1 = pi_2 =135 sqrt(pi_total) is the optimum only for the ideal case; with eps_ic =136 0.8 the second stage still does more work (244.39 against 213.03137 kJ/kg) because its inlet sits at 330.39 K, above ambient.138- Reporting the work gain without the efficiency cost: at the worked139 point the net work rises +35.9 percent while eta_th falls 1.66140 points, and the gain alone is what sells an intercooled design.141- Dividing the efficiency in twice: stage_exit_temperature already142 applies eta_c to return the real discharge, so the stage work is143 cp * (T_exit - T_in) and not that value divided by eta_c again;144 the spec anchors pin the single application.145- Reading the eps_ic = 0 case as a free win: without intercooling the146 two-stage chain charges the stage-2 inefficiency on the real stage-1147 discharge, so its work (582.9 kJ/kg) slightly exceeds the148 single-stage value (559.3 kJ/kg); the two coincide only as eta_c149 tends to 1. This is a modeling artifact, not a physical gain.150- Expanding the turbine at the stage ratio: the turbine sees the full151 pi_total (843.34 kJ/kg here), never the per-stage sqrt value, so152 mixing the two ratios understates the expansion work.153- Mixing units: the module returns specific work in J/kg; the worked154 example tables divide by 1000 to quote kJ/kg.155156## Behavior contract (gate 3)157158Run the deterministic contract test (stdlib unittest, offline):159160 python3 scripts/test_intercooled_cycle.py161162The test covers the module constants, the optimum pressure ratio (36 ->1636.0, 30 -> 5.4772), stage and intercooler exit temperatures with their164limits (eps_ic 0 and 1) and monotonicity, the worked-example anchors165within 1 percent, the compressor total as the stage-work sum, the166effectiveness work-reduction relation, the full cycle and simple-cycle167baseline dicts with their identities (w_net = w_t - w_c_total,168eta_th = w_net / q_in), the comparison signs and closed forms, the169eps_ic = 0 degeneration identity, determinism, and ValueError rejection170of every non-physical input class.171172## Contract test173174Run from the leaf root: python3 scripts/test_intercooled_cycle.py.175The logic module is scripts/intercooled_cycle_logic.py, pure stdlib with176module constants GAMMA = 1.4 and CP = 1005.0. The test file is stdlib177unittest, offline and deterministic, 33 methods, and asserts the module178outputs against the prep-verified worked-example anchors plus the179magnitude bounds of the spec (works within 1 percent, eta_th between 0180and 1). Exit code 0 means the leaf contract holds.181182## Compliance183184- Standards referenced, not reproduced: FAR-33 (14 CFR Part 33) frames185 aircraft engine certification context; the intercooled cycle186 relations above are standard air-standard engineering methodology,187 summary-only per standards-map.yaml.188- compliance: STANDARDS-REF, gated: false.