Skip to content

Can't use constant controls #12

@augustjohansson

Description

@augustjohansson

It's not possible to use controls that are constant variables, but this works if one uses minimize(). Here's an example:

from fenics import *
from fenics_adjoint import *
import moola

mesh = UnitSquareMesh(10, 10)

# Control
k = Constant(0.1)
control = Control(k)
k_exact = Constant(2.0)

# State discretization
V = FunctionSpace(mesh, "CG", 1)
u = Function(V, name="State")
v = TestFunction(V)

# State data
x = SpatialCoordinate(mesh)
d = sin(pi*x[0])*sin(pi*x[1])
f = -div(k_exact*grad(d))

# State PDE
F = inner(k*grad(u), grad(v))*dx - f*v*dx
bc = DirichletBC(V, Constant(0.0), "on_boundary")
solve(F == 0, u, bc)

# Goal functional
J = assemble((0.5*inner(u-d, u-d))*dx)
rJ = ReducedFunctional(J, control)

# Solve using moola doesn't work
problem = MoolaOptimizationProblem(rJ)
k_moola = moola.DolfinPrimalVector(k)
solver = moola.BFGS(problem, k_moola)
solution = solver.solve()
k_opt = solution["control"].data

# # Solve using minimize works
# k_opt = minimize(rJ)

print("k_opt", k_opt.values()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions