VE simulation of CO2 injection in a multilayered system
In the example, we look at a mockup system with multiple sandbodies separated by inclined, undulating caprock layers that contain leakage points. The caprock layers are modelled by setting the vertical transmissibilities to be zero, whereas the leakage points are modelled using wells with a total rate set to zero. With this setup, we can have inflow in one perforation and outflow in another. CO2 is injected in the deepest part of the lower layer. To simulate the injection process, we use a fully-implicit, two-phase, black-oil simulator from MRST.
mrstModule addad-coread-blackoilad-propsmrst-gui
Aquifer geometry, petrophysical data, and boundary conditions
Simple geometry: three layers of sand having a 0.3% inclination and an undulating top surface.
Instead of using one of the VE fluid models from the co2lab module, we simply use a model with linear relative permeabilities, which is is essentially what we would get by performing a vertical integration. However, we modify the capillary pressure so that it corresponds to the second-order term that comes out of the vertical integration
The model is a special case of a two-phase oil-water model
model = TwoPhaseOilWaterModel(G, rock, fluid); %'trans',T,'porv',pv);
model.operators = setupOperatorsTPFA(G, [], 'trans',T,'porv',pv);
Set initial state
We assume that some CO2 has already been injected into the formation to fill the deepest part of layer 3.
[i,j,k] = ind2sub(G.cartDims,G.cells.indexMap);
cells = find(k==G.cartDims(3));
s_co2 = (-((G.cells.centroids(:,1)-100*k*3)/300).^2+0.8).*(k==3);
s_co2(s_co2<0,:) = 0;
s = [1-s_co2,s_co2];
state = initResSol(G, 100*barsa, s);
delete(h);
plotCellData(G, state.s(:, 1),'FaceAlpha',.8)
title('Initial water saturation')
colorbar
Set wells
We have one injection well that is completed in the lower sand body, in which we will inject CO2. The other two wells are used to model leakage pathways and are hence assigned to have zero total rate. This will issue a warning that can be ignored.
*****************************************************************
********** Starting simulation: 19 steps, 3650 days *********
*****************************************************************
Solving timestep 01/19: -> 192 Days, 2 Hours, 1894 Seconds, 736 Milliseconds
Completed 15 iterations in 0.69 seconds (0.05s per iteration)
:
:
:
Solving timestep 19/19: 9 Years, 172 Days, 21 Hours, 1705 Seconds, 263 Milliseconds -> 10 Years
Completed 3 iterations in 0.16 seconds (0.05s per iteration)
*** Simulation complete. Solved 19 control steps in 4 Seconds, 975 Milliseconds ***
Play a movie of the results, shown as 3D grid
h = figure();
for i = 1:numel(states)
figure(h); clf;
% Plotting
plotCellData(G, states{i}.s(:, 2))
title(['Water saturation after ', num2str(sum(dt(1:i))/year), ...'yrs (Step #', num2str(i), ')']);
% Make axis equal to show column structure%axis equal tight off
view(8, 4)
colorbar
caxis([0, 0.4])
pause(0.5)
end
Play a movie of the interface between CO2 and brine
x2d=reshape(G.cells.centroids(:,1),G.cartDims(1),G.cartDims(3));
z2d=reshape(G.cells.centroids(:,3),G.cartDims(1),G.cartDims(3));
for j=0:numel(states);
if(j==0)
sol3d=state;
else
sol3d=states{j};
end
sat2d=reshape(sol3d.s(:,2),G.cartDims(1),G.cartDims(3));
figure(33),clf
for i=1:G.cartDims(3)
plot(x2d(:,i),z2d(:,i)-dz/2,'r');hold on
plot(x2d(:,i),z2d(:,i)+dz/2,'r');hold on
plot(x2d(:,i),sat2d(:,i)*dz+z2d(:,i)-dz/2)
title(['CO2 interface after ', num2str(sum(dt(1:j))/year), ...'yrs (Step #', num2str(j), ')']);
set(gca,'Ydir','reverse')
hold onend
pause(0.1)
hold offend