SimPEG - Geophysical Simulation & Inversion
Quick Reference
python
from discretize import TensorMesh from simpeg.electromagnetics.static import resistivity as dc from simpeg import maps, data_misfit, regularization, optimization from simpeg import inverse_problem, inversion, directives import numpy as np # Create mesh hx, hz = np.ones(100) * 10, np.ones(50) * 5 mesh = TensorMesh([hx, hz], origin='CN') # Forward model simulation = dc.Simulation2DNodal(mesh, survey=survey, sigmaMap=maps.ExpMap(mesh)) dpred = simulation.dpred(model) # Inversion dmis = data_misfit.L2DataMisfit(data=data, simulation=simulation) reg = regularization.WeightedLeastSquares(mesh) opt = optimization.InexactGaussNewton(maxIter=20) inv_prob = inverse_problem.BaseInvProblem(dmis, reg, opt) inv = inversion.BaseInversion(inv_prob, directiveList=[...]) mrec = inv.run(m0)
Key Classes
| Class | Purpose |
|---|---|
TensorMesh, TreeMesh | Discretization (regular grid, adaptive octree) |
Survey | Data acquisition geometry |
Simulation | Forward modeling engine |
Data | Observed/predicted data container |
InvProblem | Combines misfit, regularization, optimization |
Essential Operations
Create Mesh
python
from discretize import TensorMesh # 2D mesh (x, z) - centered in x, top at z=0 hx, hz = np.ones(100) * 20, np.ones(50) * 10 mesh = TensorMesh([hx, hz], origin='CN') # 3D mesh mesh = TensorMesh([np.ones(50)*25, np.ones(50)*25, np.ones(30)*10], origin='CCN')
DC Resistivity Survey
python
from simpeg.electromagnetics.static import resistivity as dc
elec_locs = np.c_[np.linspace(-95, 95, 20), np.zeros(20)]
source_list = []
for i in range(17): # dipole-dipole
rx = dc.receivers.Dipole(elec_locs[[i+2]], elec_locs[[i+3]])
src = dc.sources.Dipole([rx], elec_locs[i], elec_locs[i+1])
source_list.append(src)
survey = dc.Survey(source_list)
Forward Model
python
model = np.ones(mesh.nC) * 100 # 100 ohm-m simulation = dc.Simulation2DNodal(mesh, survey=survey, sigmaMap=maps.ExpMap(mesh)) dpred = simulation.dpred(np.log(1/model)) # input: log(conductivity)
Inversion
python
from simpeg import data_misfit, regularization, optimization from simpeg import inverse_problem, inversion, directives, data obs_data = data.Data(survey, dobs=dobs, standard_deviation=0.05*np.abs(dobs)) dmis = data_misfit.L2DataMisfit(data=obs_data, simulation=simulation) reg = regularization.WeightedLeastSquares(mesh, alpha_s=1e-4, alpha_x=1, alpha_z=1) opt = optimization.InexactGaussNewton(maxIter=20) inv_prob = inverse_problem.BaseInvProblem(dmis, reg, opt) dir_list = [directives.BetaSchedule(coolingFactor=2), directives.TargetMisfit()] inv = inversion.BaseInversion(inv_prob, directiveList=dir_list) mrec = inv.run(m0)
Common Maps
| Map | Description | Use Case |
|---|---|---|
IdentityMap | No transformation | Susceptibility, density |
ExpMap | exp(m) | Log-parameterized conductivity |
ReciprocalMap | 1/m | Resistivity to conductivity |
Wires | Split model | Joint inversion |
Physical Property Ranges
| Property | Typical Range | Units |
|---|---|---|
| Resistivity | 1 - 10000 | ohm-m |
| Conductivity | 0.0001 - 1 | S/m |
| Susceptibility | 0 - 0.1 | SI |
| Density contrast | -1 to 1 | g/cc |
Tips
- •Use log parameters for positive quantities (resistivity, susceptibility)
- •Start with coarse mesh and refine after initial tests
- •Check data fit by plotting observed vs predicted
- •Tune regularization to balance data fit and model smoothness
- •Use TreeMesh for 3D problems to improve efficiency
References
- •Survey Types - Survey configurations and receiver types
- •Mesh Types - Mesh discretization and refinement
Scripts
- •scripts/dc_inversion.py - Complete DC resistivity inversion example