problem with vector-valued Constant control
Issue #74
new
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
Hi Florian,
Yes, afaik vector valued Constants are not fully supported. You could try a VectorFunctionspace with a "Real" element instead?
Best wishes,
Simon