if mpirank == 0:
        print 'Check gradient and Hessian against finite-difference'

    InvPb.update_m(mtrueVm)  #InvPb.update_m(1.0)
    InvPb.Regul.update_Parameters({
        'Vm': Vm,
        'gamma': 0.0,
        'beta': 0.0,
        'm0': 1.0
    })
    InvPb.solvefwd_cost()
    InvPb.solveadj_constructgrad()

    nbcheck = 5
    MedPert = np.zeros((nbcheck, InvPb.m.vector().local_size()))
    for ii in range(nbcheck):
        smoothperturb = dl.Expression('sin(n*pi*x[0])*sin(n*pi*x[1])',
                                      n=ii + 1)
        smoothperturb_fn = dl.interpolate(smoothperturb, Vm)
        MedPert[ii, :] = smoothperturb_fn.vector().array()

    checkgradfd_med(InvPb, MedPert, 1e-6, [1e-4, 1e-5, 1e-6], True, mpicomm)
    print ''
    checkhessfd_med(InvPb, MedPert, 1e-6, [1e-4, 1e-5, 1e-6], True, mpicomm)

    sys.exit(0)

# Solve inverse problem
if mpirank == 0: print 'Solve inverse problem'
InvPb.inversion(1.0, mtrueVm, mpicomm, {'maxnbNewtiter': 200}, myplot=myplot)
Beispiel #2
0
        dl.Expression('sin(pi*x[0])*sin(pi*x[1])', degree=10),
        dl.Expression('x[1]', degree=10),
        dl.Expression('x[0]', degree=10),
        dl.Expression('sin(3*pi*x[0])*sin(3*pi*x[1])', degree=10)
    ]

    if ALL:
        Medium = []
        tmp = dl.Function(Vl * Vl)
        for ii in range(nbtest):
            tmp.vector().zero()
            dl.assign(tmp.sub(0), dl.interpolate(MPa[ii], Vl))
            dl.assign(tmp.sub(1), dl.interpolate(MPb[ii], Vl))
            Medium.append(tmp.vector().copy())
        if PRINT: print 'check gradient with FD'
        checkgradfd_med(waveobj, Medium, PRINT, 1e-6, [1e-5, 1e-6, 1e-7], True)
        if PRINT: print '\ncheck Hessian with FD'
        checkhessabfd_med(waveobj, Medium, PRINT, 1e-6, [1e-5, 1e-6, 1e-7],
                          True, 'all')
    else:
        Mediuma, Mediumb = [], []
        tmp = dl.Function(Vl * Vl)
        for ii in range(nbtest):
            tmp.vector().zero()
            dl.assign(tmp.sub(0), dl.interpolate(MPa[ii], Vl))
            Mediuma.append(tmp.vector().copy())
            tmp.vector().zero()
            dl.assign(tmp.sub(1), dl.interpolate(MPb[ii], Vl))
            Mediumb.append(tmp.vector().copy())
        if PRINT: print 'check a-gradient with FD'
        if 'a' in PARAM:
def run_test(fpeak, lambdamin, lambdamax, Nxy, tfilterpts, r, Dt, skip):
    h = 1./Nxy
    checkdt(Dt, h, r, np.sqrt(lambdamax), True)
    mesh = dl.UnitSquareMesh(Nxy, Nxy)
    Vl = dl.FunctionSpace(mesh, 'Lagrange', 1)
    V = dl.FunctionSpace(mesh, 'Lagrange', r)
    fctV = dl.Function(V)
    # set up plots:
    filename, ext = splitext(sys.argv[0])
    if isdir(filename + '/'):   rmtree(filename + '/')
    myplot = PlotFenics(filename)
    # source:
    Ricker = RickerWavelet(fpeak, 1e-10)
    Pt = PointSources(V, [[0.5,0.5]])
    mydelta = Pt[0].array()
    def mysrc(tt):
        return Ricker(tt)*mydelta
    # target medium:
    lambda_target = dl.Expression('lmin + x[0]*(lmax-lmin)', \
    lmin=lambdamin, lmax=lambdamax)
    lambda_target_fn = dl.interpolate(lambda_target, Vl)
    myplot.set_varname('lambda_target')
    myplot.plot_vtk(lambda_target_fn)
    # initial medium:
    lambda_init = dl.Constant(lambdamin)
    lambda_init_fn = dl.interpolate(lambda_init, Vl)
    myplot.set_varname('lambda_init')
    myplot.plot_vtk(lambda_init_fn)
    # observation operator:
    #obspts = [[0.2, 0.5], [0.5, 0.2], [0.5, 0.8], [0.8, 0.5]]
    obspts = [[0.2, ii/10.] for ii in range(2,9)] + \
    [[0.8, ii/10.] for ii in range(2,9)] + \
    [[ii/10., 0.2] for ii in range(3,8)] + \
    [[ii/10., 0.8] for ii in range(3,8)]
    obsop = TimeObsPtwise({'V':V, 'Points':obspts}, tfilterpts)
    # define pde operator:
    wavepde = AcousticWave({'V':V, 'Vl':Vl, 'Vr':Vl})
    wavepde.timestepper = 'centered'
    wavepde.lump = True
    wavepde.set_abc(mesh, LeftRight(), True)
    wavepde.update({'lambda':lambda_target_fn, 'rho':1.0, \
    't0':t0, 'tf':tf, 'Dt':Dt, 'u0init':dl.Function(V), 'utinit':dl.Function(V)})
    wavepde.ftime = mysrc
    # define objective function:
    waveobj = ObjectiveAcoustic(wavepde)
    waveobj.obsop = obsop
    # data
    print 'generate noisy data'
    waveobj.solvefwd()
    myplot.plot_timeseries(waveobj.solfwd, 'pd', 0, skip, fctV)
    dd = waveobj.Bp.copy()
    nbobspt, dimsol = dd.shape
    noiselevel = 0.1   # = 10%
    sigmas = np.sqrt((dd**2).sum(axis=1)/dimsol)*noiselevel
    rndnoise = np.random.randn(nbobspt*dimsol).reshape((nbobspt, dimsol))
    waveobj.dd = dd + sigmas.reshape((len(sigmas),1))*rndnoise
    # gradient
    print 'generate observations'
    waveobj.update_m(lambda_init_fn)
    waveobj.solvefwd_cost()
    cost1 = waveobj.misfit
    print 'misfit = {}'.format(waveobj.misfit)
    myplot.plot_timeseries(waveobj.solfwd, 'p', 0, skip, fctV)
    # Plot data and observations
    fig = plt.figure()
    if len(obspts) > 9: fig.set_size_inches(20., 15.)
    for ii in range(len(obspts)):
        if len(obspts) == 4:    ax = fig.add_subplot(2,2,ii+1)
        else:   ax = fig.add_subplot(4,6,ii+1)
        ax.plot(waveobj.PDE.times, waveobj.dd[ii,:], 'k--')
        ax.plot(waveobj.PDE.times, waveobj.Bp[ii,:], 'b')
        ax.set_title('Plot'+str(ii))
    fig.savefig(filename + '/observations.eps')
    print 'compute gradient'
    waveobj.solveadj_constructgrad()
    myplot.plot_timeseries(waveobj.soladj, 'v', 0, skip, fctV)
    MG = waveobj.MGv.array().copy()
    myplot.set_varname('grad')
    myplot.plot_vtk(waveobj.Grad)
    print 'check gradient with FD'
    Medium = np.zeros((5, Vl.dim()))
    for ii in range(5):
        smoothperturb = dl.Expression('sin(n*pi*x[0])*sin(n*pi*x[1])', n=ii+1)
        smoothperturb_fn = dl.interpolate(smoothperturb, Vl)
        Medium[ii,:] = smoothperturb_fn.vector().array()
    checkgradfd_med(waveobj, Medium, 1e-6, [1e-5, 1e-4])
    print 'check Hessian with FD'
    checkhessfd_med(waveobj, Medium, 1e-6, [1e-1, 1e-2, 1e-3, 1e-4, 1e-5], False)