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)
Beispiel #2
0
        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()