added a new constructor that takes hardware profile as a parameter so
that we can run with CPU / GPU without hardcoding within the solver