16
16
def double_rtm (model , wavelet , src_coords , res , res_o , rec_coords , space_order = 8 ):
17
17
"""
18
18
"""
19
- _ , u , _ = forward (model , src_coords , None , wavelet , space_order = space_order ,
20
- save = True )
21
-
22
- # Illumination
23
- illum = Function (name = "I" , grid = model .grid , space_order = 0 )
24
- Operator (Inc (illum , u ** 2 ))()
19
+ _ , u , illum , _ = forward (model , src_coords , None , wavelet , space_order = space_order ,
20
+ illum = True , save = True )
25
21
26
22
# RTMs
27
- rtm , _ = gradient (model , res , rec_coords , u , space_order = space_order )
28
- rtmo , _ = gradient (model , res_o , rec_coords , u , space_order = space_order )
23
+ rtm = gradient (model , res , rec_coords , u , space_order = space_order )[ 0 ]
24
+ rtmo = gradient (model , res_o , rec_coords , u , space_order = space_order )[ 0 ]
29
25
return rtm .data , rtmo .data , illum .data
30
26
31
27
32
- def cig_grad (model , src_coords , wavelet , rec_coords , res , offsets , isic = False , space_order = 8 , omni = False ):
28
+ def cig_grad (model , src_coords , wavelet , rec_coords , res , offsets , ic = "as" , space_order = 8 , omni = False , illum = False ):
33
29
"""
34
30
"""
35
31
u = forward (model , src_coords , None , wavelet , space_order = space_order , save = True )[1 ]
36
- # Setting adjoint wavefieldgradient
32
+ # Setting adjoint wavefield
37
33
v = wavefield (model , space_order , fw = False )
38
34
39
35
# Set up PDE expression and rearrange
40
36
pde = wave_kernel (model , v , fw = False )
41
37
42
38
# Setup source and receiver
43
39
go_expr = geom_expr (model , v , src_coords = rec_coords ,
44
- wavelet = res , fw = False )
40
+ wavelet = res , fw = False )
45
41
# Setup gradient wrt m with all offsets
46
42
ohs = make_offsets (offsets , model , omni )
47
- x = u .indices [1 ]
48
43
49
44
# Subsurface offsets.
50
- hs = (h .shape [0 ] for h in ohs .values ())
51
- hd = (h .indices [0 ] for h in ohs .values ())
45
+ hs = tuple (h .shape [0 ] for h in ohs .values ())
46
+ hd = tuple (h .indices [0 ] for h in ohs .values ())
52
47
gradm = Function (name = "gradm" , grid = model .grid , shape = (* hs , * u .shape [1 :]),
53
- dimensions = (* hd , * model .grid .dimensions ), space_order = 0 )
48
+ dimensions = (* hd , * model .grid .dimensions ))
49
+
54
50
uh , vh = shifted_wf (u , v , ohs )
55
- g_expr = grad_expr (gradm , uh , vh , model , ic = isic )
51
+ g_expr = grad_expr (gradm , uh , vh , model , ic = ic )
56
52
57
53
# Create operator and run
58
- subs = model .spacing_map
59
- op = Operator (pde + go_expr + g_expr ,subs = subs , name = "cig_sso" , opt = opt_op (model ))
54
+ subs = model .grid .spacing_map
55
+ op = Operator (pde + go_expr + g_expr , subs = subs , name = "cig_sso" , opt = opt_op (model ))
56
+
60
57
try :
61
58
op .cfunction
62
59
except :
63
- op = Operator (pde + go_expr + g_expr ,subs = subs , name = "cig_sso" , opt = 'advanced' )
60
+ op = Operator (pde + go_expr + g_expr , subs = subs , name = "cig_sso" , opt = 'advanced' )
64
61
op .cfunction
62
+
65
63
# Get bounds from offsets
66
64
dim_kw = make_kw (ohs , DimensionTuple (* u .shape [1 :], getters = model .grid .dimensions ))
67
65
op (dt = model .critical_dt , ** dim_kw )
@@ -70,7 +68,7 @@ def cig_grad(model, src_coords, wavelet, rec_coords, res, offsets, isic=False, s
70
68
return gradm .data
71
69
72
70
73
- def cig_lin (model , src_coords , wavelet , rec_coords , dm_ext , offsets , isic = False , space_order = 8 , omni = False ):
71
+ def cig_lin (model , src_coords , wavelet , rec_coords , dm_ext , offsets , ic = "as" , space_order = 8 , omni = False ):
74
72
"""
75
73
"""
76
74
nt = wavelet .shape [0 ]
@@ -83,7 +81,7 @@ def cig_lin(model, src_coords, wavelet, rec_coords, dm_ext, offsets, isic=False,
83
81
84
82
# Set up PDE expression and rearrange
85
83
pde = wave_kernel (model , u )
86
- qlin = ext_src (model , u , dm_ext , oh , isic = isic )
84
+ qlin = ext_src (model , u , dm_ext , oh , ic = ic )
87
85
fact = 1 / (model .damp / dt + (model .m * model .irho )/ dt ** 2 )
88
86
pdel = wave_kernel (model , ul ) + [Inc (ul .forward , fact * qlin )]
89
87
@@ -92,7 +90,7 @@ def cig_lin(model, src_coords, wavelet, rec_coords, dm_ext, offsets, isic=False,
92
90
go_exprl = geom_expr (model , ul , rec_coords = rec_coords , nt = nt )
93
91
_ , rcvl = src_rec (model , ul , rec_coords = rec_coords , nt = nt )
94
92
# Create operator and run
95
- subs = model .spacing_map
93
+ subs = model .grid . spacing_map
96
94
op = Operator (pde + go_expr + pdel + go_exprl ,
97
95
subs = subs , name = "extborn" , opt = opt_op (model ))
98
96
op .cfunction
@@ -104,7 +102,7 @@ def cig_lin(model, src_coords, wavelet, rec_coords, dm_ext, offsets, isic=False,
104
102
return rcvl .data
105
103
106
104
107
- def ext_src (model , u , dm_ext , oh , isic = False ):
105
+ def ext_src (model , u , dm_ext , oh , ic = "as" ):
108
106
# Extended perturbation
109
107
hs = (h .shape [0 ] for h in oh .values ())
110
108
hd = (h .indices [0 ] for h in oh .values ())
@@ -137,6 +135,8 @@ def shifted_wf(u, v, ohs):
137
135
uh = u
138
136
vh = v
139
137
for k , v in ohs .items ():
138
+ if v .shape [0 ] == 1 :
139
+ continue
140
140
uh = uh ._subs (k , k - v )
141
141
vh = vh ._subs (k , k + v )
142
142
return uh , vh
@@ -152,6 +152,6 @@ def _shift(u, oh):
152
152
def make_kw (ohs , shape ):
153
153
kw = dict ()
154
154
for d , v in ohs .items ():
155
- kw ['%s_m' % d .name ] = - np .min (v .data )
156
- kw ['%s_M' % d .name ] = shape [d ] - np .max (v .data )
155
+ kw ['%s_m' % d .name ] = - np .min (v .data . view ( np . ndarray ) )
156
+ kw ['%s_M' % d .name ] = shape [d ] - np .max (v .data . view ( np . ndarray ) )
157
157
return kw
0 commit comments