Hello, this is a question about UFL and composing differentiable operations.
Let’s say I have a dolfinx.fem.Function p representing some parameter field, and a scalar valued UFL expression J(p). It is well known that I can evaluate the gradient of J w.r.t. p with something like
dJdp = ufl.derivative(J, p)
dJdp_vector = dolfinx.fem.assemble_vector(dolfinx.fem.form(dJdp))
Now, I wish to add some custom operation on p inside the expression of J(p). Let’s name q that operator: J(p) = J(q(p)). However, q is not a UFL expression, it is implemented with an external python code. Though I am able to compute the jacobian matrix of q for a given input p.
My question is: is it possible to wrap q inside a UFL object such that it is still possible to define a UFL expression for J, and evaluate its gradient with automatic differentiation?