mcpField
D
devito

devito

github.com/steadfastasart数据与数据库7358 次安装6 周前更新
代码仓库

关于 devito

Devito 是用于符号化偏微分方程求解的 Python 技能,面向地震波传播模拟和地震成像研究。它将符号方程转为计算算子,并生成优化代码以运行有限差分计算。

主要功能

  1. 01定义计算网格与空间、时间场
  2. 02用符号表达式构建差分方程
  3. 03配置震源注入与接收点插值
  4. 04编译并运行计算算子
  5. 05生成优化的计算代码

适用场景

  1. 01模拟声学波传播
  2. 02构建全波形反演或逆时偏移流程
  3. 03测试震源与接收点配置
  4. 04运行大规模地震成像计算

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/steadfastasart/geoscience-skills --skill devito

安装后在 Claude Code 中输入/devito确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
operators.md
performance.md
scripts/
acoustic_wave.py

详细介绍

Devito - 符号 PDE 求解器

快速参考

from devito import Grid, Function, TimeFunction, Eq, solve, Operator

# Create grid
grid = Grid(shape=(101, 101), extent=(1000., 1000.))

# Velocity model
v = Function(name='v', grid=grid, space_order=4)
v.data[:] = 1500.

# Wavefield
p = TimeFunction(name='p', grid=grid, time_order=2, space_order=4)

# Wave equation: d2p/dt2 = v^2 * laplacian(p)
stencil = Eq(p.forward, solve(p.dt2 - v**2 * p.laplace, p.forward))

# Compile and run
op = Operator([stencil])
op(time_M=100, dt=0.5)

主要类

类用途
Grid定义计算域
Function网格上的空间场
TimeFunction随时间变化的场
SparseTimeFunction点源/接收器
Operator编译后的计算内核

基本操作

网格和场
from devito import Grid, Function, TimeFunction

# 2D/3D Grid
grid = Grid(shape=(nx, nz), extent=(x_size, z_size))

# Velocity model (spatial field)
v = Function(name='v', grid=grid, space_order=4)
v.data[:] = 1500.

# Wavefield (time-dependent)
p = TimeFunction(name='p', grid=grid, time_order=2, space_order=4)
源和接收器
from examples.seismic import RickerSource, Receiver, TimeAxis

time_range = TimeAxis(start=0., stop=1000., step=dt)

# Source
src = RickerSource(name='src', grid=grid, f0=10., npoint=1, time_range=time_range)
src.coordinates.data[0, :] = [500., 20.]

# Receivers
rec = Receiver(name='rec', grid=grid, npoint=101, time_range=time_range)
rec.coordinates.data[:, 0] = np.linspace(0., 1000., 101)
rec.coordinates.data[:, 1] = 20.
构建和运行
# Wave equation
stencil = Eq(p.forward, solve(p.dt2 - v**2 * p.laplace, p.forward))
src_term = src.inject(field=p.forward, expr=src * dt**2 * v**2)
rec_term = rec.interpolate(expr=p)

# Compile and execute
op = Operator([stencil] + src_term + rec_term)
op(time_M=nt-1, dt=dt)

# Results
shot_record = rec.data        # (nt, nrec)
snapshot = p.data[0]          # Current wavefield

符号导数

语法描述
p.dt, p.dt2一阶/二阶时间导数
p.dx, p.dy, p.dz空间导数
p.laplace拉普拉斯算子(自动适配维度)
p.forwardt+dt 时刻的 p(时间步进)
p.backwardt-dt 时刻的 p(伴随)

稳定性和精度

CFL 条件:dt < dx / (v_max * sqrt(ndim))

维度最大 dt
2Ddx / (v_max * 1.414)
3Ddx / (v_max * 1.732)
空间阶数模板点数误差
23O(h^2)
45O(h^4)
89O(h^8)

阶数越高,精度越高,但速度越慢。生产环境中建议使用 4-8 阶。

适用场景与替代方案

场景建议
地震波传播(声学/弹性)Devito - 符号 PDE,自动优化代码
全波形反演(FWI)或逆时偏移(RTM)Devito - 支持伴随计算,可用于 GPU
遗留地震处理流水线Madagascar - 成熟稳定,脚本库丰富
简单的 1D/2D 波动演示Custom NumPy - 无依赖,更易调试
通用 PDE 求解(非波动问题)FEniCS - 基于 FEM,支持更广泛的 PDE
大规模生产级地震成像Devito - 生成优化的 C 代码,支持 MPI

选择 Devito 的情况:需要高性能有限差分波传播,并使用符号方程进行描述。它可以根据 Python 层面的数学表达式自动生成优化的 C/OpenMP/GPU 代码,非常适合 FWI、RTM 和研究原型开发。

避免使用 Devito 的情况:需要有限元方法(使用 FEniCS),或只需 NumPy 就能实现的简单教学示例。

常见工作流

使用源和接收器进行声波正演建模
  • 定义 Grid,其形状和物理范围应与速度模型匹配
  • 创建速度 Function,并填入模型值
  • 为波场创建 TimeFunction(time_order=2,space_order=4+)
  • 验证 CFL 条件:dt < dx / (v_max * sqrt(ndim))
  • 构建波动方程模板:Eq(p.forward, solve(p.dt2 - v**2 * p.laplace, p.forward))
  • 创建源(RickerSource)和接收器,并设置坐标
  • 添加源注入项和接收器插值项
  • 使用模板、源项和接收器项编译 Operator
  • 运行算子:op(time_M=nt-1, dt=dt)
  • 从 rec.data 提取炮集记录并绘图

参考资料

脚本

评论

支持 Markdown