The Dyktra-Parsons coefficient of variation is a frequently employed method for evaluating permeability variation. The coefficient value, V, is determined using the following formula: V = (k50 - k84.1)/k50. The permeability value at %k>=84.1 (one standard deviation) in this instance is indicated by k84.1, while the permeability value at %k>=50 (log mean) is indicated by k50. To compute this coefficient, one must be familiar with k50 and k84.1. Rstudio is used to plot the permeability frequency distribution on a log-normal probability graph paper. This can be accomplished by sorting the permeability values in descending order and calculating the proportion of samples that have permeability greater than each value. To avoid issues with values of zero or 100% samples, the percentage greater than or equal to a value is normalized by n+1, where n is the number of data. To proceed, the data must be entered into Rstudio.

data2 = read.csv("karpur.csv")
 k_core = data2$k.core
 depth=data2$depth
 summary(k_core)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##     0.42   657.33  1591.22  2251.91  3046.82 15600.00

After that, they are arranged in descending order using the permeability.

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

Finding the percentage of samples with permeability greater than each specific value comes next once permeability values have been calculated. To prevent problems caused by values reaching extremes of zero or 100%, the computed percentage, for values higher than or equal to a certain threshold, is modified by normalization using the formula n+1, where n is the number of samples.

n = length(sorted_k) 
k_percent = c(1:n)/(n+1) 
head(k_percent)
## [1] 0.001219512 0.002439024 0.003658537 0.004878049 0.006097561 0.007317073

Make a log-normal probability graph by first sorting k on the y-axis and plotting k percent on the x-axis.

plot(
  x = k_percent, 
  y = sorted_k,
  type="l",
  xlab = "% >= k",
  ylab = "k",
  log='y',
  lwd=2
  )

The curve can be roughly represented by a straight line because it primarily lies between 0.1 and 0.9. As a result, a straight line can be fitted onto the curve.

nearly_linear_k_values = sorted_k[floor(0.1*n): floor(0.9*n)]
nearly_linear_k_percent = k_percent[floor(0.1*n): floor(0.9*n)]
model = lm(log10(nearly_linear_k_values) ~ nearly_linear_k_percent)
summary(model)
## 
## Call:
## lm(formula = log10(nearly_linear_k_values) ~ nearly_linear_k_percent)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.19128 -0.03880  0.02148  0.04110  0.07176 
## 
## Coefficients:
##                          Estimate Std. Error t value Pr(>|t|)    
## (Intercept)              3.885895   0.005010   775.7   <2e-16 ***
## nearly_linear_k_percent -1.461904   0.009112  -160.4   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.05402 on 655 degrees of freedom
## Multiple R-squared:  0.9752, Adjusted R-squared:  0.9751 
## F-statistic: 2.574e+04 on 1 and 655 DF,  p-value: < 2.2e-16
plot(
  x = k_percent, 
  y = sorted_k,
  type="l",
  xlab = "% >= k",
  ylab = "k", 
  log='y',
  lwd=2
  )
abline(model, col="red", lwd=2)

The permeability variation coefficient, or V, is obtained by comparing the permeability values at different percentiles on a graph. The permeability value at %k>=50 is divided by the difference between the permeability value at %k>=50 (log mean) and the permeability value at %k>=84.1 (one standard deviation) to arrive at V=(k50−k84.1)/k50.

log_k50_and_84.1 = predict(model, 
  data.frame(nearly_linear_k_percent=c(0.50, 0.841))
  )
print(10^log_k50_and_84.1)
##         1         2 
## 1428.7056  453.3498
k50   = 10^log_k50_and_84.1[1]
k84.1 = 10^log_k50_and_84.1[2]
V = (k50 - k84.1)/k50
print(V)
##        1 
## 0.682685

The Dykstra-Parsons coefficient reveals a permeability coefficient of variation exceeding 0.5, indicating pronounced heterogeneity in the reservoir.

Lorenz hickness is determined by the variations in depths:coefficient

The Lorenz coefficient for permeability variation can be obtained by plotting cumulative kh against cumulative phi*h to create a flow capacity diagram. First, let’s use the depths to compute the thickness.The differences in depths determine the thickness:

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(data2)
ta["thickness"]=thickness
j=ta[order(k_core, 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            thickness     
##  Min.   :    0.42   Length:819         Min.   :0.5000  
##  1st Qu.:  657.33   Class :character   1st Qu.:0.5000  
##  Median : 1591.22   Mode  :character   Median :0.5000  
##  Mean   : 2251.91                      Mean   :0.5085  
##  3rd Qu.: 3046.82                      3rd Qu.:0.5000  
##  Max.   :15600.00                      Max.   :1.0000

Next, we’ll make a table with the following columns: thickness, phi.core, and 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

Next, we’ll make a table with the following columns: thickness, phi.core, and k.core.

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