askill
devito

devitoSafety 95Repository

Symbolic PDE solver with automatic code generation for finite-difference computations. Use when Claude needs to: (1) Perform seismic wave propagation modeling, (2) Implement acoustic or elastic wave equations, (3) Run forward modeling for shot gathers, (4) Set up Full Waveform Inversion (FWI) workflows, (5) Implement Reverse Time Migration (RTM), (6) Create absorbing boundary conditions, (7) Generate optimized stencil code for CPUs/GPUs, (8) Solve custom PDEs with finite differences.

13 stars
1.2k downloads
Updated 3/15/2026

Package Files

Loading files...
SKILL.md

Devito - Symbolic PDE Solver

Quick Reference

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)

Key Classes

ClassPurpose
GridComputational domain definition
FunctionSpatial field on grid
TimeFunctionTime-dependent field
SparseTimeFunctionPoint sources/receivers
OperatorCompiled computation kernel

Essential Operations

Grid and Fields

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)

Source and Receivers

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.

Build and Run

# 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

Symbolic Derivatives

SyntaxDescription
p.dt, p.dt2First/second time derivative
p.dx, p.dy, p.dzSpatial derivatives
p.laplaceLaplacian (auto-adapts to dims)
p.forwardp at t+dt (time stepping)
p.backwardp at t-dt (adjoint)

Stability and Accuracy

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

DimsMax dt
2Ddx / (v_max * 1.414)
3Ddx / (v_max * 1.732)
Space OrderStencil PointsError
23O(h^2)
45O(h^4)
89O(h^8)

Higher order = more accurate but slower. Use 4-8 for production.

When to Use vs Alternatives

ScenarioRecommendation
Seismic wave propagation (acoustic/elastic)Devito - symbolic PDE, auto-optimized code
Full Waveform Inversion (FWI) or RTMDevito - adjoint support, GPU-ready
Legacy seismic processing pipelinesMadagascar - established, large script library
Simple 1D/2D wave demosCustom NumPy - no dependencies, easier to debug
General-purpose PDE solving (non-wave)FEniCS - FEM-based, broader PDE support
Production seismic imaging at scaleDevito - generates optimized C code, MPI support

Choose Devito when: You need high-performance finite-difference wave propagation with symbolic equation specification. It auto-generates optimized C/OpenMP/GPU code from Python-level math, making it ideal for FWI, RTM, and research prototyping.

Avoid Devito when: You need finite-element methods (use FEniCS), or simple pedagogical examples where NumPy suffices.

Common Workflows

Acoustic wave forward modelling with sources and receivers

  • Define Grid with shape and physical extent matching the velocity model
  • Create velocity Function and populate with model values
  • Create TimeFunction for the wavefield (time_order=2, space_order=4+)
  • Verify CFL condition: dt < dx / (v_max * sqrt(ndim))
  • Build wave equation stencil: Eq(p.forward, solve(p.dt2 - v**2 * p.laplace, p.forward))
  • Create source (RickerSource) and receivers, set coordinates
  • Add source injection and receiver interpolation terms
  • Compile Operator with stencil + source + receiver terms
  • Run operator: op(time_M=nt-1, dt=dt)
  • Extract shot record from rec.data and plot

References

Scripts

Install

Download ZIP
Requires askill CLI v1.0+

AI Quality Score

82/100Analyzed 3/28/2026

High-quality technical skill document for Devito, a symbolic PDE solver. Provides comprehensive coverage of wave propagation modeling with excellent code examples, tables, and actionable workflows. Well-structured with clear comparisons to alternatives. Slightly docked for being narrowly scoped to geophysics (internal_only signal) and missing GPU-specific details, but otherwise a reference-style skill that would be valuable for seismic modeling tasks.

95
85
82
78
88

Metadata

Licenseunknown
Version1.0.0
Updated3/15/2026
PublisherSteadfastAsArt

Tags

ci-cd