Simultaneous log inversion in Excel - a carbonate example
Andy Brickell
Senior Petrophysicist | Upstream Oil and Gas Industry | Geothermal | Subject Matter Expert | Formation Evaluation | Logging | Static and Dynamic Core Analysis
In my last LI article, I showed how the Microsoft Excel Solver could be used to run simultaneous log inversion, similar to commercial products like QuantiElan, MultiMin and MinSolv. I demonstrated the workflow with an example from a North Sea well, which included a gas-bearing sandstone section. I finished with a plaintive appeal for data in carbonates and unconventional reservoirs. My LI connection Francisco Badillo graciously shared log data from a carbonate interval, and in this article I'll show how my method worked there. I also found some excellent, detailed work on carbonates created by Craig Phillips and applied that too as a benchmark.
Francisco's data consists of a modern set of logs including array resistivity, density, neutron, spectral GR and compressional and shear slowness. Here's a log plot made in Python showing the data:
Initial observations -
I decided to evaluate the section from 4,500m to 4,800m, because the data quality is generally good, although there are some questionable density spikes. I removed the obvious density spikes and replaced them with a transform from the compressional slowness. I then looked at a density-neutron cross plot:
The matrix lines were digitized from the Schlumberger chart TNPH CP-1e. Some observations from this plot:
the GR (the colour bar in the plot) is not very helpful in identifying shale zones. This could be due to the presence of uranium salts, which is quite common in carbonates
There are three different lithologies present:
Before going any further, I wanted to try part of Craig Phillips' excellent Carbonate Reservoir Workflow, which is a series of Jupyter notebooks that perform a number of useful computations. I ran the section which computes grain density and porosity using the standard chartbook. The result is shown below:
The plot confirms my observations from the density-neutron crossplot - matrix density varies in general between 2.71g/cc and 2.85g/cc, indicating a mixture of limestone and dolomite. There are also intervals with very high grain density that are probably anhydritic, and intervals with grain density less than 2.71g/cc that could be cherty. Porosity in the interval is generally very low, less than 5%, but there are some zones where it's higher.
I decided to use the density, neutron and compressional slowness logs for the inversion. The GR doesn't seem to represent lithology, and (as noted above) the resistivity is outside of the reliable range for an induction measurement. I created three different mineral models:
领英推荐
The next issue was the mineral endpoints. I used the published endpoints for the density and compressional slowness logs, but the neutron is more challenging. The tool was logged on a limestone matrix, so the neutron endpoint is zero for limestone, but what should I use for dolomite? The dolomite matrix line on the chart does not extrapolate to the fluid point, which is of course 100% neutron, 1.0 g/cc density, and I can't have different fluid points for each log. Ideally I would use a non-linear trend, but I haven't worked out how to do that.
My solution was to use Craig's results, apparent grain density and porosity. I computed the volume fraction of limestone and dolomite, then plotted dolomite volume against the neutron to determine the neutron response in 100% dolomite. This came out to be 0.008v/v, which is close to the published value of 0.01 v/v.
With my lithologies identified and my mineral endpoints established, I then ran my Excel Solver for each lithology. This was predictably a very slow process, because I had nearly 2,000 rows of data to process and a fairly complex model. With the lithology and porosity model complete, I then computed Sw. Francisco had supplied the formation water salinity, and had also recommended using a variable m model, so I used the Shell formula in the Archie equation to determine Sw. The results are shown below:
The plot layout is as follows:
Overall the reconstructed logs match the inputs quite well, with a few exceptions. I made cross plots of the reconstructed vs the original logs, with frequency as colour:
The density match is very good, the neutron slightly poorer and the compressional slowness poorer still. That reflects my view of the reliability of the measurements. As a final check, I plotted the Solver matrix density with Craig Phillips' chartbook matrix density:
The match is very good.
Reservoir mapping w/ Danomics: Better, faster, stronger.
3 年Interesting use of excel to do this, and certainly a good learning exercise, but why excel instead of Python or similar?
Petrophysics Engineer
3 年SOLVER with VBA MACRO
Petrophysics Engineer
3 年thanks and Beautiful work, Andy , i already test the solver in excel , and create simple VBA macro could be essay to testing by others and attache my résulte plotted in excel
Consultant Petrophysicist with INTEG Petrophysics, Calgary; International Affiliation as Senior Petrophysicist at Virtual Petrophysics
3 年I’ll work at getting you something over the next couple of days. Get me your email and I’ll take it from there.
Consultant Petrophysicist with INTEG Petrophysics, Calgary; International Affiliation as Senior Petrophysicist at Virtual Petrophysics
3 年Beautiful work, Andy! How long does Excel take to do the computations?