Exemple #1
0
MooseObjectPtr
Factory::create(const std::string & obj_name,
                const std::string & name,
                InputParameters parameters,
                THREAD_ID tid /* =0 */,
                bool print_deprecated /* =true */)
{
  if (print_deprecated)
    mooseDeprecated("Factory::create() is deprecated, please use Factory::create<T>() instead");

  // Pointer to the object constructor
  std::map<std::string, buildPtr>::iterator it = _name_to_build_pointer.find(obj_name);

  // Check if the object is registered
  if (it == _name_to_build_pointer.end())
    reportUnregisteredError(obj_name);

  // Print out deprecated message, if it exists
  deprecatedMessage(obj_name);

  // Create the actual parameters object that the object will reference
  InputParameters & params =
      _app.getInputParameterWarehouse().addInputParameters(name, parameters, tid);

  // Set the _type parameter
  params.set<std::string>("_type") = obj_name;

  // Check to make sure that all required parameters are supplied
  params.checkParams(name);

  // register type name as constructed
  _constructed_types.insert(obj_name);

  // add FEProblem pointers to object's params object
  if (_app.actionWarehouse().problemBase())
    _app.actionWarehouse().problemBase()->setInputParametersFEProblem(params);

  // call the function pointer to build the object
  buildPtr & func = it->second;
  auto obj = (*func)(params);

  auto fep = std::dynamic_pointer_cast<FEProblemBase>(obj);
  if (fep)
    _app.actionWarehouse().problemBase() = fep;

  // Make sure no unexpected parameters were added by the object's constructor or by the action
  // initiating this create call.  All parameters modified by the constructor must have already
  // been specified in the object's validParams function.
  InputParameters orig_params = getValidParams(obj_name);
  if (orig_params.n_parameters() != parameters.n_parameters())
  {
    std::set<std::string> orig, populated;
    for (const auto & it : orig_params)
      orig.emplace(it.first);
    for (const auto & it : parameters)
      populated.emplace(it.first);

    std::set<std::string> diff;
    std::set_difference(populated.begin(),
                        populated.end(),
                        orig.begin(),
                        orig.end(),
                        std::inserter(diff, diff.begin()));

    if (!diff.empty())
    {
      std::stringstream ss;
      for (const auto & name : diff)
        ss << ", " << name;
      mooseError("attempted to set unregistered parameter(s) for ",
                 obj_name,
                 " object:\n    ",
                 ss.str().substr(2));
    }
  }

  return obj;
}