Locating mesh on survey area#
The discretize
package allows us to define 3D meshes that can be used
for running SimPEG’s forward and inverse problems.
Mesh dimensions for discretize.TensorMesh
and
discretize.TreeMesh
are assumed to be in meters, and by default their
origin (the westmost-southmost-lowest point) is located in the origin of the
coordinate system (the (0, 0, 0)
).
When working with real-world data, we want our mesh to be located around the
survey area. We can move our mesh location by by shifting its origin
.
For example, suppose we want to invert some magnetic data from Osborne Mine in Australia that spans in a region between 448353.0 m and 482422.0 m along the easting, and between 7578158.0 m and 7594834.0 m along the northing (UTM zone 54). Let’s also assume that the maximum topographic height of the area is 417 m.
We can build a mesh that spans 34 km on the easting, 17 km on the northing, and 5500 m vertically:
import discretize
dx, dy, dz = 200.0, 200.0, 100.0
nx, ny, nz = 170, 85, 55
hx, hy, hz = [(dx, nx)], [(dy, ny)], [(dz, nz)]
mesh = discretize.TensorMesh([hx, hy, hz])
print(mesh)
TensorMesh: 794,750 cells
MESH EXTENT CELL WIDTH FACTOR
dir nC min max min max max
--- --- --------------------------- ------------------ ------
x 170 0.00 34,000.00 200.00 200.00 1.00
y 85 0.00 17,000.00 200.00 200.00 1.00
z 55 0.00 5,500.00 100.00 100.00 1.00
The origin
of this mesh is located on (0, 0, 0)
. We can move it to the
survey area by shifting it to (448353.0 m, 7578158.0 m, -5000 m):
mesh.origin = (448353.0, 7578158.0, -5000)
print(mesh)
TensorMesh: 794,750 cells
MESH EXTENT CELL WIDTH FACTOR
dir nC min max min max max
--- --- --------------------------- ------------------ ------
x 170 448,353.00 482,353.00 200.00 200.00 1.00
y 85 7,578,158.00 7,595,158.00 200.00 200.00 1.00
z 55 -5,000.00 500.00 100.00 100.00 1.00
By shifting the origin
we are not changing the number of cells in the mesh
nor their dimensions. We are just moving the location of the mesh in the three
directions.
Note
We shift the z coordinate of the origin to -5000 m so we leave 500 m above the zeroth height to possibly account for topography.
Tip
Alternatively, we can set the origin
when defining the mesh, by passing
it as an argument. For example:
origin = (448353.0, 7578158.0, -5000)
mesh = discretize.TensorMesh([hx, hy, hz], origin=origin)
print(mesh)
Considering padding: simple case#
It’s best practice to add some padding to the mesh when using it in an inversion. The padding cells will allocate any potential body outside the survey area, which effect might be present in the data.
Let’s take the previous example and build a mesh that has 3 km of padding on each horizontal direction:
hx = [(200.0, 15), (dx, nx), (200.0, 15)]
hy = [(200.0, 15), (dy, ny), (200.0, 15)]
hz = [(dz, nz)]
mesh = discretize.TensorMesh([hx, hy, hz])
print(mesh)
TensorMesh: 1,265,000 cells
MESH EXTENT CELL WIDTH FACTOR
dir nC min max min max max
--- --- --------------------------- ------------------ ------
x 200 0.00 40,000.00 200.00 200.00 1.00
y 115 0.00 23,000.00 200.00 200.00 1.00
z 55 0.00 5,500.00 100.00 100.00 1.00
Now we can shift the origin
, but we also need to take into account the
padding cells. We will set the origin to the westmost-southmost corner of the
survey minus the padding distance we added to the mesh (3km):
mesh.origin = (448353.0 - 3000, 7578158.0 - 3000, -5000)
print(mesh)
TensorMesh: 1,265,000 cells
MESH EXTENT CELL WIDTH FACTOR
dir nC min max min max max
--- --- --------------------------- ------------------ ------
x 200 445,353.00 485,353.00 200.00 200.00 1.00
y 115 7,575,158.00 7,598,158.00 200.00 200.00 1.00
z 55 -5,000.00 500.00 100.00 100.00 1.00
Considering padding: padding factor#
Alternatively, we can introduce padding through a padding factor. Instead of
creating padding cells of the same size, we can use the padding factor to
create padding cells that increase in volume as they move away from the survey
area.
This is the usual approach to add padding cells to
discretize.TensorMesh
since it reduces the amount of cells in the
mesh, making inversions less expensive.
Following the previous example, let’s add 7 cells to each side of the horizontal directions. Let’s make the first cells the same size of the ones in the mesh, and then start increasing their size with a factor of 1.5:
n_pad_cells = 7
factor = 1.5
hx = [(dx, n_pad_cells, -factor), (dx, nx), (dx, n_pad_cells, factor)]
hy = [(dy, n_pad_cells, -factor), (dy, ny), (dy, n_pad_cells, factor)]
hz = [(dz, nz)]
mesh = discretize.TensorMesh([hx, hy, hz])
print(mesh)
TensorMesh: 1,001,880 cells
MESH EXTENT CELL WIDTH FACTOR
dir nC min max min max max
--- --- --------------------------- ------------------ ------
x 184 0.00 53,303.12 200.00 3,417.19 1.50
y 99 0.00 36,303.12 200.00 3,417.19 1.50
z 55 0.00 5,500.00 100.00 100.00 1.00
As before, we need to consider the padding cells when shifting the origin
of the mesh. Since we know that we added 7 cells to each side, we can leverage
that by shifting the 7th node of the x and y axes to the westmost-southmost
corner of the survey:
x_node_7th = mesh.nodes_x[n_pad_cells]
y_node_7th = mesh.nodes_y[n_pad_cells]
mesh.origin = (448353.0 - x_node_7th, 7578158.0 - y_node_7th, -5000)
print(mesh)
TensorMesh: 1,001,880 cells
MESH EXTENT CELL WIDTH FACTOR
dir nC min max min max max
--- --- --------------------------- ------------------ ------
x 184 438,701.44 492,004.56 200.00 3,417.19 1.50
y 99 7,568,506.44 7,604,809.56 200.00 3,417.19 1.50
z 55 -5,000.00 500.00 100.00 100.00 1.00