def run_test(nbrep=100):
    mesh = dl.UnitSquareMesh(100,100)
    V = dl.FunctionSpace(mesh, 'Lagrange', 2)
    test, trial = dl.TestFunction(V), dl.TrialFunction(V)
    k = dl.Function(V)
    wkform = dl.inner(k*dl.nabla_grad(test), dl.nabla_grad(trial))*dl.dx
    for ii in xrange(nbrep):
        setfct(k, float(ii+1))
        dl.assemble(wkform)
Example #2
0
def run_exple(denoise, PLOT=True, TEST=False):
    # testcase == 0
    print 'Run basic example -- PLOT={}. TEST={}'.format(PLOT, TEST)
    # Solve
    #ALPHAS = 10**(-np.linspace(-3.,3.,7))
    ALPHAS = [1.0]
    denoise.g = dl.Function(denoise.V)
    for aa in ALPHAS:
        setfct(denoise.g, denoise.dn)   # start from noisy image
        denoise.regparam = aa
        denoise.solve()
        if PLOT:    denoise.plot(2,'-'+str(aa))
Example #3
0
def run_continuation(denoise, PLOT=True, TEST=False):
    # testcase == 1
    print 'Run continuation scheme on eps -- PLOT={}. TEST={}'.format(PLOT, TEST)
    # Solve
    denoise.regparam = 1e-2
    EPS = 10**(-np.linspace(0.,4.,5))
    #EPS = [1.0]
    denoise.g = dl.Function(denoise.V)
    setfct(denoise.g, denoise.dn)   # start from noisy image
    for eps in EPS:
        print 'eps={}'.format(eps)
        paramregul = {'regularization':'TV', 'eps':eps, 'k':1.0, 'GN':False}
        denoise.define_regularization(paramregul)
        denoise.solve()
        if PLOT:    denoise.plot(2,'-'+str(eps))
def run_test(nbrep=100):
    #    dl.parameters['form_compiler']['cpp_optimize'] = True
    #    dl.parameters['form_compiler']['cpp_optimize_flags'] = '-O3'
    #    dl.parameters['form_compiler']['optimize'] = True
    #    ffc.parameters.FFC_PARAMETERS['optimize'] = True
    #    ffc.parameters.FFC_PARAMETERS['cpp_optimize'] = True
    #    ffc.parameters.FFC_PARAMETERS['cpp_optimize_flags'] = '-O3'
    mesh = dl.UnitSquareMesh(1000, 1000)
    V = dl.FunctionSpace(mesh, 'Lagrange', 2)
    test, trial = dl.TestFunction(V), dl.TrialFunction(V)
    k = dl.Function(V)
    wkform = dl.inner(k * dl.nabla_grad(test), dl.nabla_grad(trial)) * dl.dx
    v2 = dl.assemble(wkform)
    for ii in xrange(nbrep):
        setfct(k, float(ii + 1))
        dl.assemble(wkform)
def run_test2(nbrep=100):
    mesh = dl.UnitSquareMesh(40, 40)
    V = dl.FunctionSpace(mesh, 'Lagrange', 2)
    Vr = dl.FunctionSpace(mesh, 'Lagrange', 1)
    test = dl.TestFunction(Vr)
    u, v = dl.Function(V), dl.Function(V)
    # weak form
    wkform = dl.inner(test * u, v) * dl.dx
    # assemble tensor
    M = LumpedMassMatrixPrime(Vr, V, 1.0)
    for ii in xrange(nbrep):
        setfct(u, np.random.randn(V.dim()))
        setfct(v, np.random.randn(V.dim()))

        dl.assemble(wkform)
        M.get_gradient(u.vector(), v.vector())
Example #6
0
def run():
    mesh = dl.UnitSquareMesh(50, 50)
    Vr = dl.FunctionSpace(mesh, 'Lagrange', 1)
    Vphi = dl.FunctionSpace(mesh, 'Lagrange', 2)
    Vphidofmap = Vphi.dofmap().dofs()
    test, trial = dl.TestFunction(Vphi), dl.TrialFunction(Vphi)
    u, v = dl.Function(Vphi), dl.Function(Vphi)
    rho = dl.Function(Vr)
    Mweak = dl.inner(rho * test, trial) * dl.dx
    Mprime = LumpedMassMatrixPrime(Vr, Vphi, None)
    h = 1e-5
    fact = [1.0, -1.0]

    RHO = \
    [dl.interpolate(dl.Expression('2.0 + sin(n*pi*x[0])*sin(n*pi*x[1])', n=1.0, degree=10), Vr), \
    dl.interpolate(dl.Expression('2.0 + sin(n*pi*x[0])*sin(n*pi*x[1])', n=8.0, degree=10), Vr), \
    dl.interpolate(dl.Expression('2.0 + sin(2*pi*x[0])*sin(1*pi*x[1])*(x[0]<0.5)', degree=10), Vr), \
    dl.interpolate(dl.Expression('2.0 + 2.0*(x[0]<0.5)*(x[1]<0.5) - 1.8*(x[0]>=0.5)*(x[1]<0.5)', degree=10), Vr)]

    np.random.seed(11)
    locsize = len(u.vector().array())
    for jj, rho1 in enumerate(RHO):
        if mpirank == 0: print '\nmedium {}'.format(jj)
        setfct(rho, rho1)
        M = dl.assemble(Mweak)
        Ml = LumpedMatrixSolverS(Vphi)
        Ml.set_operator(M)
        Mprime.updater(Ml.ratio)
        for ii in range(5):
            rndvecu = np.random.randn(Vphi.dim())
            rndvecv = np.random.randn(Vphi.dim())
            if mpirank == 0: print 'test {}'.format(ii)
            rnddir = dl.interpolate(dl.Expression('2.0+sin(n*pi*x[0])*sin(n*pi*x[1])',\
            n=ii+1, degree=10), Vr)
            setfct(u, rndvecu[Vphidofmap])
            setfct(v, rndvecv[Vphidofmap])
            analytical = rnddir.vector().inner(
                Mprime.get_gradient(u.vector(), v.vector()))
            uMv = []
            for ff in fact:
                setfct(rho, rho1)
                rho.vector().axpy(ff * h, rnddir.vector())
                M = dl.assemble(Mweak)
                Ml = LumpedMatrixSolverS(Vphi)
                Ml.set_operator(M)
                uMv.append(u.vector().inner(Ml * v.vector()))
            fd = (uMv[0] - uMv[1]) / (2 * h)
            err = np.abs((analytical - fd) / analytical)
            if mpirank == 0:
                print 'analytical={}, fd={}, err={}'.format(
                    analytical, fd, err),
                if err < 1e-6: print '\t =>> OK!!'
                else: print ''
            MPI.barrier(mycomm)
Example #7
0
def run_continuation(denoise, PLOT=True, TEST=False):
    # testcase == 1
    print 'Run continuation scheme on eps -- PLOT={}. TEST={}'.format(
        PLOT, TEST)
    # Solve
    denoise.regparam = 1e-2
    EPS = 10**(-np.linspace(0., 4., 5))
    #EPS = [1.0]
    denoise.g = dl.Function(denoise.V)
    setfct(denoise.g, denoise.dn)  # start from noisy image
    for eps in EPS:
        print 'eps={}'.format(eps)
        paramregul = {
            'regularization': 'TV',
            'eps': eps,
            'k': 1.0,
            'GN': False
        }
        denoise.define_regularization(paramregul)
        denoise.solve()
        if PLOT: denoise.plot(2, '-' + str(eps))
Example #8
0
import dolfin as dl
from fenicstools.plotfenics import PlotFenics
from fenicstools.miscfenics import setfct

mesh = dl.UnitSquareMesh(40, 40)
V = dl.FunctionSpace(mesh, 'Lagrange', 1)
myplot = PlotFenics()
myplot.set_varname('u')
u = dl.Function(V)
for ii in range(10):
    setfct(u, dl.interpolate(dl.Constant(ii), V))
    myplot.plot_vtk(u, ii)
myplot.gather_vtkplots()
Example #9
0
 a = dl.interpolate(dl.Expression('1.0 + sin(n*pi*x[0])*sin(n*pi*x[1])',\
 n=ii, degree=10), V)
 b = dl.interpolate(dl.Expression('pow(x[0], n)*pow(x[1], n)',\
 n=ii, degree=10), V)
 grad = cg.gradab(a, b)
 for jj in range(5):
     directa = dl.interpolate(dl.Expression('pow(x[0], n)*pow(x[1], n)',\
     n=jj+1, degree=10), V)
     directb = dl.interpolate(dl.Expression('1.0 + sin(n*pi*x[0])*sin(n*pi*x[1])',\
     n=jj+1, degree=10), V)
     dl.assign(directab.sub(0), directa)
     dl.assign(directab.sub(1), directb)
     gradxdir = grad.inner(directab.vector())
     print 'grad={}, '.format(gradxdir)
     for h in H:
         setfct(ak, a)
         setfct(bk, b)
         ak.vector().axpy(h, directa.vector())
         bk.vector().axpy(h, directb.vector())
         cost1 = cg.costab(ak, bk)
         setfct(ak, a)
         setfct(bk, b)
         ak.vector().axpy(-h, directa.vector())
         bk.vector().axpy(-h, directb.vector())
         cost2 = cg.costab(ak, bk)
         gradfddirect = (cost1 - cost2) / (2 * h)
         if np.abs(gradxdir) > 1e-16:
             err = np.abs(gradxdir - gradfddirect) / np.abs(gradxdir)
         else:
             err = np.abs(gradxdir - gradfddirect)
         print '\th={}, fd={}, err={:.2e}'.format(h, gradfddirect, err),
Example #10
0
def runcontobs():
    mesh = dl.UnitSquareMesh(100, 100)
    V = dl.FunctionSpace(mesh, 'Lagrange', 1)
    myn = 1
    m_exp = dl.Expression('sin(n*pi*x[0])*sin(n*pi*x[1])', n=myn)
    m = dl.interpolate(m_exp, V)
    m_in = dl.Function(V)
    mv = m.vector()
    shm = mv.array().shape
    HH = [1e-4, 1e-5, 1e-6]

    # CONTINUOUS obsop:
    # Cost:
    obsopcont = ObsEntireDomain({'V': V}, None)
    cost_ex = (.5 - np.sin(2 * np.pi * myn) / (4 * np.pi * myn))**2
    print 'relative error on cost: {:.2e}'.format(\
    np.abs(2*obsopcont.costfct(mv.array(), np.zeros(shm)) - cost_ex) / cost_ex)
    print 'relative error on cost_F: {:.2e}'.format(\
    np.abs(2*obsopcont.costfct_F(m, dl.Function(V)) - cost_ex) / cost_ex)

    md_exp = dl.Expression('sin(n*pi*x[0])*sin(n*pi*x[1])', n=3)
    md = dl.interpolate(md_exp, V)
    cost = obsopcont.costfct(mv.array(), md.vector().array())
    cost_F = obsopcont.costfct_F(m, md)
    print 'cost={}, cost_F={}, rel_err={:.2e}'.format(cost, cost_F,\
    np.abs(cost-cost_F)/np.abs(cost_F))

    # Gradient:
    print '\nGradient:'
    failures = 0
    for nn in range(8):
        print '\ttest ' + str(nn + 1)
        dm_exp = dl.Expression('sin(n*pi*x[0])*sin(n*pi*x[1])', n=nn + 1)
        dm = dl.interpolate(dm_exp, V)

        for h in HH:
            success = False
            setfct(m_in, m)
            m_in.vector().axpy(h, dm.vector())
            cost1 = obsopcont.costfct_F(m_in, md)

            setfct(m_in, m)
            m_in.vector().axpy(-h, dm.vector())
            cost2 = obsopcont.costfct_F(m_in, md)

            cost = obsopcont.costfct_F(m, md)

            GradFD1 = (cost1 - cost) / h
            GradFD2 = (cost1 - cost2) / (2. * h)

            Gradm = obsopcont.grad(m, md)
            Gradm_h = Gradm.inner(dm.vector())

            err1 = np.abs(GradFD1 - Gradm_h) / np.abs(Gradm_h)
            err2 = np.abs(GradFD2 - Gradm_h) / np.abs(Gradm_h)
            print 'h={}, GradFD1={:.5e}, GradFD2={:.5e} Gradm_h={:.5e}, err1={:.2e}, err2={:.2e}'.format(\
            h, GradFD1, GradFD2, Gradm_h, err1, err2)
            if err2 < 1e-6:
                print 'test {}: OK!'.format(nn + 1)
                success = True
                break
        if not success: failures += 1
    print '\nTest gradient -- Summary: {} test(s) failed'.format(failures)

    if failures < 5:
        print '\n\nHessian:'
        failures = 0
        for nn in range(8):
            print '\ttest ' + str(nn + 1)
            dm_exp = dl.Expression('sin(n*pi*x[0])*sin(n*pi*x[1])', n=nn + 1)
            dm = dl.interpolate(dm_exp, V)

            for h in HH:
                success = False
                setfct(m_in, m)
                m_in.vector().axpy(h, dm.vector())
                grad1 = obsopcont.grad(m_in, md)
                #
                setfct(m_in, m)
                m_in.vector().axpy(-h, dm.vector())
                grad2 = obsopcont.grad(m_in, md)
                #
                HessFD = (grad1 - grad2) / (2. * h)

                Hessmdm = obsopcont.hessian(dm.vector())

                err = (HessFD - Hessmdm).norm('l2') / Hessmdm.norm('l2')
                print 'h={}, err={}'.format(h, err)

                if err < 1e-6:
                    print 'test {}: OK!'.format(nn + 1)
                    success = True
                    break
            if not success: failures += 1
        print '\nTest Hessian --  Summary: {} test(s) failed\n'.format(
            failures)
'(x[0]>=0.3)*(x[0]<=0.7)*(x[1]>=0.3)*(x[1]<=0.7))')
lambda_target_fn = interpolate(lambda_target, Vl)
Wave.update({'b':lambda_target_fn, 'a':1.0, \
't0':0.0, 'tf':tf, 'Dt':Dt, 'u0init':Function(V), 'utinit':Function(V)})
Wave.ftime = mysrc
sol, tmp = Wave.solve()
# Observations
myObs = TimeObsPtwise({
    'V': V,
    'Points': [[.5, .2], [.5, .8], [.2, .5], [.8, .5]]
})
Bp = np.zeros((4, len(sol)))
mytimes = np.zeros(len(sol))
solp = Function(V)
for index, pp in enumerate(sol):
    setfct(solp, pp[0])
    Bp[:, index] = myObs.obs(solp)
    mytimes[index] = pp[1]
Bpf = Bp * mytf.evaluate(mytimes)

# Plots:
try:
    boolplot = int(sys.argv[1])
except:
    boolplot = 20
if boolplot > 0:
    filename, ext = splitext(sys.argv[0])
    if myrank == 0:
        if isdir(filename + '/'): rmtree(filename + '/')
    if PARALLEL: MPI.barrier(mycomm)
    myplot = PlotFenics(filename)
    return Ricker(tt)*mydelta
Waveex = AcousticWave({'V':Vex, 'Vl':Vl, 'Vr':Vl})
Waveex.timestepper = 'backward'
Waveex.lump = True
Waveex.update({'lambda':1.0, 'rho':1.0, 't0':0.0, 'tf':tf, 'Dt':Dt,\
'u0init':dl.Function(Vex), 'utinit':dl.Function(Vex)})
Waveex.ftime = mysrc
sol,_ = Waveex.solve()
Waveex.exact = dl.Function(Vex)
normex = Waveex.computeabserror()
# plot
myplot.set_varname('u-q'+str(qq))
plotu = dl.Function(Vex)
for index, uu in enumerate(sol):
    if index%boolplot == 0:
        setfct(plotu, uu[0])
        myplot.plot_vtk(plotu, index)
myplot.gather_vtkplots()

print 'Check different spatial sampling'
QQ = [4, 5, 6, 10]
for qq in QQ:
    N = int(qq/cmin)
    h = 1./N
    mesh = dl.UnitSquareMesh(N,N)
    Vl = dl.FunctionSpace(mesh, 'Lagrange', 1)
    V = dl.FunctionSpace(mesh, 'Lagrange', r)
    Pt = PointSources(V, [[.5,.5]])
    mydelta = Pt[0].array()
    def mysrc(tt):
        return Ricker(tt)*mydelta
#Wave.set_abc(mesh, AllFour(), True)
lambda_target = Expression('1.0 + 3.0*(' \
'(x[0]>=0.3)*(x[0]<=0.7)*(x[1]>=0.3)*(x[1]<=0.7))') 
lambda_target_fn = interpolate(lambda_target, Vl)
Wave.update({'lambda':lambda_target_fn, 'rho':1.0, \
't0':0.0, 'tf':tf, 'Dt':Dt, 'u0init':Function(V), 'utinit':Function(V)})
Wave.ftime = mysrc
sol, tmp = Wave.solve()
if not mycomm == None:  MPI.barrier(mycomm)
# Observations
myObs = TimeObsPtwise({'V':V, 'Points':[[.5,.2], [.5,.8], [.2,.5], [.8,.5]]})
Bp = np.zeros((4, len(sol)))
mytimes = np.zeros(len(sol))
solp = Function(V)
for index, pp in enumerate(sol):
    setfct(solp, pp[0])
    Bp[:,index] = myObs.obs(solp)
    mytimes[index] = pp[1]
Bpf = Bp*mytf.evaluate(mytimes)


# Plots:
try:
    boolplot = int(sys.argv[1])
except:
    boolplot = 20
if boolplot > 0:
    filename, ext = splitext(sys.argv[0])
    #filename = filename + '0'
    if myrank == 0: 
        if isdir(filename + '/'):   rmtree(filename + '/')
Example #14
0
goal.update_m(mtrue)
goal.solvefwd()
# noise
np.random.seed(11)
noisepercent = 0.02  # e.g., 0.02 = 2% noise level
UD = goal.U[0]
rndnb = np.random.randn(UD.size)
rndnb = rndnb / np.linalg.norm(rndnb)
noiseres = noisepercent * np.linalg.norm(UD)
UDnoise = UD + rndnb * noiseres
if mpirank == 0:    print 'noiseres={}, rndnb*noiseres={}'.format(\
MPI.sum(mpicomm, noiseres), MPI.sum(mpicomm, np.linalg.norm(rndnb*noiseres)))
if PLOT:
    myplot.set_varname('u_target')
    myplot.plot_vtk(goal.u)
    setfct(goal.u, UDnoise)
    myplot.set_varname('d_target')
    myplot.plot_vtk(goal.u)

# Define regularization:
# Tikhonov
Regul = LaplacianPrior({'Vm': Vm, 'gamma': 1e-2, 'beta': 1e-2, 'm0': 9.0})
# Total Variation
#   full TV w/o primal-dual
#Regul = TV({'Vm':Vm, 'eps':dl.Constant(1.0), 'GNhessian':False})
#   GN Hessian for TV w/o primal-dual
#Regul = TV({'Vm':Vm, 'eps':dl.Constant(1e-4), 'GNhessian':True})
#   full TV w/ primal-dual
#Regul = TVPD({'Vm':Vm, 'eps':dl.Constant(1.0)})

ObsOp.noise = False
Example #15
0
    if PRINT:   print 'v1n={}, v2n={}, err={:.2e}'.format(v1n, v2n, err)
    if err > 1e-14:
        if PRINT:   print '*** relative error too large!'
        sys.exit(1)

if PRINT:   print 'Test 5'
VwVwVwVw = createMixedFS(VwVw, VwVw)
testx, testy = TestFunctions(VwVwVwVw)
test1, test2 = TestFunction(VwVw)
m = Function(VV)
v1xf, v1yf = Function(VwVw), Function(VwVw)
v1f = Function(VwVwVwVw)
for ii in range(10):
    m.vector()[:] = np.random.randn(m.vector().local_size())
    m1, m2 = m.split(deepcopy=True)
    v1x = assemble(inner(test1, m1.dx(0))*dx + inner(test2, m2.dx(0))*dx)
    setfct(v1xf, v1x)
    v1y = assemble(inner(test1, m1.dx(1))*dx + inner(test2, m2.dx(1))*dx)
    setfct(v1yf, v1y)
    assign(v1f.sub(0), v1xf)
    assign(v1f.sub(1), v1yf)
    v1 = v1f.vector()
    v1n = v1.norm('l2')
    v2 = assemble(inner(testx, m.dx(0))*dx + inner(testy, m.dx(1))*dx)
    v2n = v2.norm('l2')
    err = (v1-v2).norm('l2')/v1n
    if PRINT:   print 'v1n={}, v2n={}, err={:.2e}'.format(v1n, v2n, err)
    if err > 1e-14:
        if PRINT:   print '*** relative error too large!'
        sys.exit(1)
Example #16
0
    err2 = np.abs(costt2 - costl) / np.abs(costl)
    print 'ii={}: err={}'.format(ii, err2)
    if err2 > 1e-14:
        print '*** WARNING: error too large'
        sys.exit(1)
print '\t=>> cost OK!'

print 'gradient'
VV = createMixedFS(V, V)
grad = dl.Function(VV)
grada = dl.Function(V)
gradb = dl.Function(V)
for ii in range(10):
    a.vector()[:] = np.random.randn(V.dim())
    b.vector()[:] = np.random.randn(V.dim())
    setfct(grada, reg1.grad(a))
    setfct(gradb, reg2.grad(b))
    dl.assign(grad.sub(0), grada)
    dl.assign(grad.sub(1), gradb)
    sumgradab = sumregul.gradab(a, b)
    err2 = dl.norm(sumgradab - grad.vector()) / dl.norm(grad.vector())
    print 'ii={}: err={}'.format(ii, err2)
    if err2 > 1e-14:
        print '*** WARNING: error too large'
        sys.exit(1)
print '\t=>> gradient OK!'

print 'Hessian'
VV = createMixedFS(V, V)
hess = dl.Function(VV)
hessa = dl.Function(V)
Example #17
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)

Example #18
0
def test_grad(eps_in, k_in):
    mesh = UnitSquareMesh(10, 10)
    param = {'eps': eps_in, 'k': k_in}
    NN = NuclearNormSVD2D(mesh, param)
    NN2 = NuclearNormformula(mesh, param)
    direc12 = Function(NN.VV)
    m1h, m2h = Function(NN.V), Function(NN.V)
    H = [1e-4, 1e-5, 1e-6, 1e-7]

    mpicomm = mesh.mpi_comm()
    mpirank = MPI.rank(mpicomm)
    mpisize = MPI.size(mpicomm)
    if mpirank == 0:
        print '-------------------------------------'
        print 'Test gradient. eps={}'.format(eps)
        print '-------------------------------------'

    if mpirank == 0: print 'Test 1'
    m1 = Function(NN.V)
    m2 = Function(NN.V)
    grad = NN.gradab(m1, m2)
    grad2 = NN2.gradab(m1, m2)
    normgrad = norm(grad)
    normgrad2 = norm(grad2)
    if mpirank == 0:
        print '|grad|={}, err={}'.format(normgrad, np.abs(normgrad))
        print '|grad2|={}, err={}'.format(normgrad2, np.abs(normgrad2))

    M1 = [interpolate(Expression("x[0] + x[1]", degree=10), NN.V),
    interpolate(Expression("x[0] * x[1]", degree=10), NN.V),
    interpolate(Expression("x[0]*x[0] + x[1]", degree=10), NN.V),
    interpolate(Expression('log(10 - ' + \
    '(pow(pow(x[0]-0.5,2)+pow(x[1]-0.5,2),0.5)<0.4) * (' + \
    '4*(x[0]<=0.5) + 8*(x[0]>0.5) ))', degree=10), NN.V),
    interpolate(Expression('log(10 - ' + \
    '(pow(pow(x[0]-0.5,2)+pow(x[1]-0.5,2),0.5)<0.4) * 8 )', degree=10), NN.V)]
    M2 = [interpolate(Expression("x[0] + x[1]", degree=10), NN.V),
    interpolate(Expression("1.0 + cos(x[0])", degree=10), NN.V),
    interpolate(Expression("x[1]*x[1] + x[0]", degree=10), NN.V),
    interpolate(Expression('log(10 - ' + \
    '(pow(pow(x[0]-0.5,2)+pow(x[1]-0.5,2),0.5)<0.4) * (' + \
    '8*(x[0]<=0.5) + 4*(x[0]>0.5) ))', degree=10), NN.V),
    interpolate(Expression('log(10 - ' + \
    '(pow(pow(x[0]-0.5,2)+pow(x[1]-0.5,2),0.5)<0.4) * (' + \
    '8*(x[0]<=0.5) + 4*(x[0]>0.5) ))', degree=10), NN.V)]
    tt = 2
    for m1, m2 in zip(M1, M2):
        if mpirank == 0: print '\nTest {}'.format(tt)
        tt += 1
        grad = NN.gradab(m1, m2)
        grad2 = NN2.gradab(m1, m2)
        for nn in range(5):
            if mpirank == 0: print '--direction {}'.format(nn)
            direc1 = interpolate(Expression('1 + sin(n*pi*x[0])*sin(n*pi*x[1])',\
            n=nn, degree=10), NN.V)
            direc2 = interpolate(Expression('1 + cos(n*pi*x[0])*cos(n*pi*x[1])',\
            n=nn, degree=10), NN.V)
            assign(direc12.sub(0), direc1)
            assign(direc12.sub(1), direc2)
            direcderiv = grad.inner(direc12.vector())
            direcderiv2 = grad2.inner(direc12.vector())
            if mpirank == 0:
                print 'grad={}, '.format(direcderiv)
                print 'grad2={}, diff={:.2e} '.format(direcderiv2, \
                np.abs(direcderiv-direcderiv2)/np.abs(direcderiv))

            for hh in H:
                setfct(m1h, m1)
                m1h.vector().axpy(hh, direc1.vector())
                setfct(m2h, m2)
                m2h.vector().axpy(hh, direc2.vector())
                cost1 = NN.costab(m1h, m2h)

                setfct(m1h, m1)
                m1h.vector().axpy(-hh, direc1.vector())
                setfct(m2h, m2)
                m2h.vector().axpy(-hh, direc2.vector())
                cost2 = NN.costab(m1h, m2h)

                FDdirecderiv = (cost1 - cost2) / (2.0 * hh)
                if np.abs(direcderiv) > 1e-16:
                    err = np.abs(direcderiv -
                                 FDdirecderiv) / np.abs(direcderiv)
                else:
                    err = np.abs(direcderiv - FDdirecderiv)
                if mpirank == 0:
                    print '\th={}, fd={}, err={:.2e}'.format(
                        hh, FDdirecderiv, err),
                if err < 1e-6:
                    if mpirank == 0: print '\t =>> OK!'
                    break
                else:
                    if mpirank == 0: print ''
Example #19
0
cost = obsopcont.costfct(mv.array(), md.vector().array())
cost_F = obsopcont.costfct_F(m, md)
print 'cost={}, cost_F={}, rel_err={:.2e}'.format(cost, cost_F,\
np.abs(cost-cost_F)/np.abs(cost_F))

# Gradient:
print '\nGradient:'
failures = 0
for nn in range(8):
    print '\ttest ' + str(nn+1)
    dm_exp = dl.Expression('sin(n*pi*x[0])*sin(n*pi*x[1])', n=nn+1)
    dm = dl.interpolate(dm_exp, V)

    for h in HH:
        success = False
        setfct(m_in, m)
        m_in.vector().axpy(h, dm.vector())
        cost1 = obsopcont.costfct_F(m_in, md)

        setfct(m_in, m)
        m_in.vector().axpy(-h, dm.vector())
        cost2 = obsopcont.costfct_F(m_in, md)

        cost = obsopcont.costfct_F(m, md)

        GradFD1 = (cost1 - cost)/h
        GradFD2 = (cost1 - cost2)/(2.*h)

        Gradm = obsopcont.grad(m, md)
        Gradm_h = Gradm.inner(dm.vector())
Example #20
0
def test_hessian(eps_in):
    mesh = UnitSquareMesh(10, 10)
    param = {'eps': eps_in}
    NN = NuclearNormSVD2D(mesh, param)
    NN2 = NuclearNormformula(mesh, param)
    direc12 = Function(NN.VV)
    m1h, m2h = Function(NN.V), Function(NN.V)
    H = [1e-4, 1e-5, 1e-6, 1e-7]

    mpicomm = mesh.mpi_comm()
    mpirank = MPI.rank(mpicomm)
    mpisize = MPI.size(mpicomm)
    if mpirank == 0:
        print '-------------------------------------'
        print 'Test Hessian. eps={}'.format(eps)
        print '-------------------------------------'

    M1 = [interpolate(Expression("x[0] + x[1]", degree=10), NN.V),
    interpolate(Expression("x[0] * x[1]", degree=10), NN.V),
    interpolate(Expression("x[0]*x[0] + x[1]", degree=10), NN.V),
    interpolate(Expression('log(10 - ' + \
    '(pow(pow(x[0]-0.5,2)+pow(x[1]-0.5,2),0.5)<0.4) * (' + \
    '4*(x[0]<=0.5) + 8*(x[0]>0.5) ))', degree=10), NN.V),
    interpolate(Expression('log(10 - ' + \
    '(pow(pow(x[0]-0.5,2)+pow(x[1]-0.5,2),0.5)<0.4) * 8 )', degree=10), NN.V)]
    M2 = [interpolate(Expression("x[0] + x[1]", degree=10), NN.V),
    interpolate(Expression("1.0 + cos(x[0])", degree=10), NN.V),
    interpolate(Expression("x[1]*x[1] + x[0]", degree=10), NN.V),
    interpolate(Expression('log(10 - ' + \
    '(pow(pow(x[0]-0.5,2)+pow(x[1]-0.5,2),0.5)<0.4) * (' + \
    '8*(x[0]<=0.5) + 4*(x[0]>0.5) ))', degree=10), NN.V),
    interpolate(Expression('log(10 - ' + \
    '(pow(pow(x[0]-0.5,2)+pow(x[1]-0.5,2),0.5)<0.4) * (' + \
    '8*(x[0]<=0.5) + 4*(x[0]>0.5) ))', degree=10), NN.V)]
    tt = 1
    for m1, m2 in zip(M1, M2):
        if mpirank == 0: print '\nTest {}'.format(tt)
        tt += 1
        NN2.assemble_hessianab(m1, m2)
        for nn in range(5):
            if mpirank == 0: print '--direction {}'.format(nn)
            direc1 = interpolate(Expression('1 + sin(n*pi*x[0])*sin(n*pi*x[1])',\
            n=nn, degree=10), NN.V)
            direc2 = interpolate(Expression('1 + cos(n*pi*x[0])*cos(n*pi*x[1])',\
            n=nn, degree=10), NN.V)
            assign(direc12.sub(0), direc1)
            assign(direc12.sub(1), direc2)
            Hv = NN2.hessianab(direc1.vector(), direc2.vector())
            HMv = (NN2.H + NN2.sMass) * direc12.vector()
            nHv = norm(Hv)
            nHMv = norm(HMv)
            ndiff = norm(Hv - HMv) / nHv
            if mpirank == 0:
                print '|Hv|={}, |HMV|={}, |diff|={:.2e}'.format(
                    nHv, nHMv, ndiff)

            for hh in H:
                setfct(m1h, m1)
                m1h.vector().axpy(hh, direc1.vector())
                setfct(m2h, m2)
                m2h.vector().axpy(hh, direc2.vector())
                grad1 = NN.gradab(m1h, m2h)

                setfct(m1h, m1)
                m1h.vector().axpy(-hh, direc1.vector())
                setfct(m2h, m2)
                m2h.vector().axpy(-hh, direc2.vector())
                grad2 = NN.gradab(m1h, m2h)

                FD = (grad1 - grad2) / (2.0 * hh)
                nFD = norm(FD)
                if nHv > 1e-16:
                    err = norm(FD - Hv) / nHv
                else:
                    err = norm(FD - Hv)
                if mpirank == 0:
                    print '\th={}, |FD|={}, err={:.2e}'.format(hh, nFD, err),
                if err < 1e-6:
                    if mpirank == 0: print '\t =>> OK!'
                    break
                else:
                    if mpirank == 0: print ''
Waveex = AcousticWave({'V': Vex, 'Vm': Vl})
Waveex.timestepper = 'backward'
Waveex.lump = True
Waveex.update({'a':1.0, 'b':1.0, 't0':0.0, 'tf':tf, 'Dt':Dt,\
'u0init':dl.Function(Vex), 'utinit':dl.Function(Vex)})
Waveex.ftime = mysrc
sol, _ = Waveex.solve()
Waveex.exact = dl.Function(Vex)
normex = Waveex.computeabserror()
# plot
myplot.set_varname('u-q' + str(qq))
plotu = dl.Function(Vex)
for index, uu in enumerate(sol):
    if index % boolplot == 0:
        setfct(plotu, uu[0])
        myplot.plot_vtk(plotu, index)
myplot.gather_vtkplots()

print 'Check different spatial sampling'
QQ = [4, 5, 6, 10]
for qq in QQ:
    N = int(qq / cmin)
    h = 1. / N
    mesh = dl.UnitSquareMesh(N, N)
    Vl = dl.FunctionSpace(mesh, 'Lagrange', 1)
    V = dl.FunctionSpace(mesh, 'Lagrange', r)
    Pt = PointSources(V, [[.5, .5]])
    mydelta = Pt[0].array()

    def mysrc(tt):
Example #22
0
def gradhesscheck():
    sndorder = True

    #HH = [1e-4]
    #HH = [1e-4, 1e-5, 1e-6]
    HH = [1e-4, 1e-5, 1e-6, 1e-7, 1e-8]

    mesh = dl.UnitSquareMesh(100, 100)
    V = dl.FunctionSpace(mesh, 'Lagrange', 1)
    #k_exp = dl.Expression('1.0 + exp(x[0]*x[1])')
    #k = dl.interpolate(k_exp, V)
    #k = dl.Constant(1.0)
    m_in = dl.Function(V)
    TV1 = TV({'Vm': V, 'eps': 1e-4, 'k': 1e-2, 'GNhessian': False})
    TV2 = TVPD({'Vm': V, 'eps': 1e-4, 'k': 1e-2, 'exact': True})

    #M_EXP = [dl.Expression('1.0'),\
    #dl.Expression('1.0 + (x[0]>=0.2)*(x[0]<=0.8)*(x[1]>=0.2)*(x[1]<=0.8)'), \
    #dl.Expression('1.0 + (x[0]>=0.2)*(x[0]<=0.8)*(x[1]>=0.2)*(x[1]<=0.8) ' + \
    #'+ (x[0]>=0.2)*(x[0]<=0.4)*(x[1]>=0.2)*(x[1]<=0.4)')]
    M_EXP = [
        dl.Expression('1.0 + (x[0]>=0.2)*(x[0]<=0.8)*(x[1]>=0.2)*(x[1]<=0.8)')
    ]

    for ii, m_exp in enumerate(M_EXP):
        # Verification point, i.e., point at which gradient and Hessian are checked
        print 'Verification point', str(ii)
        #m_exp = dl.Expression('sin(n*pi*x[0])*sin(n*pi*x[1])', n=ii)
        m = dl.interpolate(m_exp, V)

        print '\nGradient:'
        failures = 0
        for nn in range(8):
            print '\ttest ' + str(nn + 1)
            dm_exp = dl.Expression('sin(n*pi*x[0])*sin(n*pi*x[1])', n=nn + 1)
            dm = dl.interpolate(dm_exp, V)

            for h in HH:
                success = False
                setfct(m_in, m)
                m_in.vector().axpy(h, dm.vector())
                cost1 = TV1.cost(m_in)
                cost12 = TV2.cost(m_in)
                print 'cost1={}, cost12={}, err={}'.format(cost1, cost12, \
                np.abs(cost1-cost12)/np.abs(cost1))

                if sndorder:
                    setfct(m_in, m)
                    m_in.vector().axpy(-h, dm.vector())
                    cost2 = TV1.cost(m_in)

                    GradFD = (cost1 - cost2) / (2. * h)
                else:
                    cost = TV1.cost(m)

                    GradFD = (cost1 - cost) / h

                Grad1m = TV1.grad(m)
                Grad1m_h = Grad1m.inner(dm.vector())
                Grad2m = TV2.grad(m)
                Grad2m_h = Grad2m.inner(dm.vector())

                if np.abs(Grad1m_h) > 1e-16:
                    err1 = np.abs(GradFD - Grad1m_h) / np.abs(Grad1m_h)
                    err2 = np.abs(Grad1m_h - Grad2m_h) / np.abs(Grad1m_h)
                else:
                    err1 = np.abs(GradFD - Grad1m_h)
                    err2 = np.abs(Grad1m_h - Grad2m_h)
                print 'h={}, GradFD={}, Grad1m_h={}, err1={:.2e}'.format(\
                h, GradFD, Grad1m_h, err1)
                print 'Grad2m_h={}, err12={}'.format(Grad2m_h, err2)
                if err1 < 1e-6:
                    print 'test {}: OK!'.format(nn + 1)
                    success = True
                    break
            if not success: failures += 1
        print '\nTest gradient -- Summary: {} test(s) failed'.format(failures)

        #if failures < 5:
        if True:
            print '\n\nHessian:'
            failures = 0
            for nn in range(8):
                print '\ttest ' + str(nn + 1)
                dm_exp = dl.Expression('sin(n*pi*x[0])*sin(n*pi*x[1])',
                                       n=nn + 1)
                dm = dl.interpolate(dm_exp, V)

                for h in HH:
                    success = False
                    setfct(m_in, m)
                    m_in.vector().axpy(h, dm.vector())
                    grad1 = TV1.grad(m_in)

                    if sndorder:
                        setfct(m_in, m)
                        m_in.vector().axpy(-h, dm.vector())
                        grad2 = TV1.grad(m_in)

                        HessFD = (grad1 - grad2) / (2. * h)
                    else:
                        grad = TV1.grad(m)

                        HessFD = (grad1 - grad) / h

                    TV1.assemble_hessian(m)
                    Hess1mdm = TV1.hessian(dm.vector())
                    TV2.assemble_hessian(m)
                    Hess2mdm = TV2.hessian(dm.vector())

                    err1 = (HessFD - Hess1mdm).norm('l2') / Hess1mdm.norm('l2')
                    err2 = (Hess1mdm -
                            Hess2mdm).norm('l2') / Hess2mdm.norm('l2')
                    print 'h={}, err1={}, err12={}'.format(h, err1, err2)

                    if err1 < 1e-6:
                        print 'test {}: OK!'.format(nn + 1)
                        success = True
                        break
                if not success: failures += 1
            print '\nTest Hessian --  Summary: {} test(s) failed\n'.format(
                failures)