1. 测井物理基础与仪器

1.1 岩石电性测量原理

岩石电阻率的基本概念

岩石电阻率是描述地层导电能力的重要物理参数,定义为在单位长度、单位截面积的岩层中产生单位电流所需的电压。其数学表达式为:

R=ρ⋅LAR = \rho \cdot \frac{L}{A}R=ρAL

其中:

  • R 为电阻(Ω)
  • ρ 为电阻率(Ω·m)
  • L 为长度(m)
  • A 为截面积(m²)

地层电阻率受多种因素影响,主要包括孔隙度、流体性质和矿物成分。
在这里插入图片描述

阿奇公式及其扩展

1942年,J.C. Archie提出了描述岩石电阻率与孔隙度、饱和度和泥质含量关系的经典方程:

Rt=a⋅ϕ−m⋅RwSwnR_t = a \cdot \frac{\phi^{-m} \cdot R_w}{S_w^n}Rt=aSwnϕmRw

其中各参数的物理意义为:

  • Rt:地层真电阻率(Ω·m)
  • φ:岩石有效孔隙度
  • Rw:地层水电阻率(Ω·m)
  • Sw:含水饱和度
  • m:水泥化指数
  • n:胶结指数
  • a:分散系数

该公式的物理基础在于多孔介质中电流主要通过流体相传导,而固体矿物骨架的导电能力相对较弱。

影响岩石电性的主要因素

(1)孔隙度与电阻率关系

孔隙度增加时,流体所占空间增大,电阻率相应降低。实验研究表明,孔隙度与电阻率的关系近似满足:

Rt∝ϕ−mR_t \propto \phi^{-m}Rtϕm

不同岩性地层的水泥化指数 m 存在差异,砂岩通常取值在1.5-2.0之间,碳酸盐岩则可能达到3.0左右。

(2)含流体性质

地层水电阻率 Rw 是决定电阻率大小的关键因素之一。对于含有相同孔隙度和饱和度的地层,Rw越大,则 Rt也越大。这一关系可表示为:

Rt∝RwR_t \propto R_wRtRw

在实际应用中,通常采用岩心分析或地球物理测井方法获取 Rw值。

(3)粘土矿物的影响

粘土矿物具有特殊的电学性质,能够显著改变地层的电阻率响应。粘土含量增加时,地层电阻率通常降低,但具体变化规律与粘土类型密切相关:

Rt=Rma1+CvR_t = \frac{R_{ma}}{1 + C_v}Rt=1+CvRma

其中 Cv为粘土系数,Rma为泥岩基线电阻率。

(4)温度效应

电阻率随温度升高而降低,其关系可表示为:

ρT=ρ25°C⋅e−0.018(T−25)\rho_T = \rho_{25°C} \cdot e^{-0.018(T - 25)}ρT=ρ25°Ce0.018(T25)

该公式中 ρT为温度 T(°C)时的电阻率值。

电阻率测量方法分类

测量类型 描述 适用场景
深探测测井 电流从电极向外扩散,探测深度较大 获取地层真电阻率
浅探测测井 探测范围较浅,受侵入带影响大 判断泥浆侵入程度
微电阻率测井 极小探测半径,主要用于识别泥质含量 评价泥质含量和含油性

1.2 典型测井工具结构

深、中、浅三侧向测井仪

三侧向测井仪由斯伦贝谢公司于1950年代研制成功,其基本结构包括:

(1)发射系统

采用交流电源激励的电极系,通过四个发射电极(A1、A2、B1、B2)产生电流场。各电极按特定几何关系布置,保证测量精度。

┌─────────────────────────────────────────┐
│              三侧向测井仪结构            │
│                                         │
│    A1      B1                              │
│     ●━━━━━━●                               │
│       ╲    ╱                                │
│        ╲  ╱                                 │
│         ╲╱                                  │
│         ●                                   │
│         C (接收电极)                       │
│                                         │
│    A2      B2                              │
│     ●━━━━━━●                               │
└─────────────────────────────────────────┘
(2)接收系统

由三个接收电极(C、D1、D2)组成,用于采集电位差信号。测量原理基于:

V=I⋅RmeasV = I \cdot R_{meas}V=IRmeas

其中 V 为接收电位差,I 为发射电流强度。

(3)机械结构特点
  • 仪器外径:约 9.5 cm
  • 重量:约 12 kg
  • 供电方式:电池组提供直流电源
  • 信号处理:通过模拟电路完成初步放大和滤波

感应测井仪

感应测井采用电磁感应原理测量地层电导率,特别适用于高电阻率或油气层探测。其基本结构包括:

(1)发射线圈系统

由多个激励线圈组成,按特定几何关系排列,产生交变磁场。典型参数为:

# 感应测井仪发射线圈配置示例
transmitter_coils = {
    "coil_count": 4,          # 发射线圈数量
    "frequency": 100000,      # 工作频率 (Hz)
    "current_amplitude": 5.0, # 电流振幅 (A)
    "diameter": 8.2           # 线圈直径 (cm)
}

# 计算磁场强度
def calculate_magnetic_field(current, frequency, coil_diameter):
    """根据发射参数计算感应磁场强度"""
    import math
    
    B = (mu_0 * current * N) / (2 * pi * r)
    
    return {
        "magnetic_flux_density": B,  # 磁通密度 (T)
        "wavelength": c / frequency  # 电磁波波长 (m)
    }

# 示例计算
result = calculate_magnetic_field(5.0, 100000, 8.2e-2)
print(f"磁场强度: {result['magnetic_flux_density']:.6f} T")
(2)接收线圈系统

由多个接收线圈组成,通过感应电动势获取地层电导率信息。接收信号处理流程为:

Vinduced=−N⋅dΦdtV_{induced} = -N \cdot \frac{d\Phi}{dt}Vinduced=NdtdΦ

其中 N 为线圈匝数,Φ 为磁通量。

声波测井仪结构

声波测井用于测定地层的声波传播速度,进而计算孔隙度、岩性等信息。典型结构包括:

┌─────────────────────────────────────────────┐
│              声波测井仪剖面示意图              │
│                                             │
│   ┌──────────┐                               │
│   │发射换能器│ ←→ 声脉冲                       │
│   └──────────┘                               │
│       ↓                                       │
│   ┌──────────┐                               │
│   │地层      │ → 声波传播                     │
│   │(砂岩)     │                               │
│   └──────────┘                               │
│       ↓                                       │
│   ┌──────────┐                               │
│   │接收换能器│ ← 接收反射波                      │
│   └──────────┘                               │
│                                             │
│   主要参数:                                 │
│   - 发射频率: 25-40 kHz                       │
│   - 脉冲宽度: 100 μs                          │
│   - 重复周期: 50 ms                           │
└─────────────────────────────────────────────┘

测井仪器数据传输系统

现代测井仪器采用数字化传输技术,主要包括:

(1)模拟信号处理

早期测井仪使用模拟电路进行信号采集和放大:

# 模拟信号处理模块示例
class AnalogSignalProcessor:
    def __init__(self, gain=100.0, filter_freq=100):
        """
        初始化模拟信号处理器
        
        Args:
            gain: 放大器增益 (默认100)
            filter_freq: 滤波器截止频率 (Hz)
        """
        self.gain = gain
        self.filter_freq = filter_freq
    
    def amplify_signal(self, voltage):
        """对输入电压进行放大"""
        amplified_voltage = voltage * self.gain
        return amplified_voltage
    
    def apply_low_pass_filter(self, frequency):
        """应用低通滤波器,仅通过低于截止频率的信号"""
        if frequency <= self.filter_freq:
            return True  # 信号可通过
        else:
            return False  # 信号被滤除
(2)数字数据传输

现代测井系统采用数字化传输技术:

数据类型 带宽要求 传输协议
模拟数据 10-50 kHz RS-485
数字数据 >1 MHz Ethernet
视频/图像 >10 MHz Fiber Optic

测井工具质量控制

为确保测量精度,测井仪器需要定期进行校准和维护:

# 测井仪器校准程序示例
class WellLoggingCalibration:
    def __init__(self):
        self.reference_values = {
            "resistivity": 1.0,      # 标准电阻率 (Ω·m)
            "porosity": 0.25,        # 标准孔隙度
            "velocity": 4500         # 标准声波速度 (m/s)
        }
    
    def calibrate_resistivity_tool(self):
        """电阻率测井工具校准"""
        print("开始电阻率测井工具校准...")
        
        test_results = {
            "tool_id": "RL-2024-X1",  # 工具编号
            "calibration_date": "2024-03-15",
            "reference_resistivity": self.reference_values["resistivity"]
        }
        
        # 模拟校准过程
        measured_value = self.reference_values["resistivity"] * (1 + 0.02)  # 假设误差2%
        correction_factor = 1 / (1 + 0.02)
        
        test_results["correction_factor"] = correction_factor
        print(f"修正系数: {correction_factor:.4f}")
        
        return test_results
    
    def calibrate_porosity_tool(self):
        """孔隙度测井工具校准"""
        print("开始孔隙度测井工具校准...")
        
        test_results = {
            "tool_id": "CNL-2024-Y1",  # 中子测井仪编号
            "calibration_date": "2024-03-15"
        }
        
        # 使用标准孔隙度块进行校准
        standard_porosity = self.reference_values["porosity"]
        measured_porosity = standard_porosity * (1 - 0.015)  # 假设误差-1.5%
        
        correction_factor = standard_porosity / measured_porosity
        
        test_results["correction_factor"] = correction_factor
        print(f"孔隙度修正系数: {correction_factor:.4f}")
        
        return test_results

# 执行校准程序
calibration_system = WellLoggingCalibration()
resistivity_cal = calibration_system.calibrate_resistivity_tool()
porosity_cal = calibration_system.calibrate_porosity_tool()

测井数据记录与存储

测井数据的数字化记录和存储是现代测井技术的重要组成部分:

# 测井数据存储结构示例
import json
from datetime import datetime

class WellLoggingDataStorage:
    def __init__(self):
        self.data_structure = {
            "well_name": "",
            "measurement_date": "",
            "depth_range": {"start": 0.0, "end": 0.0},
            "tools_used": [],
            "raw_data": []
        }
    
    def record_measurement(self, depth, tool_type, value):
        """记录单次测量数据"""
        measurement_record = {
            "depth_m": depth,
            "tool_type": tool_type,
            "value": value,
            "timestamp": datetime.now().isoformat()
        }
        
        self.data_structure["raw_data"].append(measurement_record)
        return measurement_record
    
    def save_to_file(self, filename):
        """保存数据到文件"""
        try:
            with open(filename, 'w', encoding='utf-8') as f:
                json.dump({
                    "metadata": self.data_structure["well_name"],
                    "measurements": self.data_structure["raw_data"]
                }, f, indent=2)
            print(f"数据已保存到 {filename}")
        except Exception as e:
            print(f"保存失败:{e}")

# 示例使用
storage = WellLoggingDataStorage()
storage.data_structure["well_name"] = "Well-A-101"
measurement1 = storage.record_measurement(1234.5, "电阻率", 8.7)
measurement2 = storage.record_measurement(1235.0, "孔隙度", 28.3)

# 保存数据
storage.save_to_file("well_data.json")

以上章节涵盖了岩石电性测量原理和典型测井工具结构的核心内容。通过理论分析与实例说明相结合的方式,帮助读者深入理解测井技术的基础知识及其工程应用。

2. 电阻率测井与流体识别

2.1 地层水电阻率计算

在地层评价中,地层水电阻率 RwR_wRw 是连接岩石物理性质与含流体现象的关键参数。由于地下环境的复杂性,直接测量 RwR_wRw 往往受到限制,因此需要通过间接方法推算。主要的推算依据包括岩心分析数据、邻井对比以及经验统计模型。

计算原理与方法

目前常用的计算方法主要包括:

  1. 岩心分析法:对取出的岩样进行实验室测试,结合孔隙度测定,建立 RwR_wRw 与地层条件的关系曲线。这是最准确但成本较高的方法。
  2. 经验公式法:利用不同沉积相带的统计规律,如前苏联的“克拉斯诺亚尔斯基”模型或美国的“Shirley-Garland”模型。
  3. 核磁共振测井(NMR)反演:NMR技术可以直接反映孔隙中的流体分布,结合弛豫时间谱可以分离 RwR_wRw 分量。

在实际工程软件中,通常采用混合模型进行估算。以下示例展示了如何基于已知参数和统计关系计算地层水电阻率。

import numpy as np

class RwCalculator:
    def __init__(self):
        # 默认参数:不同岩性类型的经验系数
        self.params = {
            "sandstone": {"a": 0.7, "m": 1.8},   # 砂岩典型值
            "limestone": {"a": 0.5, "m": 2.4},   # 石灰岩
            "dolomite":  {"a": 0.6, "m": 2.1}    # 白云岩
        }

    def calculate_rw(self, formation_type="sandstone", 
                     porosity=0.25, measured_resistivity=None):
        """
        根据地层类型和孔隙度估算地层水电阻率
        
        Args:
            formation_type: 岩石类型 ('sandstone', 'limestone', etc.)
            porosity: 有效孔隙度 (phi)
            measured_resistivity: 实测电阻率 (可选,用于校验)
            
        Returns:
            estimated_rw: 估算的地层水电阻率 (Ohm·m)
        """
        if formation_type not in self.params:
            raise ValueError("Unsupported rock type")

        base_params = self.params[formation_type]
        
        # 简化模型:基于 Archie 公式的变形
        # Rt = a * phi^-m * Rw / Sw^n (假设 Sw=1, n=m)
        # => Rw = Rt / (a * phi^-m)
        # 此处为了演示计算逻辑,设定一个基准关系
        
        # 模拟数据:假设已知某标准样品的 Rt 和 phi
        sample_rt = 2.5  # Ohm·m
        sample_phi_std = porosity
        
        # 计算理论 Rw (假设样品完全饱和)
        a, m = base_params["a"], base_params["m"]
        
        rw_estimated = sample_rt / (a * pow(sample_phi_std, -m))
        
        return {
            "rock_type": formation_type,
            "porosity_input": porosity,
            "estimated_rw": rw_estimated
        }

# 实例应用
calc_system = RwCalculator()
result_sand = calc_system.calculate_rw("sandstone", porosity=0.28)
print(f"砂岩地层水电阻率估算值: {result_sand['estimated_rw']:.3f} Ohm·m")

2.2 油气水层划分方法

在获得电阻率曲线后,核心任务是将储层划分为油、气、水或含油水层。这一过程通常结合孔隙度数据(如中子测井 CNL)和电阻率数据进行综合判识。

判别逻辑与交会图法

传统的判别方法是使用 RtR_tRt-ϕ\phiϕ 交会图,设定不同的斜率和截距来区分流体性质。

  • 油层/气层:通常表现为高电阻率(相对于水层),且孔隙度较高。
  • 水层:电阻率较低,且随深度增加变化较小。
  • 含油饱和度层:介于两者之间。

现代算法引入了机器学习分类器,但基础逻辑仍基于物理模型。以下代码演示了基于阈值的初步判别流程。

class FluidIdentifier:
    def __init__(self):
        # 定义典型流体的电阻率下限阈值 (Ohm·m)
        self.thresholds = {
            "water": 10.0,      # 水层上限,低于此值通常为干层或异常低阻
            "oil_gas": 50.0,    # 油气下限,高于此值可能为高阻油气
            "mixed": 25.0       # 过渡带
        }

    def classify_layer(self, rt_value, phi_eff):
        """
        根据电阻率和有效孔隙度进行流体分类
        
        Args:
            rt_value: 真电阻率 (Ohm·m)
            phi_eff: 有效孔隙度
            
        Returns:
            classification: 流体类型字符串
        """
        # 结合孔隙度校正的判别逻辑
        if phi_eff < 0.1:
            return "non-reservoir" # 非储层
        
        # 简易判别规则:高阻 + 高孔 = 油气可能,低阻 = 水
        if rt_value > self.thresholds["oil_gas"]:
            return "potential_oil_gas"
        elif rt_value < self.thresholds["water"]:
            return "water_layer"
        else:
            # 中间区域需要结合其他曲线进一步分析
            if phi_eff > 0.25:
                return "transition_zone" 
            else:
                return "uncertain"

    def batch_process(self, data_list):
        """批量处理测井数据"""
        results = []
        for record in data_list:
            rt = record['rt']
            phi = record['phi']
            label = self.classify_layer(rt, phi)
            results.append({
                "depth": record['depth'],
                "label": label,
                "parameters": {"rt": rt, "phi": phi}
            })
        return results

# 模拟数据输入
sample_data = [
    {'depth': 1200.5, 'rt': 65.2, 'phi': 0.28},
    {'depth': 1201.0, 'rt': 8.5, 'phi': 0.15},
    {'depth': 1201.5, 'rt': 45.0, 'phi': 0.30}
]

processor = FluidIdentifier()
layer_analysis = processor.batch_process(sample_data)

for item in layer_analysis:
    print(f"深度 {item['depth']}: 判为 -> {item['label']}")

2.3 含油饱和度模型

含油饱和度 SoS_oSo 的计算是储量评估的基础。虽然 Archie公式是最经典的工具,但在复杂地质条件下(如存在泥质、高矿化度水),需要采用修正模型。Simandoux方程和 Waxman-Smits模型在处理这些特殊情况时表现优异。

模型原理与应用

含油饱和度计算的核心在于准确获取含水饱和度 SwS_wSw,进而导出 So=1−SwS_o = 1 - S_wSo=1Sw(假设无气)。
对于含泥质地层,电阻率关系修正为:
Rt=Rma⋅(1+Cv)/(1+Cv⋅Rwa/Rtma)R_t = R_{ma} \cdot (1 + C_v) / (1 + C_v \cdot R_{wa}/R_{tma})Rt=Rma(1+Cv)/(1+CvRwa/Rtma)

在数值计算中,我们通常采用迭代法或解析解来求解 SwS_wSw。以下代码实现了基于 Archie 公式及其改进型的饱和度计算器。

def calculate_saturation(archie_params, measured_rt, rw, porosity):
    """
    计算含油饱和度
    
    Args:
        archie_params: 包含 m (水泥化指数), n (胶结指数) 的字典
        measured_rt: 测量的真电阻率
        rw: 地层水电阻率
        porosity: 有效孔隙度
        
    Returns:
        sw, so: 含水饱和度和含油饱和度
    """
    m = archie_params.get('m', 2.0)
    n = archie_params.get('n', 2.0)
    
    # Archie 公式基础形式:Rt = a * phi^-m * Rw / Sw^n (忽略 a=1, n=m 简化)
    # Sw = (a * phi^-m * Rw / Rt) ^ (1/n)
    
    numerator = porosity ** (-m) * rw
    sw_value = (numerator / measured_rt) ** (1.0 / n)
    
    # 限制饱和度在物理范围内 [0, 1]
    if sw_value > 1.0: sw_value = 1.0
    elif sw_value < 0.0: sw_value = 0.0
    
    so_value = 1.0 - sw_value
    
    return {"sw": sw_value, "so": so_value}

# 示例参数配置
geo_model_params = {
    "m": 2.15, 
    "n": 2.0,
    "rw_base": 0.45 # 平均地层水电阻率假设值
}

# 计算一组数据
test_data = [
    {"rt": 25.0, "phi": 0.25},
    {"rt": 12.0, "phi": 0.30}
]

print("--- 饱和度计算结果 ---")
for item in test_data:
    res = calculate_saturation(geo_model_params, 
                               measured_rt=item["rt"], 
                               rw=geo_model_params["rw_base"],
                               porosity=item["phi"])
    print(f"电阻率={item['rt']}, 孔隙度={item['phi']} -> Sw={res['sw']:.2%}, So={res['so']:.2%}")

本章完

3. 综合岩性解释与应用

3.1 密度中子交会分析

密度测井和中子测井是识别岩石岩性和孔隙度的核心组合测井系列。两者基于不同的物理原理,通过交会图分析可获得准确的储层参数。

技术原理

密度测井测量的是电子密度,与岩石骨架和流体密度相关:
ρb=ϕ⋅ρf+(1−ϕ)⋅ρm\rho_b = \phi \cdot \rho_f + (1-\phi) \cdot \rho_mρb=ϕρf+(1ϕ)ρm

其中 ρb\rho_bρb 为地层视密度,ϕ\phiϕ 为孔隙度,ρf\rho_fρf 为流体密度,ρm\rho_mρm 为岩石骨架密度。

中子测井测量的是氢原子数量,与孔隙度正相关:
CNL=CNL0⋅e−αϕCNL = CNL_0 \cdot e^{-\alpha \phi}CNL=CNL0eαϕ

交会图分析技术

通过绘制密度-中子交会图,可以区分不同岩性:

  • 砂岩:位于典型区域,具有特定的斜率
  • 石灰岩/白云岩:骨架密度差异导致位置偏移
  • 泥质层:显示为高孔隙度特征但实际无储集能力
import numpy as np
import matplotlib.pyplot as plt

class DensityNeutronCrossplot:
    def __init__(self):
        # 典型岩石的骨架参数(g/cm³)
        self.bone_density = {
            "sandstone": 2.65,
            "limestone": 2.71,
            "dolomite": 2.87,
            "shale": 2.40
        }
        
    def calculate_crossplot_params(self, rock_type):
        """计算特定岩性的交会图参数"""
        bd = self.bone_density.get(rock_type, 2.65)
        
        # 密度-中子交会图的理论斜率公式
        slope = (1 - 0.9 * bd) / (1 + 0.9 * bd)
        
        return {
            "rock_type": rock_type,
            "bone_density": bd,
            "slope": slope,
            "expected_position": self._get_expected_pos(bd)
        }
    
    def _get_expected_pos(self, bd):
        """获取预期交会图位置"""
        if bd < 2.5:
            return {"density_range": (1.8, 2.0), "neutron_range": (35, 40)}
        elif bd < 2.7:
            return {"density_range": (2.0, 2.3), "neutron_range": (30, 35)}
        else:
            return {"density_range": (2.3, 2.8), "neutron_range": (25, 30)}

    def analyze_sample(self, rho_b, cnl):
        """分析样品并识别岩性"""
        # 计算偏离程度
        deviation = np.sqrt((rho_b - 1.9)**2 + **(cnl - 38)2)
        
        if deviation < 5:
            return "sandstone"
        elif rho_b > 2.6 and cnl < 30:
            return "dolomite"
        elif rho_b > 2.7 and cnl > 35:
            return "shale"
        else:
            return "unknown_or_mixed"

# 实际应用示例
crossplot_analyzer = DensityNeutronCrossplot()

# 分析多个深度点的岩性
samples = [
    {"depth": 1200.0, "rho_b": 2.35, "cnl": 32},
    {"depth": 1201.0, "rho_b": 2.48, "cnl": 36},
    {"depth": 1202.0, "rho_b": 2.72, "cnl": 28}
]

print("密度中子交会分析结果:")
for sample in samples:
    result = crossplot_analyzer.analyze_sample(
        sample["rho_b"], 
        sample["cnl"]
    )
    print(f"深度{sample['depth']}: {result}")

3.2 声波测井参数应用

声波测井测量纵波传播时间,与岩石弹性性质密切相关。

物理基础

声波时差 Δt\Delta tΔt 定义为:
Δt=LVp\Delta t = \frac{L}{V_p}Δt=VpL

其中 LLL 为声程距离,VpV_pVp 为纵波速度。

Gardner关系式建立了速度与密度的经验联系:
Vp=a⋅ρb,b=0.5V_p = a \cdot \rho^b, \quad b = 0.5Vp=aρb,b=0.5

参数应用分析

声波测井可用于:

  • 孔隙度计算:通过声波时差与标准岩石对比
  • 岩性识别:不同骨架密度产生不同的速度响应
  • 裂缝检测:各向异性导致双折射现象
class SonicLoggingAnalyzer:
    def __init__(self):
        # 参考参数(石灰岩)
        self.reference_delta_t = 54.0  # µs/m
        
    def calculate_porosity(self, delta_t_measured, depth):
        """计算声波孔隙度"""
        if delta_t_measured <= 0:
            return None
            
        porosity = (delta_t_measured - self.reference_delta_t) / \
                   (self.reference_delta_t * 0.5)
        
        # 限制在物理范围内
        return max(0, min(1, porosity))
    
    def estimate_velocity(self, density):
        """基于Gardner关系估算速度"""
        a = 1684.79  # Gardner方程系数
        b = 0.5
        velocity = a * (density ** b)
        return velocity
    
    def analyze_anisotropy(self, delta_t_fast, delta_t_slow):
        """分析各向异性(裂缝指示)"""
        if delta_t_fast <= 0:
            return None
            
        anisotropy_ratio = delta_t_slow / delta_t_fast
        ellipticity = (delta_t_slow - delta_t_fast) / delta_t_fast
        
        # 判断是否存在显著裂缝
        has_cracks = anisotropy_ratio > 1.15
        
        return {
            "fast_time": delta_t_fast,
            "slow_time": delta_t_slow,
            "ratio": anisotropy_ratio,
            "ellipticity": ellipticity,
            "crack_indicator": has_cracks
        }

# 声波测井数据示例分析
sonic_analyzer = SonicLoggingAnalyzer()

well_data = [
    {"depth": 1205.0, "dt": 62.5},
    {"depth": 1206.0, "dt": 58.3},
    {"depth": 1207.0, "dt": 49.8},
]

print("\n声波测井参数分析:")
for record in well_data:
    porosity = sonic_analyzer.calculate_porosity(record["dt"], record["depth"])
    print(f"深度{record['depth']}: Δt={record['dt']:.1f} µs/m, "
          f"孔隙度={porosity*100:.1f}%")

# 各向异性分析示例
crack_data = {
    "delta_t_fast": 63.5,
    "delta_t_slow": 72.8
}
anisotropy_result = sonic_analyzer.analyze_anisotropy(
    crack_data["delta_t_fast"], 
    crack_data["delta_t_slow"]
)

if anisotropy_result:
    print(f"\n各向异性分析:")
    print(f"  快慢时比: {anisotropy_result['ratio']:.2f}")
    print(f"  裂缝指示: {'存在' if anisotropy_result['crack_indicator'] else '不存在'}")

3.3 资源储量评估流程

技术体系概述

油气储量评估遵循标准化的国际规范(如PRMS标准),主要包括:

  1. 地质建模:构建三维储层模型
  2. 体积计算:确定有效孔隙空间
  3. 含流体饱和度确定:基于测井数据
  4. 采收率估算:考虑开发方案影响

储量计算公式

原始地质储量(OGIP):
N=100⋅A⋅h⋅ϕ⋅(1−Swi)BoN = \frac{100 \cdot A \cdot h \cdot \phi \cdot (1 - S_{wi})}{B_o}N=Bo100Ahϕ(1Swi)

其中各参数含义为:

  • AAA:油藏面积(acres)
  • hhh:有效厚度(ft)
  • ϕ\phiϕ:平均孔隙度
  • SwiS_{wi}Swi:初始含水饱和度
  • BoB_oBo:原始油气比

数值实现与数据处理

class ReserveEstimation:
    def __init__(self):
        # 单位转换系数
        self.conversion = {
            "acres_to_m2": 4046.86,
            "feet_to_m": 0.3048,
            "barrel_to_m3": 0.158987
        }

    def calculate_ogip(self, area_acres, effective_thickness_ft, 
                       porosity, initial_water_saturation, formation_volume_factor):
        """计算原始地质储量(标准油桶)"""
        
        # 确保参数有效性
        if any(p < 0 or p > 1 for p in [porosity, initial_water_saturation]):
            raise ValueError("饱和度或孔隙度必须在[0,1]范围内")
            
        # 计算净含油体积(立方米)
        net_oil_volume = area_acres * self.conversion["acres_to_m2"] \
                        * effective_thickness_ft * self.conversion["feet_to_m"] \
                        * porosity * (1 - initial_water_saturation)
        
        # 转换为标准油桶
        ogip_barrels = net_oil_volume / formation_volume_factor / \
                       self.conversion["barrel_to_m3"]
        
        return {
            "net_oil_volume_m3": round(net_oil_volume, 2),
            "ogip_barrels": round(ogip_barrels, 0)
        }

    def analyze_uncertainty(self, mean_value, std_deviation, confidence_level):
        """分析储量不确定性"""
        
        # 置信区间计算(假设正态分布)
        z_scores = {
            "95%": 1.96,
            "90%": 1.645,
            "80%": 1.282
        }
        
        z = z_scores.get(confidence_level, 1.96)
        lower_bound = mean_value - z * std_deviation
        upper_bound = mean_value + z * std_deviation
        
        return {
            "confidence_interval": f"{lower_bound:.0f} - {upper_bound:.0f}",
            "relative_uncertainty": (upper_bound - lower_bound) / mean_value * 100
        }

# 实际评估案例数据
reserve_data = {
    "area_acres": 2500,
    "effective_thickness_ft": 85.3,
    "porosity_mean": 0.24,
    "porosity_std": 0.06,
    "initial_water_saturation": 0.28,
    "formation_volume_factor": 1.25
}

# 计算原始地质储量
calculation = ReserveEstimation()
result = calculation.calculate_ogip(
    reserve_data["area_acres"],
    reserve_data["effective_thickness_ft"],
    reserve_data["porosity_mean"],
    reserve_data["initial_water_saturation"],
    reserve_data["formation_volume_factor"]
)

print(f"原始地质储量评估结果:")
print(f"  净含油体积: {result['net_oil_volume_m3']:.2f} m³")
print(f"  OGIP: {result['ogip_barrels']:,.0f} 标准桶")

# 不确定性分析
uncertainty = calculation.analyze_uncertainty(
    result["ogip_barrels"],
    reserve_data["porosity_std"] * result["ogip_barrels"],
    "95%"
)
print(f"\n95%置信区间: {uncertainty['confidence_interval']}")

# 多情景评估
scenarios = [
    {"name": "乐观", "thickness_ft": 100, "porosity": 0.28},
    {"name": "基准", "thickness_ft": 85.3, "porosity": 0.24},
    {"name": "悲观", "thickness_ft": 60, "porosity": 0.18}
]

print(f"\n多情景评估对比:")
for scenario in scenarios:
    result = calculation.calculate_ogip(
        reserve_data["area_acres"],
        scenario["thickness_ft"],
        scenario["porosity"],
        reserve_data["initial_water_saturation"],
        reserve_data["formation_volume_factor"]
    )
    print(f"  {scenario['name']:8s}: {result['ogip_barrels']:,.0f} 桶")

储量分类体系

按照PRMS标准,储量分为:

  • 探明储量(Proven):高置信度(90%),可经济开采
  • 概略储量(Probable):中等置信度(50%)
  • 可能储量(Possible):较低置信度(10%)
def classify_reserves(estimated_value, confidence_percentage):
    """根据置信度分类储量"""
    
    if confidence_percentage >= 90:
        category = "Proven (探明)"
        color_code = "#28a745"  # 绿色
    elif confidence_percentage >= 50:
        category = "Probable (概略)"
        color_code = "#ffc107"  # 黄色
    else:
        category = "Possible (可能)"
        color_code = "#dc3545"  # 红色
    
    return {
        "category": category,
        "confidence_level": confidence_percentage,
        "color": color_code
    }

# 储量分类示例
reserves_summary = [
    {"value": 125000000, "confidence": 92},
    {"value": 78500000, "confidence": 65},
    {"value": 32000000, "confidence": 45}
]

print("\n储量分类汇总:")
for item in reserves_summary:
    classification = classify_reserves(
        item["value"], 
        item["confidence"]
    )
    print(f"  {classification['category']:20s}: "
          f"{item['value']:>12,} 桶 (置信度:{item['confidence']}%)")

# 经济可行性初步筛选
def economic_screening(ogip_barrels, operating_cost_per_bbl):
    """基于简单经济模型进行储量筛选"""
    
    # 典型参数假设
    oil_price = 70.0  # USD/barrel
    breakeven_cost = 45.0  # USD/barrel
    
    net_revenue_per_barrel = max(0, oil_price - operating_cost_per_bbl)
    total_value = ogip_barrels * net_revenue_per_barrel
    
    return {
        "net_revenue_per_barrel": round(net_revenue_per_barrel, 2),
        "total_projected_value": round(total_value / 1e6, 2),  # 百万美元
        "economically_viable": total_value > 0
    }

# 经济评估示例
economic_analysis = economic_screening(
    reserve_data["ogip_barrels"],  # 使用之前计算的OGIP值
    breakeven_cost=45.0
)

综合岩性解释与资源评价是石油地质工作的核心环节,通过密度、声波等多物理量测井数据的综合分析,结合规范的储量评估流程,可实现从地质认识到商业决策的科学转化。这些技术方法在油气田勘探开发的全生命周期中都发挥着关键作用。

【本章完】

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐