How to Specify Sources and Boundary Conditions
This example shows how to set up a combination of source and boundary conditions and is a continuation of two previous examples, the basic flow-solver tutorial and the gravity column example.
Contents
Define grid, rock and fluid data
Construct a Cartesian grid of size nx-by-ny-by-nz cells, where each cell has dimension 1-by-1-by-1 m. Set an isotropic and homogeneous permeability of 100 mD, a fluid viscosity of 1 cP and a fluid density of 1000 kg/m^3.
nx = 20; ny = 20; nz = 10; G = cartGrid([nx, ny, nz]); G = computeGeometry(G); rock.perm = repmat(100 * milli*darcy, [G.cells.num, 1]); fluid = initSingleFluid('mu' , 1*centi*poise , ... 'rho', 1014*kilogram/meter^3); gravity reset on
Add sources and boundary conditions
The simplest way to model inflow or outflow from the reservoir is to use a fluid source/sink. Here we specify a source with flux rate of 1m^3/day in each grid cell.
c = (nx/2*ny+nx/2 : nx*ny : nx*ny*nz) .'; src = addSource([], c, ones(size(c)) ./ day()); display(src);
src = cell: [10x1 double] rate: [10x1 double] sat: []
Our flow solvers automatically assume no-flow conditions on all outer (and inner) boundaries; other types of boundary conditions need to be specified explicitly. Here we impose a Dirichlet boundary condition of p=10 bar at the global left-hand side of the model. For a single-phase flow, we do not need to specify fluid saturation at the boundary and the last argument is therefor left empty.
bc = pside([], G, 'LEFT', 10*barsa());
To check that boundary conditions and sources are placed at the correct location, we plot the model.
subplot(2,2,1), pos = get(gca,'Position'); clf plotGrid(G, 'FaceColor', 'none'); plotGrid(G, c, 'FaceColor', 'r'); plotFaces(G, bc.face, 'b'); title('Boundary conditions and source-cells') view(3), camproj perspective, axis tight equal, camlight headlight h = gca;

Construct and solve the linear system
Compute transmissibilities based on input grid and rock properties and use this to set up the linear system.
T = computeTrans(G, rock, 'Verbose', true);
Computing one-sided transmissibilities... Elapsed time is 0.005266 seconds.
Compute the solution for the system with sources and boundary conditions
rSol = initResSol(G, 0); rSol = incompTPFA(rSol, G, T, fluid, 'MatrixOutput', true, ... 'src', src, 'bc', bc);
Plot output
We convert the cell pressure to unit bar and the fluxes to unit m^3/day when plotting the results. Although it is not strictly necessary here, we show how to make shorthands to simplify the plotting.
cellNo = rldecode(1:G.cells.num, diff(G.cells.facePos), 2) .'; plot_var = @(x) plotCellData(G, x); plot_pres = @(x) plot_var(convertTo(x.pressure(1:G.cells.num), barsa())); plot_flux = @(x) plot_var(accumarray(cellNo, ... abs(convertTo(faceFlux2cellFlux(G, x.flux), meter^3/day)))); set(h,'Position',pos); % move first plot to subplot(2,2,1); subplot(2,2,2) spy(rSol.A) title('System matrix') subplot(2,2,3) plot_pres(rSol); title('Pressure [bar]') view(3), camproj perspective, axis tight equal, camlight headlight subplot(2,2,4) plot_flux(rSol); title('Sqrt of flux intensity [m^3/day]') view(3), camproj perspective, axis tight equal, camlight headlight
