def isic_freq(u, v, model, **kwargs): """ Inverse scattering imaging condition Parameters ---------- u: TimeFunction or Tuple Forward wavefield (tuple of fields for TTI or dft) v: TimeFunction or Tuple Adjoint wavefield (tuple of fields for TTI) model: Model Model structure """ freq = kwargs.get('freq') # Subsampled dft time axis time = model.grid.time_dim dt = time.spacing tsave, factor = sub_time(time, kwargs.get('factor')) expr = 0 for uu, vv in zip(u, v): ufr, ufi = uu # Frequencies nfreq = freq.shape[0] f = Function(name='f', dimensions=(ufr.dimensions[0], ), shape=(nfreq, )) f.data[:] = freq[:] omega_t = 2 * np.pi * f * tsave * factor * dt # Gradient weighting is (2*np.pi*f)**2/nt w = (2 * np.pi * f)**2 / time.symbolic_max expr += (w * (ufr * cos(omega_t) - ufi * sin(omega_t)) * vv * model.m - factor / time.symbolic_max * (grads(ufr * cos(omega_t) - ufi * sin(omega_t), so_fact=2).T * grads(vv, so_fact=2))) return expr
def inner_grad(u, v): """ Inner product of the gradient of two Function. Parameters ---------- u: TimeFunction or Function First wavefield v: TimeFunction or Function Second wavefield """ return sum([a*b for a, b in zip(grads(u, so_fact=2), grads(v, so_fact=2))])
def isic_time(u, v, model, **kwargs): """ Inverse scattering imaging condition Parameters ---------- u: TimeFunction or Tuple Forward wavefield (tuple of fields for TTI or dft) v: TimeFunction or Tuple Adjoint wavefield (tuple of fields for TTI) model: Model Model structure """ w = -u[0].indices[0].spacing * model.irho return w * sum( uu * vv.dt2 * model.m + grads(uu, so_fact=2).T * grads(vv, so_fact=2) for uu, vv in zip(u, v))
def isic_src(model, u, **kwargs): """ ISIC source for linearized modeling Parameters ---------- u: TimeFunction or Tuple Forward wavefield (tuple of fields for TTI or dft) model: Model Model containing the perturbation dm """ m, dm, irho = model.m, model.dm, model.irho dus = [] for uu in u: du_aux = divs(dm * irho * grads(uu, so_fact=2), so_fact=2) dus.append(dm * irho * uu.dt2 * m - du_aux) if model.is_tti: return (-dus[0], -dus[1]) return -dus[0]