-
Notifications
You must be signed in to change notification settings - Fork 222
/
operators.py
68 lines (56 loc) · 2.6 KB
/
operators.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
from devito import Eq, Operator, VectorTimeFunction, TensorTimeFunction
from devito import div, grad, diag
from examples.seismic import PointSource, Receiver
def src_rec(v, tau, model, geometry):
"""
Source injection and receiver interpolation
"""
s = model.grid.time_dim.spacing
# Source symbol with input wavelet
src = PointSource(name='src', grid=model.grid, time_range=geometry.time_axis,
npoint=geometry.nsrc)
rec1 = Receiver(name='rec1', grid=model.grid, time_range=geometry.time_axis,
npoint=geometry.nrec)
rec2 = Receiver(name='rec2', grid=model.grid, time_range=geometry.time_axis,
npoint=geometry.nrec)
# The source injection term
src_xx = src.inject(field=tau[0, 0].forward, expr=src * s)
src_zz = src.inject(field=tau[-1, -1].forward, expr=src * s)
src_expr = src_xx + src_zz
if model.grid.dim == 3:
src_yy = src.inject(field=tau[1, 1].forward, expr=src * s)
src_expr += src_yy
# Create interpolation expression for receivers
rec_term1 = rec1.interpolate(expr=tau[-1, -1])
rec_term2 = rec2.interpolate(expr=div(v))
return src_expr + rec_term1 + rec_term2
def ForwardOperator(model, geometry, space_order=4, save=False, **kwargs):
"""
Construct method for the forward modelling operator in an elastic media.
Parameters
----------
model : Model
Object containing the physical parameters.
geometry : AcquisitionGeometry
Geometry object that contains the source (SparseTimeFunction) and
receivers (SparseTimeFunction) and their position.
space_order : int, optional
Space discretization order.
save : int or Buffer
Saving flag, True saves all time steps, False saves three buffered
indices (last three time steps). Defaults to False.
"""
v = VectorTimeFunction(name='v', grid=model.grid,
space_order=space_order, time_order=1)
tau = TensorTimeFunction(name='tau', grid=model.grid,
space_order=space_order, time_order=1)
lam, mu, ro = model.lam, model.mu, model.irho
dt = model.critical_dt
u_v = Eq(v.forward, model.damp * v + model.damp * dt * ro * div(tau))
u_t = Eq(tau.forward, model.damp * tau +
model.damp * dt * lam * diag(div(v.forward)) +
model.damp * dt * mu * (grad(v.forward) + grad(v.forward).T))
srcrec = src_rec(v, tau, model, geometry)
op = Operator([u_v] + [u_t] + srcrec, subs=model.spacing_map, name="ForwardElastic")
# Substitute spacing terms to reduce flops
return op