Hubbert used the LGM approach to predict the cumulative production from gas and oil fields or region
Hubbert (1956) was the first to employ the concept of LGM (Logistic Growth Model) in the oil industry. Hubbert used the LGM approach to predict the cumulative production from gas and oil fields or regions. Clark et al. (2011) proposed a three-parameter growth model to forecast the production growth from a production well; that is, cumulative oil “NP” or gas “GP.” Clark and co-authors proposed the following expression:
For cumulative oil \("Np"\) or gas \("Gp"\) \[Gp = \frac{(K)t^n}{a+t^n}\] For oil rate \("Qo"\) or gas rate \("Qg"\) \[Q_g = \frac{(K)nat^{n-1}}{(a+t^n)^2}\] The parameters \("a"\) and \("n"\) are regression variables that impact the shape and upwards and downward of the decline curve. The “K” acts as a bounded or maximum growth.
Data and example 18.7 (Ahmed, 2019)
Matching observed production data using LGM method
Load data from .csv file
library(ggplot2)
library(plotly)
library(dplyr)
library(ggpubr)
library(crosstalk)
library(minpack.lm)
library(DT)
gas_rate <- read.csv("REH_Ch_18.csv")
datatable(gas_rate)
fig <- ggplot() +
geom_point(data = gas_rate, aes(DAYS,RATE), color = "black") +
geom_point(data = gas_rate, aes(DAYS,GP/100), color = "black") +
ylab("Gas rate (MMscf/day)") + xlab("Time (days)") +
scale_y_continuous(sec.axis = sec_axis(~ . * 100, name="Cumulative gas (MMscf)"))
fig
Assuming the following values for the three LMG parameters:
\[K = 800\] \[N = 1.2\] \[a = 220\]
gas_rate <- gas_rate %>%
mutate(Qg_cal = (800 * 1.2 * 220 * DAYS^(1.2-1))/(220 + DAYS^1.2)^2,
Gp_cal = (800 * DAYS^(1.2))/(220 + DAYS^1.2))
fig <- fig + geom_line(data = gas_rate, aes(gas_rate$DAYS,gas_rate$Qg_cal), color = "blue", size = 1.5) +
geom_line(data = gas_rate, aes(gas_rate$DAYS,gas_rate$Gp_cal/100), color = "blue", size = 1.5)
fig
We can use non-linear regression with minpack.lm package using
dca.LGM <- nlsLM(
RATE ~ (K.cal*n.cal*a.cal*DAYS^(n.cal-1))/(a.cal+DAYS^n.cal)^2,
data = gas_rate,
start = list(
K.cal = 800,
a.cal = 220,
n.cal = 1.2
)
)
coefficients(dca.LGM)
K.cal a.cal n.cal
808.044750 239.005696 1.124712
gas_rate$Qg_reg <- fitted(dca.LGM)
gas_rate$Gp_reg <- (coefficients(dca.LGM)[1]*gas_rate$DAYS^(coefficients(dca.LGM)[3]))/
(coefficients(dca.LGM)[2]+gas_rate$DAYS^coefficients(dca.LGM)[3])
fig <- fig + geom_line(data = gas_rate, aes(DAYS,Qg_reg), color = "red", size = 1.5) +
geom_line(data = gas_rate, aes(DAYS,Gp_reg/100), color = "red", size = 1.5)
fig
datatable(gas_rate)
For generate a forecast, we can create a days vector and calculate rates using model equation and fit coefficients. Initially, creating a dataframe with forecasting data and then, using merge() function merge both dataframes, in this case, because both have DAYS column the function just add Qg_for and Gp_for columns and fill empty rows with NA values.
K <- coefficients(dca.LGM)[1]
a <- coefficients(dca.LGM)[2]
n <- coefficients(dca.LGM)[3]
days_forc <- c(481:780)
rate_forc <- (K*n*a*days_forc^(n-1))/(a+days_forc^n)^2
gp_forc <- (K*days_forc^(n))/(a+days_forc^n)
forcast <- data.frame(DAYS = days_forc, Qg_for = rate_forc, Gp_for = gp_forc)
gas_rate_for <- merge(gas_rate, forcast, all = TRUE)
fig <- fig + geom_line(data = forcast, aes(DAYS,Qg_for), color = "red", size = 1.5, linetype = "dashed") +
geom_line(data = forcast, aes(DAYS,Gp_for/100), color = "red", size = 1.5,linetype = "dashed")
fig
Reference Ahmed, T (2019) Reservoir Engineering Handbook. Fifth edition.
For attribution, please cite this work as
Vázquez (2021, June 7). Chato Solutions: Logistic Growth Model(LMG) model. Retrieved from https://www.chatosolutions.com/posts/2021-06-07-lmg-model/
BibTeX citation
@misc{vázquez2021logistic, author = {Vázquez, Rigoberto Chandomí}, title = {Chato Solutions: Logistic Growth Model(LMG) model}, url = {https://www.chatosolutions.com/posts/2021-06-07-lmg-model/}, year = {2021} }