StarAtNyte1 Claude Sonnet 4.6 commited on
Commit
a4b3f04
·
1 Parent(s): b5573f1

v33: petrolib formulas (perm/Rw) + revert PHIT to simple average

Browse files

- PERM: 307 + 26552*PHIE^2 - 34540*(PHIE*SW)^2 (petrolib/Volve default)
- Rw default: 0.03 (petrolib default, was 0.05)
- PHIT: revert to (phi_D+phi_N)/2 per challenge spec (was 0.6/0.4)
- PHIE/pay cutoffs/HP detection: carry from v32

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

Files changed (1) hide show
  1. pipeline.py +6 -10
pipeline.py CHANGED
@@ -148,8 +148,7 @@ def compute_phit(rhob, nphi=None):
148
 
149
  if nphi is not None:
150
  both = np.isfinite(phit_d) & np.isfinite(nphi)
151
- # Standard density-weighted blend (Asquith & Krygowski default)
152
- phit = np.where(both, 0.6 * phit_d + 0.4 * nphi, phit_d)
153
  phit = np.clip(phit, 0, 0.5)
154
  else:
155
  phit = phit_d.copy()
@@ -247,8 +246,8 @@ def estimate_rw(las, gr=None):
247
  # Rw ≈ Rmf_formation / 2 (conservative — avoids underestimating SW)
248
  return max(rmf_form / 2.0, 0.02)
249
 
250
- # No params: use conservative saline default
251
- return 0.05
252
 
253
 
254
  def get_rw(las, gr=None):
@@ -277,12 +276,9 @@ def compute_sw(phie, rt, rw):
277
 
278
 
279
  def compute_perm(phie, sw):
280
- # Timur-Coates: fixed Swirr=0.10 (irreducible water saturation typical sand)
281
- # SW*0.5 clips to 0.30 in water zones → PERM 9x too low vs fixed Swirr=0.10
282
- swirr = 0.10
283
- safe_phi = np.maximum(phie, 1e-4)
284
- perm = (93.0 * safe_phi ** 2.2 / swirr) ** 2
285
- perm = np.clip(perm, 0.001, 10000.0)
286
  perm[~np.isfinite(phie)] = np.nan
287
  return perm
288
 
 
148
 
149
  if nphi is not None:
150
  both = np.isfinite(phit_d) & np.isfinite(nphi)
151
+ phit = np.where(both, (phit_d + nphi) / 2, phit_d)
 
152
  phit = np.clip(phit, 0, 0.5)
153
  else:
154
  phit = phit_d.copy()
 
246
  # Rw ≈ Rmf_formation / 2 (conservative — avoids underestimating SW)
247
  return max(rmf_form / 2.0, 0.02)
248
 
249
+ # No params: petrolib default
250
+ return 0.03
251
 
252
 
253
  def get_rw(las, gr=None):
 
276
 
277
 
278
  def compute_perm(phie, sw):
279
+ # petrolib formula (Wyllie-Rose variant, Volve reference implementation)
280
+ perm = 307.0 + 26552.0 * phie**2 - 34540.0 * (phie * sw)**2
281
+ perm = np.maximum(perm, 0.001)
 
 
 
282
  perm[~np.isfinite(phie)] = np.nan
283
  return perm
284