Inflow Performance Relation
Definition: The Inflow Performance Relationship (IPR) describes the relationship between the bottom-hole flowing pressure (\(p_{wf}\)) and the production rate (‘math:q) of a well. It is a fundamental tool in reservoir engineering used to evaluate well productivity and forecast performance under different operating conditions.
Oil Well IPR Above Bubble Point
the reservoir pressure is above the bubble point pressure, the fluid remains single-phase (oil only). The relationship is linear and can be expressed as:
Where:
\(q\) = production rate (STB/day)
\(J\) = productivity index (STB/day/psi)
\(p_r\) = average reservoir pressure (psi)
\(p_{wf}\) = bottom-hole flowing pressure (psi)
Numerical Example:
Given:
\(J = 2 \, \text{STB/day/psi}\)
\(p_r = 3000 \, \text{psi}\)
\(p_{wf} = 2500 \, \text{psi}\)
double J = 2; // STB/day/psi
double p_r = 3000; // psi
double p_wf = 2500; // psi
double q = J * (p_r - p_wf); // STB/day
Console.WriteLine($"Production Rate (q) = {q} STB/day");
// Full Range
double qfun(double pwf) => J * (p_r - pwf);
ColVec Prange = Linspace(0, p_r);
ColVec Qrange = Arrayfun(qfun, Prange);
Plot(Prange, Qrange, "b", 2);
Xlabel("Flowrate Q (STB/day)");
Ylabel("Pressure P (psia)");
Title("OilIPR_Above_Pb");
SaveAs("OilIPR_Above_Pb.png");
Ouput
Production Rate (q) = 1000 STB/day
Oil Well IPR Below Bubble Point
When the reservoir pressure falls below the bubble point, gas evolves from solution, and the relationship becomes non-linear. Vogel’s empirical equation is commonly used:
Where:
-\(q_{max}\) = maximum flow rate at \(p_{wf} = 0\)
Numerical Example:
Given:
\(q_{max} = 2000 \, \text{STB/day}\)
\(p_r = 2500 \, \text{psi}\)
\(p_{wf} = 1000 \, \text{psi}\)
double q_max = 2000; // STB/day
double p_r = 2500; // psi
double p_wf = 1000; // psi
double q = q_max * (1 - 0.2 * (p_wf / p_r) - 0.8 * Pow(p_wf / p_r, 2)); // STB/day
Console.WriteLine($"Production Rate (q) = {q} STB/day");
// Full Range
double qfun(double pwf) => q_max * (1 - 0.2 * (pwf / p_r) - 0.8 * Pow(pwf / p_r, 2));
ColVec Prange = Linspace(0, p_r);
ColVec Qrange = Arrayfun(qfun, Prange);
Plot(Qrange, Prange, "b", 2);
Xlabel("Flowrate Q (STB/day)");
Ylabel("Pressure P (psia)");
Title("OilIPR_Below_Pb");
SaveAs("OilIPR_Below_Pb.png");
Ouput
Production Rate (q) = 1583.9999999999998 STB/day
Flow Efficiency and Skin
Flow Efficiency (FE): Flow efficiency is a measure of how effectively a well produces compared to an ideal, undamaged well. It is defined as:
double q_ideal = 1584; // STB/day (from previous example)
double q_act = 1200; // STB/day (maximum flow rate)
double FE = q_act / q_ideal; // Flow Efficiency
Console.WriteLine($"Flow Efficiency (FE) = {FE:P2}");
Ouput
Flow Efficiency (FE) = 75.76%
Skin Factor (s): Skin represents additional pressure drop caused by near-wellbore damage or stimulation. The productivity index with skin is:
Where:
\(r_e\) = drainage radius
\(r_w\) = wellbore radius
\(s\) = skin factor
A positive skin reduces productivity, while a negative skin (stimulation) increases productivity. Numerical Example with Pressure Drop Consider a reservoir with:
\(p_r = 3000 \, \text{psi}\)
Bubble point pressure \(p_b = 2500 \, \text{psi}\)
\(q_{max} = 2000 \, \text{STB/day}\)
\(J = 2 \, \text{STB/day/psi}\)
\(r_e/r_w = 1000\)
\(s = +3\)
Case 1: Above Bubble Point (\(p_{wf} = 2800 \, \text{psi}\))
double q_max = 2000; // STB/day
double p_r = 3000; // psi
double p_wf = 2800; // psi
double J = 2; // STB/day/psi
double r_e_r_w = 1000; // dimensionless
double s = 3; // dimensionless
double lnre_rw = Log(r_e_r_w);
double FE = lnre_rw/(lnre_rw + s);
double J_s = J * FE; // STB/day/psi
double q = J_s * (p_r - p_wf); // STB/day
Console.WriteLine($"Adjusted Productivity Index (J_s) = {J_s:F4} STB/day/psi");
// Full Range
double damageskin = 3;
double stimulatedskin = -3;
double FE_damage = lnre_rw/(lnre_rw + damageskin);
double FE_stimulated = lnre_rw/(lnre_rw + stimulatedskin);
double qfun(double pwf) => J * (p_r - pwf);
ColVec Prange = Linspace(0, p_r);
ColVec Qrange = Arrayfun(qfun, Prange);
Plot(Qrange, Prange, "b", 2); HoldOn();
Plot(FE_damage * Qrange, Prange, "r", 2);
Plot(FE_stimulated * Qrange, Prange, "g", 2); HoldOff();
Xlabel("Flowrate Q (STB/day)");
Ylabel("Pressure P (psia)");
Title("OilIPR_Above_Pb_Damaged_Stimulated_Skin");
Legend(["Ideal", "Damaged", "Stimulated"]);
SaveAs("OilIPR_Above_Pb_Damaged_Stimulated_Skin.png");
Ouput
Adjusted Productivity Index (J_s) = 1.3944 STB/day/psi
Case 2: Below Bubble Point (\(p_{wf} = 2000 \, \text{psi}\))
Adjusted for skin:
double q_max = 2000; // STB/day
double p_wf = 1000; // psi
double p_r = 2500; // psi
double J = 2;
double r_e_r_w = 1000;
double s = 3;
double lnre_rw = Log(r_e_r_w);
double FE = lnre_rw/ (lnre_rw + s);
double J_s = J * FE; // STB/day/psi
double q_ideal = q_max * (1 - 0.2 * (p_wf / p_r) - 0.8 * Pow(p_wf / p_r, 2)); // STB/day
// Full Range
double damageskin = 3;
double stimulatedskin = -3;
double FE_damage = lnre_rw/(lnre_rw + damageskin);
double FE_stimulated = lnre_rw/(lnre_rw + stimulatedskin);
double qfun(double pwf) => q_max * (1 - 0.2 * (pwf / p_r) - 0.8 * Pow(pwf / p_r, 2));
ColVec Prange = Linspace(0, p_r);
ColVec Qrange = Arrayfun(qfun, Prange);
Plot(Qrange, Prange, "b", 2); HoldOn();
Plot(FE_damage * Qrange, Prange, "r", 2);
Plot(FE_stimulated * Qrange, Prange, "g", 2); HoldOff();
Xlabel("Flowrate Q (STB/day)");
Ylabel("Pressure P (psia)");
Title("OilIPR_Below_Pb_Damaged_Stimulated_Skin");
Legend(["Ideal", "Damaged", "Stimulated"]);
SaveAs("OilIPR_Below_Pb_Damaged_Stimulated_Skin.png");
Case 3: At Zero Bottom-Hole Pressure (\(p_{wf} = 0\))
Adjusted for skin:
double q_max = 2000;
double q_act = q_max * 1.3944/2;
Console.WriteLine($"Actual AOF = {q_act} STB/day");
Ouput
Actual AOF = 1394.4 STB/day
Gas Well Inflow Performance Relation (IPR)
Definition: Gas Inflow Performance Relationship (IPR) describes the relationship between the gas flow rate (\(q_g\)) and the bottom-hole flowing pressure (\(p_{wf}\)). Unlike oil, gas productivity is highly non-linear due to the pressure-dependent properties of gas (viscosity \(mu_g\) and compressibility factor \(z\)).
The Simplified Back-Pressure Equation
For most engineering applications, the Rawlins and Schellhardt empirical “Back-Pressure” equation is used to describe gas well performance:
Where:
\(q_g\) = gas flow rate (Mscf/day)
\(C\) = performance coefficient (Mscf/day/psi²)
\(p_r\) = average reservoir pressure (psia)
\(p_{wf}\) = bottom-hole flowing pressure (psia)
\(n\) = turbulence factor (typically 0.5 to 1.0)
Numerical Example:
Given:
\(C = 0.01 \, \text{Mscf/day/psi}^2\)
\(n = 0.85\) (indicates some non-Darcy flow/turbulence)
\(p_r = 3000 \, \text{psia}\)
\(p_{wf} = 2000 \, \text{psia}\)
double C = 0.01, n = 0.85;
double p_r = 3000; // psia
double p_wf = 2000; // psia
double q_g = C * Pow(Pow(p_r, 2) - Pow(p_wf, 2), n);
Console.WriteLine($"Gas Flow Rate (q_g) = {q_g:F2} Mscf/day");
// Full Range
double qfun(double pwf) => C * Pow(Pow(p_r, 2) - Pow(pwf, 2), n);
ColVec Prange = Linspace(0, p_r);
ColVec Qrange = Arrayfun(qfun, Prange);
Plot(Qrange, Prange, "b", 2);
Xlabel("Flowrate Q (Mscf/day)");
Ylabel("Pressure P (psia)");
Title("GasIPR");
SaveAs("GasIPR.png");
Ouput
Gas Flow Rate (q_g) = 4944.52 Mscf/day
Absolute Open Flow (AOF)
The Absolute Open Flow potential is the maximum rate a well could theoretically deliver if the flowing pressure (\(p\_{wf}\)) were reduced to zero. It is a common benchmark for gas well productivity.
Numerical Example:
Using the same parameters as above:
double C = 0.01;
double n = 0.85;
double p_r = 3000;
double AOF = C * Pow(Pow(p_r, 2), n);
Console.WriteLine($"Absolute Open Flow (AOF) = {AOF:F2} Mscf/day");
}
Ouput
❌ Syntax Error in Documentation:
Line 7: Member definition, statement, or end-of-file expected
High Pressure Gas IPR (Pseudo-Pressure)
The \(m(p)\) approach:/// When reservoir pressure exceeds 2000–3000 psi, the \(p^2\) method becomes inaccurate. Engineers use the Real Gas Pseudo-Pressure, \(m(p)\), to linearize the flow equation:
Where:
// Simplified Linear Pseudo-Pressure Example
double m_pr = 6.5e8; // psi^2/cp
double m_pwf = 4.2e8; // psi^2/cp
double C_prime = 0.00002; // performance coefficient
double q_g = C_prime * (m_pr - m_pwf);
Console.WriteLine($"Pseudo-pressure Gas Rate = {q_g:F2} Mscf/day");
Ouput
Pseudo-pressure Gas Rate = 4600.00 Mscf/day
Summary of n-values:
n Value |
Flow Regime |
Description |
|---|---|---|
n = 1.0 |
Fully Laminar |
Darcy flow, no turbulence near wellbore. |
0.5 < n < 1.0 |
Transitional |
Common in most commercial gas wells. |
n = 0.5 |
Fully Turbulent |
High velocity flow, typical in high-rate wells. |