problem with vector-valued Constant control

Issue #74 new
Florian Bruckner created an issue

hello,

i slightly adapted an example which i found for the use of Constant controls, so that it uses vector valued Constants (the commented code uses 3 scalar valued Constant controls and works without error):

from dolfin import *
from dolfin_adjoint import *

mesh = UnitCubeMesh(2,2,2)

V = FunctionSpace(mesh, "CG", 1)

u = Function(V)
v = TestFunction(V)

f = Constant((1.,2.,3.))
#f1 = Constant(1.)
#f2 = Constant(1.)
#f3 = Constant(1.)

#F = inner(grad(u), grad(v))*dx - inner(as_vector([f1,f2,f3]), grad(v))*dx
F = inner(grad(u), grad(v))*dx - inner(f, grad(v))*dx
solve(F == 0, u)

functional = Functional(u * dx)

reduced_functional = ReducedFunctional(functional, Control(f))
#reduced_functional = ReducedFunctional(functional, [Control(f1), Control(f2), Control(f3)])
problem = MinimizationProblem(reduced_functional)

opt = minimize(reduced_functional)

The forward problem seems to work, but unfortunately the optimization fails with the following error:

No Jacobian form specified for nonlinear variational problem.
Differentiating residual form F to obtain Jacobian J = F'.
Solving nonlinear variational problem.
  Newton iteration 0: r (abs) = 2.016e+00 (tol = 1.000e-10) r (rel) = 1.000e+00 (tol = 1.000e-09)
  Newton iteration 1: r (abs) = 1.516e-15 (tol = 1.000e-10) r (rel) = 7.521e-16 (tol = 1.000e-09)
  Newton solver finished in 1 iterations and 1 linear solver iterations.
RUNNING THE L-BFGS-B CODE

           * * *

Machine precision = 2.220D-16
 N =            3     M =           10
 This problem is unconstrained.

At X0         0 variables are exactly at the bounds
Couldn't map 'f_7' to a float, returning ufl object without evaluation.
Solving nonlinear variational problem.
  Newton iteration 0: r (abs) = 2.016e+00 (tol = 1.000e-10) r (rel) = 1.000e+00 (tol = 1.000e-09)
  Newton iteration 1: r (abs) = 1.516e-15 (tol = 1.000e-10) r (rel) = 7.521e-16 (tol = 1.000e-09)
  Newton solver finished in 1 iterations and 1 linear solver iterations.
Coefficient and argument shapes do not match!
Traceback (most recent call last):
  File "constant_control.py", line 26, in <module>
    opt = minimize(reduced_functional)
  File "/usr/lib/python2.7/dist-packages/dolfin_adjoint/misc.py", line 33, in func_wrapper
    res = func(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/dolfin_adjoint/optimization/optimization.py", line 223, in minimize
    opt = algorithm(rf_np, **kwargs)
  File "/usr/lib/python2.7/dist-packages/dolfin_adjoint/optimization/optimization.py", line 128, in minimize_scipy_generic
    res = scipy_minimize(J, m_global, method=method, **kwargs)
  File "/usr/lib/python2.7/dist-packages/scipy/optimize/_minimize.py", line 447, in minimize
    callback=callback, **options)
  File "/usr/lib/python2.7/dist-packages/scipy/optimize/lbfgsb.py", line 330, in _minimize_lbfgsb
    f, g = func_and_grad(x)
  File "/usr/lib/python2.7/dist-packages/scipy/optimize/lbfgsb.py", line 279, in func_and_grad
    g = jac(x, *args)
  File "/usr/lib/python2.7/dist-packages/dolfin_adjoint/optimization/optimization.py", line 62, in <lambda>
    dJ = lambda m: rf_np.derivative(m, forget=forget, project=project)
  File "/usr/lib/python2.7/dist-packages/dolfin_adjoint/reduced_functional_numpy.py", line 76, in derivative
    dJdm = self.__base_derivative__(forget=forget, project=project)
  File "/usr/lib/python2.7/dist-packages/dolfin_adjoint/reduced_functional.py", line 255, in derivative
    dfunc_value = drivers.compute_gradient(self.functional, self.controls, forget=forget, project=project)
  File "/usr/lib/python2.7/dist-packages/dolfin_adjoint/drivers.py", line 160, in compute_gradient
    out = param.equation_partial_derivative(adjglobals.adjointer, output.data, i, fwd_var)
  File "/usr/lib/python2.7/dist-packages/dolfin_adjoint/controls.py", line 473, in equation_partial_derivative
    return [p.equation_partial_derivative(adjointer, adjoint, i, variable) for p in self.controls]
  File "/usr/lib/python2.7/dist-packages/dolfin_adjoint/controls.py", line 216, in equation_partial_derivative
    backend.derivative(form, get_constant(self.a), dparam))
  File "/usr/lib/python2.7/dist-packages/dolfin/fem/formmanipulations.py", line 90, in derivative
    return ufl.derivative(form, u, du, coefficient_derivatives)
  File "/usr/lib/python2.7/dist-packages/ufl/formoperators.py", line 283, in derivative
    argument)
  File "/usr/lib/python2.7/dist-packages/ufl/formoperators.py", line 227, in _handle_derivative_arguments
    error("Coefficient and argument shapes do not match!")
  File "/usr/lib/python2.7/dist-packages/ufl/log.py", line 171, in error
    raise self._exception_type(self._format_raw(*message))
ufl.log.UFLException: Coefficient and argument shapes do not match!

Is there a problem with the example or a vector-valued Constant control not supported by dolfin adjoint?

thanks and best wishes

Florian

Comments (1)

  1. Simon Funke

    Hi Florian,

    Yes, afaik vector valued Constants are not fully supported. You could try a VectorFunctionspace with a "Real" element instead?

    Best wishes,

    Simon

  2. Log in to comment