Source code for pysit.core.acquisition
import copy
import numpy as np
from .shot import *
from .receivers import *
from .sources import *
from pysit.util.parallel import ParallelWrapShotNull
__all__ = ['equispaced_acquisition']
[docs]def equispaced_acquisition(mesh, wavelet,
sources=1,
receivers='max',
source_depth=None,
source_kwargs={},
receiver_depth=None,
receiver_kwargs={},
parallel_shot_wrap=ParallelWrapShotNull()
):
m = mesh
d = mesh.domain
xmin = d.x.lbound
xmax = d.x.rbound
zmin = d.z.lbound
zmax = d.z.rbound
if m.dim == 3:
ymin = d.y.lbound
ymax = d.y.rbound
if source_depth is None:
source_depth = zmin
if receiver_depth is None:
receiver_depth = zmin
shots = list()
max_sources = m.x.n
if m.dim == 2:
if receivers == 'max':
receivers = m.x.n
if sources == 'max':
sources = m.x.n
if receivers > m.x.n:
raise ValueError('Number of receivers exceeds mesh nodes.')
if sources > m.x.n:
raise ValueError('Number of sources exceeds mesh nodes.')
xpos = np.linspace(xmin, xmax, receivers)
receiversbase = ReceiverSet(m, [PointReceiver(m, (x, receiver_depth), **receiver_kwargs) for x in xpos])
local_sources = sources // parallel_shot_wrap.size, 1
if m.dim == 3:
if receivers == 'max':
receivers = (m.x.n, m.y.n) # x, y
if sources == 'max':
sources = (m.x.n, m.y.n) # x, y
if receivers[0] > m.x.n or receivers[1] > m.y.n:
raise ValueError('Number of receivers exceeds mesh nodes.')
if sources[0] > m.x.n or sources[1] > m.y.n:
raise ValueError('Number of sources exceeds mesh nodes.')
xpos = np.linspace(xmin, xmax, receivers[0])
ypos = np.linspace(ymin, ymax, receivers[1])
receiversbase = ReceiverSet(m, [PointReceiver(m, (x, y, receiver_depth), **receiver_kwargs) for x in xpos for y in ypos])
local_sources = sources[0] // parallel_shot_wrap.size, sources[1] // parallel_shot_wrap.size
for i in range(int(local_sources[0])):
for j in range(int(local_sources[1])):
idx = i + local_sources[0]*parallel_shot_wrap.rank
jdx = j + local_sources[1]*parallel_shot_wrap.rank
if m.dim == 2:
srcpos = (xmin + (xmax-xmin)*(idx+1.0)/(sources+1.0), source_depth)
elif m.dim == 3:
srcpos = (xmin + (xmax-xmin)*(idx+1.0)/(sources[0]+1.0), ymin + (ymax-ymin)*(jdx+1.0)/(sources[1]+1.0), source_depth)
# Define source location and type
source = PointSource(m, srcpos, wavelet, **source_kwargs)
# Define set of receivers
receivers = copy.deepcopy(receiversbase)
# Create and store the shot
shot = Shot(source, receivers)
shots.append(shot)
return shots