Skip to content

oimero/xihu_inversion_workflow

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

笔记

![](data\diagrams\Used Well.bmp)


Week1

  • well_import.ipynb: 尝试用 lasio 库导入 Petrel 导出的测井曲线

    • 输入: *.las
  • well_visualize.ipynb: 尝试可视化测井曲线以及解释层位

  • well_horizon_preprocess.ipynb: 尝试删除一些明显异常的(或者不想要的)井或层位

    • 输入: well_horizon.xlsx
    • 输出: well_horizon_processed.xlsx
  • well_find_common_logs.ipynb: 尝试查看井有哪些共同曲线

    • 输入: vertical_well_las/*.las
  • well_extract_common_logs.ipynb: 尝试提取井的共同曲线

    • 输入: vertical_well_las/*.las
    • 输出: vertical_well_common_las/*.las
  • sand_group_thickness: 尝试获得砂组级层位砂厚的统计信息

    • 输入: well_horizon_processed.xlsx
    • 输出: sand_group_thickness_complete.xlsx(砂组级层位砂厚的统计信息)
  • well_log_truncate.ipynb: 尝试截断到目的层曲线

    • 输入: vertical_well_common_las/*.las,sand_group_thickness_complete.xlsx
    • 输出: vertical_well_truncated_las/*.las
  • cali_check.ipynb: 尝试通过众数或者直方图检查钻头的基础尺寸 → 12.25 in

  • well_log_delete_outliers.ipynb: 尝试剔除测井曲线的一些异常值

    • 输入: vertical_well_truncated_las/*.las
    • 输出: vertical_well_las_delete_outliers/*.las

Week2

  • well_log_delete_outliers_by_layers.ipynb: 尝试分层剔除测井曲线的一些异常值

    • 输入: vertical_well_truncated_las/*.las
    • 输出: vertical_well_las_delete_outliers_by_layers/*.las
  • well_visualize_test.ipynb: 测试可视化测井曲线以及解释层位的函数,并集中可视化

  • well_log_baseline_correction: (SUSPEND)尝试对测井曲线做基线校正

    • 问题1: 需要做吗?→ 一般对 SP 曲线做基线校正,暂时用不着 SP

  • well_correlation_analysis.ipynb: (TODO)分层位分析测井曲线之间的相关性,热力图&交会图

    • 问题1: 部分井缺层位?→ 将解释层位更换到了5月23日提供的版本,现在不缺了
  • seismic_import.ipynb: 试着用 pyzgy 库导入地震数据

    • 输入: obn-yuan.zgy
  • forward_correlation_analysis.ipynb: (DONE)卷积正演,然后分析正演波形与井旁道地震波形的相关性

    • 问题1: 要把井转换到时间域。但是,构建速度模型时,怎么知道井的第一个解释层位要对到地震上的哪个时间采样点?
    • 前提1: 别忘了对波阻抗做地震频带的带通
    • 问题2: 怎么获得用于卷积的小波?
  • borehole_correction: (SUSPEND)根据测井曲线之间的相关性,对扩径段DT和DEN进行拟合


Week3 & Week4

参考: Tschannen V, Ghanim A, Ettrich N. Partial automation of the seismic to well tie with deep learning and Bayesian optimization[J]. Computers & Geosciences, 2022, 164: 105120.

  • 01_Data_Import.ipynb: 加载数据并将其存储到 wtie 的内部格式中

  • 02_Introduction_to_wtie.ipynb: 超参数未经过贝叶斯优化的井震标定

  • 03_Auto_Well_Tie.ipynb: 超参数经过贝叶斯优化的井震标定


Week5

  • wtie_import_logs.ipynb: 尝试加载测井曲线数据并将其存储到 wtie 的内部格式中

  • wtie_import_seismic.ipynb: 尝试加载井旁道地震数据并将其存储到 wtie 的内部格式中

  • wtie_grid_time_depth_md_version_test.ipynb: 尝试修改原代码的时深关系表数据结构,以支持导入md

  • well_log_sampling_rate_check.ipynb: (DONE)检查测井曲线的采样间隔是否一致

  • wtie_import_time_depth_table.ipynb: 尝试加载时深关系表数据并将其存储到 wtie 的内部格式中,顺便测试已有的时深转换


Week6

  • 做两个最坏假设:

    1. 初始的时深不准且偏移较大
    2. 深度学习提取的子波完全无法使用
  • wtie_02_first_try.ipynb: 尝试复刻 02_Introduction_to_wtie.ipynb

    • 结果: PH1、PH4不可用,PH3能对上(但振幅对不上,相关性不高),PH2、PH5的时深数据报错,疑似TWT没有递增
    • 分析1: PH3的声波和密度曲线的尖峰明显少于PH1、PH4
    • 分析2: 对PH2、PH5的时深数据进行修正后,也能对上(但振幅对不上,相关性不高)
    • 分析3:总体来说,PH5对得最好(除了下部由于扩径导致的明显异常),PH3的曲线最好(扩径较少)
  • series_increase_check.ipynb: 检查序列是否严格递增,并自动修正不严重的情况

  • wtie_03_first_try.ipynb: 尝试复刻 03_Auto_Well_Tie.ipynb

    • 结果:PH3最终的子波的相位不是很美好,PH2和PH5还可以

工具函数

Week1

  • visualize.plotter: 可视化相关
    • plot_well_log: 可视化测井曲线以及解释层位

Week2

  • utils.statistics: 剔除测井曲线的先验异常值和统计异常值

Week3 & Week4

  • wtie.*: 参考上述论文,加入对应开源库(开源协议: GPL3)

Week5

  • wtie.processing.grid: 定义数据结构和坐标系统,为地球物理中的一维信号(如测井曲线、地震道、子波)提供了统一的抽象类,并处理这些数据在不同域(时间域 TWT、深度域 TVDSS/MD)之间的转换、重采样和对齐

    • A. 核心数据容器类

      • BaseTrace: 所有一维数据的基类。
        • 功能: 封装了 values (数值) 和 basis (坐标轴,如时间或深度)。它继承自 pd.Series 的概念,支持切片、加减乘除运算,并强制检查采样率是否均匀。
      • Log: 继承自 BaseTrace,专门表示测井曲线(如声波 Vp, 密度 Rho)。
      • Seismic / Reflectivity / Wavelet: 分别表示地震道、反射系数序列和子波。
      • BasePrestackTrace & 子类: 用于处理叠前数据(Pre-stack),即包含不同角度(Angle Gathers)的道集数据。
      • LogSet:
        • 功能: 一个容器,用于存放属于同一口井的一组测井曲线(必须包含 Vp 和 Rho)。
        • 特性: 自动计算 AI (波阻抗)Vp/Vs 比
    • B. 几何与坐标转换类

      • (UPDATE)TimeDepthTable (时深关系表):
        • 功能: 管理双程走时 (TWT) 与 垂直深度 (TVDSS) 之间的映射关系。
        • 关键方法: temporal_interpolation (插值到均匀时间采样), slope_velocity_twt (计算层速度)。
      • WellPath (井轨迹):
        • 功能: 管理测量深度 (MD) 与 垂直深度 (TVDSS) 的关系,处理井的造斜/偏差。
        • 关键方法: md_interpolation, get_tvdkb_from_inclination (从井斜角计算垂直深度)。
    • C. 核心处理函数

      • (UPDATE)convert_log_from_md_to_tvdss_to_twt:
        • 功能: 利用井轨迹和时深关系表,将测井曲线从 测量深度 (MD) 域转换到 时间 (TWT) 域。
      • (UPDATE)convert_log_from_md_to_twt:
        • 功能: 仅利用时深关系表,将测井曲线从 测量深度 (MD) 域转换到 时间 (TWT) 域。
      • resample_trace / downsample_trace / upsample_trace:
        • 功能: 处理采样率变换(例如将测井的高频采样降采样到地震数据的 2ms 或 4ms)。
      • lowpass_filter_trace: 对数据应用低通滤波(Butterworth 滤波器)。
      • get_matching_traces: 截取两条曲线的公共部分,使它们在坐标轴上对齐,便于计算相关性。
  • wtie.processing.logs: 预处理测井曲线,包括去除噪声尖峰、平滑数据、插值填充缺失值以及对数据进行块化处理

    • despike:

      • 功能: 去除数据中的尖峰噪声。
      • 原理: 它使用中值滤波(medfilt)作为基线,计算原始数据与基线的偏差。如果偏差超过设定的阈值,该点就被视为尖峰并替换为 NaN(非数字)。
    • interpolate_nans:

      • 功能: 填充数组中的 NaN 缺失值。
      • 原理: 利用 pandas 库的 interpolate 功能进行插值。通过执行一次正向插值和一次反向插值,以确保数组开头和结尾的 NaN 也能被有效填充。
    • smooth:

      • 功能: 对数据进行平滑处理。
      • 原理: 内部调用 scipy 的高斯滤波器(gaussian_filter1d)。它能智能处理含有 NaN 的数组,通过一种加权平均的方法在平滑时忽略 NaN 值的影响。
    • smoothly_interpolate_nans:

      • 功能: 一种更稳健的 NaN 插值方法。
      • 原理: 这是一个组合流程: 首先对数据进行去尖峰(despike)和平滑(smooth),然后在处理过的数据上进行插值,最后用插值得到的结果填补原始数据中的 NaN
    • blocking:

      • 功能: 对数据进行“块化”或“分段”处理。
      • 原理: 该函数首先根据数据点的变化率阈值(threshold)和最大段长度(maximum_length)将连续的数据分割成若干段。然后,用每段数据的平均值(算术或调和平均)来替换该段内的所有原始值,从而生成阶梯状的“块状”曲线。@njit 装饰器表示它使用了 numba 库进行了即时编译优化,以提高计算速度。

Week6

  • utils.load: 数据加载相关

    • query_well_info: 利用包含井点-层位-MD-TWT的excel表查询所需的信息
    • import_logs:导入测井曲线
    • import_seismic:导入井旁道地震
    • import_time_depth_table:导入时深关系表
  • wtie.optimize.tie:提供一组高层级的实用函数,用于执行井震标定的各个关键步骤。作为“协调者”,将底层的测井处理(_logs)、子波提取(_wavelet)和相似性计算(_similarity)逻辑串联起来,向用户或上层应用提供简单清晰的接口,以完成从测井数据处理到合成记录生成的全过程

    • A.数据预处理与转换

      • resample_seismic(seismic, dt): 对地震数据进行重采样(通常使用 Sinc 插值)。
      • filter_md_logs(logset, **kwargs): 在测量深度(MD)域对测井曲线进行滤波处理(如去噪)。
      • convert_logs_from_md_to_twt(...): 核心步骤。利用时深关系表(Time-Depth Table)将测井曲线从深度域转换到双程走时(TWT)域,并进行重采样。
    • B.反射系数计算

      • compute_reflectivity(logset, angle_range): 计算反射系数序列。
        • 如果未提供角度范围,计算垂直入射反射系数(R0,声学)。
        • 如果提供了 angle_range,则计算叠前/随角度变化的反射系数(Rpp)。
    • C.数据对齐

      • match_seismic_and_reflectivity(seismic, reflectivity): 截取地震道和反射系数序列,使它们在时间轴上重叠/对齐,确保后续计算在有效范围内进行。
    • D.子波提取

      • compute_wavelet(...): 这是文件中最复杂的函数。它负责提取或估算地震子波。
        • 支持类型: 支持叠后(Post-stack)和叠前(Pre-stack)数据。
        • 提取策略:
          • expected_value=True: 计算期望子波(可能是基于贝叶斯或统计方法)。
          • expected_value=False: 使用网格搜索(Grid Search)寻找最佳子波。
        • 标定/缩放: 如果 scaling=True,它会计算子波的绝对缩放因子,使合成记录能量与实际地震匹配。
    • E.正演模拟

      • compute_synthetic_seismic(...): 利用提取的子波和反射系数,通过卷积模型生成合成地震记录(Synthetic Seismogram)。
  • wtie.optimize.logs:处理测井曲线、时深关系以及生成合成地震记录的相关函数,包含了数据清洗、时深转换、扰动分析(用于不确定性分析)以及正演模拟的封装

    • A. 测井曲线处理 (Logs Processing)

      • filter_logs / filter_log:
        • 功能: 对测井曲线进行去野值(despike)、插值(interpolate)和平滑(smooth)。
        • 作用: 提高数据质量,去除高频噪声,为合成记录制作做准备。
      • block_logs:
        • 功能: 对测井曲线进行“分块化”或“粗化”处理(Backus Averaging 的一种形式)。
        • 作用: 将高分辨率的测井数据转换为层状模型,常用于地震反演前的模型构建。
      • update_log_values: 辅助函数,用于更新 Log 对象中的数值数组。
    • B. 时深关系与扰动 (Time-Depth Tables & Perturbation)

      • get_tdt_from_vp:
        • 功能: 根据速度曲线(Vp)积分计算时深关系表(TDT)。
        • 作用: 建立深度域(MD/TVD)与时间域(TWT)的桥梁。
      • OLDget_perturbed_time_depth_tables / OLD_get_pertubed_tdt_from_vp:
        • 功能: 生成一系列“扰动”后的时深关系表。通过对多项式系数添加随机噪声来实现。
        • 作用: 用于蒙特卡洛模拟或不确定性分析,探索不同的时深关系对井震标定的影响。(注:OLD 前缀暗示这可能是旧版或实验性实现)。
      • old_temporal_strech_squeeze: 对时深表进行拉伸或压缩,用于手动调整井震匹配。
    • C. 正演模拟与合成记录 (Forward Modeling)

      • compute_acoustic_relfectiviy:
        • 功能: 计算垂直入射的声波反射系数(基于 Vp 和 Rho)。
      • compute_prestack_reflectivity:
        • 功能: 计算叠前(不同角度)的反射系数(基于 Vp, Vs, Rho)。
      • compute_synthetic_seismic:
        • 功能: 将子波(Wavelet)与反射系数进行卷积,生成叠后合成地震记录。
      • compute_synthetic_prestack_seismic:
        • 功能: 生成叠前合成地震道集(AVO 分析)。
    • D. 域转换 (Domain Conversion)

      • convert_logs_from_md_to_tvdss: 将测井曲线从测量深度(MD)转换为垂深(TVDSS)。
      • convert_logs_from_md_to_twt: 将测井曲线从深度域转换为双程旅行时(TWT)域。
  • wtie.optimize.wavelet: 在已知反射系数和地震数据的情况下,利用深度学习模型、贝叶斯优化等方法估计、搜索并优化地震子波

    • A. 子波预测与生成 (基于深度学习模型)

      • compute_expected_wavelet(...):
        • 利用 evaluator(深度学习评估器)根据输入的地震和反射系数预测一个“期望子波”。
        • 支持计算子波的不确定性(通过多次采样 sample_n_times 计算均值和方差)。
        • 支持极性反转和零相位化。
      • compute_expected_prestack_wavelet(...):
        • 针对叠前数据(不同角度/偏移距),对每个角度分别调用上述函数生成子波集合。
    • B. 子波搜索与择优 (Grid Search)

      • grid_search_best_wavelet(...):
        • 暴力搜索策略:从模型中采样 num_wavelets 个子波。
        • 正演模拟:将每个子波与反射系数卷积生成合成地震记录。
        • 匹配度评分:计算合成记录与实际地震记录的相似度(如互相关)。
        • 相位约束:在相似度高的子波中,倾向于选择相位较小(更接近零相位)的子波。
      • grid_search_best_prestack_wavelet(...):
        • 对叠前数据的每个角度道集执行上述网格搜索。
    • C. 子波优化与缩放 (Bayesian Optimization)

      • scale_wavelet(...):
        • 核心优化逻辑:使用 AxClient(贝叶斯优化)寻找一个最佳标量(Scaler)。
        • 目标:最小化合成地震记录能量与实际地震记录能量之间的差异。
        • 混合策略:结合了 Sobol 序列(随机探索)和 BoTorch(贝叶斯利用)。
      • scale_prestack_wavelet(...):
        • 对叠前数据的每个角度分别进行能量标定优化。
    • D. 辅助与正演工具

      • compute_synthetic_seismic(...): 执行卷积操作(正演),生成合成地震记录。
      • zero_phasing_wavelet(...): 将子波转换为零相位子波。
      • get_spectrum(...) / get_phase(...): 计算子波的频谱和相位谱。
      • _preprocess_...: 数据归一化和张量形状调整,适配神经网络输入。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published