Dykstra-Parsons coefficient

The Dykstra-Parsons method involves plotting the frequency distribution of the permeability on a log-normal probability graph paper. This is done by arranging the permeability values in descending order and then calculating for each permeability, the percent of the samples with permeability greater than that value. to avoid values of zero or 100%, the percent greater than or equal to value is normalized by n+1, where n it is the number of samples.

# imort data
data = read.csv('C:/Users/intel/Desktop/karpur.csv')
kcore= data$k.core 
depth=data$depth
summary(data)
##      depth         caliper         ind.deep          ind.med       
##  Min.   :5667   Min.   :8.487   Min.   :  6.532   Min.   :  9.386  
##  1st Qu.:5769   1st Qu.:8.556   1st Qu.: 28.799   1st Qu.: 27.892  
##  Median :5872   Median :8.588   Median :217.849   Median :254.383  
##  Mean   :5873   Mean   :8.622   Mean   :275.357   Mean   :273.357  
##  3rd Qu.:5977   3rd Qu.:8.686   3rd Qu.:566.793   3rd Qu.:544.232  
##  Max.   :6083   Max.   :8.886   Max.   :769.484   Max.   :746.028  
##      gamma            phi.N            R.deep            R.med        
##  Min.   : 16.74   Min.   :0.0150   Min.   :  1.300   Min.   :  1.340  
##  1st Qu.: 40.89   1st Qu.:0.2030   1st Qu.:  1.764   1st Qu.:  1.837  
##  Median : 51.37   Median :0.2450   Median :  4.590   Median :  3.931  
##  Mean   : 53.42   Mean   :0.2213   Mean   : 24.501   Mean   : 21.196  
##  3rd Qu.: 62.37   3rd Qu.:0.2640   3rd Qu.: 34.724   3rd Qu.: 35.853  
##  Max.   :112.40   Max.   :0.4100   Max.   :153.085   Max.   :106.542  
##        SP          density.corr          density         phi.core    
##  Min.   :-73.95   Min.   :-0.067000   Min.   :1.758   Min.   :15.70  
##  1st Qu.:-42.01   1st Qu.:-0.016000   1st Qu.:2.023   1st Qu.:23.90  
##  Median :-32.25   Median :-0.007000   Median :2.099   Median :27.60  
##  Mean   :-30.98   Mean   :-0.008883   Mean   :2.102   Mean   :26.93  
##  3rd Qu.:-19.48   3rd Qu.: 0.002000   3rd Qu.:2.181   3rd Qu.:30.70  
##  Max.   : 25.13   Max.   : 0.089000   Max.   :2.387   Max.   :36.30  
##      k.core            Facies          phi.core_frac.  
##  Min.   :    0.42   Length:819         Min.   :0.1570  
##  1st Qu.:  657.33   Class :character   1st Qu.:0.2390  
##  Median : 1591.22   Mode  :character   Median :0.2760  
##  Mean   : 2251.91                      Mean   :0.2693  
##  3rd Qu.: 3046.82                      3rd Qu.:0.3070  
##  Max.   :15600.00                      Max.   :0.3630

make sort the permeability in decreasing order

sorted_k = sort(kcore,decreasing = TRUE)
head(sorted_k)
## [1] 15600.00 14225.31 13544.98 13033.53 11841.74 11117.40
n = length(sorted_k)

# find the percent for each permeability 
k_percent = c(1:n)/(n+1)
summary(k_percent)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.00122 0.25061 0.50000 0.50000 0.74939 0.99878
# plot best strighat line between sorted permeability and permeability percentage
mod1=lm(log10(sorted_k) ~ k_percent)
plot(k_percent, sorted_k, log="y", lwd = 2)
abline(mod1)

The Dykstra-Parsons coefficient of permeability variation (V) is determined from the graph as:

V=(k50−k84.1)/k50

k50=10^predict(mod1,data.frame(k_percent=c(0.5)))
k84.1=10^predict(mod1,data.frame(k_percent=c(0.841)))

V=(k50 - k84.1)/(k50)
print(V)
##         1 
## 0.7661618

Lorenz coefficient

The Lorenz coefficient of permeability variation is obtained by plotting a graph of cumulative kh versus cumulative phi*h, sometimes called a flow capacity plot.

calculate the thickness from the differences in depths.

thickness = depth[2:n]-depth[1:n-1]
summary(thickness)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.5000  0.5000  0.5000  0.5086  0.5000  1.0000
thickness=append(thickness, 0.5)
ta=data.frame(data)
ta["thickness"]=thickness
j=ta[order(kcore, decreasing = TRUE),]
summary(j)
##      depth         caliper         ind.deep          ind.med       
##  Min.   :5667   Min.   :8.487   Min.   :  6.532   Min.   :  9.386  
##  1st Qu.:5769   1st Qu.:8.556   1st Qu.: 28.799   1st Qu.: 27.892  
##  Median :5872   Median :8.588   Median :217.849   Median :254.383  
##  Mean   :5873   Mean   :8.622   Mean   :275.357   Mean   :273.357  
##  3rd Qu.:5977   3rd Qu.:8.686   3rd Qu.:566.793   3rd Qu.:544.232  
##  Max.   :6083   Max.   :8.886   Max.   :769.484   Max.   :746.028  
##      gamma            phi.N            R.deep            R.med        
##  Min.   : 16.74   Min.   :0.0150   Min.   :  1.300   Min.   :  1.340  
##  1st Qu.: 40.89   1st Qu.:0.2030   1st Qu.:  1.764   1st Qu.:  1.837  
##  Median : 51.37   Median :0.2450   Median :  4.590   Median :  3.931  
##  Mean   : 53.42   Mean   :0.2213   Mean   : 24.501   Mean   : 21.196  
##  3rd Qu.: 62.37   3rd Qu.:0.2640   3rd Qu.: 34.724   3rd Qu.: 35.853  
##  Max.   :112.40   Max.   :0.4100   Max.   :153.085   Max.   :106.542  
##        SP          density.corr          density         phi.core    
##  Min.   :-73.95   Min.   :-0.067000   Min.   :1.758   Min.   :15.70  
##  1st Qu.:-42.01   1st Qu.:-0.016000   1st Qu.:2.023   1st Qu.:23.90  
##  Median :-32.25   Median :-0.007000   Median :2.099   Median :27.60  
##  Mean   :-30.98   Mean   :-0.008883   Mean   :2.102   Mean   :26.93  
##  3rd Qu.:-19.48   3rd Qu.: 0.002000   3rd Qu.:2.181   3rd Qu.:30.70  
##  Max.   : 25.13   Max.   : 0.089000   Max.   :2.387   Max.   :36.30  
##      k.core            Facies          phi.core_frac.     thickness     
##  Min.   :    0.42   Length:819         Min.   :0.1570   Min.   :0.5000  
##  1st Qu.:  657.33   Class :character   1st Qu.:0.2390   1st Qu.:0.5000  
##  Median : 1591.22   Mode  :character   Median :0.2760   Median :0.5000  
##  Mean   : 2251.91                      Mean   :0.2693   Mean   :0.5085  
##  3rd Qu.: 3046.82                      3rd Qu.:0.3070   3rd Qu.:0.5000  
##  Max.   :15600.00                      Max.   :0.3630   Max.   :1.0000
# make table contain (thickness,phi.core,k.core)
ta['kh']= j$k.core * j$thickness
ta['sum_kh']=cumsum(ta['kh'])
ta['sum_kh/total']=ta['sum_kh']/ta[n, 'sum_kh']

ta['phih']           = j$phi.core * j$thickness
ta['sum_phih']       = cumsum(ta['phih'])
ta['sum_phih/total'] = ta['sum_phih']/ta[n, 'sum_phih']

plot(ta['sum_phih/total'][1:n,1], ta['sum_kh/total'][1:n,1], xlab = "fraction of total volume (phih)", 
  ylab = "fraction of total flow capacity (kh)")

x  = c(ta['sum_phih/total'][1:n,1])
dx = x[2:n] - x[1:n-1]

y1 = c(ta['sum_kh/total'][1:n,1])[1:n-1]
y2 = c(ta['sum_kh/total'][1:n,1])[2:n]

lower_area = sum(y1*dx) #Reduce("+", y1*dx)
upper_area = sum(y2*dx) #Reduce("+", y2*dx)

AUC = (lower_area + upper_area)/2

print(AUC)
## [1] 0.7247318

calculate Lorenz coefficient as fallows:

Lorenz coefficient=(AUC−0.5)/0.5

Lorenz_coefficient = (AUC - 0.5)/0.5
print(Lorenz_coefficient)
## [1] 0.4494636