if gradnorm < gradnorm0 * tolgrad or gradnorm < 1e-12: print '\nGradient sufficiently reduced -- optimization stopped' break # search direction tolcg = min(0.5, np.sqrt(gradnorm / gradnorm0)) cgiter, cgres, cgid, tolcg = compute_searchdirection( waveobj, 'Newt', tolcg) myplot.set_varname('srchdir' + str(iter)) myplot.plot_vtk(waveobj.srchdir) # line search cost_old = waveobj.cost statusLS, LScount, alpha = bcktrcklinesearch(waveobj, 12) cost = waveobj.cost print '{:11.3f} {:12.2e} {:10d}'.\ format(alpha, tolcg, cgiter) # stopping criterion (cost) if np.abs(cost - cost_old) / np.abs(cost_old) < tolcost: print 'Cost function stagnates -- optimization stopped' break # Compute eigenspectrum waveobj.alpha_reg = 0.0 # no regularization Omega = np.random.randn(Vm.dim() * 60).reshape((Vm.dim(), 60)) #TODO: need to left-multiply Omega by R^{-1/2}.M (to be checked) d, U = doublePassG(waveobj, regul.precond, regul.getprecond(), Omega, 40) np.savetxt(filename + str(Nxy) + '/eigenvalues.txt', d) # myplot.set_varname('eigenvectors') # for ii in range(U.shape[1]): # setfct(waveobj.PDE.a, U[:,ii]) # myplot.plot_vtk(waveobj.PDE.a, ii)
if myrank + 1 < mysize: b = (myrank + 1) * (Vm.dim() / mysize) + 5 else: b = Vm.dim() myrange = range(Vm.dim())[a:b] print 'Hand-made parallelism: myrank={} (out of {}), myrange=[{}:{}]'.format(\ myrank, mysize, a, b) Hessfilename = outputdirectory + 'Hessian' + str(freq) \ + '_' + 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()