Refactored Simulation to be an abstract class and use properties where appropriate
Remove State class and instead handle solutions and times as separate attributes of Simulation. Otherwise there is always a question about whether a method should belong to Simulation or State, and where to insert dependencies. Perhaps one should re-design this at some point.
Remove "run" method. Separate "solve" and "advance" methods to give the user more control over finding a good solution before going to the next time step. Now the user will always write a time loop. The original idea behind the "run" method wasn't recognizing how much different every simulation will be, especially regarding playing with the numerical parameters.
Update tutorial for new Simulation interface
Some changes which are especially useful when working in Jupyter notebooks:
Add deepcopy feature
Add plot method which plots all parts of the mixed solution and the adapted mesh (with fenics.plot and matplotlib)
Some more utility features
Extended coarsening to allow consideration of multiple fields, including $phi(T, C)$
Add a method for setting solution on a subdomain, e.g. for freezing simulations beginning from a steady state convecting solution
Changed dependencies
Major API changes
Some changes which are especially useful when working in Jupyter notebooks:
Some more utility features
Other