@@ -229,11 +229,13 @@ def updatesrc(self, wav):
229
229
time_range = self .geometry .time_axis ,
230
230
)
231
231
232
- def _srcillumination_oneshot (self , isrc : int ) -> Tuple [NDArray , NDArray ]:
232
+ def _srcillumination_oneshot (self , solver : AcousticWaveSolverType , isrc : int ) -> Tuple [NDArray , NDArray ]:
233
233
"""Source wavefield and illumination for one shot
234
234
235
235
Parameters
236
236
----------
237
+ solver : :obj:`AcousticWaveSolver`
238
+ Devito's solver object.
237
239
isrc : :obj:`int`
238
240
Index of source to model
239
241
@@ -245,21 +247,10 @@ def _srcillumination_oneshot(self, isrc: int) -> Tuple[NDArray, NDArray]:
245
247
Source illumination
246
248
247
249
"""
248
- # create geometry for single source
249
- geometry = AcquisitionGeometry (
250
- self .model ,
251
- self .geometry .rec_positions ,
252
- self .geometry .src_positions [isrc , :],
253
- self .geometry .t0 ,
254
- self .geometry .tn ,
255
- f0 = self .geometry .f0 ,
256
- src_type = self .geometry .src_type ,
257
- )
258
- solver = AcousticWaveSolver (self .model , geometry , space_order = self .space_order )
259
250
260
251
# assign source location to source object with custom wavelet
261
252
if hasattr (self , "wav" ):
262
- self .wav .coordinates .data [0 , :] = self .geometry .src_positions [isrc , :]
253
+ self .wav .coordinates .data [0 , :] = solver .geometry .src_positions [:]
263
254
264
255
# source wavefield
265
256
u0 = solver .forward (
@@ -279,13 +270,27 @@ def srcillumination_allshots(self, savewav: bool = False) -> None:
279
270
Save source wavefield (``True``) or not (``False``)
280
271
281
272
"""
273
+ # create geometry for single source
274
+ geometry = AcquisitionGeometry (
275
+ self .model ,
276
+ self .geometry .rec_positions ,
277
+ self .geometry .src_positions [0 , :],
278
+ self .geometry .t0 ,
279
+ self .geometry .tn ,
280
+ f0 = self .geometry .f0 ,
281
+ src_type = self .geometry .src_type ,
282
+ )
283
+
284
+ solver = AcousticWaveSolver (self .model , geometry , space_order = self .space_order )
285
+
282
286
nsrc = self .geometry .src_positions .shape [0 ]
283
287
if savewav :
284
288
self .src_wavefield = []
285
289
self .src_illumination = np .zeros (self .model .shape )
286
290
287
291
for isrc in range (nsrc ):
288
- src_wav , src_ill = self ._srcillumination_oneshot (isrc )
292
+ solver .geometry .src_positions = self .geometry .src_positions [isrc , :]
293
+ src_wav , src_ill = self ._srcillumination_oneshot (solver , isrc )
289
294
if savewav :
290
295
self .src_wavefield .append (src_wav )
291
296
self .src_illumination += src_ill
@@ -359,11 +364,13 @@ def _born_allshots(self, dm: NDArray) -> NDArray:
359
364
dtot = np .array (dtot ).reshape (nsrc , d .shape [0 ], d .shape [1 ])
360
365
return dtot
361
366
362
- def _bornadj_oneshot (self , isrc , dobs ):
367
+ def _bornadj_oneshot (self , solver : AcousticWaveSolverType , isrc , dobs ):
363
368
"""Adjoint born modelling for one shot
364
369
365
370
Parameters
366
371
----------
372
+ solver : :obj:`AcousticWaveSolver`
373
+ Devito's solver object.
367
374
isrc : :obj:`float`
368
375
Index of source to model
369
376
dobs : :obj:`np.ndarray`
@@ -375,25 +382,13 @@ def _bornadj_oneshot(self, isrc, dobs):
375
382
Model
376
383
377
384
"""
378
- # create geometry for single source
379
- geometry = AcquisitionGeometry (
380
- self .model ,
381
- self .geometry .rec_positions ,
382
- self .geometry .src_positions [isrc , :],
383
- self .geometry .t0 ,
384
- self .geometry .tn ,
385
- f0 = self .geometry .f0 ,
386
- src_type = self .geometry .src_type ,
387
- )
388
385
# create boundary data
389
386
recs = self .geometry .rec .copy ()
390
387
recs .data [:] = dobs .T [:]
391
388
392
- solver = AcousticWaveSolver (self .model , geometry , space_order = self .space_order )
393
-
394
389
# assign source location to source object with custom wavelet
395
390
if hasattr (self , "wav" ):
396
- self .wav .coordinates .data [0 , :] = self .geometry .src_positions [isrc , :]
391
+ self .wav .coordinates .data [0 , :] = solver .geometry .src_positions [:]
397
392
398
393
# source wavefield
399
394
if hasattr (self , "src_wavefield" ):
@@ -423,11 +418,25 @@ def _bornadj_allshots(self, dobs: NDArray) -> NDArray:
423
418
Model
424
419
425
420
"""
421
+ # create geometry for single source
422
+ geometry = AcquisitionGeometry (
423
+ self .model ,
424
+ self .geometry .rec_positions ,
425
+ self .geometry .src_positions [0 , :],
426
+ self .geometry .t0 ,
427
+ self .geometry .tn ,
428
+ f0 = self .geometry .f0 ,
429
+ src_type = self .geometry .src_type ,
430
+ )
431
+
426
432
nsrc = self .geometry .src_positions .shape [0 ]
427
433
mtot = np .zeros (self .model .shape , dtype = np .float32 )
428
434
435
+ solver = AcousticWaveSolver (self .model , geometry , space_order = self .space_order )
436
+
429
437
for isrc in range (nsrc ):
430
- m = self ._bornadj_oneshot (isrc , dobs [isrc ])
438
+ solver .geometry .src_positions = self .geometry .src_positions [isrc , :]
439
+ m = self ._bornadj_oneshot (solver , isrc , dobs [isrc ])
431
440
mtot += self ._crop_model (m .data , self .model .nbl )
432
441
return mtot
433
442
0 commit comments