Exemple #1
0
    def __init__(self, model, rec_positions, src_positions, t0, tn, **kwargs):
        """
        In practice would be __init__(segyfile) and all below parameters
        would come from a segy_read (at property call rather than at init)
        """
        src_positions = np.reshape(src_positions, (-1, model.dim))
        rec_positions = np.reshape(rec_positions, (-1, model.dim))
        self.rec_positions = rec_positions
        self._nrec = rec_positions.shape[0]
        self.src_positions = src_positions
        self._nsrc = src_positions.shape[0]
        self._src_type = kwargs.get('src_type')
        assert (self.src_type in sources or self.src_type is None)
        self._f0 = kwargs.get('f0')
        self._a = kwargs.get('a', None)
        self._t0w = kwargs.get('t0w', None)
        if self._src_type is not None and self._f0 is None:
            error("Peak frequency must be provided in KH" +
                  " for source of type %s" % self._src_type)

        self._grid = model.grid
        self._model = model
        self._dt = model.critical_dt
        self._t0 = t0
        self._tn = tn
Exemple #2
0
 def verify_parameters(self, parameters, expected):
     """
     Utility function to verify a parameter set against expected
     values.
     """
     boilerplate = ['timers']
     parameters = [p.name for p in parameters]
     for exp in expected:
         if exp not in parameters + boilerplate:
             error("Missing parameter: %s" % exp)
         assert exp in parameters + boilerplate
     extra = [p for p in parameters if p not in expected and p not in boilerplate]
     if len(extra) > 0:
         error("Redundant parameters: %s" % str(extra))
     assert len(extra) == 0
Exemple #3
0
    def verify_arguments(self, arguments, expected):
        """
        Utility function to verify an argument dictionary against
        expected values.
        """
        for name, value in expected.items():
            if isinstance(value, np.ndarray):
                condition = (arguments[name] == value).all()
            else:
                condition = arguments[name] == value

            if not condition:
                error('Wrong argument %s: expected %s, got %s' %
                      (name, value, arguments[name]))
            assert condition
Exemple #4
0
    def __init__(self, model, rec_positions, src_positions, t0, tn, **kwargs):
        """
        In practice would be __init__(segyfile) and all below parameters
        would come from a segy_read (at property call rather than at init)
        """
        self.rec_positions = rec_positions
        self._nrec = rec_positions.shape[0]
        self.src_positions = src_positions
        self._nsrc = src_positions.shape[0]
        self._src_type = kwargs.get('src_type')
        assert self.src_type in sources
        self._f0 = kwargs.get('f0')
        if self._src_type is not None and self._f0 is None:
            error("Peak frequency must be provided in KH" +
                  " for source of type %s" % self._src_type)

        self._model = model
        self._dt = model.critical_dt
        self._t0 = t0
        self._tn = tn
Exemple #5
0
def fwi_gradient_shot(vp_in, i, solver_params, source_location):
    error("Initialising solver")
    tn = solver_params['tn']
    nbl = solver_params['nbl']
    space_order = solver_params['space_order']
    dtype = solver_params['dtype']
    origin = solver_params['origin']
    spacing = solver_params['spacing']
    true_model_filename = "overthrust_3D_true_model_2D.h5"
    # shots_container = solver_params['shots_container']

    # true_d, source_location, old_dt = load_shot(i, container=shots_container)

    true_solver_params = solver_params.copy()

    true_solver_params['h5_file'] = true_model_filename
    true_solver_params['datakey'] = "m"

    solver_true = overthrust_solver_iso(**true_solver_params)

    true_d, _, _ = solver_true.forward()

    model = Model(vp=vp_in,
                  nbl=nbl,
                  space_order=space_order,
                  dtype=dtype,
                  shape=vp_in.shape,
                  origin=origin,
                  spacing=spacing,
                  bcs="damp")
    geometry = create_geometry(model, tn, source_location)

    error("tn: %d, nt: %d, dt: %f" % (geometry.tn, geometry.nt, geometry.dt))

    # error("Reinterpolate shot from %d samples to %d samples" % (true_d.shape[0], geometry.nt))
    # true_d = reinterpolate(true_d, geometry.nt, old_dt)

    solver = AcousticWaveSolver(model,
                                geometry,
                                kernel='OT2',
                                nbl=nbl,
                                space_order=space_order,
                                dtype=dtype)

    grad = Function(name="grad", grid=model.grid)

    residual = Receiver(name='rec',
                        grid=model.grid,
                        time_range=geometry.time_axis,
                        coordinates=geometry.rec_positions)

    u0 = TimeFunction(name='u',
                      grid=model.grid,
                      time_order=2,
                      space_order=solver.space_order,
                      save=geometry.nt)

    error("Forward prop")
    smooth_d, _, _ = solver.forward(save=True, u=u0)
    error("Misfit")
    residual.data[:] = smooth_d.data[:] - true_d.data[:]

    objective = .5 * np.linalg.norm(residual.data.ravel())**2
    error("Gradient")
    solver.gradient(rec=residual, u=u0, grad=grad)

    grad = clip_boundary_and_numpy(grad.data, model.nbl)

    return objective, -grad