I've been working with TensorFlow and I'm very impressed with its automatic differentiation capabilities. I'm wondering what the state of the art in automatic differentiation for finite element methods (and other pde solvers) is. Has automatic differentiation rendered adjoint methods for computing sensitivities of objective functionals obsolete?
No. It's more frequently used as a complement to adjoint sensitivity computation. Often times it's used to compute the matrix vector products needed as part of the adjoint linear solve. As nice/simple as AD can make sensitivity computation, if you have many more inputs than outputs, adjoint differentiation is really scalable and desirable over direct methods. An additional point in favor of computing the adjoint state is that it allows for the use of dual-weighted residual based error estimates which are very desirable in automatic mesh refinement in the simulation of governing equations of PDEs