SimPEG Documentation

Transcription

SimPEG Documentation
SimPEG Documentation
Release 0.1.9
Rowan Cockett
January 10, 2016
Contents
1
About SimPEG
1.1 Why SimPEG? . . . . .
1.2 License . . . . . . . . .
1.3 Authors . . . . . . . . .
1.4 Projects Using SimPEG
.
.
.
.
3
4
5
5
5
2
Getting Started with SimPEG
2.1 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
7
3
Discretization
3.1 SimPEG Meshes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2 Differential Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3 Inner Products . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
9
29
32
4
Forward Problems
4.1 Forward Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
39
5
Inversion
5.1 Data Misfit . .
5.2 Regularization
5.3 Optimize . . .
5.4 Directives . . .
5.5 Inversion . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
47
47
49
52
60
61
Utility Codes
6.1 Solver . . . . . .
6.2 SimPEG Maps .
6.3 Utilities . . . . .
6.4 Testing SimPEG
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
63
63
64
70
79
7
Packages
7.1 Electromagnetics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.2 Richards Equation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
83
83
90
8
Developer’s Documentation
93
9
Project Index & Search
95
6
10 Examples
97
i
10.1 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Python Module Index
ii
97
121
SimPEG Documentation, Release 0.1.9
SimPEG: Simulation and Parameter Estimation in Geophysics
SimPEG is a framework and a collection of tools that aid in the development of large-scale geophysical inversion
codes. The vision is to create a modular and extensible package for finite volume simulation and parameter estimation
with applications to geophysical imaging and subsurface flow. To enable these goals, this package has the following
features:
• is modular with respect to ... everything!
• is built with the (large-scale) inverse problem in mind
• provides a framework for geophysical and hydrogeologic problems
• supports 1D, 2D and 3D problems
• provides a set of commonly used visualization utilities
Contents
1
SimPEG Documentation, Release 0.1.9
2
Contents
3
SimPEG Documentation, Release 0.1.9
CHAPTER 1
About SimPEG
1.1 Why SimPEG?
1.1.1 The Big Picture
4
Chapter 1. About SimPEG
SimPEG Documentation, Release 0.1.9
1.1.2 Explaining The Big Picture
1.2 License
The MIT License (MIT)
Copyright (c) 2013-2015 SimPEG Developers
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1.3 Authors
• Luz Angelica Caudillo-Mata, (@lacmajedrez)
• Rowan Cockett, (@rowanc1)
• Eldad Haber, (@ehaber99)
• Lindsey Heagy, (@lheagy)
• Seogi Kang, (@sgkang)
• Dave Marchant, (@dwfmarchant)
• Gudni Rosenkjaer, (@grosenkj)
• Lars Ruthotto, (@lruthotto)
• Mike Wathen, (@mrwathen)
1.4 Projects Using SimPEG
• Electromagnetics (simpegEM)
• Potential Fields (simpegPF)
• Ground Water Flow (simpegFLOW)
• Direct Current Resistivity (simpegDC)
• Electromagnetics 1D (simpegEM1D)
• Magnetotellurics (simpegMT)
1.2. License
5
SimPEG Documentation, Release 0.1.9
6
Chapter 1. About SimPEG
CHAPTER 2
Getting Started with SimPEG
2.1 Installation
2.1.1 Dependencies
• Python 2.7
• NumPy 1.8 (or greater)
• SciPy 0.13 (or greater)
• matplotlib 1.3 (or greater)
• Cython 0.20 (or greater)
2.1.2 Installing Python
Python is available on all major operating systems, but if you are getting started with python it is best to use a package
manager such as Continuum Anaconda or Enthought Canopy. You can download the package manager and use it to
install the dependencies above.
2.1.3 Installing SimPEG
SimPEG is on pip!!:
pip install SimPEG
Installing from Source
First (you need git):
git clone https://github.com/simpeg/simpeg
Second (from the root of the simpeg repository):
python setup.py install
7
SimPEG Documentation, Release 0.1.9
2.1.4 Useful Links
An enormous amount of information (including tutorials and examples) can be found on the official websites of the
packages
• Python Website
• Numpy Website
• SciPy Website
• Matplotlib
Python for scientific computing
• Python for Scientists Links to commonly used packages, Matlab to Python comparison
• Python Wiki Lists packages and resources for scientific computing in Python
Numpy and Matlab
• NumPy for Matlab Users
• Python vs Matlab
Lessons in Python
• Software Carpentry
• Introduction to NumPy and Matplotlib
Editing Python
There are numerous ways to edit and test Python (see PythonWiki for an overview) and in our group at least the
following options are being used:
• Sublime
• iPython Notebook
• iPython
• Enthought Canopy
8
Chapter 2. Getting Started with SimPEG
CHAPTER 3
Discretization
3.1 SimPEG Meshes
The Mesh objects in SimPEG provide a numerical grid on which to solve differential equations. Each mesh type has
a similar API to make switching between different meshes relatively simple.
3.1.1 Overview of Meshes Available
The following meshes are available for use:
Tensor Mesh
class SimPEG.Mesh.TensorMesh.BaseTensorMesh(h_in, x0_in=None)
Bases: SimPEG.Mesh.BaseMesh.BaseMesh
h
h is a list containing the cell widths of the tensor mesh in each dimension.
hx
Width of cells in the x direction
hy
Width of cells in the y direction
hz
Width of cells in the z direction
vectorNx
Nodal grid vector (1D) in the x direction.
vectorNy
Nodal grid vector (1D) in the y direction.
vectorNz
Nodal grid vector (1D) in the z direction.
vectorCCx
Cell-centered grid vector (1D) in the x direction.
vectorCCy
Cell-centered grid vector (1D) in the y direction.
9
SimPEG Documentation, Release 0.1.9
vectorCCz
Cell-centered grid vector (1D) in the z direction.
gridCC
Cell-centered grid.
gridN
Nodal grid.
gridFx
Face staggered grid in the x direction.
gridFy
Face staggered grid in the y direction.
gridFz
Face staggered grid in the z direction.
gridEx
Edge staggered grid in the x direction.
gridEy
Edge staggered grid in the y direction.
gridEz
Edge staggered grid in the z direction.
getTensor(key)
Returns a tensor list.
Parameters key (str) – What tensor (see below)
Return type list
Returns list of the tensors that make up the mesh.
key can be:
'CC'
'N'
'Fx'
'Fy'
'Fz'
'Ex'
'Ey'
'Ez'
->
->
->
->
->
->
->
->
scalar field defined
scalar field defined
x-component of field
y-component of field
z-component of field
x-component of field
y-component of field
z-component of field
on cell centers
on nodes
defined on faces
defined on faces
defined on faces
defined on edges
defined on edges
defined on edges
isInside(pts, locType=’N’)
Determines if a set of points are inside a mesh.
Parameters pts (numpy.ndarray) – Location of points to test
:rtype numpy.ndarray :return inside, numpy array of booleans
getInterpolationMat(loc, locType, zerosOutside=False)
Produces interpolation matrix
Parameters
• loc (numpy.ndarray) – Location of points to interpolate to
• locType (str) – What to interpolate (see below)
Return type scipy.sparse.csr.csr_matrix
Returns M, the interpolation matrix
10
Chapter 3. Discretization
SimPEG Documentation, Release 0.1.9
locType can be:
'Ex'
'Ey'
'Ez'
'Fx'
'Fy'
'Fz'
'N'
'CC'
->
->
->
->
->
->
->
->
x-component of field
y-component of field
z-component of field
x-component of field
y-component of field
z-component of field
scalar field defined
scalar field defined
defined on edges
defined on edges
defined on edges
defined on faces
defined on faces
defined on faces
on nodes
on cell centers
class SimPEG.Mesh.TensorMesh.TensorMesh(h_in, x0=None)
Bases: SimPEG.Mesh.TensorMesh.BaseTensorMesh, SimPEG.Mesh.BaseMesh.BaseRectangularMesh,
SimPEG.Mesh.View.TensorView,
SimPEG.Mesh.DiffOperators.DiffOperators,
SimPEG.Mesh.InnerProducts.InnerProducts
TensorMesh is a mesh class that deals with tensor product meshes.
Any Mesh that has a constant width along the entire axis such that it can defined by a single width vector, called
‘h’.
hx = np.array([1,1,1])
hy = np.array([1,2])
hz = np.array([1,1,1,1])
mesh = Mesh.TensorMesh([hx, hy, hz])
Example of a padded tensor mesh using SimPEG.Utils.meshutils.meshTensor():
from SimPEG import Mesh, Utils
M = Mesh.TensorMesh([[(10,10,-1.3),(10,40),(10,10,1.3)], [(10,10,-1.3),(10,20)]])
M.plotGrid()
3.1. SimPEG Meshes
11
SimPEG Documentation, Release 0.1.9
800
700
600
x2
500
400
300
200
100
0
0
200
400
600
800
x1
1000
1200
1400
1600
For a quick tensor mesh on a (10x12x15) unit cube:
mesh = Mesh.TensorMesh([10, 12, 15])
vol
Construct cell volumes of the 3D model as 1d array.
area
Construct face areas of the 3D model as 1d array.
edge
Construct edge legnths of the 3D model as 1d array.
faceBoundaryInd
Find indices of boundary faces in each direction
cellBoundaryInd
Find indices of boundary faces in each direction
Tree Mesh
class SimPEG.Mesh.TreeMesh.TreeMesh(h, x0=None, levels=None)
Bases: SimPEG.Mesh.TensorMesh.BaseTensorMesh, SimPEG.Mesh.InnerProducts.InnerProducts
levels
12
Chapter 3. Discretization
SimPEG Documentation, Release 0.1.9
fill
How filled is the mesh compared to a TensorMesh? As a fraction: [0,1].
maxLevel
The maximum level used, which may be less than levels.
nC
nN
nF
nFx
nFy
nFz
nE
nEx
nEy
nEz
nhN
nhF
nhFx
nhFy
nhFz
nhE
nhEx
nhEy
nhEz
ntN
ntF
vntF
ntFx
ntFy
ntFz
ntE
vntE
ntEx
ntEy
ntEz
permuteCC
permuteF
permuteE
3.1. SimPEG Meshes
13
SimPEG Documentation, Release 0.1.9
refine(function=None, recursive=True, cells=None, balance=True, verbose=False, _inRecursion=False)
corsen(function=None, recursive=True, cells=None, balance=True, verbose=False, _inRecursion=False)
balance(recursive=True, cells=None, verbose=False, _inRecursion=False)
gridCC
gridN
gridFx
gridFy
gridFz
gridEx
gridEy
gridEz
vol
area
edge
number(balance=True, force=False)
faceDiv
edgeCurl
Construct the 3D curl operator.
nodalGrad
aveEx2CC
aveEy2CC
Construct the averaging operator on cell edges to cell centers.
aveEz2CC
Construct the averaging operator on cell edges to cell centers.
aveE2CC
Construct the averaging operator on cell edges to cell centers.
aveE2CCV
Construct the averaging operator on cell edges to cell centers.
aveFx2CC
aveFy2CC
aveFz2CC
aveF2CC
Construct the averaging operator on cell faces to cell centers.
aveF2CCV
Construct the averaging operator on cell faces to cell centers.
aveN2CC
point2index(locs)
14
Chapter 3. Discretization
SimPEG Documentation, Release 0.1.9
getInterpolationMat(locs, locType, zerosOutside=False)
Produces interpolation matrix
Parameters
• locs (numpy.ndarray) – Location of points to interpolate to
• locType (str) – What to interpolate (see below)
Return type scipy.sparse.csr.csr_matrix
Returns M, the interpolation matrix
locType can be:
'Ex'
'Ey'
'Ez'
'Fx'
'Fy'
'Fz'
'N'
'CC'
->
->
->
->
->
->
->
->
x-component of field
y-component of field
z-component of field
x-component of field
y-component of field
z-component of field
scalar field defined
scalar field defined
defined on edges
defined on edges
defined on edges
defined on faces
defined on faces
defined on faces
on nodes
on cell centers
plotGrid(ax=None, showIt=False, grid=True, cells=False, cellLine=False, nodes=False,
facesX=False, facesY=False, facesZ=False, edgesX=False, edgesY=False, edgesZ=False)
plotImage(I, ax=None, showIt=False, grid=False, clim=None)
plotSlice(v, vType=’CC’, normal=’Z’, ind=None, grid=True, view=’real’, ax=None, clim=None,
showIt=False, pcolorOpts={}, streamOpts={‘color’: ‘k’}, gridOpts={‘color’: ‘k’, ‘alpha’:
0.5})
Curvilinear Mesh
Cylindrical Mesh
class SimPEG.Mesh.CylMesh.CylMesh(h, x0=None, cartesianOrigin=None)
Bases: SimPEG.Mesh.TensorMesh.BaseTensorMesh, SimPEG.Mesh.BaseMesh.BaseRectangularMesh,
SimPEG.Mesh.InnerProducts.InnerProducts, SimPEG.Mesh.View.CylView
CylMesh is a mesh class for cylindrical problems
Note: for a cylindrically symmetric mesh use [hx, 1, hz]
cs, nc, npad = 20., 30, 8
hx = Utils.meshTensor([(cs,npad+10,-0.7), (cs,nc), (cs,npad,1.3)])
hz = Utils.meshTensor([(cs,npad
,-1.3), (cs,nc), (cs,npad,1.3)])
mesh = Mesh.CylMesh([hx,1,hz], [0.,0,-hz.sum()/2.])
isSymmetric
nNx
Number of nodes in the x-direction
Return type int
Returns nNx
nNy
Number of nodes in the y-direction
3.1. SimPEG Meshes
15
SimPEG Documentation, Release 0.1.9
Return type int
Returns nNy
vnFx
Number of x-faces in each direction
Return type numpy.array (dim, )
Returns vnFx
vnEy
Number of y-edges in each direction
Return type numpy.array (dim, )
Returns vnEy or None if dim < 2
vnEz
Number of z-edges in each direction
Return type numpy.array (dim, )
Returns vnEz or None if nCy > 1
nEz
Number of z-edges
Return type int
Returns nEz
vectorCCx
Cell-centered grid vector (1D) in the x direction.
vectorCCy
Cell-centered grid vector (1D) in the y direction.
vectorNx
Nodal grid vector (1D) in the x direction.
vectorNy
Nodal grid vector (1D) in the y direction.
edge
Edge lengths
area
Face areas
vol
Volume of each cell
faceDiv
Construct divergence operator (face-stg to cell-centres).
faceDivx
Construct divergence operator in the x component (face-stg to cell-centres).
faceDivy
Construct divergence operator in the y component (face-stg to cell-centres).
faceDivz
Construct divergence operator in the z component (face-stg to cell-centres).
16
Chapter 3. Discretization
SimPEG Documentation, Release 0.1.9
cellGrad
The cell centered Gradient, takes you to cell faces.
nodalGrad
Construct gradient operator (nodes to edges).
nodalLaplacian
Construct laplacian operator (nodes to edges).
edgeCurl
The edgeCurl property.
aveE2CC
Construct the averaging operator on cell edges to cell centers.
aveE2CCV
Construct the averaging operator on cell edges to cell centers.
aveF2CC
Construct the averaging operator on cell faces to cell centers.
aveF2CCV
Construct the averaging operator on cell faces to cell centers.
getInterpolationMatCartMesh(Mrect, locType=’CC’)
Takes a cartesian mesh and returns a projection to translate onto the cartesian grid.
Each mesh code follows the guiding principles that are present in this tutorial, but the details, advantages and disadvantages differ between the implementations.
3.1.2 Variable Locations and Terminology
We will go over the basics of using a TensorMesh, but these skills are transferable to the other meshes available in
SimPEG. All of the mesh generation code is located in the Mesh package in SimPEG (i.e. SimPEG.Mesh).
To create a TensorMesh we need to create mesh tensors, the widths of each cell of the mesh in each dimension. We
will call these tensors h, and these will be define the constant widths of cells in each dimension of the TensorMesh.
from SimPEG import Mesh, np
import matplotlib.pyplot as plt
hx = np.r_[3,2,1,1,1,1,2,3]
hy = np.r_[3,1,1,3]
M = Mesh.TensorMesh([hx, hy])
M.plotGrid(centers=True)
plt.show()
3.1. SimPEG Meshes
17
SimPEG Documentation, Release 0.1.9
8
7
6
x2
5
4
3
2
1
0
0
2
4
6
x1
8
10
12
14
In this simple mesh, the hx vector defines the widths of the cell in the x dimension, and starts counting from the origin
(0,0). The resulting mesh is divided into cells, and the cell-centers are plotted above as red circles. Other terminology
for this mesh are:
• cell-centers
• nodes
• faces
• edges
from SimPEG import Mesh, np
import matplotlib.pyplot as plt
hx = np.r_[3,2,1,1,1,1,2,3]
hy = np.r_[3,1,1,3]
M = Mesh.TensorMesh([hx, hy])
M.plotGrid(faces=True, nodes=True)
plt.title('Cell faces in the x- and y-directions.')
plt.legend(('Nodes', 'X-Faces', 'Y-Faces'))
plt.show()
18
Chapter 3. Discretization
SimPEG Documentation, Release 0.1.9
Cell faces in the x- and y-directions.
8
Nodes
X-Faces
Y-Faces
7
6
x2
5
4
3
2
1
0
0
2
4
6
x1
8
10
12
14
Generally, the faces are used to discretize fluxes, quantities that leave or enter the cells. As such, these fluxes have
a direction to them, which is normal to the cell (i.e. directly out of the cell face). The plot above shows that x-faces
point in the x-direction, and y-faces point in the y-direction. The nodes are shown in blue, and lie at the intersection
of the grid lines. In a two-dimensional mesh, the edges actually live in the same location as the faces, however, they
align (or are tangent to) the face. This is easier to see in 3D, when the edges do not live in the same location as the
faces. In the 3D plot below, the edge variables are seen as black triangles, and live on the edges(!) of the cell.
from SimPEG import Mesh
Mesh.TensorMesh([1,1,1]).plotGrid(faces=True, edges=True, centers=True, showIt=True)
3.1. SimPEG Meshes
19
SimPEG Documentation, Release 0.1.9
1.0
0.8
0.6 x3
0.4
0.2
0.0
0.2
0.4
x1 0.6
0.8
1.0 0.0
0.2
0.6
0.4 x2
0.8
0.0
1.0
How many of each?
When making variables that live in each of these locations, it is important to know how many of each variable type
you are dealing with. SimPEG makes this pretty easy:
In [1]: print M
---- 2-D TensorMesh ---x0: 0.00
y0: 0.00
nCx: 8
nCy: 4
hx: 3.00, 2.00, 4*1.00, 2.00, 3.00
hy: 3.00, 2*1.00, 3.00
In [2]: count = {'numCells': M.nC,
....:
'numCells_xDir': M.nCx,
....:
'numCells_yDir': M.nCy,
....:
'numCells_vector': M.vnC}
In [3]: print 'This mesh has %(numCells)d cells, which is %(numCells_xDir)d*%(numCells_yDir)d!!' % co
This mesh has 32 cells, which is 8*4!!
In [4]: print count
20
Chapter 3. Discretization
SimPEG Documentation, Release 0.1.9
{
'numCells_vector': array([8, 4]),
'numCells_yDir': 4,
'numCells_xDir': 8,
'numCells': 32
}
SimPEG also counts the nodes, faces, and edges.
Nodes: M.nN, M.nNx, M.nNy, M.nNz, M.vnN
Faces: M.nF, M.nFx, M.nFy, M.nFz, M.vnF, M.vnFx, M.vnFy, M.vnFz
Edges: M.nE, M.nEx, M.nEy, M.nEz, M.vnE, M.vnEx, M.vnEy, M.vnEz
Face and edge variables have different counts depending on the dimension of the direction that you are interested in.
In a 4x5 mesh, for example, there is a 5x5 grid of x-faces, and a 4x6 grid of y-faces. You can count them below! As
such, the vnF(x,y,z) and vnE(x,y,z) properties give the vector grid size.
from SimPEG import Mesh
Mesh.TensorMesh([4,5]).plotGrid(faces=True, showIt=True)
1.0
0.8
x2
0.6
0.4
0.2
0.0
0.0
0.2
0.4
x1
0.6
0.8
1.0
Making Tensors
For tensor meshes, there are some additional functions that can come in handy. For example, creating mesh tensors can
be a bit time consuming, these can be created speedily by just giving numbers and sizes of padding. See the example
below, that follows this notation:
3.1. SimPEG Meshes
21
SimPEG Documentation, Release 0.1.9
h1 = (
(cellSize, numPad, [, increaseFactor]),
(cellSize, numCore),
(cellSize, numPad, [, increaseFactor])
)
from SimPEG import Mesh, Utils
h1 = [(10, 5, -1.3), (5, 20), (10, 3, 1.3)]
M = Mesh.TensorMesh([h1, h1], x0='CN')
M.plotGrid(showIt=True)
0
50
x2
100
150
200
250
300
150
100
50
0
x1
50
100
150
Note: You can center your mesh by passing a ‘C’ for the x0[i] position. A ‘N’ will make the entire mesh negative,
and a ‘0’ (or a 0) will make the mesh start at zero.
Hopefully, you now know how to create TensorMesh objects in SimPEG, and by extension you are also familiar with
how to create and use other types of meshes in this SimPEG framework.
3.1.3 The API
class SimPEG.Mesh.BaseMesh.BaseMesh(n, x0=None)
BaseMesh does all the counting you don’t want to do. BaseMesh should be inherited by meshes with a regular
structure.
Parameters
22
Chapter 3. Discretization
SimPEG Documentation, Release 0.1.9
• n (numpy.array,list) – number of cells in each direction (dim, )
• x0 (numpy.array,list) – Origin of the mesh (dim, )
x0
Origin of the mesh
Return type numpy.array (dim, )
Returns x0
dim
The dimension of the mesh (1, 2, or 3).
Return type int
Returns dim
nC
Total number of cells in the mesh.
Return type int
Returns nC
from SimPEG import Mesh, np
Mesh.TensorMesh([np.ones(n) for n in [2,3]]).plotGrid(centers=True,showIt=True)
3.0
2.5
x2
2.0
1.5
1.0
0.5
0.0
0.0
0.5
1.0
x1
1.5
2.0
nN
Total number of nodes
Return type int
Returns nN
3.1. SimPEG Meshes
23
SimPEG Documentation, Release 0.1.9
from SimPEG import Mesh, np
Mesh.TensorMesh([np.ones(n) for n in [2,3]]).plotGrid(nodes=True,showIt=True)
3.0
2.5
x2
2.0
1.5
1.0
0.5
0.0
0.0
0.5
1.0
x1
1.5
2.0
nEx
Number of x-edges
Return type int
Returns nEx
nEy
Number of y-edges
Return type int
Returns nEy
nEz
Number of z-edges
Return type int
Returns nEz
vnE
Total number of edges in each direction
Return type numpy.array (dim, )
Returns [nEx, nEy, nEz]
from SimPEG import Mesh, np
Mesh.TensorMesh([np.ones(n) for n in [2,3]]).plotGrid(edges=True,showIt=True)
24
Chapter 3. Discretization
SimPEG Documentation, Release 0.1.9
3.0
2.5
x2
2.0
1.5
1.0
0.5
0.0
0.0
0.5
1.0
x1
1.5
2.0
nE
Total number of edges.
Return type int
Returns sum([nEx, nEy, nEz])
nFx
Number of x-faces
Return type int
Returns nFx
nFy
Number of y-faces
Return type int
Returns nFy
nFz
Number of z-faces
Return type int
Returns nFz
vnF
Total number of faces in each direction
Return type numpy.array (dim, )
Returns [nFx, nFy, nFz]
3.1. SimPEG Meshes
25
SimPEG Documentation, Release 0.1.9
from SimPEG import Mesh, np
Mesh.TensorMesh([np.ones(n) for n in [2,3]]).plotGrid(faces=True,showIt=True)
3.0
2.5
x2
2.0
1.5
1.0
0.5
0.0
0.0
0.5
1.0
x1
1.5
2.0
nF
Total number of faces.
Return type int
Returns sum([nFx, nFy, nFz])
normals
Face Normals
Return type numpy.array (sum(nF), dim)
Returns normals
tangents
Edge Tangents
Return type numpy.array (sum(nE), dim)
Returns normals
projectFaceVector(fV)
Given a vector, fV, in cartesian coordinates, this will project it onto the mesh using the normals
Parameters fV (numpy.array) – face vector with shape (nF, dim)
Return type numpy.array with shape (nF, )
Returns projected face vector
26
Chapter 3. Discretization
SimPEG Documentation, Release 0.1.9
projectEdgeVector(eV)
Given a vector, eV, in cartesian coordinates, this will project it onto the mesh using the tangents
Parameters eV (numpy.array) – edge vector with shape (nE, dim)
Return type numpy.array with shape (nE, )
Returns projected edge vector
class SimPEG.Mesh.BaseMesh.BaseRectangularMesh(n, x0=None)
nCx
Number of cells in the x direction
Return type int
Returns nCx
nCy
Number of cells in the y direction
Return type int
Returns nCy or None if dim < 2
nCz
Number of cells in the z direction
Return type int
Returns nCz or None if dim < 3
vnC
Total number of cells in each direction
Return type numpy.array (dim, )
Returns [nCx, nCy, nCz]
nNx
Number of nodes in the x-direction
Return type int
Returns nNx
nNy
Number of nodes in the y-direction
Return type int
Returns nNy or None if dim < 2
nNz
Number of nodes in the z-direction
Return type int
Returns nNz or None if dim < 3
vnN
Total number of nodes in each direction
Return type numpy.array (dim, )
Returns [nNx, nNy, nNz]
3.1. SimPEG Meshes
27
SimPEG Documentation, Release 0.1.9
vnEx
Number of x-edges in each direction
Return type numpy.array (dim, )
Returns vnEx
vnEy
Number of y-edges in each direction
Return type numpy.array (dim, )
Returns vnEy or None if dim < 2
vnEz
Number of z-edges in each direction
Return type numpy.array (dim, )
Returns vnEz or None if dim < 3
vnFx
Number of x-faces in each direction
Return type numpy.array (dim, )
Returns vnFx
vnFy
Number of y-faces in each direction
Return type numpy.array (dim, )
Returns vnFy or None if dim < 2
vnFz
Number of z-faces in each direction
Return type numpy.array (dim, )
Returns vnFz or None if dim < 3
nC
Total number of cells
Return type int
Returns nC
nN
Total number of nodes
Return type int
Returns nN
nEx
Number of x-edges
Return type int
Returns nEx
nEy
Number of y-edges
Return type int
28
Chapter 3. Discretization
SimPEG Documentation, Release 0.1.9
Returns nEy
nEz
Number of z-edges
Return type int
Returns nEz
nFx
Number of x-faces
Return type int
Returns nFx
nFy
Number of y-faces
Return type int
Returns nFy
nFz
Number of z-faces
Return type int
Returns nFz
r(x, xType=’CC’, outType=’CC’, format=’V’)
Mesh.r is a quick reshape command that will do the best it can at giving you what you want.
For example, you have a face variable, and you want the x component of it reshaped to a 3D matrix.
Mesh.r can fulfil your dreams:
mesh.r(V, 'F', 'Fx', 'M')
|
|
|
{ How: 'M' or ['V'] for a matrix (ndgrid style) or a vector (n x dim)
|
|
{ What you want: ['CC'], 'N', 'F', 'Fx', 'Fy', 'Fz', 'E', 'Ex', 'Ey', or 'E
|
{ What is it: ['CC'], 'N', 'F', 'Fx', 'Fy', 'Fz', 'E', 'Ex', 'Ey', or 'Ez' }
{ The input: as a list or ndarray }
For example:
Xex, Yex, Zex = r(mesh.gridEx, 'Ex', 'Ex', 'M')
XedgeVector = r(edgeVector, 'E', 'Ex', 'V')
eX, eY, eZ = r(edgeVector, 'E', 'E', 'V')
# Separates each component of the Ex grid i
# Given an edge vector, this will return just t
# Separates each component of the edgeVector into
3.2 Differential Operators
SimPEG.Mesh.DiffOperators.checkBC(bc)
Checks if boundary condition ‘bc’ is valid.
Each bc must be either ‘dirichlet’ or ‘neumann’
SimPEG.Mesh.DiffOperators.ddxCellGrad(n, bc)
Create 1D derivative operator from cell-centers to nodes this means we go from n to n+1
For Cell-Centered Dirichlet, use a ghost point:
3.2. Differential Operators
29
SimPEG Documentation, Release 0.1.9
(u_1 - u_g)/hf = grad
u_g
*
u_1
*
|
^
0
u_2
*
|
...
u_g = - u_1
grad = 2*u1/dx
negitive on the other side.
For Cell-Centered Neumann, use a ghost point:
(u_1 - u_g)/hf = 0
u_g
*
u_g = u_1
grad = 0;
u_1
*
|
u_2
*
|
...
put a zero in.
SimPEG.Mesh.DiffOperators.ddxCellGradBC(n, bc)
Create 1D derivative operator from cell-centers to nodes this means we go from n to n+1
For Cell-Centered Dirichlet, use a ghost point:
(u_1 - u_g)/hf = grad
u_g
*
|
^
u_b
u_1
*
|
u_2
*
...
We know the value at the boundary (u_b):
(u_g+u_1)/2 = u_b
u_g = 2*u_b - u_1
(the average)
So plug in to gradient:
(u_1 - (2*u_b - u_1))/hf = grad
2*(u_1-u_b)/hf = grad
Separate, because BC are known (and can move to RHS later):
( 2/hf )*u_1 + ( -2/hf )*u_b = grad
(
^
) JUST RETURN THIS
class SimPEG.Mesh.DiffOperators.DiffOperators
Class creates the differential operators that you need!
faceDiv
Construct divergence operator (face-stg to cell-centres).
faceDivx
Construct divergence operator in the x component (face-stg to cell-centres).
faceDivy
Construct divergence operator in the y component (face-stg to cell-centres).
30
Chapter 3. Discretization
SimPEG Documentation, Release 0.1.9
faceDivz
Construct divergence operator in the z component (face-stg to cell-centres).
nodalGrad
Construct gradient operator (nodes to edges).
nodalLaplacian
Construct laplacian operator (nodes to edges).
setCellGradBC(BC)
Function that sets the boundary conditions for cell-centred derivative operators.
Examples:
BC = 'neumann'
# Neumann in all directions
BC = ['neumann', 'dirichlet', 'neumann']
# 3D, Dirichlet in y Neumann else
BC = [['neumann', 'dirichlet'], 'dirichlet', 'dirichlet'] # 3D, Neumann in x on bottom of do
#
Dirichlet else
cellGrad
The cell centered Gradient, takes you to cell faces.
cellGradBC
The cell centered Gradient boundary condition matrix
cellGradx
Cell centered Gradient in the x dimension. Has neumann boundary conditions.
cellGrady
Cell centered Gradient in the x dimension. Has neumann boundary conditions.
cellGradz
Cell centered Gradient in the x dimension. Has neumann boundary conditions.
edgeCurl
Construct the 3D curl operator.
getBCProjWF(BC, discretization=’CC’)
The weak form boundary condition projection matrices.
Examples:
BC = 'neumann'
# Neumann in all directions
BC = ['neumann', 'dirichlet', 'neumann']
# 3D, Dirichlet in y Neumann else
BC = [['neumann', 'dirichlet'], 'dirichlet', 'dirichlet'] # 3D, Neumann in x on bottom of do
#
Dirichlet else
aveF2CC
Construct the averaging operator on cell faces to cell centers.
aveF2CCV
Construct the averaging operator on cell faces to cell centers.
aveFx2CC
Construct the averaging operator on cell faces in the x direction to cell centers.
aveFy2CC
Construct the averaging operator on cell faces in the y direction to cell centers.
aveFz2CC
Construct the averaging operator on cell faces in the z direction to cell centers.
aveCC2F
Construct the averaging operator on cell cell centers to faces.
3.2. Differential Operators
31
SimPEG Documentation, Release 0.1.9
aveE2CC
Construct the averaging operator on cell edges to cell centers.
aveE2CCV
Construct the averaging operator on cell edges to cell centers.
aveEx2CC
Construct the averaging operator on cell edges in the x direction to cell centers.
aveEy2CC
Construct the averaging operator on cell edges in the y direction to cell centers.
aveEz2CC
Construct the averaging operator on cell edges in the z direction to cell centers.
aveN2CC
Construct the averaging operator on cell nodes to cell centers.
aveN2E
Construct the averaging operator on cell nodes to cell edges, keeping each dimension separate.
aveN2F
Construct the averaging operator on cell nodes to cell faces, keeping each dimension separate.
3.3 Inner Products
By using the weak formulation of many of the PDEs in geophysical applications, we can rapidly develop discretizations. Much of this work, however, needs a good understanding of how to approximate inner products on our discretized meshes. We will define the inner product as:
∫︁
(𝑎, 𝑏) =
𝑎 · 𝑏𝜕𝑣
Ω
where a and b are either scalars or vectors.
Note: The InnerProducts class is a base class providing inner product matrices for meshes and cannot run on its own.
3.3.1 Example problem for DC resistivity
We will start with the formulation of the Direct Current (DC) resistivity problem in geophysics.
1⃗
𝑗 = ∇𝜑
𝜎
∇ · ⃗𝑗 = 𝑞
In the following discretization, \( \sigma \) and \( \phi \) will be discretized on the cell-centers and the flux, \(\vec{j}\),
will be on the faces. We will use the weak formulation to discretize the DC resistivity equation.
We can define in weak form by integrating with a general face function \(\vec{f}\):
∫︁
∫︁
𝜎 −1⃗𝑗 · 𝑓⃗ =
∇𝜑 · 𝑓⃗
Ω
Ω
Here we can integrate the right side by parts,
∇ · (𝜑𝑓⃗) = ∇𝜑 · 𝑓⃗ + 𝜑∇ · 𝑓⃗
32
Chapter 3. Discretization
SimPEG Documentation, Release 0.1.9
and rearrange it, and apply the Divergence theorem.
∫︁
∫︁
∫︁
𝜎 −1⃗𝑗 · 𝑓⃗ = −
(𝜑∇ · 𝑓⃗) +
Ω
Ω
𝜑𝑓⃗ · n
𝜕Ω
We can then discretize for every cell:
𝑣cell 𝜎 −1 (J𝑥 F𝑥 + J𝑦 F𝑦 + J𝑧 F𝑧 ) = −𝜑⊤ 𝑣cell Dcell F + BC
Note: We have discretized the dot product above, but remember that we do not really have a single vector
\(\mathbf{J}\), but approximations of \(\vec{j}\) on each face of our cell. In 2D that means 2 approximations of
\(\mathbf{J}_x\) and 2 approximations of \(\mathbf{J}_y\). In 3D we also have 2 approximations of \(\mathbf{J}_z\).
Regardless of how we choose to approximate this dot product, we can represent this in vector form (again this is for
every cell), and will generalize for the case of anisotropic (tensor) sigma.
√
−1 √
𝑣cell )J𝑐 = −𝜑⊤ 𝑣cell Dcell F) + BC
F⊤
𝑐 ( 𝑣cell Σ
We multiply by square-root of volume on each side of the tensor conductivity to keep symmetry in the system. Here
\(\mathbf{J}_c\) is the Cartesian \(\mathbf{J}\) (on the faces that we choose to use in our approximation) and must be
calculated differently depending on the mesh:
J𝑐 = Q(𝑖) JTENSOR
J𝑐 = N−1
(𝑖) Q(𝑖) JCurv
Here the \(i\) index refers to where we choose to approximate this integral, as discussed in the note above. We will
approximate this integral by taking the fluxes clustered around every node of the cell, there are 8 combinations in 3D,
and 4 in 2D. We will use a projection matrix \( \mathbf{Q}_{(i)} \) to pick the appropriate fluxes. So, now that we
have 8 approximations of this integral, we will just take the average. For the TensorMesh, this looks like:
(︃ 8
)︃
∑︁
⊤1
⊤ √
−1 √
F
Q
𝑣cell Σ
𝑣cell Q(𝑖) J = −F⊤ D⊤
cell 𝑣cell 𝜑 + BC
8 𝑖=1 (𝑖)
Or, when generalizing to the entire mesh and dropping our general face function:
M𝑓Σ−1 J = −D⊤ diag(v)𝜑 + BC
By defining the faceInnerProduct (8 combinations of fluxes in 3D, 4 in 2D, 2 in 1D) to be:
𝑑
M𝑓Σ−1
=
2
∑︁
−1
P⊤
P(𝑖)
(𝑖) Σ
𝑖=1
Where \(d\) is the dimension of the mesh. The \( \mathbf{M}^f \) is returned when given the input of \( \Sigma^{-1}
\).
Here each \( \mathbf{P} \in \mathbb{R}^{(d*nC, nF)} \) is a combination of the projection, volume, and any normalization to Cartesian coordinates (where the dot product is well defined):
Curv only
√︂
P(𝑖) =
⏞ ⏟
1 𝑑
−1
I
⊗
diag(v)
N
(𝑖) Q(𝑖)
2𝑑
Note: This is actually completed for each cell in the mesh at the same time, and the full matrices are returned.
If returnP=True is requested in any of these methods the projection matrices are returned as a list ordered by nodes
around which the fluxes were approximated:
3.3. Inner Products
33
SimPEG Documentation, Release 0.1.9
#
P
#
P
#
P
In 3D
= [P000, P100, P010, P110, P001, P101, P011, P111]
In 2D
= [P00, P10, P01, P11]
In 1D
= [P0, P1]
The derivation for edgeInnerProducts is exactly the same, however, when we approximate the integral using the
fields around each node, the projection matrices look a bit different because we have 12 edges in 3D instead of just 6
faces. The interface to the code is exactly the same.
3.3.2 Defining Tensor Properties
For 3D:
Depending on the number of columns (either 1, 3, or 6) of mu, the material property is interpreted as follows:
⎡
⎤
𝜇1 0
0
𝜇
⃗ = ⎣ 0 𝜇1 0 ⎦
0
0 𝜇1
⎡
⎤
𝜇1 0
0
𝜇
⃗ = ⎣ 0 𝜇2 0 ⎦
0
0 𝜇3
⎡
⎤
𝜇1 𝜇4 𝜇5
𝜇
⃗ = ⎣𝜇4 𝜇2 𝜇6 ⎦
𝜇5 𝜇6 𝜇3
For 2D:
Depending on the number of columns (either 1, 2, or 3) of mu, the material property is interpreted as
follows:
[︂
𝜇1
0
0
𝜇1
]︂
[︂
𝜇1
0
[︂
𝜇
𝜇
⃗= 1
𝜇3
0
𝜇2
]︂
𝜇3
𝜇2
]︂
𝜇
⃗=
𝜇
⃗=
3.3.3 Structure of Matrices
Both the isotropic, and anisotropic material properties result in a diagonal mass matrix. Which is nice and easy to
invert if necessary, however, in the fully anisotropic case which is not aligned with the grid, the matrix is not diagonal.
This can be seen for a 3D mesh in the figure below.
34
Chapter 3. Discretization
SimPEG Documentation, Release 0.1.9
Isotropic Material Property
Anisotropic Material Property
Tensor Material Property
3.3.4 Taking Derivatives
We will take the derivative of the fully anisotropic tensor for a 3D mesh, the other cases are easier and will not be
discussed here. Let us start with one part of the sum which makes up \(\mathbf{M}^f_\Sigma\) and take the derivative
when this is multiplied by some vector \(\mathbf{v}\):
P⊤ ΣPv
Here we will let \( \mathbf{Pv} = \mathbf{y} \) and \(\mathbf{y}\) will have the form:
⎡ ⎤
y1
y = Pv = ⎣y2 ⎦
y3
⎡
𝜎1
P⊤ Σy = P⊤ ⎣𝜎 4
𝜎5
𝜎4
𝜎2
𝜎6
⎤⎡ ⎤
⎡
⎤
𝜎5
y1
𝜎 1 ∘ y1 + 𝜎 4 ∘ y2 + 𝜎 5 ∘ y3
𝜎 6 ⎦ ⎣y2 ⎦ = P⊤ ⎣𝜎 4 ∘ y1 + 𝜎 2 ∘ y2 + 𝜎 6 ∘ y3 ⎦
𝜎3
y3
𝜎 5 ∘ y1 + 𝜎 6 ∘ y2 + 𝜎 3 ∘ y3
Now it is easy to take the derivative with respect to any one of the parameters,
\(\frac{\partial}{\partial\boldsymbol{\sigma}_1}\)
⎤
⎡
diag(y1 )
𝜕 (︀ ⊤ )︀
⎦
0
P Σy = P⊤ ⎣
𝜕𝜎 1
0
for example,
Whereas \(\frac{\partial}{\partial\boldsymbol{\sigma}_4}\), for example, is:
⎡
⎤
diag(y2 )
𝜕 (︀ ⊤ )︀
P Σy = P⊤ ⎣diag(y1 )⎦
𝜕𝜎 4
0
These are computed for each of the 8 projections, horizontally concatenated, and returned.
3.3.5 The API
class SimPEG.Mesh.InnerProducts.InnerProducts
This is a base for the SimPEG.Mesh classes. This mixIn creates the all the inner product matrices that you need!
3.3. Inner Products
35
SimPEG Documentation, Release 0.1.9
getFaceInnerProduct(prop=None, invProp=False, invMat=False, doFast=True)
Parameters
• prop (numpy.array) – material property (tensor properties are possible) at each cell center
(nC, (1, 3, or 6))
• invProp (bool) – inverts the material property
• invMat (bool) – inverts the matrix
• doFast (bool) – do a faster implementation if available.
Return type scipy.csr_matrix
Returns M, the inner product matrix (nF, nF)
getEdgeInnerProduct(prop=None, invProp=False, invMat=False, doFast=True)
Parameters
• prop (numpy.array) – material property (tensor properties are possible) at each cell center
(nC, (1, 3, or 6))
• invProp (bool) – inverts the material property
• invMat (bool) – inverts the matrix
• doFast (bool) – do a faster implementation if available.
Return type scipy.csr_matrix
Returns M, the inner product matrix (nE, nE)
getFaceInnerProductDeriv(prop, doFast=True, invProp=False, invMat=False)
Parameters
• prop (numpy.array) – material property (tensor properties are possible) at each cell center
(nC, (1, 3, or 6))
• doFast (bool) – do a faster implementation if available.
• invProp (bool) – inverts the material property
• invMat (bool) – inverts the matrix
Return type function
Returns dMdmu(u), the derivative of the inner product matrix (u)
Given u, dMdmu returns (nF, nC*nA)
Parameters u (np.ndarray) – vector that multiplies dMdmu
Return type scipy.csr_matrix
Returns dMdmu, the derivative of the inner product matrix for a certain u
getEdgeInnerProductDeriv(prop, doFast=True, invProp=False, invMat=False)
Parameters
• prop (numpy.array) – material property (tensor properties are possible) at each cell center
(nC, (1, 3, or 6))
• doFast (bool) – do a faster implementation if available.
• invProp (bool) – inverts the material property
36
Chapter 3. Discretization
SimPEG Documentation, Release 0.1.9
• invMat (bool) – inverts the matrix
Return type scipy.csr_matrix
Returns dMdm, the derivative of the inner product matrix (nE, nC*nA)
3.3. Inner Products
37
SimPEG Documentation, Release 0.1.9
38
Chapter 3. Discretization
CHAPTER 4
Forward Problems
4.1 Forward Problem
4.1.1 Problem Class
The problem is a partial differential equation of the form:
𝑐(𝑚, 𝑢) = 0
Here, \(m\) is the model and u is the field (or fields). Given the model, \(m\), we can calculate the fields \(u(m)\),
however, the data we collect is a subset of the fields, and can be defined by a linear projection, \(P\).
𝑑pred = 𝑃 𝑢(𝑚)
For the inverse problem, we are interested in how changing the model transforms the data, as such we can take write
the Taylor expansion:
𝑃 𝑢(𝑚 + ℎ𝑣) = 𝑃 𝑢(𝑚) + ℎ𝑃
𝜕𝑢(𝑚)
𝑣 + 𝒪(ℎ2 ‖𝑣‖)
𝜕𝑚
We can linearize and define the sensitivity matrix as:
𝐽 =𝑃
𝜕𝑢
𝜕𝑚
The sensitivity matrix, and it’s transpose will be used in the inverse problem to (locally) find how model parameters
change the data, and optimize!
Working with the general PDE, \(c(m, u) = 0\), where m is the model and u is the field, the sensitivity is defined as:
𝐽 =𝑃
𝜕𝑢
𝜕𝑚
We can take the derivative of the PDE:
∇𝑚 𝑐(𝑚, 𝑢)𝜕𝑚 + ∇𝑢 𝑐(𝑚, 𝑢)𝜕𝑢 = 0
If the forward problem is invertible, then we can rearrange for \(\frac{\partial u}{\partial m}\):
𝐽 = −𝑃 (∇𝑢 𝑐(𝑚, 𝑢))
−1
∇𝑚 𝑐(𝑚, 𝑢)
This can often be computed given a vector (i.e. \(J(v)\)) rather than stored, as \(J\) is a large dense matrix.
𝑢(𝑚)
39
SimPEG Documentation, Release 0.1.9
4.1.2 The API
Problem
class SimPEG.Problem.BaseProblem(mesh, mapping=None, **kwargs)
Problem is the base class for all geophysical forward problems in SimPEG.
counter = None
A SimPEG.Utils.Counter object
surveyPair
A SimPEG.Survey Class
alias of BaseSurvey
mapPair
A SimPEG.Map Class
alias of IdentityMap
Solver
A SimPEG Solver class.
alias of spsolve_Wrapped
solverOpts = {}
Sovler options as a kwarg dict
PropMap = None
A SimPEG PropertyMap class.
mesh = None
A SimPEG.Mesh instance.
mapping
A SimPEG.Map instance or a property map is PropMap is not None
survey
The survey object for this problem.
pair(d)
Bind a survey to this problem instance using pointers.
unpair()
Unbind a survey from this problem instance.
deleteTheseOnModelUpdate = []
curModel
Sets the current model, and removes dependent mass matrices.
ispaired
True if the problem is paired to a survey.
Jvec(m, v, u=None)
Effect of J(m) on a vector v.
Parameters
• m (numpy.array) – model
• v (numpy.array) – vector to multiply
• u (numpy.array) – fields
40
Chapter 4. Forward Problems
SimPEG Documentation, Release 0.1.9
Return type numpy.array
Returns Jv
Jtvec(m, v, u=None)
Effect of transpose of J(m) on a vector v.
Parameters
• m (numpy.array) – model
• v (numpy.array) – vector to multiply
• u (numpy.array) – fields
Return type numpy.array
Returns JTv
Jvec_approx(m, v, u=None)
Approximate effect of J(m) on a vector v
Parameters
• m (numpy.array) – model
• v (numpy.array) – vector to multiply
• u (numpy.array) – fields
Return type numpy.array
Returns approxJv
Jtvec_approx(m, v, u=None)
Approximate effect of transpose of J(m) on a vector v.
Parameters
• m (numpy.array) – model
• v (numpy.array) – vector to multiply
• u (numpy.array) – fields
Return type numpy.array
Returns JTv
fields(m)
The field given the model.
Parameters m (numpy.array) – model
Return type numpy.array
Returns u, the fields
class SimPEG.Problem.BaseTimeProblem(mesh, mapping=None, **kwargs)
Sets up that basic needs of a time domain problem.
timeSteps
Sets/gets the timeSteps for the time domain problem.
You can set as an array of dt’s or as a list of tuples/floats. Tuples must be length two with [..., (dt, repeat),
...]
For example, the following setters are the same:
4.1. Forward Problem
41
SimPEG Documentation, Release 0.1.9
prob.timeSteps = [(1e-6, 3), 1e-5, (1e-4, 2)]
prob.timeSteps = np.r_[1e-6,1e-6,1e-6,1e-5,1e-4,1e-4]
nT
Number of time steps.
t0
times
Modeling times
timeMesh
Survey
class SimPEG.Survey.BaseRx(locs, rxType, **kwargs)
SimPEG Receiver Object
knownRxTypes = None
Set this to a list of strings to ensure that srcType is known
projGLoc = ‘CC’
Projection grid location, default is CC
storeProjections = True
Store calls to getP (organized by mesh)
locs = None
Locations (nRx x nDim)
rxType
Receiver Type
nD
Number of data in the receiver.
getP(mesh)
Returns the projection matrices as a list for all components collected by the receivers.
Note: Projection matrices are stored as a dictionary listed by meshes.
class SimPEG.Survey.BaseTimeRx(locs, times, rxType, **kwargs)
SimPEG Receiver Object
times = None
Times when the receivers were active.
nD
Number of data in the receiver.
getSpatialP(mesh)
Returns the spatial projection matrix.
Note: This is not stored in memory, but is created on demand.
getTimeP(timeMesh)
Returns the time projection matrix.
Note: This is not stored in memory, but is created on demand.
42
Chapter 4. Forward Problems
SimPEG Documentation, Release 0.1.9
getP(mesh, timeMesh)
Returns the projection matrices as a list for all components collected by the receivers.
Note: Projection matrices are stored as a dictionary (mesh, timeMesh) if storeProjections is True
class SimPEG.Survey.BaseSrc(rxList, **kwargs)
SimPEG Source Object
loc = None
Location [x,y,z]
rxPair
alias of BaseRx
rxList = None
SimPEG Receiver List
nD
Number of data
vnD
Vector number of data
class SimPEG.Survey.Data(survey, v=None)
Fancy data storage by Src and Rx
class SimPEG.Survey.BaseSurvey(**kwargs)
Survey holds the observed data, and the standard deviations.
std = None
Estimated Standard Deviations
dobs = None
Observed data
dtrue = None
True data, if data is synthetic
mtrue = None
True model, if data is synthetic
counter = None
A SimPEG.Utils.Counter object
srcPair
Source Pair
alias of BaseSrc
srcList
Source List
prob
The geophysical problem that explains this survey, use:
survey.pair(prob)
mesh
Mesh of the paired problem.
pair(p)
Bind a problem to this survey instance using pointers
4.1. Forward Problem
43
SimPEG Documentation, Release 0.1.9
unpair()
Unbind a problem from this survey instance
nD
Number of data
vnD
Vector number of data
nSrc
Number of Sources
dpred(m, u=None)
Create the projected data from a model. The field, u, (if provided) will be used for the predicted
data instead of recalculating the fields (which may be expensive!).
𝑑pred = 𝑃 (𝑢(𝑚))
Where P is a projection of the fields onto the data space.
Note: To use survey.dpred(), SimPEG requires that a problem be bound to the survey. If a problem has
not been bound, an Exception will be raised. To bind a problem to the Data object:
survey.pair(myProblem)
projectFields(u)
This function projects the fields onto the data space.
𝑑pred = P𝑢(𝑚)
projectFieldsDeriv(u)
This function s the derivative of projects the fields onto the data space.
𝜕𝑑pred
=P
𝜕𝑢
residual(m, u=None)
Parameters
• m (numpy.array) – geophysical model
• u (numpy.array) – fields
Return type numpy.array
Returns data residual
The data residual:
𝜇data = dpred − dobs
isSynthetic
Check if the data is synthetic.
makeSyntheticData(m, std=0.05, u=None, force=False)
Make synthetic data given a model, and a standard deviation.
Parameters
• m (numpy.array) – geophysical model
44
Chapter 4. Forward Problems
SimPEG Documentation, Release 0.1.9
• std (numpy.array) – standard deviation
• u (numpy.array) – fields for the given model (if pre-calculated)
• force (bool) – force overwriting of dobs
4.1. Forward Problem
45
SimPEG Documentation, Release 0.1.9
46
Chapter 4. Forward Problems
CHAPTER 5
Inversion
5.1 Data Misfit
The data misfit using an l_2 norm is:
1
2
|W𝑑 (dpred − dobs )|2
2
𝜇data =
If the field, u, is provided, the calculation of the data is fast:
dpred = Pu(m)
R = W𝑑 (dpred − dobs )
Where P is a projection matrix that brings the field on the full domain to the data measurement locations; u is the field
of interest; d_obs is the observed data; and \(\mathbf{W}_d\) is the weighting matrix.
The derivative of this, with respect to the model, is:
𝜕𝜇data
= J ⊤ W𝑑 R
𝜕m
The second derivative is:
𝜕 2 𝜇data
= J ⊤ W𝑑 W𝑑 J
𝜕2m
5.1.1 The API
class SimPEG.DataMisfit.BaseDataMisfit(survey, **kwargs)
Note: You should inherit from this class to create your own data misfit term.
debug = False
Print debugging information
counter = None
Set this to a SimPEG.Utils.Counter() if you want to count things
eval(m, u=None)
Parameters
• m (numpy.array) – geophysical model
47
SimPEG Documentation, Release 0.1.9
• u (numpy.array) – fields
Return type float
Returns data misfit
evalDeriv(m, u=None)
Parameters
• m (numpy.array) – geophysical model
• u (numpy.array) – fields
Return type numpy.array
Returns data misfit derivative
eval2Deriv(m, v, u=None)
Parameters
• m (numpy.array) – geophysical model
• v (numpy.array) – vector to multiply
• u (numpy.array) – fields
Return type numpy.array
Returns data misfit derivative
5.1.2 Common Data Misfits
l2 norm
class SimPEG.DataMisfit.l2_DataMisfit(survey, **kwargs)
The data misfit with an l_2 norm:
𝜇data =
1
2
|W𝑑 (dpred − dobs )|2
2
Wd
getWd(survey)
The data weighting matrix.
The default is based on the norm of the data plus a noise floor.
Return type scipy.sparse.csr_matrix
Returns Wd
eval(m, u=None)
evalDeriv(m, u=None)
eval2Deriv(m, v, u=None)
48
Chapter 5. Inversion
SimPEG Documentation, Release 0.1.9
5.2 Regularization
class SimPEG.Regularization.BaseRegularization(mesh, mapping=None, **kwargs)
Bases: object
Base Regularization Class
This is used to regularize the model space:
reg = Regularization(mesh)
counter = None
mapPair
A SimPEG.Map Class
alias of IdentityMap
mref = None
Reference model.
mesh = None
A SimPEG.Mesh instance.
mapping = None
A SimPEG.Map instance.
parent
This is the parent of the regularization.
inv
invProb
reg
opt
prob
survey
W
Full regularization weighting matrix W.
eval(*args, **kwargs)
evalDeriv(*args, **kwargs)
The regularization is:
𝑅(𝑚) =
1
(m − mref )⊤ W⊤ W(m − mref )
2
So the derivative is straight forward:
𝑅(𝑚) = W⊤ W(m − mref )
eval2Deriv(*args, **kwargs)
param numpy.array m geophysical model
param numpy.array v vector to multiply
rtype scipy.sparse.csr_matrix or numpy.ndarray
5.2. Regularization
49
SimPEG Documentation, Release 0.1.9
return WtW or WtW*v
The regularization is:
𝑅(𝑚) =
1
(m − mref )⊤ W⊤ W(m − mref )
2
So the second derivative is straight forward:
𝑅(𝑚) = W⊤ W
class SimPEG.Regularization.Tikhonov(mesh, mapping=None, **kwargs)
Bases: SimPEG.Regularization.BaseRegularization
Tikhonov Regularization
Here we will define regularization of a model, m, in general however, this should be thought of as (m-m_ref)
but otherwise it is exactly the same:
∫︁
𝑅(𝑚) =
Ω
𝛼𝑥
2
(︂
𝜕𝑚
𝜕𝑥
)︂2
𝛼𝑦
+
2
(︂
𝜕𝑚
𝜕𝑦
)︂2
𝜕𝑣
Our discrete gradient operator works on cell centers and gives the derivative on the cell faces, which is not
where we want to be evaluating this integral. We need to average the values back to the cell-centers before we
integrate. To avoid null spaces, we square first and then average. In 2D with ij notation it looks like this:
[︃
[︃(︂
]︃
[︃
)︂2 (︂
)︂2 ]︃]︃
∑︁ 𝛼𝑥 (︂ 𝑚𝑖+1,𝑗 − 𝑚𝑖,𝑗 )︂2 (︂ 𝑚𝑖,𝑗 − 𝑚𝑖−1,𝑗 )︂2
𝑚𝑖,𝑗+1 − 𝑚𝑖,𝑗
𝑚𝑖,𝑗 − 𝑚𝑖,𝑗−1
𝛼𝑦
+
+
+
ℎ2
𝑅(𝑚) ≈
2
ℎ
ℎ
2
ℎ
ℎ
𝑖𝑗
If we let D_1 be the derivative matrix in the x direction
D1 = I2 ⊗ d1
D2 = d2 ⊗ I1
Where d_1 is the one dimensional derivative:
⎡
d1 =
𝑅(𝑚) ≈ v⊤
[︁ 𝛼
𝑥
1⎢
⎣
ℎ
−1
1
..
.
⎤
..
.
−1
A1 (D1 𝑚) ⊙ (D1 𝑚) +
2
⎥
⎦
1
]︁
𝛼𝑦
A2 (D2 𝑚) ⊙ (D2 𝑚)
2
Recall that this is really a just point wise multiplication, or a diagonal matrix times a vector. When we multiply
by something in a diagonal we can interchange and it gives the same results (i.e. it is point wise)
a ⊙ b = diag(a)b = diag(b)a = b ⊙ a
and the transpose also is true (but the sizes have to make sense...):
a⊤ diag(b) = b⊤ diag(a)
So R(m) can simplify to:
𝑅(𝑚) ≈ m⊤
50
[︁ 𝛼
𝑥
2
⊤
D⊤
1 diag(A1 v)D1 +
]︁
𝛼𝑦 ⊤
D2 diag(A⊤
2 v)D2 m
2
Chapter 5. Inversion
SimPEG Documentation, Release 0.1.9
We will define W_x as:
W𝑥 =
√
𝛼𝑥 diag
(︂√︁
)︂
A⊤
v
D1
1
And then W as a tall matrix of all of the different regularization terms:
⎡
⎤
W𝑠
W = ⎣ W𝑥 ⎦
W𝑦
Then we can write
𝑅(𝑚) ≈
1 ⊤ ⊤
m W Wm
2
smoothModel = True
SMOOTH and SMOOTH_MOD_DIF options
alpha_s
Smallness weight
alpha_x
Weight for the first derivative in the x direction
alpha_y
Weight for the first derivative in the y direction
alpha_z
Weight for the first derivative in the z direction
alpha_xx
Weight for the second derivative in the x direction
alpha_yy
Weight for the second derivative in the y direction
alpha_zz
Weight for the second derivative in the z direction
Ws
Regularization matrix Ws
Wx
Regularization matrix Wx
Wy
Regularization matrix Wy
Wz
Regularization matrix Wz
Wxx
Regularization matrix Wxx
Wyy
Regularization matrix Wyy
Wzz
Regularization matrix Wzz
Wsmooth
Full smoothness regularization matrix W
5.2. Regularization
51
SimPEG Documentation, Release 0.1.9
W
Full regularization matrix W
eval(*args, **kwargs)
evalDeriv(*args, **kwargs)
The regularization is:
𝑅(𝑚) =
1
(m − mref )⊤ W⊤ W(m − mref )
2
So the derivative is straight forward:
𝑅(𝑚) = W⊤ W(m − mref )
5.3 Optimize
class SimPEG.Optimization.StoppingCriteria
Bases: object
docstring for StoppingCriteria
iteration = {‘stopType’: ‘critical’, ‘right’: <function <lambda> at 0x7f66544802a8>, ‘str’: ‘%d : maxIter = %3d <= ite
iterationLS = {‘stopType’: ‘critical’, ‘right’: <function <lambda> at 0x7f6654480398>, ‘str’: ‘%d : maxIterLS = %3d
armijoGoldstein = {‘stopType’: ‘optimal’, ‘right’: <function <lambda> at 0x7f6654480488>, ‘str’: ‘%d : ft = %1.4e <
tolerance_f = {‘stopType’: ‘optimal’, ‘right’: <function <lambda> at 0x7f6654480578>, ‘str’: ‘%d : |fc-fOld| = %1.4e
moving_x = {‘stopType’: ‘optimal’, ‘right’: <function <lambda> at 0x7f6654480668>, ‘str’: ‘%d : |xc-x_last| = %1.4e <=
tolerance_g = {‘stopType’: ‘optimal’, ‘right’: <function <lambda> at 0x7f6654480758>, ‘str’: ‘%d : |proj(x-g)-x| = %1
norm_g = {‘stopType’: ‘critical’, ‘right’: <function <lambda> at 0x7f6654480848>, ‘str’: ‘%d : |proj(x-g)-x| = %1.4e <= 1
bindingSet = {‘stopType’: ‘critical’, ‘right’: <function <lambda> at 0x7f6654480938>, ‘str’: ‘%d : probSize = %3d <=
bindingSet_LS = {‘stopType’: ‘critical’, ‘right’: <function <lambda> at 0x7f6654480a28>, ‘str’: ‘%d : probSize = %3d
phi_d_target_Minimize = {‘stopType’: ‘critical’, ‘right’: <function <lambda> at 0x7f6654480b18>, ‘str’: ‘%d : phi_
phi_d_target_Inversion = {‘stopType’: ‘critical’, ‘right’: <function <lambda> at 0x7f6654480c08>, ‘str’: ‘%d : ph
class SimPEG.Optimization.IterationPrinters
Bases: object
docstring for IterationPrinters
iteration = {‘width’: 5, ‘format’: ‘%3d’, ‘value’: <function <lambda> at 0x7f6654480c80>, ‘title’: ‘#’}
f = {‘width’: 10, ‘format’: ‘%1.2e’, ‘value’: <function <lambda> at 0x7f6654480cf8>, ‘title’: ‘f’}
norm_g = {‘width’: 15, ‘format’: ‘%1.2e’, ‘value’: <function <lambda> at 0x7f6654480d70>, ‘title’: ‘|proj(x-g)-x|’}
totalLS = {‘width’: 5, ‘format’: ‘%d’, ‘value’: <function <lambda> at 0x7f6654480de8>, ‘title’: ‘LS’}
iterationLS = {‘width’: 5, ‘format’: ‘%3d.%d’, ‘value’: <function <lambda> at 0x7f6654480e60>, ‘title’: ‘#’}
LS_ft = {‘width’: 10, ‘format’: ‘%1.2e’, ‘value’: <function <lambda> at 0x7f6654480ed8>, ‘title’: ‘ft’}
LS_t = {‘width’: 10, ‘format’: ‘%0.5f’, ‘value’: <function <lambda> at 0x7f6654480f50>, ‘title’: ‘t’}
LS_armijoGoldstein = {‘width’: 16, ‘format’: ‘%1.2e’, ‘value’: <function <lambda> at 0x7f6654483050>, ‘title’: ‘f +
itType = {‘width’: 8, ‘format’: ‘%s’, ‘value’: <function <lambda> at 0x7f66544830c8>, ‘title’: ‘itType’}
52
Chapter 5. Inversion
SimPEG Documentation, Release 0.1.9
aSet = {‘width’: 8, ‘format’: ‘%d’, ‘value’: <function <lambda> at 0x7f6654483140>, ‘title’: ‘aSet’}
bSet = {‘width’: 8, ‘format’: ‘%d’, ‘value’: <function <lambda> at 0x7f66544831b8>, ‘title’: ‘bSet’}
comment = {‘width’: 12, ‘format’: ‘%s’, ‘value’: <function <lambda> at 0x7f6654483230>, ‘title’: ‘Comment’}
beta = {‘width’: 10, ‘format’: ‘%1.2e’, ‘value’: <function <lambda> at 0x7f66544832a8>, ‘title’: ‘beta’}
phi_d = {‘width’: 10, ‘format’: ‘%1.2e’, ‘value’: <function <lambda> at 0x7f6654483320>, ‘title’: ‘phi_d’}
phi_m = {‘width’: 10, ‘format’: ‘%1.2e’, ‘value’: <function <lambda> at 0x7f6654483398>, ‘title’: ‘phi_m’}
class SimPEG.Optimization.Minimize(**kwargs)
Bases: object
Minimize is a general class for derivative based optimization.
name = ‘General Optimization Algorithm’
The name of the optimization algorithm
maxIter = 20
Maximum number of iterations
maxIterLS = 10
Maximum number of iterations for the line-search
maxStep = inf
Maximum step possible, used in scaling before the line-search.
LSreduction = 0.0001
Expected decrease in the line-search
LSshorten = 0.5
Line-search step is shortened by this amount each time.
tolF = 0.1
Tolerance on function value decrease
tolX = 0.1
Tolerance on norm(x) movement
tolG = 0.1
Tolerance on gradient norm
eps = 1e-05
Small value
stopNextIteration = False
Stops the optimization program nicely.
debug = False
Print debugging information
debugLS = False
Print debugging information for the line-search
comment = ‘’
Used by some functions to indicate what is going on in the algorithm
counter = None
Set this to a SimPEG.Utils.Counter() if you want to count things
parent = None
This is the parent of the optimization routine.
callback
5.3. Optimize
53
SimPEG Documentation, Release 0.1.9
minimize(evalFunction, x0)
Minimizes the function (evalFunction) starting at the location x0.
Parameters
• evalFunction (def ) – function handle that evaluates: f, g, H = F(x)
• x0 (numpy.ndarray) – starting location
Return type numpy.ndarray
Returns x, the last iterate of the optimization algorithm
evalFunction is a function handle:
(f[, g][, H]) = evalFunction(x, return_g=False, return_H=False )
def evalFunction(x, return_g=False, return_H=False):
out = (f,)
if return_g:
out += (g,)
if return_H:
out += (H,)
return out if len(out) > 1 else out[0]
The algorithm for general minimization is as follows:
startup(x0)
printInit()
while True:
doStartIteration()
f, g, H = evalFunction(xc)
printIter()
if stoppingCriteria(): break
p = findSearchDirection()
p = scaleSearchDirection(p)
xt, passLS = modifySearchDirection(p)
if not passLS:
xt, caught = modifySearchDirectionBreak(p)
if not caught: return xc
doEndIteration(xt)
printDone()
finish()
return xc
startup(*args, **kwargs)
startup is called at the start of any new minimize call.
This will set:
x0 = x0
xc = x0
iter = iterLS = 0
Parameters x0 (numpy.ndarray) – initial x
Return type None
Returns None
54
Chapter 5. Inversion
SimPEG Documentation, Release 0.1.9
If you have things that also need to run in the method startup, you can create a method:
def _startup*(self, ... ):
pass
Where the * can be any string. If present, _startup* will be called at the start of the default startup call.
You may also completely overwrite this function.
doStartIteration()
doStartIteration is called at the start of each minimize iteration.
Return type None
Returns None
If you have things that also need to run in the method doStartIteration, you can create a method:
def _doStartIteration*(self, ... ):
pass
Where the * can be any string. If present, _doStartIteration* will be called at the start of the default
doStartIteration call. You may also completely overwrite this function.
printInit(inLS=False)
printInit is called at the beginning of the optimization routine.
If there is a parent object, printInit will check for a parent.printInit function and call that.
printIter(*args, **kwargs)
printIter is called directly after function evaluations.
If there is a parent object, printIter will check for a parent.printIter function and call that.
If you have things that also need to run in the method printIter, you can create a method:
def _printIter*(self, ... ):
pass
Where the * can be any string. If present, _printIter* will be called at the start of the default printIter call.
You may also completely overwrite this function.
printDone(inLS=False)
printDone is called at the end of the optimization routine.
If there is a parent object, printDone will check for a parent.printDone function and call that.
finish()
finish is called at the end of the optimization.
Return type None
Returns None
If you have things that also need to run in the method finish, you can create a method:
def _finish*(self, ... ):
pass
Where the * can be any string. If present, _finish* will be called at the start of the default finish call. You
may also completely overwrite this function.
stoppingCriteria(inLS=False)
projection(p)
projects the search direction.
5.3. Optimize
55
SimPEG Documentation, Release 0.1.9
by default, no projection is applied.
Parameters p (numpy.ndarray) – searchDirection
Return type numpy.ndarray
Returns p, projected search direction
If you have things that also need to run in the method projection, you can create a method:
def _projection*(self, ... ):
pass
Where the * can be any string. If present, _projection* will be called at the start of the default projection
call. You may also completely overwrite this function.
findSearchDirection()
findSearchDirection should return an approximation of:
𝐻𝑝 = −𝑔
Where you are solving for the search direction, p
The default is:
𝐻=𝐼
𝑝 = −𝑔
And corresponds to SteepestDescent.
The latest function evaluations are present in:
self.f, self.g, self.H
Return type numpy.ndarray
Returns p, Search Direction
scaleSearchDirection(p)
scaleSearchDirection should scale the search direction if appropriate.
Set the parameter maxStep in the minimize object, to scale back the gradient to a maximum size.
Parameters p (numpy.ndarray) – searchDirection
Return type numpy.ndarray
Returns p, Scaled Search Direction
nameLS = ‘Armijo linesearch’
The line-search name
modifySearchDirection(p)
modifySearchDirection changes the search direction based on some sort of linesearch or trust-region
criteria.
By default, an Armijo backtracking linesearch is preformed with the following parameters:
•maxIterLS, the maximum number of linesearch iterations
•LSreduction, the expected reduction expected, default: 1e-4
•LSshorten, how much the step is reduced, default: 0.5
56
Chapter 5. Inversion
SimPEG Documentation, Release 0.1.9
If the linesearch is completed, and a descent direction is found, passLS is returned as True.
Else, a modifySearchDirectionBreak call is preformed.
Parameters p (numpy.ndarray) – searchDirection
Return type numpy.ndarray,bool
Returns (xt, passLS)
modifySearchDirectionBreak(p)
Code is called if modifySearchDirection fails to find a descent direction.
The search direction is passed as input and this function must pass back both a new searchDirection, and
if the searchDirection break has been caught.
By default, no additional work is done, and the evalFunction returns a False indicating the break was not
caught.
Parameters p (numpy.ndarray) – searchDirection
Return type numpy.ndarray,bool
Returns (xt, breakCaught)
doEndIteration(xt)
doEndIteration is called at the end of each minimize iteration.
By default, function values and x locations are shuffled to store 1 past iteration in memory.
self.xc must be updated in this code.
Parameters xt (numpy.ndarray) – tested new iterate that ensures a descent direction.
Return type None
Returns None
If you have things that also need to run in the method doEndIteration, you can create a method:
def _doEndIteration*(self, ... ):
pass
Where the * can be any string. If present, _doEndIteration* will be called at the start of the default
doEndIteration call. You may also completely overwrite this function.
save(group)
class SimPEG.Optimization.Remember
Bases: object
This mixin remembers all the things you tend to forget.
You can remember parameters directly, naming the str in Minimize, or pass a tuple with the name and the
function that takes Minimize.
For Example:
opt.remember('f',('norm_g', lambda M: np.linalg.norm(M.g)))
opt.minimize(evalFunction, x0)
opt.recall('f')
The param name (str) can also be located in the parent (if no conflicts), and it will be looked up by default.
_rememberThese = []
5.3. Optimize
57
SimPEG Documentation, Release 0.1.9
remember(*args)
recall(param)
_startupRemember(x0)
_doEndIterationRemember(*args)
class SimPEG.Optimization.ProjectedGradient(**kwargs)
Bases: SimPEG.Optimization.Minimize, SimPEG.Optimization.Remember
name = ‘Projected Gradient’
maxIterCG = 5
tolCG = 0.1
lower = -inf
upper = inf
_startup(x0)
projection(x)
Make sure we are feasible.
activeSet(x)
If we are on a bound
inactiveSet(x)
The free variables.
bindingSet(x)
If we are on a bound and the negative gradient points away from the feasible set.
Optimality condition. (Satisfies Kuhn-Tucker) MoreToraldo91
findSearchDirection()
Finds the search direction based on either CG or steepest descent.
_doEndIteration_ProjectedGradient(xt)
class SimPEG.Optimization.BFGS(**kwargs)
Bases: SimPEG.Optimization.Minimize, SimPEG.Optimization.Remember
name = ‘BFGS’
nbfgs = 10
bfgsH0
Approximate Hessian used in preconditioning the problem.
Must be a SimPEG.Solver
_startup_BFGS(x0)
bfgs(d)
bfgsrec(k, n, nn, S, Y, d)
BFGS recursion
findSearchDirection()
_doEndIteration_BFGS(xt)
class SimPEG.Optimization.GaussNewton(**kwargs)
Bases: SimPEG.Optimization.Minimize, SimPEG.Optimization.Remember
58
Chapter 5. Inversion
SimPEG Documentation, Release 0.1.9
name = ‘Gauss Newton’
findSearchDirection(*args, **kwargs)
class SimPEG.Optimization.InexactGaussNewton(**kwargs)
Bases:
SimPEG.Optimization.BFGS,
SimPEG.Optimization.Minimize,
SimPEG.Optimization.Remember
Minimizes using CG as the inexact solver of
Hp = −g
By default BFGS is used as the preconditioner.
Use nbfgs to set the memory limitation of BFGS.
To set the initial H0 to be used in BFGS, set bfgsH0 to be a SimPEG.Solver
name = ‘Inexact Gauss Newton’
maxIterCG = 5
tolCG = 0.1
approxHinv
The approximate Hessian inverse is used to precondition CG.
Default uses BFGS, with an initial H0 of bfgsH0.
Must be a scipy.sparse.linalg.LinearOperator
findSearchDirection(*args, **kwargs)
class SimPEG.Optimization.SteepestDescent(**kwargs)
Bases: SimPEG.Optimization.Minimize, SimPEG.Optimization.Remember
name = ‘Steepest Descent’
findSearchDirection(*args, **kwargs)
class SimPEG.Optimization.NewtonRoot(**kwargs)
Bases: object
Newton Method - Root Finding
root = newtonRoot(fun,x);
Where fun is the function that returns the function value as well as the gradient.
For iterative solving of dh = -Jr, use O.solveTol = TOL. For direct solves, use SOLVETOL = 0 (default)
Rowan Cockett 16-May-2013 16:29:51 University of British Columbia [email protected]
tol = 1e-06
maxIter = 20
stepDcr = 0.5
maxLS = 30
comments = False
doLS = True
Solver
alias of spsolve_Wrapped
solverOpts = {}
5.3. Optimize
59
SimPEG Documentation, Release 0.1.9
root(fun, x)
Function Should have the form:
def evalFunction(x, return_g=False):
out = (f,)
if return_g:
out += (g,)
return out if len(out) > 1 else out[0]
5.4 Directives
class SimPEG.Directives.InversionDirective(**kwargs)
Bases: object
debug = False
Print debugging information
inversion
This is the inversion of the InversionDirective instance.
invProb
opt
reg
dmisfit
survey
prob
initialize()
endIter()
finish()
class SimPEG.Directives.DirectiveList(*directives, **kwargs)
Bases: object
dList = None
The list of Directives
debug
inversion
This is the inversion of the InversionDirective instance.
call(ruleType)
class SimPEG.Directives.BetaEstimate_ByEig(**kwargs)
Bases: SimPEG.Directives.InversionDirective
BetaEstimate
beta0 = None
The initial Beta (regularization parameter)
beta0_ratio = 100.0
estimateBeta0 is used with this ratio
60
Chapter 5. Inversion
SimPEG Documentation, Release 0.1.9
initialize()
The initial beta is calculated by comparing the estimated eigenvalues of JtJ and WtW.
To estimate the eigenvector of A, we will use one iteration of the Power Method:
x1 = Ax0
Given this (very course) approximation of the eigenvector, we can use the Rayleigh quotient to approximate
the largest eigenvalue.
𝜆0 =
x⊤ Ax
x⊤ x
We will approximate the largest eigenvalue for both JtJ and WtW, and use some ratio of the quotient to
estimate beta0.
𝛽0 = 𝛾
x⊤ J⊤ Jx
x⊤ W⊤ Wx
Return type float
Returns beta0
class SimPEG.Directives.BetaSchedule(**kwargs)
Bases: SimPEG.Directives.InversionDirective
coolingFactor = 8.0
coolingRate = 3
endIter()
class SimPEG.Directives.TargetMisfit(**kwargs)
Bases: SimPEG.Directives.InversionDirective
target
endIter()
class SimPEG.Directives.SaveModelEveryIteration(**kwargs)
Bases: SimPEG.Directives._SaveEveryIteration
initialize()
endIter()
class SimPEG.Directives.SaveOutputEveryIteration(**kwargs)
Bases: SimPEG.Directives._SaveEveryIteration
SaveModelEveryIteration
initialize()
endIter()
5.5 Inversion
class SimPEG.Inversion.BaseInversion(invProb, directiveList=[], **kwargs)
Bases: object
Inversion Class.
name = ‘BaseInversion’
5.5. Inversion
61
SimPEG Documentation, Release 0.1.9
debug = False
Print debugging information
counter = None
Set this to a SimPEG.Utils.Counter() if you want to count things
directiveList
run(m0)
Runs the inversion!
62
Chapter 5. Inversion
CHAPTER 6
Utility Codes
6.1 Solver
6.1.1 BYOS
The numerical linear algebra solver that you use will ultimately be the bottleneck of your large scale inversion. To be
the most flexible, SimPEG provides wrappers rather than a comprehensive set of solvers (i.e. BYOS).
The interface is as follows:
A # Where A is a sparse matrix (or linear operator)
Ainv = Solver(A, **solverOpts) # Create a solver object with key word arguments
x = Ainv * b # Where b is a numpy array of shape (n,) or (n,*)
Ainv.clean() # This cleans the memory footprint (if any)
Note: This is somewhat an abuse of notation for solvers as we never actually create A inverse. Instead we are creating
an object that acts like A inverse, whether that be a Krylov subspace solver or an LU decomposition.
To wrap up solvers in scipy.sparse.linalg it takes one line of code:
Solver
= SolverWrapD(sp.linalg.spsolve, factorize=False)
SolverLU = SolverWrapD(sp.linalg.splu, factorize=True)
SolverCG = SolverWrapI(sp.linalg.cg)
Note: The above solvers are loaded into the base name space of SimPEG.
See also:
• https://bitbucket.org/petsc/petsc4py
• https://github.com/bfroehle/pymumps
• https://github.com/rowanc1/pymatsolver
6.1.2 The API
SimPEG.Utils.SolverUtils.SolverWrapD(fun,
factorize=True,
accuracyTol=1e-06)
Wraps a direct Solver.
checkAccuracy=True,
63
SimPEG Documentation, Release 0.1.9
Solver
= SolverUtils.SolverWrapD(sp.linalg.spsolve, factorize=False)
SolverLU = SolverUtils.SolverWrapD(sp.linalg.splu, factorize=True)
SimPEG.Utils.SolverUtils.SolverWrapI(fun, checkAccuracy=True, accuracyTol=1e-05)
Wraps an iterative Solver.
SolverCG = SolverUtils.SolverWrapI(sp.linalg.cg)
6.2 SimPEG Maps
6.2.1 That’s not a map...?!
A SimPEG Map operates on a vector and transforms it to another space. We will use an example commonly applied
in electromagnetics (EM) of the log-conductivity model.
𝑚 = log(𝜎)
Here we require a mapping to get from \(m\) to \(\sigma\), we will call this map \(\mathcal{M}\).
𝜎 = ℳ(𝑚) = exp(𝑚)
In SimPEG, we use a (SimPEG.Maps.ExpMap) to describe how to map back to conductivity. This is a relatively
trivial example (we are just taking the exponential!) but by defining maps we can start to combine and manipulate
exactly what we think about as our model, \(m\). In code, this looks like
M = Mesh.TensorMesh([100])
expMap = Maps.ExpMap(M)
m = np.zeros(M.nC)
m[M.vectorCCx>0.5] = 1.0
sig = expMap * m
print m
# [ 0.
0.
0.
1.
print sig
# [ 1.
1.
1. 2.718
#
#
#
#
#
Create a mesh
Create a mapping
Create a model vector
Set half of it to 1.0
Apply the mapping using *
1.
2.718
1. ]
2.718]
6.2.2 Combining Maps
We will use an example where we want a 1D layered earth as our model, but we want to map this to a 2D discretization to do our forward modeling. We will also assume that we are working in log conductivity still, so after the transformation we want to map to conductivity space. To do this we will introduce the vertical 1D map
(SimPEG.Maps.Vertical1DMap), which does the first part of what we just described. The second part will be
done by the SimPEG.Maps.ExpMap described above.
M = Mesh.TensorMesh([7,5])
v1dMap = Maps.Vertical1DMap(M)
expMap = Maps.ExpMap(M)
myMap = expMap * v1dMap
m = np.r_[0.2,1,0.1,2,2.9] # only 5 model parameters!
sig = myMap * m
64
Chapter 6. Utility Codes
SimPEG Documentation, Release 0.1.9
1.0
Model
1.0
Physical Property
18
0.8
0.6
0.6
0.4
14
12
σ =exp(Pm)
0.8
Depth, y
Depth, y
16
10
0.4
8
6
0.2
0.2
0.0
0.0 0.5 1.0 1.5 2.0 2.5 3.0
Value, mi
0.0
0.0 0.2 0.4 0.6 0.8 1.0
x
4
2
If you noticed, it was pretty easy to combine maps. What is even cooler is that the derivatives also are made for you
(if everything goes right). Just to be sure that the derivative is correct, you should always run the test on the mapping
that you create.
6.2.3 Taking Derivatives
Now that we have wrapped up the mapping, we can ensure that it is easy to take derivatives (or at least have access
to them!). In the SimPEG.Maps.ExpMap there are no dependencies between model parameters, so it will be a
diagonal matrix:
(︂
)︂
𝜕ℳ(𝑚)
𝜕 exp(𝑚𝑖 )
=
= exp(𝑚𝑖 )
𝜕𝑚
𝜕𝑚
𝑖𝑖
Or equivalently:
𝜕ℳ(𝑚)
= diag(exp(𝑚))
𝜕𝑚
The mapping API makes this really easy to test that you have got the derivative correct. When these are used in the
inverse problem, this is extremely important!!
from SimPEG import *
import matplotlib.pyplot as plt
M = Mesh.TensorMesh([100])
expMap = Maps.ExpMap(M)
6.2. SimPEG Maps
65
SimPEG Documentation, Release 0.1.9
m = np.zeros(M.nC)
m[M.vectorCCx>0.5] = 1.0
expMap.test(m, plotIt=True)
Check Derivative - PASSED :)
101
100
10-1
Error
10-2
10-3
10-4
10-5
10-6
10-7 -4
10
10-3
f(x + h∆x)−f(x)−hg(x)∆x−O(h2 ) =0
O(h)
O(h2 )
h
10-2
10-1
6.2.4 The API
class SimPEG.Maps.IdentityMap(mesh, **kwargs)
SimPEG Map
mesh = None
A SimPEG Mesh
nP
Return type int
Returns number of parameters in the model
shape
The default shape is (mesh.nC, nP).
Return type (int,int)
Returns shape of the operator as a tuple
inverse(D)
Changes the physical property into the model.
66
Chapter 6. Utility Codes
SimPEG Documentation, Release 0.1.9
Note: The transformInverse may not be easy to create in general.
Parameters D (numpy.array) – physical property
Return type numpy.array
Returns model
deriv(m)
The derivative of the transformation.
Parameters m (numpy.array) – model
Return type scipy.csr_matrix
Returns derivative of transformed model
test(m=None, **kwargs)
Test the derivative of the mapping.
Parameters
• m (numpy.array) – model
• kwargs – key word arguments of SimPEG.Tests.checkDerivative()
Return type bool
Returns passed the test?
6.2.5 Common Maps
Exponential Map
Electrical conductivity varies over many orders of magnitude, so it is a common technique when solving the inverse
problem to parameterize and optimize in terms of log conductivity. This makes sense not only because it ensures
all conductivities will be positive, but because this is fundamentally the space where conductivity lives (i.e. it varies
logarithmically).
class SimPEG.Maps.ExpMap(mesh, **kwargs)
Changes the model into the physical property.
A common example of this is to invert for electrical conductivity in log space. In this case, your model will be
log(sigma) and to get back to sigma, you can take the exponential:
𝑚 = log 𝜎
exp 𝑚 = exp log 𝜎 = 𝜎
inverse(D)
Parameters D (numpy.array) – physical property
Return type numpy.array
Returns model
The transformInverse changes the physical property into the model.
𝑚 = log 𝜎
6.2. SimPEG Maps
67
SimPEG Documentation, Release 0.1.9
deriv(m)
Parameters m (numpy.array) – model
Return type scipy.csr_matrix
Returns derivative of transformed model
The transform changes the model into the physical property. The transformDeriv provides the derivative
of the transform.
If the model transform is:
𝑚 = log 𝜎
exp 𝑚 = exp log 𝜎 = 𝜎
Then the derivative is:
𝜕 exp 𝑚
= sdiag(exp 𝑚)
𝜕𝑚
Vertical 1D Map
class SimPEG.Maps.Vertical1DMap(mesh, **kwargs)
Given a 1D vector through the last dimension of the mesh, this will extend to the full model space.
nP
Number of model properties.
The number of cells in the last dimension of the mesh.
deriv(m)
Parameters m (numpy.array) – model
Return type scipy.csr_matrix
Returns derivative of transformed model
Map 2D Cross-Section to 3D Model
class SimPEG.Maps.Map2Dto3D(mesh, **kwargs)
Given a 2D vector, this will extend to the full 3D model space.
normal = ‘Y’
The normal
nP
Number of model properties.
The number of cells in the last dimension of the mesh.
deriv(m)
Parameters m (numpy.array) – model
Return type scipy.csr_matrix
Returns derivative of transformed model
68
Chapter 6. Utility Codes
SimPEG Documentation, Release 0.1.9
Mesh to Mesh Map
1.0Fine Mesh (Original)1.0
Course Mesh Fine
1.0 Mesh (Interpolated)
0.6
0.6
0.6
y
0.8
y
0.8
y
0.8
0.4
0.4
0.4
0.2
0.2
0.2
0.0
0.0
0.0
0.0 0.2 0.4 0.6 0.8 1.0 0.0 0.2 0.4 0.6 0.8 1.0 0.0 0.2 0.4 0.6 0.8 1.0
x
x
x
class SimPEG.Maps.Mesh2Mesh(meshes, **kwargs)
Takes a model on one mesh are translates it to another mesh.
shape
Number of parameters in the model.
nP
Number of parameters in the model.
deriv(m)
6.2.6 Some Extras
Combo Map
The ComboMap holds the information for multiplying and combining maps. It also uses the chain rule to create the
derivative. Remember, any time that you make your own combination of mappings be sure to test that the derivative
is correct.
class SimPEG.Maps.ComboMap(maps, **kwargs)
Combination of various maps.
shape
6.2. SimPEG Maps
69
SimPEG Documentation, Release 0.1.9
nP
Number of model properties.
The number of cells in the last dimension of the mesh.
deriv(m)
6.3 Utilities
6.3.1 Matrix Utilities
SimPEG.Utils.matutils.mkvc(x, numDims=1)
Creates a vector with the number of dimension specified
e.g.:
a = np.array([1, 2, 3])
mkvc(a, 1).shape
> (3, )
mkvc(a, 2).shape
> (3, 1)
mkvc(a, 3).shape
> (3, 1, 1)
SimPEG.Utils.matutils.sdiag(h)
Sparse diagonal matrix
SimPEG.Utils.matutils.sdInv(M)
Inverse of a sparse diagonal matrix
SimPEG.Utils.matutils.speye(n)
Sparse identity
SimPEG.Utils.matutils.kron3(A, B, C)
Three kron prods
SimPEG.Utils.matutils.spzeros(n1, n2)
SimPEG.Utils.matutils.ddx(n)
Define 1D derivatives, inner, this means we go from n+1 to n
SimPEG.Utils.matutils.av(n)
Define 1D averaging operator from nodes to cell-centers.
SimPEG.Utils.matutils.avExtrap(n)
Define 1D averaging operator from cell-centers to nodes.
SimPEG.Utils.matutils.ndgrid(*args, **kwargs)
Form tensorial grid for 1, 2, or 3 dimensions.
Returns as column vectors by default.
To return as matrix input:
ndgrid(..., vector=False)
70
Chapter 6. Utility Codes
SimPEG Documentation, Release 0.1.9
The inputs can be a list or separate arguments.
e.g.:
a = np.array([1, 2, 3])
b = np.array([1, 2])
XY = ndgrid(a, b)
> [[1 1]
[2 1]
[3 1]
[1 2]
[2 2]
[3 2]]
X, Y = ndgrid(a, b, vector=False)
> X = [[1 1]
[2 2]
[3 3]]
> Y = [[1 2]
[1 2]
[1 2]]
SimPEG.Utils.matutils.ind2sub(shape, inds)
From the given shape, returns the subscripts of the given index
SimPEG.Utils.matutils.sub2ind(shape, subs)
From the given shape, returns the index of the given subscript
SimPEG.Utils.matutils.getSubArray(A, ind)
subArray
SimPEG.Utils.matutils.inv3X3BlockDiagonal(a11, a12, a13, a21, a22, a23, a31, a32, a33, returnMatrix=True)
B = inv3X3BlockDiagonal(a11, a12, a13, a21, a22, a23, a31, a32, a33)
inverts a stack of 3x3 matrices
Input: A - a11, a12, a13, a21, a22, a23, a31, a32, a33
Output: B - inverse
SimPEG.Utils.matutils.inv2X2BlockDiagonal(a11, a12, a21, a22, returnMatrix=True)
B = inv2X2BlockDiagonal(a11, a12, a21, a22)
Inverts a stack of 2x2 matrices by using the inversion formula
inv(A) = (1/det(A)) * cof(A)^T
Input: A - a11, a12, a21, a22
Output: B - inverse
class SimPEG.Utils.matutils.TensorType(M, tensor)
SimPEG.Utils.matutils.makePropertyTensor(M, tensor)
SimPEG.Utils.matutils.invPropertyTensor(M, tensor, returnMatrix=False)
SimPEG.Utils.matutils.diagEst(matFun, n, k=None, approach=’Probing’)
Estimate the diagonal of a matrix, A. Note that the matrix may be a function which returns A times a vector.
Three different approaches have been implemented,
1. Probing : uses cyclic permutations of vectors with ones and zeros (default)
6.3. Utilities
71
SimPEG Documentation, Release 0.1.9
2. Ones : random +/- 1 entries
3. Random : random vectors
Parameters
• (numpy.array) matFun (lambda) – matrix to estimate the diagonal of
• n (int64) – size of the vector that should be used to compute matFun(v)
• k (int64) – number of vectors to be used to estimate the diagonal
• approach (str) – approach to be used for getting vectors
Return type numpy.array
Returns est_diag(A)
Based
on
Saad
http://www-users.cs.umn.edu/~saad/PDF/umsi-2005-082.pdf,
http://www.cita.utoronto.ca/~niels/diagonal.pdf
and
class SimPEG.Utils.matutils.Zero
class SimPEG.Utils.matutils.Identity(positive=True)
6.3.2 Solver Utilities
SimPEG.Utils.SolverUtils.SolverWrapD(fun,
factorize=True,
accuracyTol=1e-06)
Wraps a direct Solver.
checkAccuracy=True,
Solver
= SolverUtils.SolverWrapD(sp.linalg.spsolve, factorize=False)
SolverLU = SolverUtils.SolverWrapD(sp.linalg.splu, factorize=True)
SimPEG.Utils.SolverUtils.SolverWrapI(fun, checkAccuracy=True, accuracyTol=1e-05)
Wraps an iterative Solver.
SolverCG = SolverUtils.SolverWrapI(sp.linalg.cg)
SimPEG.Utils.SolverUtils.Solver
alias of spsolve_Wrapped
SimPEG.Utils.SolverUtils.SolverLU
alias of splu_Wrapped
SimPEG.Utils.SolverUtils.SolverCG
alias of cg_Wrapped
class SimPEG.Utils.SolverUtils.SolverDiag(A)
docstring for SolverDiag
clean()
6.3.3 Curv Utilities
SimPEG.Utils.curvutils.volTetra(xyz, A, B, C, D)
Returns the volume for tetrahedras volume specified by the indexes A to D.
Parameters
• xyz (numpy.array) – X,Y,Z vertex vector
72
Chapter 6. Utility Codes
SimPEG Documentation, Release 0.1.9
• A,B,C,D (numpy.array) – vert index of the tetrahedra
Return type numpy.array
Returns V, volume of the tetrahedra
Algorithm http://en.wikipedia.org/wiki/Tetrahedron#Volume
𝑉 =
𝑉 =
1
𝐴ℎ
3
1
|(𝑎 − 𝑑) · ((𝑏 − 𝑑)(𝑐 − 𝑑))|
6
SimPEG.Utils.curvutils.indexCube(nodes, gridSize, n=None)
Returns the index of nodes on the mesh.
Input: nodes - string of which nodes to return. e.g. ‘ABCD’ gridSize - size of the nodal grid n - number of
nodes each i,j,k direction: [ni,nj,nk]
Output: index - index in the order asked e.g. ‘ABCD’ –> (A,B,C,D)
TWO DIMENSIONS:
node(i,j)
node(i,j+1)
A -------------- B
|
|
|
cell(i,j)
|
|
I
|
|
|
D -------------- C
node(i+1,j)
node(i+1,j+1)
THREE DIMENSIONS:
node(i,j,k+1)
node(i,j+1,k+1)
E --------------- F
/|
/ |
/ |
/ |
/ |
/
|
node(i,j,k)
node(i,j+1,k)
A -------------- B
|
|
H ----------|---- G
|
/cell(i,j)
|
/
| /
I
| /
| /
| /
D -------------- C
node(i+1,j,k)
node(i+1,j+1,k)
SimPEG.Utils.curvutils.faceInfo(xyz, A, B, C, D, average=True, normalizeNormals=True)
function [N] = faceInfo(y,A,B,C,D)
Returns the averaged normal, area, and edge lengths for a given set of faces.
If average option is FALSE then N is a cell array {nA,nB,nC,nD}
Input: xyz - X,Y,Z vertex vector A,B,C,D - vert index of the face (counter clockwize)
Options: average - [true]/false, toggles returning all normals or the average
Output: N - average face normal or {nA,nB,nC,nD} if average = false area - average face area edgeLengths exact edge Lengths, 4 column vector [AB, BC, CD, DA]
6.3. Utilities
73
SimPEG Documentation, Release 0.1.9
see also testFaceNormal testFaceArea
@author Rowan Cockett
Last modified on: 2013/07/26
6.3.4 Mesh Utilities
SimPEG.Utils.meshutils.exampleLrmGrid(nC, exType)
SimPEG.Utils.meshutils.meshTensor(value)
meshTensor takes a list of numbers and tuples that have the form:
mT = [ float, (cellSize, numCell), (cellSize, numCell, factor) ]
For example, a time domain mesh code needs many time steps at one time:
[(1e-5, 30), (1e-4, 30), 1e-3]
Means take 30 steps at 1e-5 and then 30 more at 1e-4, and then one step of 1e-3.
Tensor meshes can also be created by increase factors:
[(10.0, 5, -1.3), (10.0, 50), (10.0, 5, 1.3)]
When there is a third number in the tuple, it refers to the increase factor, if this number is negative this section
of the tensor is flipped right-to-left.
1000
800
x2
600
400
200
0
0
200
400
600
800
x1
1000
1200
1400
1600
SimPEG.Utils.meshutils.closestPoints(mesh, pts, gridLoc=’CC’)
Move a list of points to the closest points on a grid.
74
Chapter 6. Utility Codes
SimPEG Documentation, Release 0.1.9
Parameters
• mesh (simpeg.Mesh.BaseMesh) – The mesh
• pts (numpy.ndarray) – Points to move
• gridLoc (string) – [’CC’, ‘N’, ‘Fx’, ‘Fy’, ‘Fz’, ‘Ex’, ‘Ex’, ‘Ey’, ‘Ez’]
Return type numpy.ndarray
Returns nodeInds
SimPEG.Utils.meshutils.readUBCTensorMesh(fileName)
Read UBC GIF 3DTensor mesh and generate 3D Tensor mesh in simpegTD
Input: :param fileName, path to the UBC GIF mesh file
Output: :param SimPEG TensorMesh object :return
SimPEG.Utils.meshutils.readUBCTensorModel(fileName, mesh)
Read UBC 3DTensor mesh model and generate 3D Tensor mesh model in simpeg
Input: :param fileName, path to the UBC GIF mesh file to read :param mesh, TensorMesh object, mesh that
coresponds to the model
Output: :return numpy array, model with TensorMesh ordered
SimPEG.Utils.meshutils.writeUBCTensorMesh(fileName, mesh)
Writes a SimPEG TensorMesh to a UBC-GIF format mesh file.
Parameters
• fileName (str) – File to write to
• mesh (simpeg.Mesh.TensorMesh) – The mesh
SimPEG.Utils.meshutils.writeUBCTensorModel(fileName, mesh, model)
Writes a model associated with a SimPEG TensorMesh to a UBC-GIF format model file.
Parameters
• fileName (str) – File to write to
• mesh (simpeg.Mesh.TensorMesh) – The mesh
• model (numpy.ndarray) – The model
SimPEG.Utils.meshutils.readVTRFile(fileName)
Read VTK Rectilinear (vtr xml file) and return SimPEG Tensor mesh and model
Input: :param vtrFileName, path to the vtr model file to write to
Output: :return SimPEG TensorMesh object :return SimPEG model dictionary
SimPEG.Utils.meshutils.writeVTRFile(fileName, mesh, model=None)
Makes and saves a VTK rectilinear file (vtr) for a simpeg Tensor mesh and model.
Input: :param str, path to the output vtk file :param mesh, SimPEG TensorMesh object - mesh to be transfer to
VTK :param model, dictionary of numpy.array - Name(‘s) and array(‘s). Match number of cells
SimPEG.Utils.meshutils.ExtractCoreMesh(xyzlim, mesh, meshType=’tensor’)
Extracts Core Mesh from Global mesh xyzlim: 2D array [ndim x 2] mesh: SimPEG mesh This function ouputs:
•actind: corresponding boolean index from global to core
•meshcore: core SimPEG mesh
Warning: 1D and 2D has not been tested
6.3. Utilities
75
SimPEG Documentation, Release 0.1.9
6.3.5 Model Builder Utilities
SimPEG.Utils.ModelBuilder.addBlock(gridCC, modelCC, p0, p1, blockProp)
Add a block to an exsisting cell centered model, modelCC
Parameters
• gridCC (numpy.array,) – mesh.gridCC is the cell centered grid
• modelCC (numpy.array,) – cell centered model
• p0 (numpy.array,) – bottom, southwest corner of block
• p1 (numpy.array,) – top, northeast corner of block
BlockProp float, blockProp property to assign to the model
Return numpy.array, modelBlock model with block
SimPEG.Utils.ModelBuilder.getIndicesBlock(p0, p1, ccMesh)
Creates a vector containing the block indices in the cell centers mesh. Returns a tuple
The block is defined by the points
p0, describe the position of the left upper front corner, and
p1, describe the position of the right bottom back corner.
ccMesh represents the cell-centered mesh
The points p0 and p1 must live in the the same dimensional space as the mesh.
SimPEG.Utils.ModelBuilder.defineBlock(ccMesh, p0, p1, vals=[0, 1])
Build a block with the conductivity specified by condVal. Returns an array. vals[0] conductivity of the block
vals[1] conductivity of the ground
SimPEG.Utils.ModelBuilder.defineElipse(ccMesh, center=[0, 0, 0], anisotropy=[1, 1, 1],
slope=10.0, theta=0.0)
SimPEG.Utils.ModelBuilder.defineTwoLayers(ccMesh, depth, vals=[0, 1])
Define a two layered model. Depth of the first layer must be specified. CondVals vector with the conductivity
values of the layers. Eg:
Convention to number the layers:
<----------------------------|------------------------------------>
0
depth
zf
1st layer
2nd layer
SimPEG.Utils.ModelBuilder.scalarConductivity(ccMesh, pFunction)
Define the distribution conductivity in the mesh according to the analytical expression given in pFunction
SimPEG.Utils.ModelBuilder.layeredModel(ccMesh, layerTops, layerValues)
Define a layered model from layerTops (z-positive up)
Parameters
• ccMesh (numpy.array) – cell-centered mesh
• layerTops (numpy.array) – z-locations of the tops of each layer
• layerValue (numpy.array) – values of the property to assign for each layer (starting at
the top)
Return type numpy.array
Returns M, layered model on the mesh
76
Chapter 6. Utility Codes
SimPEG Documentation, Release 0.1.9
SimPEG.Utils.ModelBuilder.randomModel(shape, seed=None, anisotropy=None,
bounds=[0, 1])
Create a random model by convolving a kernel with a uniformly distributed model.
its=100,
Parameters
• shape (int,tuple) – shape of the model.
• seed (int) – pick which model to produce, prints the seed if you don’t choose.
• anisotropy (numpy.ndarray,list) – this is the (3 x n) blurring kernel that is used.
• its (int) – number of smoothing iterations
• bounds (list) – bounds on the model, len(list) == 2
Return type numpy.ndarray
Returns M, the model
A very cool, yet completely random model.
0
0.0
0.4
0.8
10
1.2
1.6
20
2.0
2.4
30
2.8
3.2
40
3.6
0
10
20
30
40
4.0
6.3.6 Interpolation Utilities
SimPEG.Utils.interputils.interpmat(locs, x, y=None, z=None)
Local interpolation computed for each receiver point in turn
Parameters
• loc (numpy.ndarray) – Location of points to interpolate to
• x (numpy.ndarray) – Tensor vector of 1st dimension of grid.
6.3. Utilities
77
SimPEG Documentation, Release 0.1.9
• y (numpy.ndarray) – Tensor vector of 2nd dimension of grid. None by default.
• z (numpy.ndarray) – Tensor vector of 3rd dimension of grid. None by default.
Return type scipy.sparse.csr.csr_matrix
Returns Interpolation matrix
1.0
0.5
0.0
0.5
1.0
0.0
0.2
0.4
0.6
0.8
1.0
6.3.7 Counter Utilities
::
class MyClass(object):
def __init__(self, url): self.counter = Counter()
@count def MyMethod(self):
pass
@timeIt def MySecondMethod(self):
pass
c = MyClass(‘blah’) for i in range(100):
c.counter.summary()
Counters:
MyClass.MyMethod
78
c.MyMethod() for i in range(300):
:
c.MySecondMethod()
100
Chapter 6. Utility Codes
SimPEG Documentation, Release 0.1.9
Times:
MyClass.MySecondMethod
mean
sum
: 1.70e-06, 5.10e-04,
300x
The API
class SimPEG.Utils.CounterUtils.Counter
Counter allows anything that calls it to record iterations and timings in a simple way.
Also has plotting functions that allow quick recalls of data.
If you want to use this, import count or timeIt and use them as decorators on class methods.
class MyClass(object):
def __init__(self, url):
self.counter = Counter()
@count
def MyMethod(self):
pass
@timeIt
def MySecondMethod(self):
pass
c = MyClass('blah')
for i in range(100): c.MyMethod()
for i in range(300): c.MySecondMethod()
c.counter.summary()
count(prop)
Increases the count of the property.
countTic(prop)
Times a property call, this is the init call.
countToc(prop)
Times a property call, this is the end call.
summary()
Provides a text summary of the current counters and timers.
SimPEG.Utils.CounterUtils.count(f )
SimPEG.Utils.CounterUtils.timeIt(f )
6.4 Testing SimPEG
class SimPEG.Tests.OrderTest(methodName=’runTest’)
OrderTest is a base class for testing convergence orders with respect to mesh sizes of integral/differential operators.
Mathematical Problem:
Given are an operator A and its discretization A[h]. For a given test function f and h –> 0 we compare:
𝑒𝑟𝑟𝑜𝑟(ℎ) = ‖𝐴[ℎ](𝑓 ) − 𝐴(𝑓 )‖∞
Note that you can provide any norm.
6.4. Testing SimPEG
79
SimPEG Documentation, Release 0.1.9
Test is passed when estimated rate order of convergence is at least within the specified tolerance of
the estimated rate supplied by the user.
Minimal example for a curl operator:
class TestCURL(OrderTest):
name = "Curl"
def getError(self):
# For given Mesh, generate A[h], f and A(f) and return norm of error.
fun = lambda x: np.cos(x) # i (cos(y)) + j (cos(z)) + k (cos(x))
sol = lambda x: np.sin(x) # i (sin(z)) + j (sin(x)) + k (sin(y))
Ex = fun(self.M.gridEx[:, 1])
Ey = fun(self.M.gridEy[:, 2])
Ez = fun(self.M.gridEz[:, 0])
f = np.concatenate((Ex, Ey, Ez))
Fx
Fy
Fz
Af
=
=
=
=
sol(self.M.gridFx[:, 2])
sol(self.M.gridFy[:, 0])
sol(self.M.gridFz[:, 1])
np.concatenate((Fx, Fy, Fz))
# Generate DIV matrix
Ah = self.M.edgeCurl
curlE = Ah*E
err = np.linalg.norm((Ah*f -Af), np.inf)
return err
def test_order(self):
# runs the test
self.orderTest()
See also: test_operatorOrder.py
name = ‘Order Test’
expectedOrders = 2.0
tolerance = 0.85
meshSizes = [4, 8, 16, 32]
meshTypes = [’uniformTensorMesh’]
meshDimension = 3
setupMesh(nc)
For a given number of cells nc, generate a TensorMesh with uniform cells with edge length h=1/nc.
getError()
For given h, generate A[h], f and A(f) and return norm of error.
orderTest()
For number of cells specified in meshSizes setup mesh, call getError and prints mesh size, error, ratio
between current and previous error, and estimated order of convergence.
SimPEG.Tests.Rosenbrock(x, return_g=True, return_H=True)
Rosenbrock function for testing GaussNewton scheme
80
Chapter 6. Utility Codes
SimPEG Documentation, Release 0.1.9
SimPEG.Tests.checkDerivative(fctn, x0, num=7, plotIt=True, dx=None, expectedOrder=2, tolerance=0.85, eps=1e-10, ax=None)
Basic derivative check
Compares error decay of 0th and 1st order Taylor approximation at point x0 for a randomized search direction.
Parameters
• fctn (lambda) – function handle
• x0 (numpy.array) – point at which to check derivative
• num (int) – number of times to reduce step length, h
• plotIt (bool) – if you would like to plot
• dx (numpy.array) – step direction
• expectedOrder (int) – The order that you expect the derivative to yield.
• tolerance (float) – The tolerance on the expected order.
• eps (float) – What is zero?
Return type bool
Returns did you pass the test?!
Error
from SimPEG import Tests, Utils, np
def simplePass(x):
return np.sin(x), Utils.sdiag(np.cos(x))
Tests.checkDerivative(simplePass, np.random.randn(5))
100
10-1
10-2
10-3
10-4
10-5
10-6
10-7
10-8
10-9
10-10
10-11
10-12
10-13
10-14
10-15 -7
10
6.4. Testing SimPEG
Check Derivative - PASSED :)
10-6
10-5
f(x + h∆x)−f(x)−hg(x)∆x−O(h2 ) =0
O(h)
O(h2 )
10-4
h
10-3
10-2
10-1
81
SimPEG Documentation, Release 0.1.9
SimPEG.Tests.getQuadratic(A, b, c=0)
Given A, b and c, this returns a quadratic, Q
Q(x) = 0.5xAx + bx + 𝑐
82
Chapter 6. Utility Codes
CHAPTER 7
Packages
7.1 Electromagnetics
SimPEG.EM uses SimPEG as the framework for the forward and inverse electromagnetics geophysical problems.
7.1.1 Time Domian Electromagnetics
7.1.2 Code for Time Domian Electromagnetics
7.1.3 Frequency Domian Electromagnetics
Frequency Domain Electromagnetics
Electromagnetic (EM) geophysical methods are used in a variety of applications from resource exploration, including
for hydrocarbons and minerals, to environmental applications, such as groundwater monitoring. The primary physical
property of interest in EM is electrical conductivity, which describes the ease with which electric current flows through
a material.
Background
Electromagnetic phenomena are governed by Maxwell’s equations. They describe the behavior of EM fields and
fluxes. Electromagnetic theory for geophysical applications by Ward and Hohmann (1988) is a highly recommended
resource on this topic.
Fourier Transform Convention In order to examine Maxwell’s equations in the frequency domain, we must first
define our choice of harmonic time-dependence by choosing a Fourier transform convention. We use the \(e^{i \omega
t} \) convention, so we define our Fourier Transform pair as
∫︁ ∞
𝐹 (𝜔) =
𝑓 (𝑡)𝑒−𝑖𝜔𝑡 𝑑𝑡
−∞
∫︁ ∞
1
𝐹 (𝜔)𝑒𝑖𝜔𝑡 𝑑𝜔
𝑓 (𝑡) =
2𝜋 −∞
83
SimPEG Documentation, Release 0.1.9
where \(\omega\) is angular frequency, \(t\) is time, \(F(\omega)\) is the function defined in the frequency domain and
\(f(t)\) is the function defined in the time domain.
Maxwell’s Equations
In the frequency domain, Maxwell’s equations are given by
⃗ = −𝑖𝜔 𝐵
⃗
𝐸
⃗ = 𝐽⃗ + 𝑖𝜔 𝐷
⃗ +𝑆
⃗
𝐻
⃗ =0
÷𝐵
⃗ = 𝜌𝑓
÷𝐷
where:
• \(\vec{E}\) : electric field (\(V/m\))
• \(\vec{H}\) : magnetic field (\(A/m\))
• \(\vec{B}\) : magnetic flux density (\(Wb/m^2\))
• \(\vec{D}\) : electric displacement / electric flux density (\(C/m^2\))
• \(\vec{J}\) : electric current density (\(A/m^2\))
• \(\rho_f\) : free charge density
The source term is \(\vec{S}\)
Constitutive Relations The fields and fluxes are related through the constitutive relations. At each frequency, they
are given by
⃗
𝐽⃗ = 𝜎 𝐸
⃗ = 𝜇𝐻
⃗
𝐵
⃗ = 𝜀𝐸
⃗
𝐷
where:
• \(\sigma\) : electrical conductivity \(S/m\)
• \(\mu\) : magnetic permeability \(H/m\)
• \(\varepsilon\) : dielectric permittivity \(F/m\)
\(\sigma\), \(\mu\), \(\varepsilon\) are physical properties which depend on the material. \(\sigma\) describes how easily
electric current passes through a material, \(\mu\) describes how easily a material is magnetized, and \(\varepsilon\)
describes how easily a material is electrically polarized. In most geophysical applications of EM, \(\sigma\) is the the
primary physical property of interest, and \(\mu\), \(\varepsilon\) are assumed to have their free-space values \(\mu_0
= 4\pi \times 10^{-7} H/m \), \(\varepsilon_0 = 8.85 \times 10^{-12} F/m\)
Quasi-static Approximation For the frequency range typical of most geophysical surveys, the contribution of the
electric displacement is negligible compared to the electric current density. In this case, we use the Quasi-static
approximation and assume that this term can be neglected, giving
⃗ = −𝑖𝜔 𝐵
⃗
∇×𝐸
⃗ = 𝐽⃗ + 𝑆
⃗
∇×𝐻
84
Chapter 7. Packages
SimPEG Documentation, Release 0.1.9
Implementation in SimPEG.EM
We consider two formulations in SimPEG.EM, both first-order and both in terms of one field and one flux. We allow
for the definition of magnetic and electric sources (see for example: Ward and Hohmann, starting on page 144). The
E-B formulation is in terms of the electric field and the magnetic flux:
⃗ + 𝑖𝜔 𝐵
⃗ =𝑆
⃗𝑚
∇×𝐸
⃗ − 𝜎𝐸
⃗ =𝑆
⃗𝑒
∇ × 𝜇−1 𝐵
The H-J formulation is in terms of the current density and the magnetic field:
⃗ =𝑆
⃗𝑚
∇ × 𝜎 −1 𝐽⃗ + 𝑖𝜔𝜇𝐻
⃗ − 𝐽⃗ = 𝑆
⃗𝑒
∇×𝐻
Discretizing For both formulations, we use a finite volume discretization and discretize fields on cell edges, fluxes
on cell faces and physical properties in cell centers. This is particularly important when using symmetry to reduce the
dimensionality of a problem (for instance on a 2D CylMesh, there are \(r\), \(z\) faces and \(\theta\) edges)
For the two formulations, the discretization of the physical properties, fields and fluxes are summarized below.
Note that resistivity is the inverse of conductivity, \(\rho = \sigma^{-1}\).
E-B Formulation:
Ce + 𝑖𝜔b = sm
C
T
Mf𝜇−1 b
− Me𝜎 e = Me se
H-J Formulation:
CT Mf𝜌 j + 𝑖𝜔Me𝜇 h = Me sm
Ch − j = se
7.1. Electromagnetics
85
SimPEG Documentation, Release 0.1.9
API
class SimPEG.EM.FDEM.FDEM.BaseFDEMProblem(mesh, **kwargs)
Bases: SimPEG.EM.Base.BaseEMProblem
We start by looking at Maxwell’s equations in the electric field \(\mathbf{e}\) and the magnetic flux density
\(\mathbf{b}\)
Ce + 𝑖𝜔b = sm
𝑇
C
Mf𝜇−1 b
− Me𝜎 e = Me se
if using the E-B formulation (Problem_e or Problem_b) or the magnetic field \(\mathbf{h}\) and current
density \(\mathbf{j}\)
C𝑇 Mf𝜌 j + 𝑖𝜔Me𝜇 h = Me sm
Ch − j = se
if using the H-J formulation (Problem_j or Problem_h).
The problem performs the elimination so that we are solving the system for \(\mathbf{e},\mathbf{b},\mathbf{j}
\) or \(\mathbf{h}\)
surveyPair
alias of Survey
fieldsPair
alias of Fields
fields(m=None)
Solve the forward problem for the fields.
Jvec(m, v, f=None)
Sensitivity times a vector
Jtvec(m, v, f=None)
Sensitivity transpose times a vector
getSourceTerm(freq)
Evaluates the sources for a given frequency and puts them in matrix form
86
Chapter 7. Packages
SimPEG Documentation, Release 0.1.9
Parameters freq (float) – Frequency
Return type numpy.ndarray (nE or nF, nSrc)
Returns S_m, S_e
class SimPEG.EM.FDEM.FDEM.Problem_e(mesh, **kwargs)
Bases: SimPEG.EM.FDEM.FDEM.BaseFDEMProblem
By eliminating the magnetic flux density using
b=
1
(−Ce + sm )
𝑖𝜔
we can write Maxwell’s equations as a second order system in \(\mathbf{e}\) only:
(︁
)︁
C𝑇 Mf𝜇−1 C + 𝑖𝜔Me𝜎 e = C𝑇 Mf𝜇−1 sm − 𝑖𝜔Me se
which we solve for \(\mathbf{e}\).
fieldsPair
alias of Fields_e
getA(freq)
A = C𝑇 Mf𝜇−1 C + 𝑖𝜔Me𝜎
Parameters freq (float) – Frequency
Return type scipy.sparse.csr_matrix
Returns A
getADeriv_m(freq, u, v, adjoint=False)
getRHS(freq)
RHS = C𝑇 Mf𝜇−1 sm − 𝑖𝜔Me se
Parameters freq (float) – Frequency
Return type numpy.ndarray (nE, nSrc)
Returns RHS
getRHSDeriv_m(freq, src, v, adjoint=False)
class SimPEG.EM.FDEM.FDEM.Problem_b(mesh, **kwargs)
Bases: SimPEG.EM.FDEM.FDEM.BaseFDEMProblem
We eliminate \(\mathbf{e}\) using
(︁
)︁
e = Me𝜎 −1 C𝑇 Mf𝜇−1 b − se
and solve for \(\mathbf{b}\) using:
(︁
)︁
CMe𝜎 −1 C𝑇 Mf𝜇−1 + 𝑖𝜔 b = sm + Me𝜎 −1 Me se
Note: The inverse problem will not work with full anisotropy
7.1. Electromagnetics
87
SimPEG Documentation, Release 0.1.9
fieldsPair
alias of Fields_b
getA(freq)
A = CMe𝜎 −1 C𝑇 Mf𝜇−1 + 𝑖𝜔
Parameters freq (float) – Frequency
Return type scipy.sparse.csr_matrix
Returns A
getADeriv_m(freq, u, v, adjoint=False)
getRHS(freq)
RHS = sm + Me𝜎 −1 se
Parameters freq (float) – Frequency
Return type numpy.ndarray (nE, nSrc)
Returns RHS
getRHSDeriv_m(freq, src, v, adjoint=False)
class SimPEG.EM.FDEM.FDEM.Problem_j(mesh, **kwargs)
Bases: SimPEG.EM.FDEM.FDEM.BaseFDEMProblem
We eliminate \(\mathbf{h}\) using
h=
)︀
1 e −1 (︀
M𝜇
−C𝑇 Mf𝜌 j + Me sm
𝑖𝜔
and solve for \(\mathbf{j}\) using
(︁
)︁
CMe𝜇 −1 C𝑇 Mf𝜌 + 𝑖𝜔 j = CMe𝜇 −1 Me sm − 𝑖𝜔se
Note: This implementation does not yet work with full anisotropy!!
fieldsPair
alias of Fields_j
getA(freq)
A = CMemu−1 C𝑇 Mf𝜎−1 + 𝑖𝜔
Parameters freq (float) – Frequency
Return type scipy.sparse.csr_matrix
Returns A
getADeriv_m(freq, u, v, adjoint=False)
In this case, we assume that electrical conductivity, \(\sigma\) is the physical property of interest (i.e.
\(\sigma\) = model.transform). Then we want
= CMemu −1 CT
88
𝑑Mf𝜎−1
𝑑𝜎 −1
𝑑Mf𝜎−1
A(𝜎)v
= CMemu−1 CT
𝑑m
𝑑m
𝑑𝜎 −1 𝑑𝜎
𝑑𝜎 𝑑m
Chapter 7. Packages
SimPEG Documentation, Release 0.1.9
getRHS(freq)
RHS = CMe𝜇 −1 sm − 𝑖𝜔se
Parameters freq (float) – Frequency
Return type numpy.ndarray (nE, nSrc)
Returns RHS
getRHSDeriv_m(freq, src, v, adjoint=False)
class SimPEG.EM.FDEM.FDEM.Problem_h(mesh, **kwargs)
Bases: SimPEG.EM.FDEM.FDEM.BaseFDEMProblem
We eliminate \(\mathbf{j}\) using
j = Ch − se
and solve for \(\mathbf{h}\) using
(︀ 𝑇 f
)︀
C M𝜌 C + 𝑖𝜔Me𝜇 h = Me sm + C𝑇 Mf𝜌 se
fieldsPair
alias of Fields_h
getA(freq)
A = C𝑇 Mf𝜌 C + 𝑖𝜔Me𝜇
Parameters freq (float) – Frequency
Return type scipy.sparse.csr_matrix
Returns A
getADeriv_m(freq, u, v, adjoint=False)
getRHS(freq)
RHS = Me sm + C𝑇 Mf𝜌 se
Parameters freq (float) – Frequency
Return type numpy.ndarray (nE, nSrc)
Returns RHS
getRHSDeriv_m(freq, src, v, adjoint=False)
FDEM Survey
class SimPEG.EM.FDEM.SurveyFDEM.Rx(locs, rxType)
Bases: SimPEG.Survey.BaseRx
knownRxTypes = {‘hzi’: [’h’, ‘Ez’, ‘imag’], ‘ezr’: [’e’, ‘Ez’, ‘real’], ‘ezi’: [’e’, ‘Ez’, ‘imag’], ‘jxr’: [’j’, ‘Fx’, ‘real’], ‘jzi’:
radius = None
projField
Field Type projection (e.g. e b ...)
projGLoc
Grid Location projection (e.g. Ex Fy ...)
7.1. Electromagnetics
89
SimPEG Documentation, Release 0.1.9
projComp
Component projection (real/imag)
projectFields(src, mesh, u)
projectFieldsDeriv(src, mesh, u, v, adjoint=False)
class SimPEG.EM.FDEM.SurveyFDEM.Survey(srcList, **kwargs)
Bases: SimPEG.Survey.BaseSurvey
docstring for SurveyFDEM
srcPair
alias of BaseSrc
freqs
Frequencies
nFreq
Number of frequencies
nSrcByFreq
getSrcByFreq(freq)
Returns the sources associated with a specific frequency.
projectFields(u)
projectFieldsDeriv(u)
7.1.4 Utility Codes
simpegEM Utilities
SimPEG for EM provides a few EM specific utility codes, sources, and analytic functions.
Analytic Functions - Time
Analytic Functions - Frequency
Sources
7.2 Richards Equation
There are two different forms of Richards equation that differ on how they deal with the non-linearity in the timestepping term.
The most fundamental form, referred to as the ‘mixed’-form of Richards Equation [Celia et al., 1990]
𝜕𝑘(𝜓)
𝜕𝜃(𝜓)
− ∇ · 𝑘(𝜓)∇𝜓 −
=0 𝜓∈Ω
𝜕𝑡
𝜕𝑧
where theta is water content, and psi is pressure head. This formulation of Richards equation is called the ‘mixed’-form
because the equation is parameterized in psi but the time-stepping is in terms of theta.
As noted in [Celia et al., 1990] the ‘head’-based form of Richards equation can be written in the continuous form as:
𝜕𝜃 𝜕𝜓
𝜕𝑘(𝜓)
− ∇ · 𝑘(𝜓)∇𝜓 −
=0 𝜓∈Ω
𝜕𝜓 𝜕𝑡
𝜕𝑧
90
Chapter 7. Packages
SimPEG Documentation, Release 0.1.9
However, it can be shown that this does not conserve mass in the discrete formulation.
Here we reproduce the results from Celia et al. (1990):
7.2.1 Richards
7.2. Richards Equation
91
SimPEG Documentation, Release 0.1.9
92
Chapter 7. Packages
CHAPTER 8
Developer’s Documentation
• Travis-CI Testing
• Coveralls Testing
93
SimPEG Documentation, Release 0.1.9
94
Chapter 8. Developer’s Documentation
CHAPTER 9
Project Index & Search
• genindex
• modindex
• search
95
SimPEG Documentation, Release 0.1.9
96
Chapter 9. Project Index & Search
CHAPTER 10
Examples
10.1 Examples
10.1.1 EM: FDEM: 1D: Inversion
Here we will create and run a FDEM 1D inversion.
97
SimPEG Documentation, Release 0.1.9
0
100
Depth (m)
200
300
400
500
600 -4
10
98
10-3
Conductivity (S/m)
10-2
Chapter 10. Examples
SimPEG Documentation, Release 0.1.9
10-14
Noisefree
dobs
Bz (T)
10-15
10-16
10-17 -5
10
10.1. Examples
10-4
Time (s)
10-3
99
SimPEG Documentation, Release 0.1.9
0
σtrue
σpred
100
Depth (m)
200
300
400
500
600 -4
10
1
2
3
10-3
Conductivity (S/m)
10-2
from SimPEG import *
import SimPEG.EM as EM
from scipy.constants import mu_0
4
5
6
7
8
9
def run(plotIt=True):
"""
EM: FDEM: 1D: Inversion
=======================
10
Here we will create and run a FDEM 1D inversion.
11
12
"""
13
14
cs, ncx, ncz, npad = 5., 25, 15, 15
hx = [(cs,ncx), (cs,npad,1.3)]
hz = [(cs,npad,-1.3), (cs,ncz), (cs,npad,1.3)]
mesh = Mesh.CylMesh([hx,1,hz], '00C')
15
16
17
18
100
Chapter 10. Examples
SimPEG Documentation, Release 0.1.9
19
20
21
22
23
24
25
26
27
28
29
30
active = mesh.vectorCCz<0.
layer = (mesh.vectorCCz<0.) & (mesh.vectorCCz>=-100.)
actMap = Maps.ActiveCells(mesh, active, np.log(1e-8), nC=mesh.nCz)
mapping = Maps.ExpMap(mesh) * Maps.Vertical1DMap(mesh) * actMap
sig_half = 2e-3
sig_air = 1e-8
sig_layer = 1e-3
sigma = np.ones(mesh.nCz)*sig_air
sigma[active] = sig_half
sigma[layer] = sig_layer
mtrue = np.log(sigma[active])
31
32
33
34
35
36
37
38
39
40
41
if plotIt:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1,1, figsize = (3, 6))
plt.semilogx(sigma[active], mesh.vectorCCz[active])
ax.set_ylim(-600, 0)
ax.set_xlim(1e-4, 1e-2)
ax.set_xlabel('Conductivity (S/m)', fontsize = 14)
ax.set_ylabel('Depth (m)', fontsize = 14)
ax.grid(color='k', alpha=0.5, linestyle='dashed', linewidth=0.5)
42
43
44
45
46
47
48
rxOffset=1e-3
rx = EM.TDEM.RxTDEM(np.array([[rxOffset, 0., 30]]), np.logspace(-5,-3, 31), 'bz')
src = EM.TDEM.SrcTDEM_VMD_MVP([rx], np.array([0., 0., 80]))
survey = EM.TDEM.SurveyTDEM([src])
prb = EM.TDEM.ProblemTDEM_b(mesh, mapping=mapping)
49
50
51
52
53
prb.Solver = SolverLU
prb.timeSteps = [(1e-06, 20),(1e-05, 20), (0.0001, 20)]
prb.pair(survey)
dtrue = survey.dpred(mtrue)
54
55
56
57
58
59
60
61
survey.dtrue = dtrue
std = 0.05
noise = std*abs(survey.dtrue)*np.random.randn(*survey.dtrue.shape)
survey.dobs = survey.dtrue+noise
survey.std = survey.dobs*0 + std
survey.Wd = 1/(abs(survey.dobs)*std)
62
63
64
65
66
67
68
69
70
71
72
if plotIt:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1,1, figsize = (10, 6))
ax.loglog(rx.times, dtrue, 'b.-')
ax.loglog(rx.times, survey.dobs, 'r.-')
ax.legend(('Noisefree', '$d^{obs}$'), fontsize = 16)
ax.set_xlabel('Time (s)', fontsize = 14)
ax.set_ylabel('$B_z$ (T)', fontsize = 16)
ax.set_xlabel('Time (s)', fontsize = 14)
ax.grid(color='k', alpha=0.5, linestyle='dashed', linewidth=0.5)
73
74
75
76
dmisfit = DataMisfit.l2_DataMisfit(survey)
regMesh = Mesh.TensorMesh([mesh.hz[mapping.maps[-1].indActive]])
reg = Regularization.Tikhonov(regMesh)
10.1. Examples
101
SimPEG Documentation, Release 0.1.9
opt = Optimization.InexactGaussNewton(maxIter = 5)
invProb = InvProblem.BaseInvProblem(dmisfit, reg, opt)
# Create an inversion object
beta = Directives.BetaSchedule(coolingFactor=5, coolingRate=2)
betaest = Directives.BetaEstimate_ByEig(beta0_ratio=1e0)
inv = Inversion.BaseInversion(invProb, directiveList=[beta,betaest])
m0 = np.log(np.ones(mtrue.size)*sig_half)
reg.alpha_s = 1e-2
reg.alpha_x = 1.
prb.counter = opt.counter = Utils.Counter()
opt.LSshorten = 0.5
opt.remember('xc')
77
78
79
80
81
82
83
84
85
86
87
88
89
mopt = inv.run(m0)
90
91
if plotIt:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1,1, figsize = (3, 6))
plt.semilogx(sigma[active], mesh.vectorCCz[active])
plt.semilogx(np.exp(mopt), mesh.vectorCCz[active])
ax.set_ylim(-600, 0)
ax.set_xlim(1e-4, 1e-2)
ax.set_xlabel('Conductivity (S/m)', fontsize = 14)
ax.set_ylabel('Depth (m)', fontsize = 14)
ax.grid(color='k', alpha=0.5, linestyle='dashed', linewidth=0.5)
plt.legend(['$\sigma_{true}$', '$\sigma_{pred}$'])
plt.show()
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
if __name__ == '__main__':
run()
10.1.2 FLOW: Richards: 1D: Celia1990
There are two different forms of Richards equation that differ on how they deal with the non-linearity in the timestepping term.
The most fundamental form, referred to as the ‘mixed’-form of Richards Equation Celia1990
𝜕𝜃(𝜓)
𝜕𝑘(𝜓)
− ∇ · 𝑘(𝜓)∇𝜓 −
=0 𝜓∈Ω
𝜕𝑡
𝜕𝑧
where \(\theta\) is water content, and \(\psi\) is pressure head. This formulation of Richards equation is called the
‘mixed’-form because the equation is parameterized in \(\psi\) but the time-stepping is in terms of \(\theta\).
As noted in Celia1990 the ‘head’-based form of Richards equation can be written in the continuous form as:
𝜕𝜃 𝜕𝜓
𝜕𝑘(𝜓)
− ∇ · 𝑘(𝜓)∇𝜓 −
=0 𝜓∈Ω
𝜕𝜓 𝜕𝑡
𝜕𝑧
However, it can be shown that this does not conserve mass in the discrete formulation.
Here we reproduce the results from Celia1990 demonstrating the head-based formulation and the mixed-formulation.
102
Chapter 10. Examples
SimPEG Documentation, Release 0.1.9
Mixed Method
10
∆t = 10 sec
∆t = 30 sec
∆t = 120 sec
30
40
50
60
2
30
40
50
60
70
0
1
∆t = 10 sec
∆t = 30 sec
∆t = 120 sec
20
Pressure Head, cm
Pressure Head, cm
20
Head-Based Method
10
5
10
15
20 25
Depth, cm
30
35
40
70
0
5
10
15
20 25
Depth, cm
30
35
40
from SimPEG import *
from SimPEG.FLOW import Richards
3
4
5
6
7
def run(plotIt=True):
"""
FLOW: Richards: 1D: Celia1990
=============================
8
9
10
There are two different forms of Richards equation that differ
on how they deal with the non-linearity in the time-stepping term.
11
12
13
The most fundamental form, referred to as the
'mixed'-form of Richards Equation Celia1990_
14
15
.. math::
16
17
18
\\frac{\partial \\theta(\psi)}{\partial t} - \\nabla \cdot k(\psi) \\nabla \psi - \\frac{
\quad \psi \in \Omega
19
20
21
22
23
where \\\\(\\\\theta\\\\) is water content, and \\\\(\\\\psi\\\\) is pressure head.
This formulation of Richards equation is called the
'mixed'-form because the equation is parameterized in \\\\(\\\\psi\\\\)
but the time-stepping is in terms of \\\\(\\\\theta\\\\).
24
25
26
As noted in Celia1990_ the 'head'-based form of Richards
equation can be written in the continuous form as:
27
28
.. math::
29
30
\\frac{\partial \\theta}{\partial \psi}\\frac{\partial \psi}{\partial t} - \\nabla \cdot
31
32
However, it can be shown that this does not conserve mass in the discrete formulation.
33
34
Here we reproduce the results from Celia1990_ demonstrating the head-based formulation and th
35
36
37
38
39
40
41
.. _Celia1990: http://www.webpages.uidaho.edu/ch/papers/Celia.pdf
"""
M = Mesh.TensorMesh([np.ones(40)])
M.setCellGradBC('dirichlet')
params = Richards.Empirical.HaverkampParams().celia1990
params['Ks'] = np.log(params['Ks'])
10.1. Examples
103
SimPEG Documentation, Release 0.1.9
E = Richards.Empirical.Haverkamp(M, **params)
42
43
bc = np.array([-61.5,-20.7])
h = np.zeros(M.nC) + bc[0]
44
45
46
47
def getFields(timeStep,method):
timeSteps = np.ones(360/timeStep)*timeStep
prob = Richards.RichardsProblem(M, mapping=E, timeSteps=timeSteps,
boundaryConditions=bc, initialConditions=h,
doNewton=False, method=method)
return prob.fields(params['Ks'])
48
49
50
51
52
53
54
Hs_M10 =
Hs_M30 =
Hs_M120=
Hs_H10 =
Hs_H30 =
Hs_H120=
55
56
57
58
59
60
getFields(10., 'mixed')
getFields(30., 'mixed')
getFields(120.,'mixed')
getFields(10., 'head')
getFields(30., 'head')
getFields(120.,'head')
61
if not plotIt:return
import matplotlib.pyplot as plt
plt.figure(figsize=(13,5))
plt.subplot(121)
plt.plot(40-M.gridCC, Hs_M10[-1],'b-')
plt.plot(40-M.gridCC, Hs_M30[-1],'r-')
plt.plot(40-M.gridCC, Hs_M120[-1],'k-')
plt.ylim([-70,-10])
plt.title('Mixed Method')
plt.xlabel('Depth, cm')
plt.ylabel('Pressure Head, cm')
plt.legend(('$\Delta t$ = 10 sec','$\Delta t$ = 30 sec','$\Delta t$ = 120 sec'))
plt.subplot(122)
plt.plot(40-M.gridCC, Hs_H10[-1],'b-')
plt.plot(40-M.gridCC, Hs_H30[-1],'r-')
plt.plot(40-M.gridCC, Hs_H120[-1],'k-')
plt.ylim([-70,-10])
plt.title('Head-Based Method')
plt.xlabel('Depth, cm')
plt.ylabel('Pressure Head, cm')
plt.legend(('$\Delta t$ = 10 sec','$\Delta t$ = 30 sec','$\Delta t$ = 120 sec'))
plt.show()
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
if __name__ == '__main__':
run()
104
Chapter 10. Examples
SimPEG Documentation, Release 0.1.9
10.1.3 Forward BasicDirectCurrent
TensorMesh
(b)
0.000024
0.000018
0.8
CurvilinearMesh
0.000024
0.000018
0.8
0.000006
y
0.000000
0.4
0.000012
Voltage (V)
0.000012
0.6
0.000006
0.000006
0.6
0.000000
0.4
0.000006
0.000012
0.2
0.000018
0.2
1
0.4
x
0.6
0.8
0.000024
Voltage (V)
(a)
0.000012
0.2
0.000018
0.2
0.4
x
0.6
0.8
0.000024
from SimPEG import Mesh, Utils, np, SolverLU
2
3
## 2D DC forward modeling example with Tensor and Curvilinear Meshes
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def run(plotIt=True):
# Step1: Generate Tensor and Curvilinear Mesh
sz = [40,40]
# Tensor Mesh
tM = Mesh.TensorMesh(sz)
# Curvilinear Mesh
rM = Mesh.CurvilinearMesh(Utils.meshutils.exampleLrmGrid(sz,'rotate'))
# Step2: Direct Current (DC) operator
def DCfun(mesh, pts):
D = mesh.faceDiv
G = D.T
sigma = 1e-2*np.ones(mesh.nC)
Msigi = mesh.getFaceInnerProduct(1./sigma)
MsigI = Utils.sdInv(Msigi)
A = D*MsigI*G
A[-1,-1] /= mesh.vol[-1] # Remove null space
rhs = np.zeros(mesh.nC)
txind = Utils.meshutils.closestPoints(mesh, pts)
rhs[txind] = np.r_[1,-1]
return A, rhs
25
26
pts = np.vstack((np.r_[0.25, 0.5], np.r_[0.75, 0.5]))
27
28
29
30
31
#Step3: Solve DC problem (LU solver)
AtM, rhstM = DCfun(tM, pts)
AinvtM = SolverLU(AtM)
phitM = AinvtM*rhstM
32
33
34
35
ArM, rhsrM = DCfun(rM, pts)
AinvrM = SolverLU(ArM)
phirM = AinvrM*rhsrM
36
37
if not plotIt: return
38
39
40
41
import matplotlib.pyplot as plt
import matplotlib
from matplotlib.mlab import griddata
42
10.1. Examples
105
SimPEG Documentation, Release 0.1.9
#Step4: Making Figure
fig, axes = plt.subplots(1,2,figsize=(12*1.2,4*1.2))
label = ["(a)", "(b)"]
opts = {}
vmin, vmax = phitM.min(), phitM.max()
dat = tM.plotImage(phitM, ax=axes[0], clim=(vmin, vmax), grid=True)
43
44
45
46
47
48
49
#TODO: At the moment Curvilinear Mesh do not have plotimage
50
51
Xi = tM.gridCC[:,0].reshape(sz[0], sz[1], order='F')
Yi = tM.gridCC[:,1].reshape(sz[0], sz[1], order='F')
PHIrM = griddata(rM.gridCC[:,0], rM.gridCC[:,1], phirM, Xi, Yi, interp='linear')
axes[1].contourf(Xi, Yi, PHIrM, 100, vmin=vmin, vmax=vmax)
52
53
54
55
56
cb = plt.colorbar(dat[0], ax=axes[0]); cb.set_label("Voltage (V)")
cb = plt.colorbar(dat[0], ax=axes[1]); cb.set_label("Voltage (V)")
57
58
59
tM.plotGrid(ax=axes[0], **opts)
axes[0].set_title('TensorMesh')
rM.plotGrid(ax=axes[1], **opts)
axes[1].set_title('CurvilinearMesh')
for i in range(2):
axes[i].set_xlim(0.025, 0.975)
axes[i].set_ylim(0.025, 0.975)
axes[i].text(0., 1.0, label[i], fontsize=20)
if i==0:
axes[i].set_ylabel("y")
else:
axes[i].set_ylabel(" ")
axes[i].set_xlabel("x")
plt.show()
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
if __name__ == '__main__':
run()
10.1.4 Inversion: Linear Problem
Here we go over the basics of creating a linear problem and inversion.
Columns of matrix G
1.0
1.5
True Model
Recovered Model
0.8
1.0
0.6
0.4
0.5
0.2
0.0
0.0
0.2
0.4
0.5
0.6
0.8
0
1
20
40
60
80
100
1.0
0.0
0.2
0.4
0.6
0.8
1.0
from SimPEG import *
2
106
Chapter 10. Examples
SimPEG Documentation, Release 0.1.9
3
4
5
6
7
def run(N=100, plotIt=True):
"""
Inversion: Linear Problem
=========================
8
Here we go over the basics of creating a linear problem and inversion.
9
10
11
"""
12
13
14
15
class LinearSurvey(Survey.BaseSurvey):
def projectFields(self, u):
return u
16
17
class LinearProblem(Problem.BaseProblem):
18
19
surveyPair = LinearSurvey
20
21
22
23
def __init__(self, mesh, G, **kwargs):
Problem.BaseProblem.__init__(self, mesh, **kwargs)
self.G = G
24
25
26
def fields(self, m, u=None):
return self.G.dot(m)
27
28
29
def Jvec(self, m, v, u=None):
return self.G.dot(v)
30
31
32
def Jtvec(self, m, v, u=None):
return self.G.T.dot(v)
33
34
35
np.random.seed(1)
36
37
mesh = Mesh.TensorMesh([N])
38
39
40
41
42
nk = 20
jk = np.linspace(1.,20.,nk)
p = -0.25
q = 0.25
43
44
g = lambda k: np.exp(p*jk[k]*mesh.vectorCCx)*np.cos(2*np.pi*q*jk[k]*mesh.vectorCCx)
45
46
G = np.empty((nk, mesh.nC))
47
48
49
for i in range(nk):
G[i,:] = g(i)
50
51
52
53
54
mtrue = np.zeros(mesh.nC)
mtrue[mesh.vectorCCx > 0.3] = 1.
mtrue[mesh.vectorCCx > 0.45] = -0.5
mtrue[mesh.vectorCCx > 0.6] = 0
55
56
57
58
59
prob = LinearProblem(mesh, G)
survey = LinearSurvey()
survey.pair(prob)
survey.makeSyntheticData(mtrue, std=0.01)
60
10.1. Examples
107
SimPEG Documentation, Release 0.1.9
M = prob.mesh
61
62
reg = Regularization.Tikhonov(mesh)
dmis = DataMisfit.l2_DataMisfit(survey)
opt = Optimization.InexactGaussNewton(maxIter=35)
invProb = InvProblem.BaseInvProblem(dmis, reg, opt)
beta = Directives.BetaSchedule()
betaest = Directives.BetaEstimate_ByEig()
inv = Inversion.BaseInversion(invProb, directiveList=[beta, betaest])
m0 = np.zeros_like(survey.mtrue)
63
64
65
66
67
68
69
70
71
mrec = inv.run(m0)
72
73
if plotIt:
import matplotlib.pyplot as plt
74
75
76
fig, axes = plt.subplots(1,2,figsize=(12*1.2,4*1.2))
for i in range(prob.G.shape[0]):
axes[0].plot(prob.G[i,:])
axes[0].set_title('Columns of matrix G')
77
78
79
80
81
axes[1].plot(M.vectorCCx, survey.mtrue, 'b-')
axes[1].plot(M.vectorCCx, mrec, 'r-')
axes[1].legend(('True Model', 'Recovered Model'))
plt.show()
82
83
84
85
86
return prob, survey, mesh, mrec
87
88
if __name__ == '__main__':
run()
10.1.5 Mesh: Basic: PlotImage
You can use M.PlotImage to plot images on all of the Meshes.
0.8
0.6
0.4
0.2
0.0
0.0
108
1.0
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0.0
0.2
0.4
x
0.6
0.8
1.0
TreeMesh
1.0
0.8
0.6
0.4
0.2
0.0
0.0
1.0
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0.0
Random Field
TensorMesh
1.0
Random
y Field
90
y
89
0.2
0.4
x
0.6
0.8
1.0
Chapter 10. Examples
SimPEG Documentation, Release 0.1.9
1
from SimPEG import *
2
3
4
5
6
def run(plotIt=True):
"""
Mesh: Basic: PlotImage
======================
7
8
You can use M.PlotImage to plot images on all of the Meshes.
9
10
11
12
13
14
"""
M = Mesh.TensorMesh([32,32])
v = Utils.ModelBuilder.randomModel(M.vnC, seed=789)
v = Utils.mkvc(v)
15
16
17
18
19
20
21
22
23
24
O = Mesh.TreeMesh([32,32])
O.refine(1)
def function(cell):
if (cell.center[0] < 0.75 and cell.center[0] > 0.25 and
cell.center[1] < 0.75 and cell.center[1] > 0.25):return 5
if (cell.center[0] < 0.9 and cell.center[0] > 0.1 and
cell.center[1] < 0.9 and cell.center[1] > 0.1):return 4
return 3
O.refine(function)
25
26
P = M.getInterpolationMat(O.gridCC, 'CC')
27
28
ov = P * v
29
30
31
if plotIt:
import matplotlib.pyplot as plt
32
33
fig, axes = plt.subplots(1,2,figsize=(10,5))
34
35
36
37
out = M.plotImage(v, grid=True, ax=axes[0])
cb = plt.colorbar(out[0], ax=axes[0]); cb.set_label("Random Field")
axes[0].set_title('TensorMesh')
38
39
40
41
out = O.plotImage(ov, grid=True, ax=axes[1], clim=[0,1])
cb = plt.colorbar(out[0], ax=axes[1]); cb.set_label("Random Field")
axes[1].set_title('TreeMesh')
42
43
plt.show()
44
45
46
if __name__ == '__main__':
run()
10.1.6 Mesh: Basic: Types
Here we show SimPEG used to create three different types of meshes.
10.1. Examples
109
SimPEG Documentation, Release 0.1.9
TensorMesh
1.0
0.6
0.6
x2
0.6
x2
0.8
x2
0.8
0.4
0.4
0.4
0.2
0.2
0.2
0.2
0.4
x1
0.6
0.8
1.0
CurvilinearMesh
1.0
0.8
0.0
0.0
1
TreeMesh
1.0
0.0
0.0
0.2
0.4
x1
0.6
0.8
1.0
0.0
0.0
0.2
0.4
x1
0.6
0.8
1.0
from SimPEG import *
2
3
4
5
6
def run(plotIt=True):
"""
Mesh: Basic: Types
==================
7
Here we show SimPEG used to create three different types of meshes.
8
9
"""
sz = [16,16]
tM = Mesh.TensorMesh(sz)
qM = Mesh.TreeMesh(sz)
qM.refine(lambda cell: 4 if np.sqrt(((np.r_[cell.center]-0.5)**2).sum()) < 0.4 else 3)
rM = Mesh.CurvilinearMesh(Utils.meshutils.exampleLrmGrid(sz,'rotate'))
10
11
12
13
14
15
16
if plotIt:
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1,3,figsize=(14,5))
opts = {}
tM.plotGrid(ax=axes[0], **opts)
axes[0].set_title('TensorMesh')
qM.plotGrid(ax=axes[1], **opts)
axes[1].set_title('TreeMesh')
rM.plotGrid(ax=axes[2], **opts)
axes[2].set_title('CurvilinearMesh')
plt.show()
17
18
19
20
21
22
23
24
25
26
27
28
29
30
if __name__ == '__main__':
run()
10.1.7 Mesh: Operators: Cahn Hilliard
This example is based on the example in the FiPy library. Please see their documentation for more information about
the Cahn-Hilliard equation.
The “Cahn-Hilliard” equation separates a field \( \phi \) into 0 and 1 with smooth transitions.
(︂
)︂
𝜕𝜑
𝜕𝑓
= ∇ · 𝐷∇
− 𝜖2 ∇2 𝜑
𝜕𝑡
𝜕𝜑
110
Chapter 10. Examples
SimPEG Documentation, Release 0.1.9
Where \( f \) is the energy function \( f = ( a^2 / 2 )\phi^2(1 - \phi)^2 \) which drives \( \phi \) towards either 0 or 1, this
competes with the term \(\epsilon^2 \nabla^2 \phi \) which is a diffusion term that creates smooth changes in \( \phi \).
The equation can be factored:
𝜕𝜑
= ∇ · 𝐷∇𝜓
𝜕𝑡
2
𝜕 𝑓
𝜕𝑓
𝜓=
(𝜑 − 𝜑old ) +
− 𝜖2 ∇2 𝜑
2
𝜕𝜑
𝜕𝜑
Here we will need the derivatives of \( f \):
𝜕2𝑓
𝜕𝑓
= (𝑎2 /2)2𝜑(1 − 𝜑)(1 − 2𝜑) 2 = (𝑎2 /2)2[1 − 6𝜑(1 − 𝜑)]
𝜕𝜑
𝜕𝜑
The implementation below uses backwards Euler in time with an exponentially increasing time step. The initial \( \phi
\) is a normally distributed field with a standard deviation of 0.1 and mean of 0.5. The grid is 60x60 and takes a few
seconds to solve ~130 times. The results are seen below, and you can see the field separating as the time increases.
1
Elapsed Time: 0.1
Elapsed Time: 0.3
Elapsed Time: 0.7
Elapsed Time: 1.7
Elapsed Time: 4.4
Elapsed Time: 11.7
Elapsed Time: 30.5
Elapsed Time: 75.1
from SimPEG import *
2
3
4
5
6
def run(plotIt=True, n=60):
"""
Mesh: Operators: Cahn Hilliard
==============================
7
8
9
This example is based on the example in the FiPy_ library.
Please see their documentation for more information about the Cahn-Hilliard equation.
10
11
The "Cahn-Hilliard" equation separates a field \\\\( \\\\phi \\\\) into 0 and 1 with smooth t
12
13
.. math::
14
15
\\frac{\partial \phi}{\partial t} = \\nabla \cdot D \\nabla \left( \\frac{\partial f}{\pa
16
17
18
19
20
Where \\\\( f \\\\) is the energy function \\\\( f = ( a^2 / 2 )\\\\phi^2(1 - \\\\phi)^2 \\\\
which drives \\\\( \\\\phi \\\\) towards either 0 or 1, this competes with the term
\\\\(\\\\epsilon^2 \\\\nabla^2 \\\\phi \\\\) which is a diffusion term that creates smooth ch
The equation can be factored:
21
22
.. math::
10.1. Examples
111
SimPEG Documentation, Release 0.1.9
23
\\frac{\partial \phi}{\partial t} = \\nabla \cdot D \\nabla \psi \\\\
\psi = \\frac{\partial^2 f}{\partial \phi^2} (\phi - \phi^{\\text{old}}) + \\frac{\partia
24
25
26
Here we will need the derivatives of \\\\( f \\\\):
27
28
.. math::
29
30
\\frac{\partial f}{\partial \phi} = (a^2/2)2\phi(1-\phi)(1-2\phi)
\\frac{\partial^2 f}{\partial \phi^2} = (a^2/2)2[1-6\phi(1-\phi)]
31
32
33
The implementation below uses backwards Euler in time with an exponentially increasing time s
The initial \\\\( \\\\phi \\\\) is a normally distributed field with a standard deviation of
The grid is 60x60 and takes a few seconds to solve ~130 times. The results are seen below, an
field separating as the time increases.
34
35
36
37
38
.. _FiPy: http://www.ctcms.nist.gov/fipy/examples/cahnHilliard/generated/examples.cahnHilliar
39
40
"""
41
42
np.random.seed(5)
43
44
# Here we are going to rearrange the equations:
45
46
#
#
#
#
#
#
#
#
#
47
48
49
50
51
52
53
54
55
(phi_ - phi)/dt = A*(d2fdphi2*(phi_ - phi) + dfdphi - L*phi_)
(phi_ - phi)/dt = A*(d2fdphi2*phi_ - d2fdphi2*phi + dfdphi - L*phi_)
(phi_ - phi)/dt = A*d2fdphi2*phi_ + A*( - d2fdphi2*phi + dfdphi - L*phi_)
phi_ - phi = dt*A*d2fdphi2*phi_ + dt*A*(- d2fdphi2*phi + dfdphi - L*phi_)
phi_ - dt*A*d2fdphi2 * phi_ = dt*A*(- d2fdphi2*phi + dfdphi - L*phi_) + phi
(I - dt*A*d2fdphi2) * phi_ = dt*A*(- d2fdphi2*phi + dfdphi - L*phi_) + phi
(I - dt*A*d2fdphi2) * phi_ = dt*A*dfdphi - dt*A*d2fdphi2*phi - dt*A*L*phi_ + phi
(dt*A*d2fdphi2 - I) * phi_ = dt*A*d2fdphi2*phi + dt*A*L*phi_ - phi - dt*A*dfdphi
(dt*A*d2fdphi2 - I - dt*A*L) * phi_ = (dt*A*d2fdphi2 - I)*phi - dt*A*dfdphi
56
h = [(0.25,n)]
M = Mesh.TensorMesh([h,h])
57
58
59
# Constants
D = a = epsilon = 1.
I = Utils.speye(M.nC)
60
61
62
63
# Operators
A = D * M.faceDiv * M.cellGrad
L = epsilon**2 * M.faceDiv * M.cellGrad
64
65
66
67
duration = 75
elapsed = 0.
dexp = -5
phi = np.random.normal(loc=0.5,scale=0.01,size=M.nC)
ii, jj = 0, 0
PHIS = []
capture = np.logspace(-1,np.log10(duration),8)
while elapsed < duration:
dt = min(100, np.exp(dexp))
elapsed += dt
dexp += 0.05
68
69
70
71
72
73
74
75
76
77
78
79
dfdphi
80
112
= a**2 * 2 * phi * (1 - phi) * (1 - 2 * phi)
Chapter 10. Examples
SimPEG Documentation, Release 0.1.9
81
d2fdphi2 = Utils.sdiag(a**2 * 2 * (1 - 6 * phi * (1 - phi)))
82
83
84
85
MAT = (dt*A*d2fdphi2 - I - dt*A*L)
rhs = (dt*A*d2fdphi2 - I)*phi - dt*A*dfdphi
phi = Solver(MAT)*rhs
86
87
88
89
90
91
if elapsed > capture[jj]:
PHIS += [(elapsed, phi.copy())]
jj += 1
if ii % 10 == 0: print ii, elapsed
ii += 1
92
93
94
95
96
97
98
99
100
101
102
if plotIt:
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2,4,figsize=(14,6))
axes = np.array(axes).flatten().tolist()
for ii, ax in zip(np.linspace(0,len(PHIS)-1,len(axes)),axes):
ii = int(ii)
out = M.plotImage(PHIS[ii][1],ax=ax)
ax.axis('off')
ax.set_title('Elapsed Time: %4.1f'%PHIS[ii][0])
plt.show()
103
104
105
if __name__ == '__main__':
run()
10.1.8 Mesh: QuadTree: Creation
You can give the refine method a function, which is evaluated on every cell of the TreeMesh.
Occasionally it is useful to initially refine to a constant level (e.g. 3 in this 32x32 mesh). This means the function is
first evaluated on an 8x8 mesh (2^3).
10.1. Examples
113
SimPEG Documentation, Release 0.1.9
1.0
0.8
x2
0.6
0.4
0.2
0.0
0.0
1
0.2
0.4
x1
0.6
0.8
1.0
from SimPEG import *
2
3
4
5
6
def run(plotIt=True):
"""
Mesh: QuadTree: Creation
========================
7
You can give the refine method a function, which is evaluated on every cell
of the TreeMesh.
8
9
10
Occasionally it is useful to initially refine to a constant level
(e.g. 3 in this 32x32 mesh). This means the function is first evaluated
on an 8x8 mesh (2^3).
11
12
13
14
"""
M = Mesh.TreeMesh([32,32])
M.refine(3)
def function(cell):
xyz = cell.center
for i in range(3):
if np.abs(np.sin(xyz[0]*np.pi*2)*0.5 + 0.5 - xyz[1]) < 0.2*i:
return 6-i
return 0
M.refine(function);
if plotIt: M.plotGrid(showIt=True)
15
16
17
18
19
20
21
22
23
24
25
26
114
Chapter 10. Examples
SimPEG Documentation, Release 0.1.9
27
28
if __name__ == '__main__':
run()
10.1.9 Mesh: QuadTree: FaceDiv
Simple QuadTree Mesh
33
12
13
30
13
11
28
11
2
2
20
3
0
0
18
1
10
0
34
0
5
10
14
31
14
12
29
5 5 6
22
23 8
3 4 4
21
1
19
35
6
Face
Divergence
15
20
15
17
32
9
26
9
10
27
16
7
24
7
8
25
15
25
30
35
2
Cell Number
4
6
8
10
12
14
Face Number
1
from SimPEG import *
2
3
4
5
6
def run(plotIt=True, n=60):
"""
Mesh: QuadTree: FaceDiv
=======================
7
8
10.1. Examples
115
SimPEG Documentation, Release 0.1.9
9
"""
10
11
12
M = Mesh.TreeMesh([[(1,16)],[(1,16)]], levels=4)
M._refineCell([0,0,0])
M._refineCell([0,0,1])
M._refineCell([4,4,2])
M.__dirty__ = True
M.number()
13
14
15
16
17
18
19
20
if plotIt:
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2,1,figsize=(10,10))
21
22
23
24
M.plotGrid(cells=True, nodes=False, ax=axes[0])
axes[0].axis('off')
axes[0].set_title('Simple QuadTree Mesh')
axes[0].set_xlim([-1,17])
axes[0].set_ylim([-1,17])
25
26
27
28
29
30
for ii, loc in zip(range(M.nC),M.gridCC):
axes[0].text(loc[0]+0.2,loc[1],'%d'%ii, color='r')
31
32
33
axes[0].plot(M.gridFx[:,0],M.gridFx[:,1], 'g>')
for ii, loc in zip(range(M.nFx),M.gridFx):
axes[0].text(loc[0]+0.2,loc[1],'%d'%ii, color='g')
34
35
36
37
axes[0].plot(M.gridFy[:,0],M.gridFy[:,1], 'm^')
for ii, loc in zip(range(M.nFy),M.gridFy):
axes[0].text(loc[0]+0.2,loc[1]+0.2,'%d'%(ii+M.nFx), color='m')
38
39
40
41
axes[1].spy(M.faceDiv)
axes[1].set_title('Face Divergence')
axes[1].set_ylabel('Cell Number')
axes[1].set_xlabel('Face Number')
plt.show()
42
43
44
45
46
47
48
49
if __name__ == '__main__':
run()
10.1.10 Mesh: QuadTree: Hanging Nodes
You can give the refine method a function, which is evaluated on every cell of the TreeMesh.
Occasionally it is useful to initially refine to a constant level (e.g. 3 in this 32x32 mesh). This means the function is
first evaluated on an 8x8 mesh (2^3).
116
Chapter 10. Examples
SimPEG Documentation, Release 0.1.9
1.0
Grid
Cell Centers
Nodes
Hanging Nodes
X faces
Hanging X faces
0.8
x2
0.6
0.4
0.2
0.0
0.0
1
0.2
0.4
x1
0.6
0.8
1.0
from SimPEG import *
2
3
4
5
6
def run(plotIt=True):
"""
Mesh: QuadTree: Hanging Nodes
=============================
7
8
9
You can give the refine method a function, which is evaluated on every cell
of the TreeMesh.
10
11
12
13
Occasionally it is useful to initially refine to a constant level
(e.g. 3 in this 32x32 mesh). This means the function is first evaluated
on an 8x8 mesh (2^3).
14
15
16
17
18
19
20
21
22
23
24
25
26
"""
M = Mesh.TreeMesh([8,8])
def function(cell):
xyz = cell.center
dist = ((xyz - [0.25,0.25])**2).sum()**0.5
if dist < 0.25:
return 3
return 2
M.refine(function);
M.number()
if plotIt:
import matplotlib.pyplot as plt
10.1. Examples
117
SimPEG Documentation, Release 0.1.9
M.plotGrid(nodes=True, cells=True, facesX=True)
plt.legend(('Grid', 'Cell Centers', 'Nodes', 'Hanging Nodes', 'X faces', 'Hanging X faces'))
plt.show()
27
28
29
30
32
if __name__ == '__main__':
run()
10.1.11 Mesh: Tensor: Creation
For tensor meshes, there are some functions that can come in handy. For example, creating mesh tensors can be a bit
time consuming, these can be created speedily by just giving numbers and sizes of padding. See the example below,
that follows this notation:
h1 = (
(cellSize, numPad, [, increaseFactor]),
(cellSize, numCore),
(cellSize, numPad, [, increaseFactor])
)
Note: You can center your mesh by passing a ‘C’ for the x0[i] position. A ‘N’ will make the entire mesh negative,
and a ‘0’ (or a 0) will make the mesh start at zero.
0
50
100
x2
31
150
200
250
300
150
118
100
50
0
x1
50
100
150
Chapter 10. Examples
SimPEG Documentation, Release 0.1.9
1
from SimPEG import *
2
3
4
def run(plotIt=True):
"""
5
6
7
Mesh: Tensor: Creation
======================
8
9
10
11
12
13
For tensor meshes, there are some functions that can come
in handy. For example, creating mesh tensors can be a bit time
consuming, these can be created speedily by just giving numbers
and sizes of padding. See the example below, that follows this
notation::
14
15
h1 = (
(cellSize, numPad, [, increaseFactor]),
(cellSize, numCore),
(cellSize, numPad, [, increaseFactor])
16
17
18
)
19
20
21
.. note::
22
23
24
25
You can center your mesh by passing a 'C' for the x0[i] position.
A 'N' will make the entire mesh negative, and a '0' (or a 0) will
make the mesh start at zero.
26
27
28
29
30
31
"""
h1 = [(10, 5, -1.3), (5, 20), (10, 3, 1.3)]
M = Mesh.TensorMesh([h1, h1], x0='CN')
if plotIt:
M.plotGrid(showIt=True)
32
33
34
if __name__ == '__main__':
run()
10.1.12 External Notebooks
• Example 1: Direct Current
• Example 2: Seismic-Acoustic
10.1. Examples
119
SimPEG Documentation, Release 0.1.9
120
Chapter 10. Examples
Python Module Index
s
SimPEG.Directives, 60
SimPEG.EM.FDEM.FDEM, 86
SimPEG.EM.FDEM.SurveyFDEM, 89
SimPEG.Inversion, 61
SimPEG.Mesh.BaseMesh, 22
SimPEG.Mesh.CylMesh, 15
SimPEG.Mesh.DiffOperators, 29
SimPEG.Mesh.InnerProducts, 35
SimPEG.Mesh.TensorMesh, 9
SimPEG.Optimization, 52
SimPEG.Problem, 40
SimPEG.Regularization, 49
SimPEG.Survey, 42
SimPEG.Tests, 79
SimPEG.Utils, 70
SimPEG.Utils.CounterUtils, 79
SimPEG.Utils.curvutils, 72
SimPEG.Utils.interputils, 77
SimPEG.Utils.matutils, 70
SimPEG.Utils.meshutils, 74
SimPEG.Utils.ModelBuilder, 76
SimPEG.Utils.SolverUtils, 72
121
SimPEG Documentation, Release 0.1.9
122
Python Module Index
Index
Symbols
_doEndIterationRemember()
(SimPEG.Optimization.Remember
method),
58
_doEndIteration_BFGS() (SimPEG.Optimization.BFGS
method), 58
_doEndIteration_ProjectedGradient()
(SimPEG.Optimization.ProjectedGradient method),
58
_rememberThese (SimPEG.Optimization.Remember attribute), 57
_startup()
(SimPEG.Optimization.ProjectedGradient
method), 58
_startupRemember() (SimPEG.Optimization.Remember
method), 58
_startup_BFGS() (SimPEG.Optimization.BFGS method),
58
A
activeSet()
(SimPEG.Optimization.ProjectedGradient
method), 58
addBlock() (in module SimPEG.Utils.ModelBuilder), 76
alpha_s (SimPEG.Regularization.Tikhonov attribute), 51
alpha_x (SimPEG.Regularization.Tikhonov attribute), 51
alpha_xx (SimPEG.Regularization.Tikhonov attribute),
51
alpha_y (SimPEG.Regularization.Tikhonov attribute), 51
alpha_yy (SimPEG.Regularization.Tikhonov attribute),
51
alpha_z (SimPEG.Regularization.Tikhonov attribute), 51
alpha_zz (SimPEG.Regularization.Tikhonov attribute),
51
approxHinv (SimPEG.Optimization.InexactGaussNewton
attribute), 59
area (SimPEG.Mesh.CylMesh.CylMesh attribute), 16
area (SimPEG.Mesh.TensorMesh.TensorMesh attribute),
12
area (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 14
armijoGoldstein (SimPEG.Optimization.StoppingCriteria
attribute), 52
aSet (SimPEG.Optimization.IterationPrinters attribute),
52
av() (in module SimPEG.Utils.matutils), 70
aveCC2F (SimPEG.Mesh.DiffOperators.DiffOperators
attribute), 31
aveE2CC (SimPEG.Mesh.CylMesh.CylMesh attribute),
17
aveE2CC (SimPEG.Mesh.DiffOperators.DiffOperators
attribute), 31
aveE2CC (SimPEG.Mesh.TreeMesh.TreeMesh attribute),
14
aveE2CCV (SimPEG.Mesh.CylMesh.CylMesh attribute),
17
aveE2CCV (SimPEG.Mesh.DiffOperators.DiffOperators
attribute), 32
aveE2CCV (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 14
aveEx2CC (SimPEG.Mesh.DiffOperators.DiffOperators
attribute), 32
aveEx2CC (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 14
aveEy2CC (SimPEG.Mesh.DiffOperators.DiffOperators
attribute), 32
aveEy2CC (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 14
aveEz2CC (SimPEG.Mesh.DiffOperators.DiffOperators
attribute), 32
aveEz2CC (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 14
aveF2CC (SimPEG.Mesh.CylMesh.CylMesh attribute),
17
aveF2CC (SimPEG.Mesh.DiffOperators.DiffOperators
attribute), 31
aveF2CC (SimPEG.Mesh.TreeMesh.TreeMesh attribute),
14
aveF2CCV (SimPEG.Mesh.CylMesh.CylMesh attribute),
17
aveF2CCV (SimPEG.Mesh.DiffOperators.DiffOperators
attribute), 31
aveF2CCV (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 14
123
SimPEG Documentation, Release 0.1.9
aveFx2CC (SimPEG.Mesh.DiffOperators.DiffOperators
attribute), 31
aveFx2CC (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 14
aveFy2CC (SimPEG.Mesh.DiffOperators.DiffOperators
attribute), 31
aveFy2CC (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 14
aveFz2CC (SimPEG.Mesh.DiffOperators.DiffOperators
attribute), 31
aveFz2CC (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 14
aveN2CC (SimPEG.Mesh.DiffOperators.DiffOperators
attribute), 32
aveN2CC
(SimPEG.Mesh.TreeMesh.TreeMesh
attribute), 14
aveN2E (SimPEG.Mesh.DiffOperators.DiffOperators attribute), 32
aveN2F (SimPEG.Mesh.DiffOperators.DiffOperators attribute), 32
avExtrap() (in module SimPEG.Utils.matutils), 70
B
balance() (SimPEG.Mesh.TreeMesh.TreeMesh method),
14
BaseDataMisfit (class in SimPEG.DataMisfit), 47
BaseFDEMProblem
(class
in
SimPEG.EM.FDEM.FDEM), 86
BaseInversion (class in SimPEG.Inversion), 61
BaseMesh (class in SimPEG.Mesh.BaseMesh), 22
BaseProblem (class in SimPEG.Problem), 40
BaseRectangularMesh
(class
in
SimPEG.Mesh.BaseMesh), 27
BaseRegularization (class in SimPEG.Regularization), 49
BaseRx (class in SimPEG.Survey), 42
BaseSrc (class in SimPEG.Survey), 43
BaseSurvey (class in SimPEG.Survey), 43
BaseTensorMesh (class in SimPEG.Mesh.TensorMesh), 9
BaseTimeProblem (class in SimPEG.Problem), 41
BaseTimeRx (class in SimPEG.Survey), 42
beta (SimPEG.Optimization.IterationPrinters attribute),
53
beta0 (SimPEG.Directives.BetaEstimate_ByEig attribute), 60
beta0_ratio (SimPEG.Directives.BetaEstimate_ByEig attribute), 60
BetaEstimate_ByEig (class in SimPEG.Directives), 60
BetaSchedule (class in SimPEG.Directives), 61
BFGS (class in SimPEG.Optimization), 58
bfgs() (SimPEG.Optimization.BFGS method), 58
bfgsH0 (SimPEG.Optimization.BFGS attribute), 58
bfgsrec() (SimPEG.Optimization.BFGS method), 58
bindingSet (SimPEG.Optimization.StoppingCriteria attribute), 52
124
bindingSet() (SimPEG.Optimization.ProjectedGradient
method), 58
bindingSet_LS (SimPEG.Optimization.StoppingCriteria
attribute), 52
bSet (SimPEG.Optimization.IterationPrinters attribute),
53
C
call() (SimPEG.Directives.DirectiveList method), 60
callback (SimPEG.Optimization.Minimize attribute), 53
cellBoundaryInd (SimPEG.Mesh.TensorMesh.TensorMesh
attribute), 12
cellGrad (SimPEG.Mesh.CylMesh.CylMesh attribute),
16
cellGrad (SimPEG.Mesh.DiffOperators.DiffOperators attribute), 31
cellGradBC (SimPEG.Mesh.DiffOperators.DiffOperators
attribute), 31
cellGradx (SimPEG.Mesh.DiffOperators.DiffOperators
attribute), 31
cellGrady (SimPEG.Mesh.DiffOperators.DiffOperators
attribute), 31
cellGradz (SimPEG.Mesh.DiffOperators.DiffOperators
attribute), 31
checkBC() (in module SimPEG.Mesh.DiffOperators), 29
checkDerivative() (in module SimPEG.Tests), 81
clean() (SimPEG.Utils.SolverUtils.SolverDiag method),
72
closestPoints() (in module SimPEG.Utils.meshutils), 74
ComboMap (class in SimPEG.Maps), 69
comment
(SimPEG.Optimization.IterationPrinters
attribute), 53
comment (SimPEG.Optimization.Minimize attribute), 53
comments
(SimPEG.Optimization.NewtonRoot
attribute), 59
coolingFactor (SimPEG.Directives.BetaSchedule attribute), 61
coolingRate
(SimPEG.Directives.BetaSchedule
attribute), 61
corsen() (SimPEG.Mesh.TreeMesh.TreeMesh method),
14
count() (in module SimPEG.Utils.CounterUtils), 79
count() (SimPEG.Utils.CounterUtils.Counter method), 79
Counter (class in SimPEG.Utils.CounterUtils), 79
counter (SimPEG.DataMisfit.BaseDataMisfit attribute),
47
counter (SimPEG.Inversion.BaseInversion attribute), 62
counter (SimPEG.Optimization.Minimize attribute), 53
counter (SimPEG.Problem.BaseProblem attribute), 40
counter (SimPEG.Regularization.BaseRegularization attribute), 49
counter (SimPEG.Survey.BaseSurvey attribute), 43
countTic()
(SimPEG.Utils.CounterUtils.Counter
method), 79
Index
SimPEG Documentation, Release 0.1.9
countToc()
(SimPEG.Utils.CounterUtils.Counter edge (SimPEG.Mesh.TensorMesh.TensorMesh attribute),
method), 79
12
curModel (SimPEG.Problem.BaseProblem attribute), 40 edge (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 14
CylMesh (class in SimPEG.Mesh.CylMesh), 15
edgeCurl (SimPEG.Mesh.CylMesh.CylMesh attribute),
17
D
edgeCurl (SimPEG.Mesh.DiffOperators.DiffOperators
attribute), 31
Data (class in SimPEG.Survey), 43
edgeCurl (SimPEG.Mesh.TreeMesh.TreeMesh attribute),
ddx() (in module SimPEG.Utils.matutils), 70
14
ddxCellGrad() (in module SimPEG.Mesh.DiffOperators),
endIter() (SimPEG.Directives.BetaSchedule method), 61
29
(SimPEG.Directives.InversionDirective
ddxCellGradBC()
(in
module
Sim- endIter()
method), 60
PEG.Mesh.DiffOperators), 30
debug (SimPEG.DataMisfit.BaseDataMisfit attribute), 47 endIter() (SimPEG.Directives.SaveModelEveryIteration
method), 61
debug (SimPEG.Directives.DirectiveList attribute), 60
debug (SimPEG.Directives.InversionDirective attribute), endIter() (SimPEG.Directives.SaveOutputEveryIteration
method), 61
60
endIter() (SimPEG.Directives.TargetMisfit method), 61
debug (SimPEG.Inversion.BaseInversion attribute), 61
eps (SimPEG.Optimization.Minimize attribute), 53
debug (SimPEG.Optimization.Minimize attribute), 53
debugLS (SimPEG.Optimization.Minimize attribute), 53 eval() (SimPEG.DataMisfit.BaseDataMisfit method), 47
defineBlock() (in module SimPEG.Utils.ModelBuilder), eval() (SimPEG.DataMisfit.l2_DataMisfit method), 48
eval()
(SimPEG.Regularization.BaseRegularization
76
method), 49
defineElipse() (in module SimPEG.Utils.ModelBuilder),
eval() (SimPEG.Regularization.Tikhonov method), 52
76
(SimPEG.DataMisfit.BaseDataMisfit
defineTwoLayers()
(in
module
Sim- eval2Deriv()
method), 48
PEG.Utils.ModelBuilder), 76
(SimPEG.DataMisfit.l2_DataMisfit
deleteTheseOnModelUpdate
(Sim- eval2Deriv()
method), 48
PEG.Problem.BaseProblem attribute), 40
eval2Deriv() (SimPEG.Regularization.BaseRegularization
deriv() (SimPEG.Maps.ComboMap method), 70
method), 49
deriv() (SimPEG.Maps.ExpMap method), 68
evalDeriv()
(SimPEG.DataMisfit.BaseDataMisfit
deriv() (SimPEG.Maps.IdentityMap method), 67
method), 48
deriv() (SimPEG.Maps.Map2Dto3D method), 68
evalDeriv() (SimPEG.DataMisfit.l2_DataMisfit method),
deriv() (SimPEG.Maps.Mesh2Mesh method), 69
48
deriv() (SimPEG.Maps.Vertical1DMap method), 68
evalDeriv() (SimPEG.Regularization.BaseRegularization
diagEst() (in module SimPEG.Utils.matutils), 71
method), 49
DiffOperators (class in SimPEG.Mesh.DiffOperators), 30
evalDeriv() (SimPEG.Regularization.Tikhonov method),
dim (SimPEG.Mesh.BaseMesh.BaseMesh attribute), 23
52
DirectiveList (class in SimPEG.Directives), 60
directiveList
(SimPEG.Inversion.BaseInversion
at- exampleLrmGrid() (in module SimPEG.Utils.meshutils),
74
tribute), 62
expectedOrders (SimPEG.Tests.OrderTest attribute), 80
dList (SimPEG.Directives.DirectiveList attribute), 60
dmisfit (SimPEG.Directives.InversionDirective attribute), ExpMap (class in SimPEG.Maps), 67
ExtractCoreMesh() (in module SimPEG.Utils.meshutils),
60
75
dobs (SimPEG.Survey.BaseSurvey attribute), 43
doEndIteration()
(SimPEG.Optimization.Minimize
F
method), 57
doLS (SimPEG.Optimization.NewtonRoot attribute), 59 f (SimPEG.Optimization.IterationPrinters attribute), 52
(SimdoStartIteration()
(SimPEG.Optimization.Minimize faceBoundaryInd
PEG.Mesh.TensorMesh.TensorMesh attribute),
method), 55
12
dpred() (SimPEG.Survey.BaseSurvey method), 44
faceDiv (SimPEG.Mesh.CylMesh.CylMesh attribute), 16
dtrue (SimPEG.Survey.BaseSurvey attribute), 43
faceDiv (SimPEG.Mesh.DiffOperators.DiffOperators attribute), 30
E
faceDiv
(SimPEG.Mesh.TreeMesh.TreeMesh
attribute),
edge (SimPEG.Mesh.CylMesh.CylMesh attribute), 16
14
Index
125
SimPEG Documentation, Release 0.1.9
faceDivx (SimPEG.Mesh.CylMesh.CylMesh attribute), getA() (SimPEG.EM.FDEM.FDEM.Problem_e method),
16
87
faceDivx (SimPEG.Mesh.DiffOperators.DiffOperators getA() (SimPEG.EM.FDEM.FDEM.Problem_h method),
attribute), 30
89
faceDivy (SimPEG.Mesh.CylMesh.CylMesh attribute), getA() (SimPEG.EM.FDEM.FDEM.Problem_j method),
16
88
faceDivy (SimPEG.Mesh.DiffOperators.DiffOperators getADeriv_m() (SimPEG.EM.FDEM.FDEM.Problem_b
attribute), 30
method), 88
faceDivz (SimPEG.Mesh.CylMesh.CylMesh attribute), getADeriv_m() (SimPEG.EM.FDEM.FDEM.Problem_e
16
method), 87
faceDivz (SimPEG.Mesh.DiffOperators.DiffOperators at- getADeriv_m() (SimPEG.EM.FDEM.FDEM.Problem_h
tribute), 30
method), 89
faceInfo() (in module SimPEG.Utils.curvutils), 73
getADeriv_m() (SimPEG.EM.FDEM.FDEM.Problem_j
fields() (SimPEG.EM.FDEM.FDEM.BaseFDEMProblem
method), 88
method), 86
getBCProjWF() (SimPEG.Mesh.DiffOperators.DiffOperators
fields() (SimPEG.Problem.BaseProblem method), 41
method), 31
fieldsPair (SimPEG.EM.FDEM.FDEM.BaseFDEMProblem getEdgeInnerProduct()
(Simattribute), 86
PEG.Mesh.InnerProducts.InnerProducts
fieldsPair
(SimPEG.EM.FDEM.FDEM.Problem_b
method), 36
attribute), 87
getEdgeInnerProductDeriv()
(SimfieldsPair
(SimPEG.EM.FDEM.FDEM.Problem_e
PEG.Mesh.InnerProducts.InnerProducts
attribute), 87
method), 36
fieldsPair
(SimPEG.EM.FDEM.FDEM.Problem_h getError() (SimPEG.Tests.OrderTest method), 80
attribute), 89
getFaceInnerProduct()
(SimfieldsPair
(SimPEG.EM.FDEM.FDEM.Problem_j
PEG.Mesh.InnerProducts.InnerProducts
attribute), 88
method), 35
fill (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 12
getFaceInnerProductDeriv()
(SimfindSearchDirection()
(SimPEG.Optimization.BFGS
PEG.Mesh.InnerProducts.InnerProducts
method), 58
method), 36
findSearchDirection()
(Sim- getIndicesBlock()
(in
module
SimPEG.Optimization.GaussNewton
method),
PEG.Utils.ModelBuilder), 76
59
getInterpolationMat()
(SimfindSearchDirection()
(SimPEG.Mesh.TensorMesh.BaseTensorMesh
PEG.Optimization.InexactGaussNewton
method), 10
method), 59
getInterpolationMat()
(SimfindSearchDirection() (SimPEG.Optimization.Minimize
PEG.Mesh.TreeMesh.TreeMesh
method),
method), 56
14
findSearchDirection()
(Sim- getInterpolationMatCartMesh()
(SimPEG.Optimization.ProjectedGradient method),
PEG.Mesh.CylMesh.CylMesh
method),
58
17
findSearchDirection()
(Sim- getP() (SimPEG.Survey.BaseRx method), 42
PEG.Optimization.SteepestDescent method), getP() (SimPEG.Survey.BaseTimeRx method), 42
59
getQuadratic() (in module SimPEG.Tests), 81
finish() (SimPEG.Directives.InversionDirective method), getRHS()
(SimPEG.EM.FDEM.FDEM.Problem_b
60
method), 88
finish() (SimPEG.Optimization.Minimize method), 55
getRHS()
(SimPEG.EM.FDEM.FDEM.Problem_e
freqs (SimPEG.EM.FDEM.SurveyFDEM.Survey atmethod), 87
tribute), 90
getRHS()
(SimPEG.EM.FDEM.FDEM.Problem_h
method), 89
G
getRHS()
(SimPEG.EM.FDEM.FDEM.Problem_j
method),
89
GaussNewton (class in SimPEG.Optimization), 58
getRHSDeriv_m()
(SimgetA() (SimPEG.EM.FDEM.FDEM.Problem_b method),
PEG.EM.FDEM.FDEM.Problem_b
method),
88
88
126
Index
SimPEG Documentation, Release 0.1.9
getRHSDeriv_m()
(Sim- hy (SimPEG.Mesh.TensorMesh.BaseTensorMesh atPEG.EM.FDEM.FDEM.Problem_e method),
tribute), 9
87
hz (SimPEG.Mesh.TensorMesh.BaseTensorMesh atgetRHSDeriv_m()
(Simtribute), 9
PEG.EM.FDEM.FDEM.Problem_h method),
I
89
getRHSDeriv_m()
(Sim- Identity (class in SimPEG.Utils.matutils), 72
PEG.EM.FDEM.FDEM.Problem_j method), IdentityMap (class in SimPEG.Maps), 66
89
inactiveSet() (SimPEG.Optimization.ProjectedGradient
getSourceTerm() (SimPEG.EM.FDEM.FDEM.BaseFDEMProblem method), 58
method), 86
ind2sub() (in module SimPEG.Utils.matutils), 71
getSpatialP() (SimPEG.Survey.BaseTimeRx method), 42 indexCube() (in module SimPEG.Utils.curvutils), 73
getSrcByFreq() (SimPEG.EM.FDEM.SurveyFDEM.Survey InexactGaussNewton (class in SimPEG.Optimization), 59
method), 90
initialize()
(SimPEG.Directives.BetaEstimate_ByEig
getSubArray() (in module SimPEG.Utils.matutils), 71
method), 60
getTensor() (SimPEG.Mesh.TensorMesh.BaseTensorMesh initialize()
(SimPEG.Directives.InversionDirective
method), 10
method), 60
getTimeP() (SimPEG.Survey.BaseTimeRx method), 42
initialize() (SimPEG.Directives.SaveModelEveryIteration
gridCC (SimPEG.Mesh.TensorMesh.BaseTensorMesh atmethod), 61
tribute), 10
initialize() (SimPEG.Directives.SaveOutputEveryIteration
gridCC (SimPEG.Mesh.TreeMesh.TreeMesh attribute),
method), 61
14
InnerProducts (class in SimPEG.Mesh.InnerProducts), 35
gridEx (SimPEG.Mesh.TensorMesh.BaseTensorMesh at- interpmat() (in module SimPEG.Utils.interputils), 77
tribute), 10
inv (SimPEG.Regularization.BaseRegularization atgridEx (SimPEG.Mesh.TreeMesh.TreeMesh attribute),
tribute), 49
14
inv2X2BlockDiagonal()
(in
module
SimgridEy (SimPEG.Mesh.TensorMesh.BaseTensorMesh atPEG.Utils.matutils), 71
tribute), 10
inv3X3BlockDiagonal()
(in
module
SimgridEy (SimPEG.Mesh.TreeMesh.TreeMesh attribute),
PEG.Utils.matutils), 71
14
inverse() (SimPEG.Maps.ExpMap method), 67
gridEz (SimPEG.Mesh.TensorMesh.BaseTensorMesh at- inverse() (SimPEG.Maps.IdentityMap method), 66
tribute), 10
inversion (SimPEG.Directives.DirectiveList attribute), 60
gridEz (SimPEG.Mesh.TreeMesh.TreeMesh attribute), inversion (SimPEG.Directives.InversionDirective at14
tribute), 60
gridFx (SimPEG.Mesh.TensorMesh.BaseTensorMesh at- InversionDirective (class in SimPEG.Directives), 60
tribute), 10
invProb (SimPEG.Directives.InversionDirective atgridFx (SimPEG.Mesh.TreeMesh.TreeMesh attribute),
tribute), 60
14
invProb (SimPEG.Regularization.BaseRegularization atgridFy (SimPEG.Mesh.TensorMesh.BaseTensorMesh attribute), 49
tribute), 10
invPropertyTensor() (in module SimPEG.Utils.matutils),
gridFy (SimPEG.Mesh.TreeMesh.TreeMesh attribute),
71
14
isInside() (SimPEG.Mesh.TensorMesh.BaseTensorMesh
gridFz (SimPEG.Mesh.TensorMesh.BaseTensorMesh atmethod), 10
tribute), 10
ispaired (SimPEG.Problem.BaseProblem attribute), 40
gridFz (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 14 isSymmetric (SimPEG.Mesh.CylMesh.CylMesh atgridN (SimPEG.Mesh.TensorMesh.BaseTensorMesh attribute), 15
tribute), 10
isSynthetic (SimPEG.Survey.BaseSurvey attribute), 44
gridN (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 14 iteration (SimPEG.Optimization.IterationPrinters attribute), 52
H
iteration (SimPEG.Optimization.StoppingCriteria attribute), 52
h (SimPEG.Mesh.TensorMesh.BaseTensorMesh atiterationLS (SimPEG.Optimization.IterationPrinters attribute), 9
tribute), 52
hx (SimPEG.Mesh.TensorMesh.BaseTensorMesh attribute), 9
Index
127
SimPEG Documentation, Release 0.1.9
iterationLS (SimPEG.Optimization.StoppingCriteria attribute), 52
IterationPrinters (class in SimPEG.Optimization), 52
itType (SimPEG.Optimization.IterationPrinters attribute),
52
J
Jtvec() (SimPEG.EM.FDEM.FDEM.BaseFDEMProblem
method), 86
Jtvec() (SimPEG.Problem.BaseProblem method), 41
Jtvec_approx()
(SimPEG.Problem.BaseProblem
method), 41
Jvec() (SimPEG.EM.FDEM.FDEM.BaseFDEMProblem
method), 86
Jvec() (SimPEG.Problem.BaseProblem method), 40
Jvec_approx() (SimPEG.Problem.BaseProblem method),
41
K
knownRxTypes (SimPEG.EM.FDEM.SurveyFDEM.Rx
attribute), 89
knownRxTypes (SimPEG.Survey.BaseRx attribute), 42
kron3() (in module SimPEG.Utils.matutils), 70
L
mapping (SimPEG.Problem.BaseProblem attribute), 40
mapping (SimPEG.Regularization.BaseRegularization attribute), 49
maxIter (SimPEG.Optimization.Minimize attribute), 53
maxIter (SimPEG.Optimization.NewtonRoot attribute),
59
maxIterCG (SimPEG.Optimization.InexactGaussNewton
attribute), 59
maxIterCG (SimPEG.Optimization.ProjectedGradient attribute), 58
maxIterLS (SimPEG.Optimization.Minimize attribute),
53
maxLevel
(SimPEG.Mesh.TreeMesh.TreeMesh
attribute), 13
maxLS (SimPEG.Optimization.NewtonRoot attribute),
59
maxStep (SimPEG.Optimization.Minimize attribute), 53
mesh (SimPEG.Maps.IdentityMap attribute), 66
mesh (SimPEG.Problem.BaseProblem attribute), 40
mesh (SimPEG.Regularization.BaseRegularization attribute), 49
mesh (SimPEG.Survey.BaseSurvey attribute), 43
Mesh2Mesh (class in SimPEG.Maps), 69
meshDimension (SimPEG.Tests.OrderTest attribute), 80
meshSizes (SimPEG.Tests.OrderTest attribute), 80
meshTensor() (in module SimPEG.Utils.meshutils), 74
meshTypes (SimPEG.Tests.OrderTest attribute), 80
Minimize (class in SimPEG.Optimization), 53
minimize() (SimPEG.Optimization.Minimize method),
53
mkvc() (in module SimPEG.Utils.matutils), 70
modifySearchDirection()
(SimPEG.Optimization.Minimize method), 56
modifySearchDirectionBreak()
(SimPEG.Optimization.Minimize method), 57
moving_x (SimPEG.Optimization.StoppingCriteria attribute), 52
mref
(SimPEG.Regularization.BaseRegularization
attribute), 49
mtrue (SimPEG.Survey.BaseSurvey attribute), 43
l2_DataMisfit (class in SimPEG.DataMisfit), 48
layeredModel()
(in
module
SimPEG.Utils.ModelBuilder), 76
levels (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 12
loc (SimPEG.Survey.BaseSrc attribute), 43
locs (SimPEG.Survey.BaseRx attribute), 42
lower (SimPEG.Optimization.ProjectedGradient attribute), 58
LS_armijoGoldstein
(SimPEG.Optimization.IterationPrinters attribute),
52
LS_ft (SimPEG.Optimization.IterationPrinters attribute),
52
LS_t (SimPEG.Optimization.IterationPrinters attribute),
52
LSreduction (SimPEG.Optimization.Minimize attribute),
N
53
LSshorten (SimPEG.Optimization.Minimize attribute), name (SimPEG.Inversion.BaseInversion attribute), 61
name (SimPEG.Optimization.BFGS attribute), 58
53
name (SimPEG.Optimization.GaussNewton attribute), 58
M
name (SimPEG.Optimization.InexactGaussNewton attribute), 59
makePropertyTensor()
(in
module
Simname
(SimPEG.Optimization.Minimize
attribute), 53
PEG.Utils.matutils), 71
name
(SimPEG.Optimization.ProjectedGradient
atmakeSyntheticData()
(SimPEG.Survey.BaseSurvey
tribute),
58
method), 44
name (SimPEG.Optimization.SteepestDescent attribute),
Map2Dto3D (class in SimPEG.Maps), 68
59
mapPair (SimPEG.Problem.BaseProblem attribute), 40
name
(SimPEG.Tests.OrderTest
attribute), 80
mapPair (SimPEG.Regularization.BaseRegularization atnameLS
(SimPEG.Optimization.Minimize
attribute), 56
tribute), 49
128
Index
SimPEG Documentation, Release 0.1.9
nbfgs (SimPEG.Optimization.BFGS attribute), 58
nC (SimPEG.Mesh.BaseMesh.BaseMesh attribute), 23
nC (SimPEG.Mesh.BaseMesh.BaseRectangularMesh attribute), 28
nC (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
nCx (SimPEG.Mesh.BaseMesh.BaseRectangularMesh
attribute), 27
nCy (SimPEG.Mesh.BaseMesh.BaseRectangularMesh
attribute), 27
nCz (SimPEG.Mesh.BaseMesh.BaseRectangularMesh
attribute), 27
nD (SimPEG.Survey.BaseRx attribute), 42
nD (SimPEG.Survey.BaseSrc attribute), 43
nD (SimPEG.Survey.BaseSurvey attribute), 44
nD (SimPEG.Survey.BaseTimeRx attribute), 42
ndgrid() (in module SimPEG.Utils.matutils), 70
nE (SimPEG.Mesh.BaseMesh.BaseMesh attribute), 25
nE (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
NewtonRoot (class in SimPEG.Optimization), 59
nEx (SimPEG.Mesh.BaseMesh.BaseMesh attribute), 24
nEx (SimPEG.Mesh.BaseMesh.BaseRectangularMesh
attribute), 28
nEx (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
nEy (SimPEG.Mesh.BaseMesh.BaseMesh attribute), 24
nEy (SimPEG.Mesh.BaseMesh.BaseRectangularMesh
attribute), 28
nEy (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
nEz (SimPEG.Mesh.BaseMesh.BaseMesh attribute), 24
nEz (SimPEG.Mesh.BaseMesh.BaseRectangularMesh attribute), 29
nEz (SimPEG.Mesh.CylMesh.CylMesh attribute), 16
nEz (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
nF (SimPEG.Mesh.BaseMesh.BaseMesh attribute), 26
nF (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
nFreq
(SimPEG.EM.FDEM.SurveyFDEM.Survey
attribute), 90
nFx (SimPEG.Mesh.BaseMesh.BaseMesh attribute), 25
nFx (SimPEG.Mesh.BaseMesh.BaseRectangularMesh attribute), 29
nFx (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
nFy (SimPEG.Mesh.BaseMesh.BaseMesh attribute), 25
nFy (SimPEG.Mesh.BaseMesh.BaseRectangularMesh attribute), 29
nFy (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
nFz (SimPEG.Mesh.BaseMesh.BaseMesh attribute), 25
nFz (SimPEG.Mesh.BaseMesh.BaseRectangularMesh attribute), 29
nFz (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
nhE (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
nhEx (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
nhEy (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
nhEz (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
nhF (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
nhFx (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
Index
nhFy (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
nhFz (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
nhN (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
nN (SimPEG.Mesh.BaseMesh.BaseMesh attribute), 23
nN (SimPEG.Mesh.BaseMesh.BaseRectangularMesh attribute), 28
nN (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
nNx (SimPEG.Mesh.BaseMesh.BaseRectangularMesh
attribute), 27
nNx (SimPEG.Mesh.CylMesh.CylMesh attribute), 15
nNy (SimPEG.Mesh.BaseMesh.BaseRectangularMesh
attribute), 27
nNy (SimPEG.Mesh.CylMesh.CylMesh attribute), 15
nNz (SimPEG.Mesh.BaseMesh.BaseRectangularMesh
attribute), 27
nodalGrad (SimPEG.Mesh.CylMesh.CylMesh attribute),
17
nodalGrad (SimPEG.Mesh.DiffOperators.DiffOperators
attribute), 31
nodalGrad (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 14
nodalLaplacian (SimPEG.Mesh.CylMesh.CylMesh attribute), 17
nodalLaplacian (SimPEG.Mesh.DiffOperators.DiffOperators
attribute), 31
norm_g (SimPEG.Optimization.IterationPrinters attribute), 52
norm_g (SimPEG.Optimization.StoppingCriteria attribute), 52
normal (SimPEG.Maps.Map2Dto3D attribute), 68
normals (SimPEG.Mesh.BaseMesh.BaseMesh attribute),
26
nP (SimPEG.Maps.ComboMap attribute), 69
nP (SimPEG.Maps.IdentityMap attribute), 66
nP (SimPEG.Maps.Map2Dto3D attribute), 68
nP (SimPEG.Maps.Mesh2Mesh attribute), 69
nP (SimPEG.Maps.Vertical1DMap attribute), 68
nSrc (SimPEG.Survey.BaseSurvey attribute), 44
nSrcByFreq (SimPEG.EM.FDEM.SurveyFDEM.Survey
attribute), 90
nT (SimPEG.Problem.BaseTimeProblem attribute), 42
ntE (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
ntEx (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
ntEy (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
ntEz (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
ntF (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
ntFx (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
ntFy (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
ntFz (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
ntN (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
number() (SimPEG.Mesh.TreeMesh.TreeMesh method),
14
129
SimPEG Documentation, Release 0.1.9
O
opt (SimPEG.Directives.InversionDirective attribute), 60
opt (SimPEG.Regularization.BaseRegularization attribute), 49
OrderTest (class in SimPEG.Tests), 79
orderTest() (SimPEG.Tests.OrderTest method), 80
P
pair() (SimPEG.Problem.BaseProblem method), 40
pair() (SimPEG.Survey.BaseSurvey method), 43
parent (SimPEG.Optimization.Minimize attribute), 53
parent (SimPEG.Regularization.BaseRegularization attribute), 49
permuteCC (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
permuteE
(SimPEG.Mesh.TreeMesh.TreeMesh
attribute), 13
permuteF (SimPEG.Mesh.TreeMesh.TreeMesh attribute),
13
phi_d (SimPEG.Optimization.IterationPrinters attribute),
53
phi_d_target_Inversion
(SimPEG.Optimization.StoppingCriteria attribute),
52
phi_d_target_Minimize
(SimPEG.Optimization.StoppingCriteria attribute),
52
phi_m (SimPEG.Optimization.IterationPrinters attribute),
53
plotGrid() (SimPEG.Mesh.TreeMesh.TreeMesh method),
15
plotImage()
(SimPEG.Mesh.TreeMesh.TreeMesh
method), 15
plotSlice()
(SimPEG.Mesh.TreeMesh.TreeMesh
method), 15
point2index()
(SimPEG.Mesh.TreeMesh.TreeMesh
method), 14
printDone() (SimPEG.Optimization.Minimize method),
55
printInit() (SimPEG.Optimization.Minimize method), 55
printIter() (SimPEG.Optimization.Minimize method), 55
prob (SimPEG.Directives.InversionDirective attribute),
60
prob
(SimPEG.Regularization.BaseRegularization
attribute), 49
prob (SimPEG.Survey.BaseSurvey attribute), 43
Problem_b (class in SimPEG.EM.FDEM.FDEM), 87
Problem_e (class in SimPEG.EM.FDEM.FDEM), 87
Problem_h (class in SimPEG.EM.FDEM.FDEM), 89
Problem_j (class in SimPEG.EM.FDEM.FDEM), 88
projComp
(SimPEG.EM.FDEM.SurveyFDEM.Rx
attribute), 90
projectEdgeVector()
(SimPEG.Mesh.BaseMesh.BaseMesh
method),
130
26
ProjectedGradient (class in SimPEG.Optimization), 58
projectFaceVector()
(SimPEG.Mesh.BaseMesh.BaseMesh
method),
26
projectFields() (SimPEG.EM.FDEM.SurveyFDEM.Rx
method), 90
projectFields() (SimPEG.EM.FDEM.SurveyFDEM.Survey
method), 90
projectFields() (SimPEG.Survey.BaseSurvey method), 44
projectFieldsDeriv()
(SimPEG.EM.FDEM.SurveyFDEM.Rx method),
90
projectFieldsDeriv()
(SimPEG.EM.FDEM.SurveyFDEM.Survey
method), 90
projectFieldsDeriv()
(SimPEG.Survey.BaseSurvey
method), 44
projection() (SimPEG.Optimization.Minimize method),
55
projection() (SimPEG.Optimization.ProjectedGradient
method), 58
projField (SimPEG.EM.FDEM.SurveyFDEM.Rx attribute), 89
projGLoc (SimPEG.EM.FDEM.SurveyFDEM.Rx attribute), 89
projGLoc (SimPEG.Survey.BaseRx attribute), 42
PropMap (SimPEG.Problem.BaseProblem attribute), 40
R
r()
(SimPEG.Mesh.BaseMesh.BaseRectangularMesh
method), 29
radius (SimPEG.EM.FDEM.SurveyFDEM.Rx attribute),
89
randomModel()
(in
module
SimPEG.Utils.ModelBuilder), 76
readUBCTensorMesh()
(in
module
SimPEG.Utils.meshutils), 75
readUBCTensorModel()
(in
module
SimPEG.Utils.meshutils), 75
readVTRFile() (in module SimPEG.Utils.meshutils), 75
recall() (SimPEG.Optimization.Remember method), 58
refine() (SimPEG.Mesh.TreeMesh.TreeMesh method), 13
reg (SimPEG.Directives.InversionDirective attribute), 60
reg (SimPEG.Regularization.BaseRegularization attribute), 49
Remember (class in SimPEG.Optimization), 57
remember() (SimPEG.Optimization.Remember method),
57
residual() (SimPEG.Survey.BaseSurvey method), 44
root() (SimPEG.Optimization.NewtonRoot method), 59
Rosenbrock() (in module SimPEG.Tests), 80
run() (SimPEG.Inversion.BaseInversion method), 62
Rx (class in SimPEG.EM.FDEM.SurveyFDEM), 89
Index
SimPEG Documentation, Release 0.1.9
rxList (SimPEG.Survey.BaseSrc attribute), 43
rxPair (SimPEG.Survey.BaseSrc attribute), 43
rxType (SimPEG.Survey.BaseRx attribute), 42
S
save() (SimPEG.Optimization.Minimize method), 57
SaveModelEveryIteration (class in SimPEG.Directives),
61
SaveOutputEveryIteration (class in SimPEG.Directives),
61
scalarConductivity()
(in
module
SimPEG.Utils.ModelBuilder), 76
scaleSearchDirection() (SimPEG.Optimization.Minimize
method), 56
sdiag() (in module SimPEG.Utils.matutils), 70
sdInv() (in module SimPEG.Utils.matutils), 70
setCellGradBC()
(SimPEG.Mesh.DiffOperators.DiffOperators
method), 31
setupMesh() (SimPEG.Tests.OrderTest method), 80
shape (SimPEG.Maps.ComboMap attribute), 69
shape (SimPEG.Maps.IdentityMap attribute), 66
shape (SimPEG.Maps.Mesh2Mesh attribute), 69
SimPEG.Directives (module), 60
SimPEG.EM.FDEM.FDEM (module), 86
SimPEG.EM.FDEM.SurveyFDEM (module), 89
SimPEG.Inversion (module), 61
SimPEG.Mesh.BaseMesh (module), 22
SimPEG.Mesh.CylMesh (module), 15
SimPEG.Mesh.DiffOperators (module), 29
SimPEG.Mesh.InnerProducts (module), 35
SimPEG.Mesh.TensorMesh (module), 9
SimPEG.Optimization (module), 52
SimPEG.Problem (module), 40
SimPEG.Regularization (module), 49
SimPEG.Survey (module), 42
SimPEG.Tests (module), 79
SimPEG.Utils (module), 70
SimPEG.Utils.CounterUtils (module), 79
SimPEG.Utils.curvutils (module), 72
SimPEG.Utils.interputils (module), 77
SimPEG.Utils.matutils (module), 70
SimPEG.Utils.meshutils (module), 74
SimPEG.Utils.ModelBuilder (module), 76
SimPEG.Utils.SolverUtils (module), 72
smoothModel (SimPEG.Regularization.Tikhonov attribute), 51
Solver (in module SimPEG.Utils.SolverUtils), 72
Solver (SimPEG.Optimization.NewtonRoot attribute), 59
Solver (SimPEG.Problem.BaseProblem attribute), 40
SolverCG (in module SimPEG.Utils.SolverUtils), 72
SolverDiag (class in SimPEG.Utils.SolverUtils), 72
SolverLU (in module SimPEG.Utils.SolverUtils), 72
Index
solverOpts (SimPEG.Optimization.NewtonRoot attribute), 59
solverOpts (SimPEG.Problem.BaseProblem attribute), 40
SolverWrapD() (in module SimPEG.Utils.SolverUtils),
63, 72
SolverWrapI() (in module SimPEG.Utils.SolverUtils),
64, 72
speye() (in module SimPEG.Utils.matutils), 70
spzeros() (in module SimPEG.Utils.matutils), 70
srcList (SimPEG.Survey.BaseSurvey attribute), 43
srcPair (SimPEG.EM.FDEM.SurveyFDEM.Survey attribute), 90
srcPair (SimPEG.Survey.BaseSurvey attribute), 43
startup() (SimPEG.Optimization.Minimize method), 54
std (SimPEG.Survey.BaseSurvey attribute), 43
SteepestDescent (class in SimPEG.Optimization), 59
stepDcr (SimPEG.Optimization.NewtonRoot attribute),
59
stopNextIteration (SimPEG.Optimization.Minimize attribute), 53
StoppingCriteria (class in SimPEG.Optimization), 52
stoppingCriteria()
(SimPEG.Optimization.Minimize
method), 55
storeProjections (SimPEG.Survey.BaseRx attribute), 42
sub2ind() (in module SimPEG.Utils.matutils), 71
summary()
(SimPEG.Utils.CounterUtils.Counter
method), 79
Survey (class in SimPEG.EM.FDEM.SurveyFDEM), 90
survey (SimPEG.Directives.InversionDirective attribute),
60
survey (SimPEG.Problem.BaseProblem attribute), 40
survey (SimPEG.Regularization.BaseRegularization attribute), 49
surveyPair (SimPEG.EM.FDEM.FDEM.BaseFDEMProblem
attribute), 86
surveyPair (SimPEG.Problem.BaseProblem attribute), 40
T
t0 (SimPEG.Problem.BaseTimeProblem attribute), 42
tangents (SimPEG.Mesh.BaseMesh.BaseMesh attribute),
26
target (SimPEG.Directives.TargetMisfit attribute), 61
TargetMisfit (class in SimPEG.Directives), 61
TensorMesh (class in SimPEG.Mesh.TensorMesh), 11
TensorType (class in SimPEG.Utils.matutils), 71
test() (SimPEG.Maps.IdentityMap method), 67
Tikhonov (class in SimPEG.Regularization), 50
timeIt() (in module SimPEG.Utils.CounterUtils), 79
timeMesh (SimPEG.Problem.BaseTimeProblem attribute), 42
times (SimPEG.Problem.BaseTimeProblem attribute), 42
times (SimPEG.Survey.BaseTimeRx attribute), 42
timeSteps (SimPEG.Problem.BaseTimeProblem attribute), 41
131
SimPEG Documentation, Release 0.1.9
tol (SimPEG.Optimization.NewtonRoot attribute), 59
tolCG (SimPEG.Optimization.InexactGaussNewton
tribute), 59
tolCG (SimPEG.Optimization.ProjectedGradient
tribute), 58
tolerance (SimPEG.Tests.OrderTest attribute), 80
tolerance_f (SimPEG.Optimization.StoppingCriteria
tribute), 52
tolerance_g (SimPEG.Optimization.StoppingCriteria
tribute), 52
tolF (SimPEG.Optimization.Minimize attribute), 53
tolG (SimPEG.Optimization.Minimize attribute), 53
tolX (SimPEG.Optimization.Minimize attribute), 53
totalLS (SimPEG.Optimization.IterationPrinters
tribute), 52
TreeMesh (class in SimPEG.Mesh.TreeMesh), 12
vnEy (SimPEG.Mesh.CylMesh.CylMesh attribute), 16
at- vnEz (SimPEG.Mesh.BaseMesh.BaseRectangularMesh
attribute), 28
at- vnEz (SimPEG.Mesh.CylMesh.CylMesh attribute), 16
vnF (SimPEG.Mesh.BaseMesh.BaseMesh attribute), 25
vnFx (SimPEG.Mesh.BaseMesh.BaseRectangularMesh
atattribute), 28
vnFx (SimPEG.Mesh.CylMesh.CylMesh attribute), 16
at- vnFy (SimPEG.Mesh.BaseMesh.BaseRectangularMesh
attribute), 28
vnFz (SimPEG.Mesh.BaseMesh.BaseRectangularMesh
attribute), 28
vnN (SimPEG.Mesh.BaseMesh.BaseRectangularMesh
atattribute), 27
vntE (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
vntF (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 13
vol (SimPEG.Mesh.CylMesh.CylMesh attribute), 16
U
vol (SimPEG.Mesh.TensorMesh.TensorMesh attribute),
12
unpair() (SimPEG.Problem.BaseProblem method), 40
vol (SimPEG.Mesh.TreeMesh.TreeMesh attribute), 14
unpair() (SimPEG.Survey.BaseSurvey method), 43
upper (SimPEG.Optimization.ProjectedGradient at- volTetra() (in module SimPEG.Utils.curvutils), 72
tribute), 58
W
V
W
(SimPEG.Regularization.BaseRegularization attribute), 49
W (SimPEG.Regularization.Tikhonov attribute), 52
Wd (SimPEG.DataMisfit.l2_DataMisfit attribute), 48
writeUBCTensorMesh()
(in
module
SimPEG.Utils.meshutils), 75
writeUBCTensorModel()
(in
module
SimPEG.Utils.meshutils), 75
writeVTRFile() (in module SimPEG.Utils.meshutils), 75
Ws (SimPEG.Regularization.Tikhonov attribute), 51
Wsmooth (SimPEG.Regularization.Tikhonov attribute),
51
Wx (SimPEG.Regularization.Tikhonov attribute), 51
Wxx (SimPEG.Regularization.Tikhonov attribute), 51
Wy (SimPEG.Regularization.Tikhonov attribute), 51
Wyy (SimPEG.Regularization.Tikhonov attribute), 51
Wz (SimPEG.Regularization.Tikhonov attribute), 51
Wzz (SimPEG.Regularization.Tikhonov attribute), 51
vectorCCx (SimPEG.Mesh.CylMesh.CylMesh attribute),
16
vectorCCx (SimPEG.Mesh.TensorMesh.BaseTensorMesh
attribute), 9
vectorCCy (SimPEG.Mesh.CylMesh.CylMesh attribute),
16
vectorCCy (SimPEG.Mesh.TensorMesh.BaseTensorMesh
attribute), 9
vectorCCz (SimPEG.Mesh.TensorMesh.BaseTensorMesh
attribute), 9
vectorNx (SimPEG.Mesh.CylMesh.CylMesh attribute),
16
vectorNx (SimPEG.Mesh.TensorMesh.BaseTensorMesh
attribute), 9
vectorNy (SimPEG.Mesh.CylMesh.CylMesh attribute),
16
vectorNy (SimPEG.Mesh.TensorMesh.BaseTensorMesh
attribute), 9
vectorNz (SimPEG.Mesh.TensorMesh.BaseTensorMesh X
attribute), 9
x0 (SimPEG.Mesh.BaseMesh.BaseMesh attribute), 23
Vertical1DMap (class in SimPEG.Maps), 68
vnC (SimPEG.Mesh.BaseMesh.BaseRectangularMesh Z
attribute), 27
Zero (class in SimPEG.Utils.matutils), 72
vnD (SimPEG.Survey.BaseSrc attribute), 43
vnD (SimPEG.Survey.BaseSurvey attribute), 44
vnE (SimPEG.Mesh.BaseMesh.BaseMesh attribute), 24
vnEx (SimPEG.Mesh.BaseMesh.BaseRectangularMesh
attribute), 27
vnEy (SimPEG.Mesh.BaseMesh.BaseRectangularMesh
attribute), 28
132
Index