Exemplo n.º 1
0
def gradient(model, residual, rcv_coords, u, return_op=False, space_order=8, t_sub=1,
             w=None, free_surface=False, freq=None, dft_sub=None, isic=True):
    """
    Low level propagator, to be used through `interface.py`
    Compute adjoint wavefield v = adjoint(F(m))*y
    and related quantities (||v||_w, v(xsrc))
    """
    # Setting adjoint wavefieldgradient
    v = wavefield(model, space_order, fw=False)

    # Set up PDE expression and rearrange
    pde, fs = wave_kernel(model, v, fw=False, fs=free_surface)

    # Setup source and receiver
    geom_expr, _, _ = src_rec(model, v, src_coords=rcv_coords,
                              wavelet=residual, fw=False)

    # Setup gradient wrt m
    gradm = Function(name="gradm", grid=model.grid)
    g_expr = grad_expr(gradm, u, v, model, w=w, freq=freq, dft_sub=dft_sub, isic=isic)

    # Create operator and run
    subs = model.spacing_map
    op = Operator(pde + geom_expr + g_expr + fs,
                  subs=subs, name="gradient"+name(model))

    if return_op:
        return op, gradm, v
    op(**op_kwargs(model, fs=free_surface))

    # Output
    return gradm.data
Exemplo n.º 2
0
def gradient(model,
             residual,
             rcv_coords,
             u,
             return_op=False,
             space_order=8,
             w=None,
             freq=None,
             dft_sub=None,
             isic=False):
    """
    Low level propagator, to be used through `interface.py`
    Compute the action of the adjoint Jacobian onto a residual J'* δ d.
    """
    # Setting adjoint wavefieldgradient
    v = wavefield(model, space_order, fw=False)

    # Set up PDE expression and rearrange
    pde = wave_kernel(model, v, fw=False)

    # Setup source and receiver
    geom_expr, _, _ = src_rec(model,
                              v,
                              src_coords=rcv_coords,
                              wavelet=residual,
                              fw=False)

    # Setup gradient wrt m
    gradm = Function(name="gradm", grid=model.grid)
    g_expr = grad_expr(gradm,
                       u,
                       v,
                       model,
                       w=w,
                       freq=freq,
                       dft_sub=dft_sub,
                       isic=isic)

    # Create operator and run
    subs = model.spacing_map
    op = Operator(pde + geom_expr + g_expr,
                  subs=subs,
                  name="gradient" + name(model),
                  opt=opt_op(model))
    try:
        op.cfunction
    except:
        op = Operator(pde + geom_expr + g_expr,
                      subs=subs,
                      name="gradient" + name(model),
                      opt='advanced')
        op.cfunction
    if return_op:
        return op, gradm, v

    summary = op()

    # Output
    return gradm, summary
Exemplo n.º 3
0
def forward_grad(model,
                 src_coords,
                 rcv_coords,
                 wavelet,
                 v,
                 space_order=8,
                 q=None,
                 ws=None,
                 isic=False,
                 w=None,
                 freq=None,
                 **kwargs):
    """
    Low level propagator, to be used through `interface.py`
    Compute forward wavefield u = A(m)^{-1}*f and related quantities (u(xrcv))
    """
    # Number of time steps
    nt = as_tuple(q)[0].shape[0] if wavelet is None else wavelet.shape[0]

    # Setting forward wavefield
    u = wavefield(model, space_order, save=False)

    # Add extended source
    q = q or wf_as_src(u, w=0)
    q = extented_src(model, ws, wavelet, q=q)

    # Set up PDE expression and rearrange
    pde = wave_kernel(model, u, q=q)

    # Setup source and receiver
    geom_expr, _, rcv = src_rec(model,
                                u,
                                src_coords=src_coords,
                                nt=nt,
                                rec_coords=rcv_coords,
                                wavelet=wavelet)

    # Setup gradient wrt m
    gradm = Function(name="gradm", grid=model.grid)
    g_expr = grad_expr(gradm, v, u, model, w=w, isic=isic, freq=freq)

    # Create operator and run
    subs = model.spacing_map
    op = Operator(pde + geom_expr + g_expr,
                  subs=subs,
                  name="forward_grad" + name(model),
                  opt=opt_op(model))

    summary = op()

    # Output
    return rcv, gradm, summary