Contents

SPE1 case for fully implicit black oil solver

This example solves the SPE1 problem which consists of gas injection in a small ($10\times10\times3$) reservoir with a single producer and injector. The problem is parsed and solved from the problem file "odeh_adi" and the result is then compared to output from a major commercial reservoir simulator (Eclipse 100).

require ad-fi deckformat

% Read and process file.
current_dir = fileparts(mfilename('fullpath'));
fn    = fullfile(current_dir, 'odeh_adi.data');

deck = readEclipseDeck(fn);

% The deck is given in field units, MRST uses metric.
deck = convertDeckUnits(deck);

G = initEclipseGrid(deck);
G = computeGeometry(G);

rock  = initEclipseRock(deck);
rock  = compressRock(rock, G.cells.indexMap);

% Create a special ADI fluid which can produce differentiated fluid
% properties.
fluid = initDeckADIFluid(deck);

% The case includes gravity
gravity on

% The initial state is provided as a binary file. The initial state
% contains a uniform mixture of water (.12) and oil (.88).
load initialState;

Plot well and permeability

The permeability consists of three layers going from high to low permeability along the z axis. The wells are completed in the upper and lower layer for the injector and producer respectively. To get a well object, we simply process the first control from the schedule.

Note that a schedule is not necessary to solve problems using the fully implicit solver: solvefiADI is capable of taking a well object directly and solving for a single time step in a manner similar to the other MRST solvers.

clf;
W = processWells(G, rock, deck.SCHEDULE.control(1));
plotCellData(G, convertTo(rock.perm(:,1), milli*darcy), 'FaceAlpha', .5, ...
            'EdgeAlpha', .3, 'EdgeColor', 'k');
plotWell(G, W);
title('Permeability (mD)')
axis tight;
view(35, 40);
colorbar('SouthOutside');

Initialize schedule and system before solving for all timesteps

We extract the schedule from the read deck and create a ADI system for our problem. The system autodetects a black oil problem and sets up default values for the various options. The only thing we change is to disable the CPR preconditioner as the problem is too small to benefit from preconditioning: The overhead required for the preconditioner is bigger than the benefits offered by a specialized solver.

During some time steps (67 and 91) the Newton iterations oscillate. The solver detects this, and dampens or relaxes the step length when this behavior is observed.

To see detailed convergence analysis during each time step, set verbose to on using

mrstVerbose on

schedule = deck.SCHEDULE;
system = initADISystem(deck, G, rock, fluid, 'cpr', false);
timer = tic;
[wellSols states iter] = runScheduleADI(state, G, rock, system, schedule);
toc(timer)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step    1 of  114 (Used  23 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step    2 of  114 (Used   6 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step    3 of  114 (Used   6 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step    4 of  114 (Used   6 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step    5 of  114 (Used   5 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step    6 of  114 (Used   4 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step    7 of  114 (Used   4 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step    8 of  114 (Used   4 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step    9 of  114 (Used   5 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step   10 of  114 (Used   4 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step   11 of  114 (Used   5 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step   12 of  114 (Used   4 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step   13 of  114 (Used   4 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step   14 of  114 (Used   4 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step   15 of  114 (Used   4 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step   16 of  114 (Used   4 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step   17 of  114 (Used   4 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step   18 of  114 (Used   4 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   19 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   20 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   21 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step   22 of  114 (Used   4 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step   23 of  114 (Used   4 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   24 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step   25 of  114 (Used   4 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   26 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   27 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   28 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step   29 of  114 (Used   4 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   30 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   31 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   32 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   33 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   34 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   35 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   36 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step   37 of  114 (Used   4 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   38 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   39 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   40 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   41 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   42 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   43 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step   44 of  114 (Used   5 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   45 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   46 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   47 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   48 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   49 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   50 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   51 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   52 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step   53 of  114 (Used   5 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   54 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   55 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   56 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   57 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   58 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   59 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   60 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   61 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   62 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   63 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   64 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   65 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   66 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   67 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step   68 of  114 (Used   5 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   69 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   70 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   71 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   72 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   73 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   74 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   75 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   76 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   77 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   78 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   79 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   80 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   81 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   82 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   83 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   84 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   85 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   86 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   87 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   88 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   89 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   90 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   91 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Well its: 1
Step   92 of  114 (Used   5 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   93 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   94 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   95 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   96 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   97 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   98 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step   99 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step  100 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step  101 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step  102 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step  103 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step  104 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step  105 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step  106 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step  107 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step  108 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step  109 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step  110 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step  111 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step  112 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step  113 of  114 (Used   3 iterations)
Well its: 1
Well its: 1
Well its: 1
Step  114 of  114 (Used   3 iterations)
Elapsed time is 71.810264 seconds.

Plot the solution

We opt for a simple volume plot of the gas saturation. If opengl capability is set to software, we fall back to a simpler cell data plot. If you have problems with getting good plots you can set useVolume to false.

oglcapable = opengl('data');
useVolume = ~oglcapable.Software;

figure(1)
view(35, 40);
for i = 2:numel(states)
    [az el] = view();
    clf;

    % Plot the wells
    plotWell(G, W);
    if useVolume
        % Plot the grid as a transparent box colorized by the permeability
        plotCellData(G, convertTo(rock.perm(:,1), milli*darcy), ...
                           'FaceAlpha', .2, 'EdgeAlpha', .1, 'EdgeColor', 'k');

        % Create isosurfaces based on the gas saturation
        plotGridVolumes(G, states{i}.s(:,3), 'N', 100, 'extrudefaces', false)
    else
        plotCellData(G, states{i}.s(:,3));
    end
    time = sum(schedule.step.val(1:i-1));
    title(['Step ' num2str(i) ' (' formatTimeRange(time) ')'])
    axis tight off
    view(az, el);
    pause(.1)

end

Set up plotting

Load summary from binary file and find indices of the producer and injector.

load SPE1_smry

inj = find([wellSols{1}.sign] == 1);
prod = find([wellSols{1}.sign] == -1);

% Since there are zero values in the first step of the summary, we ignore
% the first entry to get better plot axes.
ind = 2:118;

% Put the well solution data into a format more suitable for plotting
[qWs, qOs, qGs, bhp] = wellSolToVector(wellSols);

% Get timesteps for both the reference and the MRST run
T = convertTo(cumsum(schedule.step.val), year);
Tcomp =  smry.get(':+:+:+:+', 'YEARS', ind);

Plot Producer Gas/Oil ratio

The most interesting part of the SPE1 case is the gas/oil ratio at the producer. We convert the field units and plot the dimensionless ratio. As should be apparent from the figure, the implicit solver is able to qualitatively reproduce the same outflow profile.

figure(2)
clf
ecl = convertFrom(smry.get('PRODUCER', 'WGOR', ind), 1000*ft^3/stb)';
mrst = qGs(:,prod)./qOs(:,prod);

hold on
plot(T, mrst)
plot(Tcomp, ecl, 'r');
legend({'MRST', 'Eclipse'})
xlabel('Years')
title('Gas rate / Oil rate')

Plot Injector Bottom Hole Pressure

The injector is rate controlled and so the bottom hole pressure is solved in the implicit loop. Plot it to verify accuracy.

figure(3)
clf
ecl = convertFrom(smry.get('PRODUCER', 'WBHP', ind), psia)';
mrst = bhp(:,prod);
hold on
plot(T,     convertTo(mrst, barsa))
plot(Tcomp, convertTo(ecl, barsa), 'r');
legend({'MRST', 'Eclipse'})
xlabel('Years')
ylabel('bar')
title('Bottom hole pressure (Producer)')

Plot Injector Bottom Hole Pressure

figure(4)
clf
ecl = convertFrom(smry.get('INJECTOR', 'WBHP', ind), psia)';
mrst = bhp(:,inj);
hold on
plot(T,     convertTo(mrst, barsa))
plot(Tcomp, convertTo(ecl, barsa), 'r');
legend({'MRST', 'Eclipse'})
xlabel('Years')
ylabel('bar')
title('Bottom hole pressure (Injector)')