Contents
- Document example prerequisites
- Define an oil/gas system
- Set up grid and get petrophysical properties.
- Show grid and petrophysical properties
- Set up four producers at 150 bars and an injector at 800 bar
- Compute static values for the IMPES solver
- Initialize an oil filled reservoir at 200 bar.
- Do actual simulations
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]
