Demo: Gulf Leak Meter

This is a demonstration version of the tool developed by the PBS NewsHour to track the size of the Deepwater Horizon oil spill in the Gulf of Mexico. It is NOT CORRECT. This version will not be updated.

For the correct, up-to-date version, see our complete coverage of the Deepwater Horizon oil spill.

Adjust Leak Rate  

840,000 GAL/DAY

Current Leak Estimates ()

How we calculate this:

The basic formula for calculating how much oil has spilled since the Deepwater Horizon rig sank on April 22 is fairly simple: Total = Rate * Time. However, since estimates of how much oil is leaking per day vary widely, we let you choose the rate you find most credible, using the slider above.

We've also adjusted the flow rate to account for BP's efforts to siphon oil directly out of the ruptured well. The formula now breaks the leak into discrete segments of time, creating a new one each time BP or the government reports the amount of oil captured, then reporting the total of all segments.

Here's the JavaScript code that calculates the total amount spilled:

function getRate(perDay) {
    var perHour = perDay / 24;
    var perMinute = perHour / 60;
    var perSecond = perMinute / 60;
    return perSecond
};

var spillChanges = [
    // start, diff
    [new Date(2010, 3, 20, 10, 0, 0), 0], // initial rate
    [new Date(2010, 4, 17, 7, 0, 0), (42 * 1000)], // tube inserted
    [new Date(2010, 4, 18, 7, 0, 0), (42 * 2000)],
    [new Date(2010, 4, 20, 11, 25, 0), (42 * 5000)], // full suck
    [new Date(2010, 4, 21, 0, 0, 0), (42 * 2200)], // reduced suck
    [new Date(2010, 4, 26, 0, 0, 0), 0], // siphoning stopped for Top Kill
    [new Date(2010, 5, 4, 0, 0, 1), (42 * 6077)], // new containment dome in place
    [new Date(2010, 5, 5, 0, 0, 1), (42 * 10500)],
    [new Date(2010, 5, 6, 0, 0, 1), (42 * 11100)],
    [new Date(2010, 5, 7, 0, 0, 1), (42 * 14800)], // capture rate exceeds lowest flow rate estimate
    [new Date(2010, 5, 8, 0, 0, 1), (42 * 15000)],
    [new Date(2010, 5, 9, 0, 0, 1), (42 * 15800)],
    [new Date(2010, 5, 10, 0, 0, 1), (42 * 15400)],
    [new Date(2010, 5, 11, 0, 0, 1), (42 * 15550)],
    [new Date(2010, 5, 12, 0, 0, 1), (42 * 15040)],
    [new Date(2010, 5, 13, 0, 0, 1), (42 * 15200)]
];

function totalSpilled(baseRate, changes, end) {
    /********** Updated May 20

    Making this adaptable to each change in siphon rate.
    Given a list of start dates and rate changes,
    we create isolated increments of the spill,
    each calculating the amount spilled, then
    adding to the total.
    **********/
    var total = 0;
    var endRate
    $.each(changes, function(i) {
        // get an end date
        if (i == (changes.length-1)) {
            endRate = end || new Date(); // the leak rate ongoing
        } else {
            var next = i + 1;
            endRate = changes[next][0];
        };
        var start = changes[i][0];
        var time = (endRate - start) / 1000;

        var diff = changes[i][1];
        var rate = baseRate - diff;

        var segment = (getRate(rate) * time);
        total += segment;
    });

    return Math.round(total);
};