Test virtual interface for Problem
Getting rid of the problem template would be a huge improvement in the code. We should do performance measurement and check what run-time penalty a virtual problem interface would bring. For that we have to first check which functions actually need to be virtual, add the virtual keyword, we could then exchange templates for a base class pointer one-by-one, and check for performance penalties.
The highest penalty is probably expected for a grid with a high boundary to internal cell ratio, and simple boundary and initial conditions so that the possible virtual function call would actually matter.