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()
+ '_' + 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)