Contents

Document example prerequisites

require impes spe10 deckformat

Define an oil/gas system

The fluid data is contained in the file 'simpleOilGas.txt'. We read and process this using the deckformat module.

current_dir = fileparts(mfilename('fullpath'));
f = fullfile(current_dir, 'simpleOilGas.txt');
deck = readEclipseDeck(f);

% Once the file has been read, we can use it to create the desired fluid.
fluid = initEclipseFluid(deck);

% Run the case with gravity on
gravity reset z on

Set up grid and get petrophysical properties.

We select three layers.

layers = 26:28;
cartDims = [60, 220, numel(layers)];
physDims = cartDims.*[20,10,2]*ft;
rock = SPE10_rock(layers);
rock.perm = convertFrom(rock.perm, milli*darcy);

% Define a Cartesian Grid based on the SPE layers selected.
G = cartGrid(cartDims, physDims);
G = computeGeometry(G);

% Cells with zero porosity are masked away to the minimum value to get
% sensible results.
is_pos = rock.poro>0;
rock.poro(~is_pos) = min(rock.poro(is_pos));

Show grid and petrophysical properties

Since the variations are large, use a logarithmic scale for permeability

perm = log10(rock.perm);
c = {'x', 'y', 'z'};
clf;
for i = 1:3
    subplot(2,2,i);
    plotCellData(G, perm(:,i));
    colorbar();
    axis equal tight;
    title(sprintf('Permeability in %s direction', c{i}));
end
% Plot porosity
subplot(2,2,4);
plotCellData(G, rock.poro);
colorbar();
axis equal tight;
title('Porosity')

Set up four producers at 150 bars and an injector at 800 bar

% Initialize empty well structure
W = [];

% Add an injector in the middle of the domain based on the midpoints of the
% cartesian indices
midpoint = round(cartDims ./ 2);

% Use vertical well, with completion in all layers. To complete in a
% different set of layers, enter the indices of the layers in completion
completion = [];
W = verticalWell(W, G, rock, midpoint(1), midpoint(2), completion, ...
                'Type', 'bhp',...            % Bottom hole pressure well
                'Val', 800*barsa,...         % Driving pressure
                'Radius', .125*meter, ...    % As per SPE10 Case B
                'InnerProduct', 'ip_tpf',... % Use TPFA inner product
                'Comp_i', [0, 1]);           % Injects only gas

% We want to place an producer in each corner of the domain, so we iterate
% over the corners and add a 200 bar well at each corner.
h_ind = [1, G.cartDims(1)];
v_ind = [1, G.cartDims(2)];
for i = 1:2
    for j = 1:2
        W = verticalWell(W, G, rock, h_ind(i), v_ind(j), [], ...
                        'Type', 'bhp',...
                        'Val', 150*barsa, ...
                        'Radius', .125*meter, ...
                        'InnerProduct', 'ip_tpf', ...
                        'Comp_i', [1, 0]);
    end
end

Compute static values for the IMPES solver

Compute TPFA transmissibilities

Trans = computeTrans(G, rock);
% Compute pore volume
PV = poreVolume(G, rock);

Initialize an oil filled reservoir at 200 bar.

Initially, it contains no gas

x = initResSolComp(G, W, fluid, 200*barsa, [1, 0]);

Do actual simulations

Simulate 3000 days of production

dT = 30*day;
Nt = 100;
states = [];

f1 = figure(1);
T  = 0;
tcpu = tic();
for kk = 1:Nt,
    fprintf('Step %d/%d: %.2f -> %.2f [days]\n\n', kk, Nt, ...
            convertTo((kk - 1) * dT, day), convertTo(kk * dT, day));

    t0 = tic;
    x = impesTPFA(x, G, Trans, fluid, dT, PV, 'wells', W);
    t0 = toc(t0);

    fprintf('  CPU Time (step): %.2f [s]\n\n', t0);

    T = T + dT;

    set(0, 'CurrentFigure', f1);
    clf;

    % Plot the pressure.
    subplot(1,3,1);
    plotCellData(G, convertTo(x.pressure, barsa));
    title('Pressure')
    caxis([100, 800])
    axis equal tight;

    % Plot the gas saturation
    subplot(1,3,2);
    plotCellData(G, x.s(:,2), x.s(:,2) > 0.01);
    plotGrid(G, 'facec', 'none', 'edgea', .05)
    caxis([0 1]);
    title('Saturation (Gas)')
    xlabel(sprintf('T = %1.0f days', convertTo(T, day)));
    axis equal tight;

    % Plot the x component of the permeability
    subplot(1,3,3);
    plotCellData(G, log10(rock.perm(:,1)));
    title('Permeability (x-direction)')
    axis equal tight;

    drawnow
end

tcpu = toc(tcpu);
fprintf('Total CPU Time (simulation): %.2f [s]\n', tcpu);
Step 1/100: 0.00 -> 30.00 [days]

  CPU Time (step): 36.77 [s]

Step 2/100: 30.00 -> 60.00 [days]

  CPU Time (step): 17.00 [s]

Step 3/100: 60.00 -> 90.00 [days]

  CPU Time (step): 16.38 [s]

Step 4/100: 90.00 -> 120.00 [days]

  CPU Time (step): 21.93 [s]

Step 5/100: 120.00 -> 150.00 [days]

  CPU Time (step): 16.96 [s]

Step 6/100: 150.00 -> 180.00 [days]

  CPU Time (step): 17.51 [s]

Step 7/100: 180.00 -> 210.00 [days]

  CPU Time (step): 17.10 [s]

Step 8/100: 210.00 -> 240.00 [days]

  CPU Time (step): 17.56 [s]

Step 9/100: 240.00 -> 270.00 [days]

  CPU Time (step): 14.30 [s]

Step 10/100: 270.00 -> 300.00 [days]

  CPU Time (step): 14.27 [s]

Step 11/100: 300.00 -> 330.00 [days]

  CPU Time (step): 14.16 [s]

Step 12/100: 330.00 -> 360.00 [days]

  CPU Time (step): 13.87 [s]

Step 13/100: 360.00 -> 390.00 [days]

  CPU Time (step): 13.94 [s]

Step 14/100: 390.00 -> 420.00 [days]

  CPU Time (step): 14.01 [s]

Step 15/100: 420.00 -> 450.00 [days]

  CPU Time (step): 14.41 [s]

Step 16/100: 450.00 -> 480.00 [days]

  CPU Time (step): 14.53 [s]

Step 17/100: 480.00 -> 510.00 [days]

  CPU Time (step): 17.51 [s]

Step 18/100: 510.00 -> 540.00 [days]

  CPU Time (step): 15.12 [s]

Step 19/100: 540.00 -> 570.00 [days]

  CPU Time (step): 16.65 [s]

Step 20/100: 570.00 -> 600.00 [days]

  CPU Time (step): 18.51 [s]

Step 21/100: 600.00 -> 630.00 [days]

  CPU Time (step): 14.27 [s]

Step 22/100: 630.00 -> 660.00 [days]

  CPU Time (step): 14.03 [s]

Step 23/100: 660.00 -> 690.00 [days]

  CPU Time (step): 16.12 [s]

Step 24/100: 690.00 -> 720.00 [days]

  CPU Time (step): 15.13 [s]

Step 25/100: 720.00 -> 750.00 [days]

  CPU Time (step): 15.23 [s]

Step 26/100: 750.00 -> 780.00 [days]

  CPU Time (step): 15.88 [s]

Step 27/100: 780.00 -> 810.00 [days]

  CPU Time (step): 14.50 [s]

Step 28/100: 810.00 -> 840.00 [days]

  CPU Time (step): 10.91 [s]

Step 29/100: 840.00 -> 870.00 [days]

  CPU Time (step): 13.44 [s]

Step 30/100: 870.00 -> 900.00 [days]

  CPU Time (step): 9.86 [s]

Step 31/100: 900.00 -> 930.00 [days]

  CPU Time (step): 14.19 [s]

Step 32/100: 930.00 -> 960.00 [days]

  CPU Time (step): 13.34 [s]

Step 33/100: 960.00 -> 990.00 [days]

  CPU Time (step): 11.30 [s]

Step 34/100: 990.00 -> 1020.00 [days]

  CPU Time (step): 11.53 [s]

Step 35/100: 1020.00 -> 1050.00 [days]

  CPU Time (step): 10.35 [s]

Step 36/100: 1050.00 -> 1080.00 [days]

  CPU Time (step): 9.92 [s]

Step 37/100: 1080.00 -> 1110.00 [days]

  CPU Time (step): 11.38 [s]

Step 38/100: 1110.00 -> 1140.00 [days]

  CPU Time (step): 11.71 [s]

Step 39/100: 1140.00 -> 1170.00 [days]

  CPU Time (step): 10.04 [s]

Step 40/100: 1170.00 -> 1200.00 [days]

  CPU Time (step): 10.24 [s]

Step 41/100: 1200.00 -> 1230.00 [days]

  CPU Time (step): 14.46 [s]

Step 42/100: 1230.00 -> 1260.00 [days]

  CPU Time (step): 11.20 [s]

Step 43/100: 1260.00 -> 1290.00 [days]

  CPU Time (step): 11.65 [s]

Step 44/100: 1290.00 -> 1320.00 [days]

  CPU Time (step): 12.72 [s]

Step 45/100: 1320.00 -> 1350.00 [days]

  CPU Time (step): 9.80 [s]

Step 46/100: 1350.00 -> 1380.00 [days]

  CPU Time (step): 10.96 [s]

Step 47/100: 1380.00 -> 1410.00 [days]

  CPU Time (step): 12.72 [s]

Step 48/100: 1410.00 -> 1440.00 [days]

  CPU Time (step): 13.03 [s]

Step 49/100: 1440.00 -> 1470.00 [days]

  CPU Time (step): 11.20 [s]

Step 50/100: 1470.00 -> 1500.00 [days]

  CPU Time (step): 9.86 [s]

Step 51/100: 1500.00 -> 1530.00 [days]

  CPU Time (step): 9.86 [s]

Step 52/100: 1530.00 -> 1560.00 [days]

  CPU Time (step): 11.66 [s]

Step 53/100: 1560.00 -> 1590.00 [days]

  CPU Time (step): 10.75 [s]

Step 54/100: 1590.00 -> 1620.00 [days]

  CPU Time (step): 13.79 [s]

Step 55/100: 1620.00 -> 1650.00 [days]

  CPU Time (step): 13.92 [s]

Step 56/100: 1650.00 -> 1680.00 [days]

  CPU Time (step): 12.02 [s]

Step 57/100: 1680.00 -> 1710.00 [days]

  CPU Time (step): 13.07 [s]

Step 58/100: 1710.00 -> 1740.00 [days]

  CPU Time (step): 12.03 [s]

Step 59/100: 1740.00 -> 1770.00 [days]

  CPU Time (step): 11.62 [s]

Step 60/100: 1770.00 -> 1800.00 [days]

  CPU Time (step): 10.70 [s]

Step 61/100: 1800.00 -> 1830.00 [days]

  CPU Time (step): 11.81 [s]

Step 62/100: 1830.00 -> 1860.00 [days]

  CPU Time (step): 14.91 [s]

Step 63/100: 1860.00 -> 1890.00 [days]

  CPU Time (step): 10.59 [s]

Step 64/100: 1890.00 -> 1920.00 [days]

  CPU Time (step): 14.09 [s]

Step 65/100: 1920.00 -> 1950.00 [days]

  CPU Time (step): 10.25 [s]

Step 66/100: 1950.00 -> 1980.00 [days]

  CPU Time (step): 11.13 [s]

Step 67/100: 1980.00 -> 2010.00 [days]

  CPU Time (step): 9.90 [s]

Step 68/100: 2010.00 -> 2040.00 [days]

  CPU Time (step): 9.86 [s]

Step 69/100: 2040.00 -> 2070.00 [days]

  CPU Time (step): 9.99 [s]

Step 70/100: 2070.00 -> 2100.00 [days]

  CPU Time (step): 9.91 [s]

Step 71/100: 2100.00 -> 2130.00 [days]

  CPU Time (step): 9.82 [s]

Step 72/100: 2130.00 -> 2160.00 [days]

  CPU Time (step): 10.06 [s]

Step 73/100: 2160.00 -> 2190.00 [days]

  CPU Time (step): 10.21 [s]

Step 74/100: 2190.00 -> 2220.00 [days]

  CPU Time (step): 9.89 [s]

Step 75/100: 2220.00 -> 2250.00 [days]

  CPU Time (step): 12.25 [s]

Step 76/100: 2250.00 -> 2280.00 [days]

  CPU Time (step): 10.03 [s]

Step 77/100: 2280.00 -> 2310.00 [days]

  CPU Time (step): 9.99 [s]

Step 78/100: 2310.00 -> 2340.00 [days]

  CPU Time (step): 10.77 [s]

Step 79/100: 2340.00 -> 2370.00 [days]

  CPU Time (step): 12.36 [s]

Step 80/100: 2370.00 -> 2400.00 [days]

  CPU Time (step): 10.19 [s]

Step 81/100: 2400.00 -> 2430.00 [days]

  CPU Time (step): 9.88 [s]

Step 82/100: 2430.00 -> 2460.00 [days]

  CPU Time (step): 9.90 [s]

Step 83/100: 2460.00 -> 2490.00 [days]

  CPU Time (step): 13.91 [s]

Step 84/100: 2490.00 -> 2520.00 [days]

  CPU Time (step): 10.35 [s]

Step 85/100: 2520.00 -> 2550.00 [days]

  CPU Time (step): 10.63 [s]

Step 86/100: 2550.00 -> 2580.00 [days]

  CPU Time (step): 14.07 [s]

Step 87/100: 2580.00 -> 2610.00 [days]

  CPU Time (step): 9.87 [s]

Step 88/100: 2610.00 -> 2640.00 [days]

  CPU Time (step): 10.41 [s]

Step 89/100: 2640.00 -> 2670.00 [days]

  CPU Time (step): 12.09 [s]

Step 90/100: 2670.00 -> 2700.00 [days]

  CPU Time (step): 12.51 [s]

Step 91/100: 2700.00 -> 2730.00 [days]

  CPU Time (step): 9.93 [s]

Step 92/100: 2730.00 -> 2760.00 [days]

  CPU Time (step): 9.96 [s]

Step 93/100: 2760.00 -> 2790.00 [days]

  CPU Time (step): 10.51 [s]

Step 94/100: 2790.00 -> 2820.00 [days]

  CPU Time (step): 10.15 [s]

Step 95/100: 2820.00 -> 2850.00 [days]

  CPU Time (step): 9.95 [s]

Step 96/100: 2850.00 -> 2880.00 [days]

  CPU Time (step): 12.86 [s]

Step 97/100: 2880.00 -> 2910.00 [days]

  CPU Time (step): 12.67 [s]

Step 98/100: 2910.00 -> 2940.00 [days]

  CPU Time (step): 11.41 [s]

Step 99/100: 2940.00 -> 2970.00 [days]

  CPU Time (step): 9.98 [s]

Step 100/100: 2970.00 -> 3000.00 [days]

  CPU Time (step): 10.00 [s]

Total CPU Time (simulation): 1320.49 [s]