completion-diagnostics
Completion Diagnostics
Diagnostic skill for interpreting frac calibration tests and stage execution data. Best results come from raw pressure, rate, slurry concentration, and proppant time series rather than only stage summaries.
Important: Completion diagnostics fail most often from bad normalization, not bad physics. Before interpreting closure or cluster efficiency, verify time alignment, gauge units, hydrostatic assumptions, pipe friction assumptions, and perforation depth.
Data To Request First
- Measured treating pressure and rate versus time
- Slurry concentration and proppant schedule versus time
- Shut-in timestamp and first few minutes of pressure falloff
- TVD to perforations and fluid density during treatment
- Surface iron / pipe friction estimate and perforation scheme
- Stage length, cluster count, shots per foot, and entry-hole diameter
- Offset DFIT, minifrac, microseismic, tracer, DAS, or fiber diagnostics if available
If only summary data are available, provide ranges and uncertainty bands rather than a single precise answer.
Workflow
- Normalize pressure to perforation depth.
- Separate hydrostatic, pipe friction, perforation friction, and fracture components.
- Estimate ISIP from the first shut-in points and bracket closure pressure.
- Compare net pressure and perforation friction across stages or clusters.
- Diagnose anomalies from pressure shape, rate response, and slurry behavior.
Module 1 - Pressure Normalization
def bhp_at_perfs(surface_pressure_psi, tvd_ft, fluid_ppg,
pipe_friction_psi=0.0, perf_friction_psi=0.0):
"""
Bottomhole treating pressure at perforations.
BHTP = P_surface + hydrostatic + pipe friction + perf friction
hydrostatic = 0.052 * MW(ppg) * TVD(ft)
"""
hydrostatic = 0.052 * fluid_ppg * tvd_ft
return surface_pressure_psi + hydrostatic + pipe_friction_psi + perf_friction_psi
def net_treating_pressure(bhtp_psi, closure_pressure_psi):
"""
Net pressure above closure / minimum stress.
For screening, use closure pressure from DFIT or minifrac.
"""
return bhtp_psi - closure_pressure_psi
def fracture_gradient(pressure_psi, tvd_ft):
"""Pressure gradient in psi/ft."""
if tvd_ft <= 0:
return None
return pressure_psi / tvd_ft
Interpretation ranges
| Metric | Typical meaning |
|---|---|
| Closure gradient 0.65 to 0.85 psi/ft | Common unconventional stress range |
| Net pressure 200 to 800 psi | Reasonable range for many slickwater stages |
| Rapid net pressure escalation at constant rate | Near-wellbore restriction, sand loading, or height growth change |
Module 2 - ISIP and Closure Screening
def isip_from_sqrt_time(time_sec, pressure_psi, n_points=8):
"""
Estimate ISIP by fitting pressure versus sqrt(time) over the first
post-shut-in points and extrapolating to time = 0.
"""
import math
n = min(len(time_sec), len(pressure_psi), n_points)
if n < 2:
return None
x = [math.sqrt(max(t, 0.0)) for t in time_sec[:n]]
y = pressure_psi[:n]
x_bar = sum(x) / n
y_bar = sum(y) / n
sxx = sum((xi - x_bar) ** 2 for xi in x)
if sxx == 0:
return None
sxy = sum((xi - x_bar) * (yi - y_bar) for xi, yi in zip(x, y))
slope = sxy / sxx
intercept = y_bar - slope * x_bar
return intercept
def closure_pressure_range(isip_psi, pressure_at_slope_change_psi,
uncertainty_psi=100.0):
"""
Return a closure bracket rather than a single number when only simple
diagnostics are available.
"""
low = min(isip_psi, pressure_at_slope_change_psi) - uncertainty_psi
high = max(isip_psi, pressure_at_slope_change_psi) + uncertainty_psi
return {"low_psi": low, "high_psi": high}
Closure picking hierarchy
- Use raw DFIT falloff with G-function and square-root-time plots.
- Cross-check derivative behavior against after-closure linear flow.
- If only treatment shut-in data exist, give a bounded closure range.
- Do not present single-psi precision unless the raw falloff quality supports it.
Diagnostic cues
| Plot cue | Likely interpretation |
|---|---|
| Early steep drop immediately after shut-in | Pipe / near-wellbore friction bleeding off |
| Clear slope change on sqrt-time | Candidate closure point |
| G-function derivative minimum then rise | Candidate closure region |
| No clean break | Multiple closures, complexity, poor shut-in data, or height growth |
Module 3 - Step-Rate And Breakdown
def step_rate_slopes(rate_bpm, pressure_psi):
"""
Piecewise slope dP/dQ between adjacent rate steps.
In a clean step-rate test, fracture initiation often appears as a
sustained reduction in slope (injectivity increase).
"""
slopes = []
for i in range(1, min(len(rate_bpm), len(pressure_psi))):
dq = rate_bpm[i] - rate_bpm[i - 1]
if dq == 0:
slopes.append(None)
else:
slopes.append((pressure_psi[i] - pressure_psi[i - 1]) / dq)
return slopes
def fracture_initiation_step(rate_bpm, pressure_psi, slope_drop_frac=0.25):
"""
Identify the first rate step where slope drops materially relative to the
previous step. This is a screening indicator, not a final picked pressure.
"""
slopes = step_rate_slopes(rate_bpm, pressure_psi)
for i in range(1, len(slopes)):
if slopes[i - 1] and slopes[i] and slopes[i] < (1 - slope_drop_frac) * slopes[i - 1]:
return {"step_index": i + 1, "pressure_psi": pressure_psi[i + 1]}
return None
Use cases
- Breakdown pressure: first clear fracture initiation point
- Reopening pressure: later cycle pressure where fracture reopens
- Step-down test: separate surface friction, pipe friction, and perforation friction after treatment
Module 4 - Cluster Efficiency And Perforation Friction
def perforation_friction_psi(rate_bpm, fluid_ppg, shot_count,
entry_diameter_in, discharge_coeff=0.8):
"""
Limited-entry perforation friction estimate.
Common field-units screening form:
dP = 0.2369 * q^2 * rho / (Cd^2 * N^2 * d^4)
q in bbl/min, rho in ppg, N total effective open holes, d in inches.
"""
if shot_count <= 0 or entry_diameter_in <= 0 or discharge_coeff <= 0:
return None
numerator = 0.2369 * rate_bpm**2 * fluid_ppg
denominator = discharge_coeff**2 * shot_count**2 * entry_diameter_in**4
return numerator / denominator
def cluster_efficiency_from_rate_split(cluster_rates_bpm):
"""
Simple rate-balance metric.
1.0 means perfectly even distribution.
"""
if not cluster_rates_bpm:
return None
avg_q = sum(cluster_rates_bpm) / len(cluster_rates_bpm)
if avg_q == 0:
return None
return min(cluster_rates_bpm) / avg_q
Rule-of-thumb guidance
| Indicator | Screening guidance |
|---|---|
| Perforation friction < 200 psi | Often too low for robust limited entry |
| Perforation friction 300 to 800 psi | Common design target range |
| Cluster efficiency < 0.6 | Large imbalance likely |
| Rising treating pressure with falling rate allocation quality | Near-wellbore restriction or dominant cluster growth |
For rigorous cluster allocation, combine this skill with
pnge:perforation-design and any available tracer or DAS data.
Module 5 - Pressure Signature Diagnosis
| Pressure behavior | Likely cause | What to check next |
|---|---|---|
| Sharp pressure rise at constant rate near tail-in | Screenout or near-screenout | Slurry concentration, sand ramp, blender behavior, heel cluster restriction |
| High pressure from start of stage | Tortuosity / near-wellbore complexity | Step-down, perf friction, gun phasing, limited-entry sizing |
| Pressure falls while rate also falls unexpectedly | Surface equipment issue | Pump schedule, iron restriction, data QA |
| Lower-than-offset pressure with poor response | Out-of-zone growth or stress shadow difference | Geology, stage spacing, offset diagnostics |
| Oscillatory pressure during proppant pumping | Sand slugs or unstable blender hydration | Slurry density, chemical loading, hydration time |
Output Format
When using this skill, structure the answer as:
- Pressure normalization assumptions
- ISIP and closure range
- Net pressure and fracture gradient interpretation
- Cluster efficiency / perforation friction findings
- Most likely operational diagnosis
- What additional data would materially reduce uncertainty
Integration Points
- Use
pnge:frac-designfor geometry and stress context. - Use
pnge:perforation-designfor limited-entry and perf friction detail. - Use
pnge:wellbore-stabilityfor stress and fracture containment context. - Use
pnge:production-chemistrywhen slurry chemistry or breaker cleanup is implicated.