Beispiel #1
0
def test_full_model():

    shape = (50, 50, 50)
    spacing = [10. for _ in shape]
    nbpml = 10

    # Create two-layer model from preset
    model = demo_model(preset='layers-isotropic',
                       vp_top=1.,
                       vp_bottom=2.,
                       spacing=spacing,
                       shape=shape,
                       nbpml=nbpml)

    # Test Model pickling
    pkl_model = pickle.dumps(model)
    new_model = pickle.loads(pkl_model)
    assert np.isclose(np.linalg.norm(model.vp - new_model.vp), 0)

    f0 = .010
    dt = model.critical_dt
    t0 = 0.0
    tn = 350.0
    time_range = TimeAxis(start=t0, stop=tn, step=dt)

    # Test TimeAxis pickling
    pkl_time_range = pickle.dumps(time_range)
    new_time_range = pickle.loads(pkl_time_range)
    assert np.isclose(np.linalg.norm(time_range.time_values),
                      np.linalg.norm(new_time_range.time_values))

    # Test Class Constant pickling
    pkl_origin = pickle.dumps(model.grid.origin)
    new_origin = pickle.loads(pkl_origin)

    for a, b in zip(model.grid.origin, new_origin):
        assert a.compare(b) == 0

    # Test Class TimeDimension pickling
    time_dim = TimeDimension(name='time',
                             spacing=Constant(name='dt', dtype=np.float32))
    pkl_time_dim = pickle.dumps(time_dim)
    new_time_dim = pickle.loads(pkl_time_dim)
    assert time_dim.spacing._value == new_time_dim.spacing._value

    # Test Class SteppingDimension
    stepping_dim = SteppingDimension(name='t', parent=time_dim)
    pkl_stepping_dim = pickle.dumps(stepping_dim)
    new_stepping_dim = pickle.loads(pkl_stepping_dim)
    assert stepping_dim.is_Time == new_stepping_dim.is_Time

    # Test Grid pickling
    pkl_grid = pickle.dumps(model.grid)
    new_grid = pickle.loads(pkl_grid)
    assert model.grid.shape == new_grid.shape

    assert model.grid.extent == new_grid.extent
    assert model.grid.shape == new_grid.shape
    for a, b in zip(model.grid.dimensions, new_grid.dimensions):
        assert a.compare(b) == 0

    ricker = RickerSource(name='src',
                          grid=model.grid,
                          f0=f0,
                          time_range=time_range)

    pkl_ricker = pickle.dumps(ricker)
    new_ricker = pickle.loads(pkl_ricker)
    assert np.isclose(np.linalg.norm(ricker.data),
                      np.linalg.norm(new_ricker.data))
Beispiel #2
0
from devito import Grid, Function, TimeFunction, NODE, Eq, Operator
from examples.seismic.source import RickerSource, TimeAxis
from numpy import sqrt
import matplotlib.pyplot as plt

extent = (150., 150.)
shape = (301, 301)

grid = Grid(extent=extent, shape=shape)

t0, tn = 0., 40.  # Strange tiling effect at tn > 30
dt = (1. / sqrt(2.)) / 2500.
time_range = TimeAxis(start=t0, stop=tn,
                      step=dt)  #Set up time axis object for ricker source

src = RickerSource(name='src', grid=grid, f0=0.100,
                   time_range=time_range)  # Ricker wavelet source
src.coordinates.data[:] = [75., 75.]

so = 6  # Spatial derivatives are second order accurate

x = grid.dimensions[0]
y = grid.dimensions[1]

#vx= TimeFunction(name='vx', grid=grid, staggered=x, space_order=so)
#vy = TimeFunction(name='vy', grid=grid, staggered=y, space_order=so)

#txx = TimeFunction(name='txx', grid=grid, staggered=NODE, space_order=so)
#tyy = TimeFunction(name='tyy', grid=grid, staggered=NODE, space_order=so)
#txy = TimeFunction(name='txy', grid=grid, staggered=(x, y), space_order=so)
#Fairly sure grid is actually 2km x 2km with spacing 10m
shape = (201, 201)
#Define x and z as spatial dimentions for Sympy
x = SpaceDimension(name='x',
                   spacing=Constant(name='h_x',
                                    value=extent[0] / (shape[0] - 1)))
#Dimension called x, with constant spacing of 10 (called h_x)
z = SpaceDimension(name='z',
                   spacing=Constant(name='h_z',
                                    value=extent[1] / (shape[1] - 1)))
grid = Grid(extent=extent, shape=shape, dimensions=(x, z))

# Timestep size from Eq. 7 with V_p=6000. and dx=100
t0, tn = 0., 600.
dt = (10. / np.sqrt(2.)) / 6.
time_range = TimeAxis(start=t0, stop=tn, step=dt)

src = RickerSource(name='src', grid=grid, f0=0.01, time_range=time_range)
src.coordinates.data[:] = np.array([1000., 1000.])
src.show()

# Now that looks pretty! But let's do it again with a higher order...
so = 6
vx = TimeFunction(name='vx', grid=grid, staggered=x, space_order=so)
vz = TimeFunction(name='vz', grid=grid, staggered=z, space_order=so)
txx = TimeFunction(name='txx', grid=grid, staggered=NODE, space_order=so)
tzz = TimeFunction(name='tzz', grid=grid, staggered=NODE, space_order=so)
txz = TimeFunction(name='txz', grid=grid, staggered=(x, z), space_order=so)

print("vx.dx stencil", vx.dx, "\n\n")
print("vx.dz stencil", vx.dz, "\n\n")