How to make sure each process gets the same amount of dofs

I do not have alot of experience with advection diffusion reaction problems, so I’m not certain if it is an efficient approach. On thing that will speed up your computations, is to stop using the solve command, and rather creating a NewtonSolver, see for instance: https://bitbucket.org/fenics-project/dolfin/src/b495043d6b3914383eb939ea6c6794442080a3a5/python/demo/documented/cahn-hilliard/demo_cahn-hilliard.py.rst and Set krylov linear solver paramters in newton solver
This will make sure that you reuse matrices and vectors during the solving process.