Application: available
Fired heater optimisation.
The one application running today, and the page a process engineer should judge us by. Everything here comes from a model you can inspect rather than a case study you have to take on trust.
The design point
What the twin represents today. Yours will differ, and that difference is what a pilot resolves.
- Duty
- 53.4 MW absorbed
- Feed
- 195,000 kg/h of 34 API crude
- Temperatures
- 40 C to 400 C
- Coil
- 120 radiant tubes, two bare plus 13 finned convection rows
- Efficiency
- 90.7 % LHV at 15 % excess air on a clean coil
- Stack and bridgewall
- 164 C stack, 773 C bridgewall
- Radiant flux
- 26.5 kW/m2 average radiant flux
- Tube metal
- 468 C peak tube metal
- Standard
- All inside the API 560 bands
Solved by the firedheater module, not fitted. First-principles simulation of a 53.4 MW crude preheat heater driven through 120 days of hourly operation. Not a plant installation.
Four levers
Two you can move this shift, one you schedule, one you have to find first.
- 01
Excess air
The lever that matters most and the one available this shift. Air above what the burners need is nitrogen heated to stack temperature and vented.
Controls 22 % of CO2 variation and 16 % of efficiency variation
- 02
Convection cleaning
A fouled bank sends heat up the stack that should have gone to the process. The twin infers the fouling index continuously, so the decoke can be timed on condition rather than on the calendar.
Dominates tube metal temperature at 19 % of its variation
- 03
Burner condition
Degraded tips and skewed registers push CO up without moving the stack O2 reading. Found by comparing CO against what a healthy heater would make at the same duty.
Drives 42 % of CO variation through register imbalance alone
- 04
Fouling-aware scheduling
The safe lean-air limit moves as the bank fouls. Optimising air and cleaning together is worth more than optimising either alone.
The reason cleaning value is quoted at the re-optimised air rate
Shares from ml_metrics.json, key actionable_split, which separates what an operator controls from what the schedule imposes.
What it produces.
Two consecutive hours from the history, exactly as the engine wrote them. Both recommendations, the price on each, the limit that bounds the move and the reasoning. Nothing here is edited for the website.
- Efficiency
- 87.1 %
- Stack O2
- 3.73 %
- Stack temp
- 233 C
- CO
- 20 ppm
- Feed
- 189,546 kg/h
- Outlet
- 415 C
- Fouling
- 0.75
- Detected fault
- fuel_upset
Trim excess air 19.8 % to 9.9 % (stack O2 3.73 % to 2.08 %)
$45.44/h~$381,710/yr at this state
- +1.26 ptsefficiency
- −1.52 %fuel
- −0.617 t/hCO2
Watch Move in steps and hold. Stop if CO passes 100 ppm before the O2 target, or if the stack falls below 98 C.
Why +−
Every percent of excess air above what the burners need is nitrogen heated from 20 C to the 233 C stack and vented. Cutting stack O2 by 1.65 points removes that parasitic mass flow, which is why the stack falls 16 C and dry flue-gas loss drops with it. The duty is unchanged, so the whole of the recovered loss shows up as less fuel through the burners. The move stops where it does because CO 167 ppm at the 200 ppm limit.
Clean the convection section (fouling index 0.75 to 0.00)
$104.74/h~$879,828/yr at this state
- +3.87 ptsefficiency
- −4.40 %fuel
- −1.119 t/hCO2
Why +−
A fouling index of 0.75 is an insulating layer on the convection tubes. Heat that the bank should have recovered leaves up the stack instead, so the stack temperature rises at constant duty and the burners make up the difference. Restoring a clean bank returns that heat to the process. Because a clean bank also pulls the stack temperature down, the safe lean-air limit moves as well, and the figure quoted is at the re-optimised air rate rather than the current one.
- Efficiency
- 87.2 %
- Stack O2
- 3.64 %
- Stack temp
- 232 C
- CO
- 22 ppm
- Feed
- 188,953 kg/h
- Outlet
- 416 C
- Fouling
- 0.75
- Detected fault
- fuel_upset
Trim excess air 19.2 % to 9.9 % (stack O2 3.64 % to 2.08 %)
$44.77/h~$376,092/yr at this state
- +1.18 ptsefficiency
- −1.43 %fuel
- −0.633 t/hCO2
Watch Move in steps and hold. Stop if CO passes 100 ppm before the O2 target, or if the stack falls below 98 C.
Why +−
Every percent of excess air above what the burners need is nitrogen heated from 22 C to the 232 C stack and vented. Cutting stack O2 by 1.56 points removes that parasitic mass flow, which is why the stack falls 15 C and dry flue-gas loss drops with it. The duty is unchanged, so the whole of the recovered loss shows up as less fuel through the burners. The move stops where it does because CO 167 ppm at the 200 ppm limit.
Clean the convection section (fouling index 0.75 to 0.00)
$104.80/h~$880,302/yr at this state
- +3.78 ptsefficiency
- −4.30 %fuel
- −1.158 t/hCO2
Why +−
A fouling index of 0.75 is an insulating layer on the convection tubes. Heat that the bank should have recovered leaves up the stack instead, so the stack temperature rises at constant duty and the burners make up the difference. Restoring a clean bank returns that heat to the process. Because a clean bank also pulls the stack temperature down, the safe lean-air limit moves as well, and the figure quoted is at the re-optimised air rate rather than the current one.
Source: thermotwin/artifacts/ml/operator_recommendations.json, verbatim.
Nine labelled fault classes
Six are real physics the twin has to learn. Three are broken instruments the cleaning step has to find and throw away.
| Class | Kind | Hours | Signature in the data |
|---|---|---|---|
| fouling_spike | process | 105 | Stack temperature rises, efficiency falls at constant duty |
| burner_degradationhidden from O2 | process | 56 | CO climbs while the stack O2 analyser still reads normal |
| register_imbalancehidden from O2 | process | 46 | CO climbs while the stack O2 analyser still reads normal |
| high_excess_air | process | 43 | Efficiency falls, dry flue-gas loss rises |
| fuel_upset | process | 28 | Heavy gas slug, LHV drops, Wobbe shifts |
| air_deficiency | process | 6 | CO breaks through, stack O2 falls |
| stack_temp_bias | sensor | 56 | Stack temperature reading drifts or offsets |
| o2_sensor_stuck | sensor | 35 | Stack O2 reading frozen |
| flow_spike | sensor | 6 | Feed flow transient that the process never saw |
The two marked hidden from O2 are the pairing that catches operators out. Burner degradation and register imbalance both push CO up while the stack analyser, which reads the mixed average, stays comfortable. Trim air on that reading and the worst burner goes richer still. Our interlock blocks the trim outright when it sees that pattern.
Hours from ml_metrics.json, key fault_classifier.class_counts. Dataset: 2,880 rows over 120 days at hourly resolution, 97 sensor-fault rows dropped, 2,783 clean, 284 process-fault rows deliberately kept.
What one heater returns
Physics-corrected, averaged over every hour, with the assumptions on the page.
- $96k
- Per heater, per year
- Averaged across every hour of a 120-day history, then scaled by the 0.839 of predicted saving that physics delivered. Fuel at 6 USD/GJ, carbon at 40 USD/t, 8,400 operating hours per year.
- 805 t/yr
- CO2 avoided per heater
- Physics-corrected. First-principles simulation of a 53.4 MW crude preheat heater driven through 120 days of hourly operation. Not a plant installation.
- 2,675 of 2,783
- Hours where a move was available
- 108 hours were interlocked, 47 of those because a combustion anomaly was detected and trimming air would have been unsafe.
Run it against your heater.
Ninety days of tags and a datasheet is enough to start. We will tell you what the unit is leaving on the table and where our model disagrees with your plant.