Teuchos::RCP<Thyra::ResponseOnlyModelEvaluatorBase<Scalar> > SolverFactory::createSolver(
    const Teuchos::RCP<Teuchos::ParameterList> &piroParams,
    const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> > &model,
    const Teuchos::RCP<Piro::ObserverBase<Scalar> > &observer)
{
  Teuchos::RCP<Thyra::ResponseOnlyModelEvaluatorBase<Scalar> > result;

  const std::string &solverType = piroParams->get("Solver Type", "NOX");

#ifdef Piro_ENABLE_NOX
  if (solverType == "NOX") {
    result = Teuchos::rcp(new NOXSolver<Scalar>(piroParams, model, observer));
  } else
  if (solverType == "LOCA") {
    result = observedLocaSolver(piroParams, model, observer);
  } else
#endif /* Piro_ENABLE_NOX */
#ifdef Piro_ENABLE_Rythmos
  if (solverType == "Rythmos") {
    result = rythmosSolver(piroParams, model, observer);
  } else
#endif /* Piro_ENABLE_Rythmos */
  {
    TEUCHOS_TEST_FOR_EXCEPTION(
        true,
        std::runtime_error,
        "Error: Unknown Piro Solver Type: " << solverType);
  }

  return result;
}
Teuchos::RCP<Thyra::ResponseOnlyModelEvaluatorBase<Scalar> > SolverFactory::createSolver(
    const Teuchos::RCP<Teuchos::ParameterList> &piroParams,
    const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> > &model,
    const Teuchos::RCP<Piro::ObserverBase<Scalar> > &observer)
{
  Teuchos::RCP<Thyra::ResponseOnlyModelEvaluatorBase<Scalar> > result;

  const std::string &solverType = piroParams->get("Solver Type", "NOX");

#ifdef HAVE_PIRO_NOX
  if (solverType == "NOX") {
    result = Teuchos::rcp(new NOXSolver<Scalar>(piroParams, model, observer));
  } else
  if (solverType == "Velocity Verlet") {
    result = Teuchos::rcp(new VelocityVerletSolver<Scalar>(piroParams, model, observer));
  } else
  if (solverType == "Trapezoid Rule") {
    result = Teuchos::rcp(new TrapezoidRuleSolver<Scalar>(piroParams, model, observer));
  } else
  if (solverType == "LOCA") {
    result = observedLocaSolver(piroParams, model, observer);
  } else
#endif /* HAVE_PIRO_NOX */
#ifdef HAVE_PIRO_RYTHMOS
  if (solverType == "Rythmos") {
    result = rythmosSolver<Scalar, LocalOrdinal, GlobalOrdinal, Node>(piroParams, model, observer);
  } else
#endif /* HAVE_PIRO_RYTHMOS */
  {
    TEUCHOS_TEST_FOR_EXCEPTION(
        true,
        std::runtime_error,
        "Error: Unknown Piro Solver Type: " << solverType);
  }

  return result;
}