Fuel Oil Analysis
Every fuel-borne risk, scored.
A vessel running 35 tonnes of HSFO a day is also running every gram of sulphur, every milligram of cat fines, every drop of water that came with the fuel. The lab report arrives 5–7 days after the fuel is in the tank — by then half of it is already in the engine. This pipeline turns bunker data, lab results, and ROB position into a TSI-grade view of what’s about to happen, not what already did.
Three passes
Per-bunker quality → Tank distribution & ROB → Consumption varianceEach pass produces its own verdict; the three compose into the senior-review disposition.
Where the data comes from
| Stream | Source | What it tells us |
|---|---|---|
| Bunker analysis | BDN + independent lab report | Per-bunker quality: viscosity, density, sulphur, cat fines, water, sediment |
| Tank ROB | Latest noon report (12:00 UTC) | Current quantity per grade, per tank |
| Daily consumption | Noon-report stream | Burn rate per grade, normalised to engine load and weather |
| Stem schedule | Bunker plan in ERP | Next bunker port, supplier, expected quantity |
| Vessel ECA exposure | Voyage plan | Whether the next leg is in an Emission Control Area |
Labs used: Bureau Veritas / VeriFuel, VPS, Maritec, Tribocare, Viswa Lab, FOBAS. Results arrive by email after the bunker is sampled at delivery; the pipeline parses each lab report and reconciles against the BDN.
Fuel grades tracked: HSFO, VLSFO, ULSFO, MDO, LSMGO, LNG.
The thresholds
Cat fines (Aluminium + Silicon)
Cat fines are catalyst fines from the refining process — silicon and aluminium oxides hard enough to score liners, rings, and fuel pumps. ISO 8217 caps them at 60 mg/kg in the delivered bunker. Engine makers want 15 mg/kg or below at the engine inlet; fuel treatment can reduce 60 → 15 only if centrifuges are working perfectly.
| Threshold | Status | Action |
|---|---|---|
| ≤ 15 mg/kg | Safe | Routine |
| 15–60 mg/kg | Risky | Confirm centrifuge effectiveness, monitor closely |
| > 60 mg/kg | Critical | Debunkering candidate — engine-damage risk |
Sulphur — BDN vs lab
ISO 8217 sulphur caps: 0.50% m/m globally, 0.10% m/m in ECAs. Two checks run in parallel:
- BDN compliance — the supplier’s declared sulphur must be at or below the operating cap.
- Lab confirmation — the independent test must confirm the BDN within tolerance.
Discrepancy % = |S_lab − S_BDN| / S_BDN × 100Above 5% triggers a supplier dispute flag.
Viscosity, density, water, sediment
Viscosity (cSt at 50 °C) and density (kg/m³ at 15 °C) determine whether the engine’s fuel system can handle the fuel. Too viscous and the heater can’t drop it to injection viscosity; too dense and centrifuge separation efficiency falls. Water above 0.5% v/v is corrosive; sediment above 0.10% m/m clogs filters and erodes pumps.
ROB safety reserve
Days of fuel = ROB / C_daily| Days remaining | Tier |
|---|---|
| < 7 with no stem arranged | CRITICAL |
| 7–14 with stem more than 7 days out | HIGH |
| 14–30 — routine planning | MEDIUM |
| > 30 | OK |
Per-bunker disposition
| Disposition | Trigger |
|---|---|
| Accept | All parameters Safe |
| Monitor | One or more Risky, none Critical |
| Blend | Risky on cat fines or sulphur where mixing with cleaner stock can dilute below threshold |
| Debunker | Any Critical, especially cat fines > 60 mg/kg |
| Dispute | BDN-vs-lab sulphur discrepancy above 5% |
Bunker planning formula
Bunker intake (to 85%) = (0.85 × V_capacity) − V_currentA tank already above 85% gets flagged for ullage check rather than further loading. Aggregated across grade gives the recommended quantity for the next bunker call.
Consumption variance
Variance % = (C_actual − C_design) / C_design × 100Sustained variance over 10% is flagged. Combined with the main engine SFOC analysis, the analyzer can usually distinguish a fuel-quality cause (consumption + cat fines) from an engine-condition cause (consumption + cylinder asymmetry).
Worked example — bad bunker on MV POSUN
POSUN took on 480 tonnes of VLSFO at Singapore on 2026-04-12. The lab report arrives on 2026-04-19, mid-passage to the Suez Canal — already burning the fuel.
| Parameter | BDN | Lab | Verdict |
|---|---|---|---|
| Cat fines (Al+Si) | 24 mg/kg | 74 mg/kg | Critical |
| Sulphur (% m/m) | 0.42 | 0.46 | Compliant, within discrepancy tolerance |
| Viscosity (cSt @ 50 °C) | 380 | 385 | Within engine spec |
| Water (% v/v) | 0.30 | 0.35 | Within tolerance |
Verdict: Critical — cat fines 14× above the 15 mg/kg engine-inlet target and 23% above the 60 mg/kg ISO cap.
The pipeline tags escalation_required: true, routes the case to the Technical Superintendent and Commercial Operator, and generates three options:
- Debunker at next port — cleanest, supplier dispute follows. Est. USD 30–50k port costs + supplier credit recovery.
- Blend with clean VLSFO at 1:3 ratio — reduces engine-inlet exposure to ~18 mg/kg with reliable centrifuge operation. Requires 1,440 tonnes of clean stock at next port.
- Run with maximum centrifuge cleaning + frequent fuel-system inspection — operational risk highest, cost lowest. Not recommended.
Under the hood
Cat-fines fleet split — implementation sketch
risky_threshold = 15 # mg/kgrisky_df = df[df["aluminium+Silicon"] > risky_threshold]safe_df = df[df["aluminium+Silicon"] <= risky_threshold]
fig.add_trace(go.Scatter(name="Safe CatFine Level", x=safe_df.imo, y=safe_df["aluminium+Silicon"], mode="markers"))fig.add_trace(go.Scatter(name="Risky CatFine Level", x=risky_df.imo, y=risky_df["aluminium+Silicon"], mode="markers", marker=dict(color="red")))fig.add_trace(go.Scatter(y=[15] * len(totaldf), mode="lines", line=dict(color="red", dash="dot")))BDN-vs-lab sulphur compliance check
def evaluate_sulfur(row, bdn_sulfur_unit: str = "% m/m", sulfur_unit: str = "% m/m"): if row["sulfur"] is None or row["bdnSulfur"] is None: return "No Data" discrepancy = abs(row["sulfur"] - row["bdnSulfur"]) / row["bdnSulfur"] * 100 if discrepancy > 5: return "Dispute" if row["sulfur"] > REGULATORY_CAP[row["zone"]]: return "Non-compliant" return "Compliant"ROB aggregation — noon report only, from 715k records
json_rob = list(common_consumption.aggregate([ {"$match": {"IMO No": {"$in": active_imos}}}, {"$addFields": {"reportTime": {"$dateToString": {"format": "%H:%M:%S", "date": "$Report Date"}}}}, {"$match": {"reportTime": "12:00:00"}}, # noon report only {"$sort": {"IMO No": 1, "Report Date": -1}}, {"$group": {"_id": "$IMO No", "latestRecord": {"$first": "$$ROOT"}}}, {"$replaceRoot": {"newRoot": "$latestRecord"}},]))# 715K records → one record per active vesselEscalation triggers
The pipeline routes to the Technical Superintendent and the Commercial Operator simultaneously when fuel quality fails — fuel disputes are technical and commercial in equal measure.
| Trigger | Severity | Owner |
|---|---|---|
| Cat fines above 60 mg/kg | CRITICAL | TSI + Commercial |
| Quality issues requiring debunkering | CRITICAL | TSI + Commercial |
| ROB critical with no stem arranged (under 7 days) | CRITICAL | TSI + Commercial |
| Sustained consumption variance above 10% | HIGH | TSI |
| Sulphur breach in ECA | CRITICAL | TSI + Commercial + Master |
| BDN-vs-lab sulphur discrepancy above 5% | HIGH | Commercial |
Why this pipeline exists
A vessel without this pipeline finds out about a bad bunker when the engineers complain about filter blockages — usually two weeks after loading, with several hundred running hours already on the engine. With the pipeline, the lab report and BDN are reconciled within hours of arrival, the disposition decision is auto-routed, and the cost of doing nothing is calculated against the cost of acting.