예제 #1
0
  void ParameterManager::initialize
    ( const GetPot& input,
      const std::string & parameters_varname,
      MultiphysicsSystem & system,
      CompositeQoI * qoi)
  {
    const unsigned int n_parameters =
      input.vector_variable_size(parameters_varname);
    libmesh_assert(n_parameters);

    this->parameter_name_list.resize(n_parameters);
    this->parameter_vector.clear();
    for (unsigned int i=0; i != n_parameters; ++i)
      {
        std::string param_name =
          input(parameters_varname, std::string(), i);

        this->parameter_name_list[i] = param_name;

        libMesh::ParameterMultiAccessor<libMesh::Number> *next_param =
          new libMesh::ParameterMultiAccessor<libMesh::Number>();

        // We always have Physics solving for u
        system.register_parameter(param_name, *next_param);

        // We don't always have QoIs when solving for du/dp
        if (qoi)
          qoi->register_parameter(param_name, *next_param);

        if (next_param->size() == 0)
          {
            std::cout << "No parameters named " << param_name <<
              " found in active Physics or QoIs" << std::endl;
            libmesh_error();
          }

        this->parameter_vector.push_back
          (libMesh::UniquePtr<libMesh::ParameterAccessor<libMesh::Number> >
           (next_param));
      }
  }