Skip to content

Commit af1530a

Browse files
authored
Merge pull request #594 from guaacoelho/performance-refactor
Update that increases performance (AcousticWave2D)
2 parents 869ddc5 + 98b1ebf commit af1530a

File tree

1 file changed

+21
-18
lines changed

1 file changed

+21
-18
lines changed

pylops/waveeqprocessing/twoway.py

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -327,13 +327,13 @@ def srcillumination_allshots(self, savewav: bool = False) -> None:
327327
self.src_wavefield.append(src_wav)
328328
self.src_illumination += src_ill
329329

330-
def _born_oneshot(self, isrc: int, dm: NDArray) -> NDArray:
330+
def _born_oneshot(self, solver: AcousticWaveSolver, dm: NDArray) -> NDArray:
331331
"""Born modelling for one shot
332332
333333
Parameters
334334
----------
335-
isrc : :obj:`int`
336-
Index of source to model
335+
solver : :obj:`AcousticWaveSolver`
336+
Devito's solver object.
337337
dm : :obj:`np.ndarray`
338338
Model perturbation
339339
@@ -343,31 +343,19 @@ def _born_oneshot(self, isrc: int, dm: NDArray) -> NDArray:
343343
Data
344344
345345
"""
346-
# create geometry for single source
347-
geometry = AcquisitionGeometry(
348-
self.model,
349-
self.geometry.rec_positions,
350-
self.geometry.src_positions[isrc, :],
351-
self.geometry.t0,
352-
self.geometry.tn,
353-
f0=self.geometry.f0,
354-
src_type=self.geometry.src_type,
355-
)
356346

357347
# set perturbation
358348
dmext = np.zeros(self.model.grid.shape, dtype=np.float32)
359349
dmext[self.model.nbl : -self.model.nbl, self.model.nbl : -self.model.nbl] = dm
360350

361351
# assign source location to source object with custom wavelet
362352
if hasattr(self, "wav"):
363-
self.wav.coordinates.data[0, :] = self.geometry.src_positions[isrc, :]
353+
self.wav.coordinates.data[0, :] = solver.geometry.src_positions[:]
364354

365-
# solve
366-
solver = AcousticWaveSolver(self.model, geometry, space_order=self.space_order)
367355
d = solver.jacobian(dmext, src=None if not hasattr(self, "wav") else self.wav)[
368356
0
369357
]
370-
d = d.resample(geometry.dt).data[:][: geometry.nt].T
358+
d = d.resample(solver.geometry.dt).data[:][: solver.geometry.nt].T
371359
return d
372360

373361
def _born_allshots(self, dm: NDArray) -> NDArray:
@@ -384,11 +372,26 @@ def _born_allshots(self, dm: NDArray) -> NDArray:
384372
Data for all shots
385373
386374
"""
375+
# create geometry for single source
376+
geometry = AcquisitionGeometry(
377+
self.model,
378+
self.geometry.rec_positions,
379+
self.geometry.src_positions[0, :],
380+
self.geometry.t0,
381+
self.geometry.tn,
382+
f0=self.geometry.f0,
383+
src_type=self.geometry.src_type,
384+
)
385+
386+
# solve
387+
solver = AcousticWaveSolver(self.model, geometry, space_order=self.space_order)
388+
387389
nsrc = self.geometry.src_positions.shape[0]
388390
dtot = []
389391

390392
for isrc in range(nsrc):
391-
d = self._born_oneshot(isrc, dm)
393+
solver.geometry.src_positions = self.geometry.src_positions[isrc, :]
394+
d = self._born_oneshot(solver, dm)
392395
dtot.append(d)
393396
dtot = np.array(dtot).reshape(nsrc, d.shape[0], d.shape[1])
394397
return dtot

0 commit comments

Comments
 (0)