Beispiel #1
0
    rndnoise = np.random.randn(nbobspt*dimsol).reshape((nbobspt, dimsol))
    DD[ii] = dd + sigmas.reshape((len(sigmas),1))*rndnoise
waveobj.dd = DD
waveobj.solvefwd_cost()
if mpirank == 0:
    print 'noise misfit={}, regul cost={}, ratio={}'.format(waveobj.cost_misfit, \
    waveobj.cost_reg, waveobj.cost_misfit/waveobj.cost_reg)
#myplot.plot_timeseries(waveobj.solfwd[2], 'pd', 0, skip, dl.Function(V))


# Matvec for Hessian
if mpirank == 0:    print 'Compute gradient'
waveobj.update_PDE({'b':b_target_fn})
waveobj.solvefwd_cost()
waveobj.solveadj_constructgrad()
x, y = dl.Function(Vm), dl.Function(Vm)
setfct(x, 1.0)
if mpirank == 0:    print 'Time Hessian matvec'
for ii in range(10):
    MPI.barrier(mpicomm)
    t0 = Wtime()
    waveobj.mult(x.vector(), y.vector())
    t1 = Wtime()
    dt = t1-t0
    mindt = MPI.min(mpicomm, t1-t0)
    maxdt = MPI.max(mpicomm, t1-t0)
    avgdt = MPI.sum(mpicomm, t1-t0) / float(mpisize)
    if mpirank == 0:
        print 'min={}, max={}, avg={}'.format(mindt, maxdt, avgdt)

diffbnorm = diffb.norm('l2')
if mpirank == 0:
    print '|MGaa|={} (df={:.2e}), |MGba|={} (df={:.2e})'.format(\
    MGaanorm, diffanorm, MGbanorm, diffbnorm)

waveobjab.assemble_hessian()
regula.assemble_hessian(evaluationpoint['a'])

waveobja = restrictobjabtoa(waveobjabnoregul, regula)

print ' Check Hessian are the same'
yy = dl.Function(Vl*Vl)
xx = dl.Function(Vl*Vl)
xx.vector().zero()
xx.vector().axpy(-1.0, waveobjab.MGv)
waveobjab.mult(xx.vector(), yy.vector())
xx.vector().zero()
xx.vector().axpy(1.0, yy.vector())
ya, yb = yy.split(deepcopy=True)
yan = ya.vector().norm('l2')
ybn = yb.vector().norm('l2')

y = dl.Function(Vl)
x = dl.Function(Vl)
x.vector().zero()
x.vector().axpy(-1.0, MGaa.vector())
waveobja.mult(x.vector(), y.vector())
x.vector().zero()
x.vector().axpy(1.0, y.vector())
yn = y.vector().norm('l2')
diff = y.vector() - ya.vector()
Beispiel #3
0
        + '_' + str(a) + '-' + str(b) + '.dat'
    except:
        myrange = xrange(Vm.dim())
        Hessfilename = outputdirectory + 'Hessian' + str(freq) + '.dat'

    # Assemble data Hessian
    if mpirank == 0: print 'Assemble data misfit part of the Hessian'
    waveobj.alpha_reg = 0.0
    Hei, ei = dl.Function(Vm), dl.Function(Vm)
    Hessian, VrDM, VcDM = setupPETScmatrix(Vm, Vm, 'dense', mpicomm)
    for ii in myrange:
        if ii % 100 == 0 and mpirank == 0:
            print 'ii={} out of {}'.format(ii, Vm.dim())
        ei.vector().zero()
        setglobalvalue(ei, ii, 1.0)
        waveobj.mult(ei.vector(), Hei.vector())
        normvec = Hei.vector().norm('l2')
        Hei_arr = Hei.vector().array()
        cols = np.where(np.abs(Hei_arr) > 1e-16 * normvec)[0]
        for cc, val in zip(cols, Hei_arr[cols]):
            global_cc = VcDM.dofs()[cc]
            Hessian[ii, global_cc] = val
    Hessian.assemblyBegin()
    Hessian.assemblyEnd()

    # Print Hessian to file
    if mpirank == 0: print 'Print Hessian to file'
    myviewer = PETSc.Viewer().createBinary(Hessfilename, \
    mode='w', format=PETSc.Viewer.Format.NATIVE, comm=mpicomm)
    myviewer(Hessian)