예제 #1
0
Albany::ModelEvaluatorT::ModelEvaluatorT(
    const Teuchos::RCP<Albany::Application>& app_,
    const Teuchos::RCP<Teuchos::ParameterList>& appParams)
: app(app_), supports_xdot(false), supports_xdotdot(false)
{

  Teuchos::RCP<Teuchos::FancyOStream> out =
    Teuchos::VerboseObjectBase::getDefaultOStream();

  // Parameters (e.g., for sensitivities, SG expansions, ...)
  Teuchos::ParameterList& problemParams = appParams->sublist("Problem");
  Teuchos::ParameterList& parameterParams =
    problemParams.sublist("Parameters");

  num_param_vecs =
    parameterParams.get("Number of Parameter Vectors", 0);
  bool using_old_parameter_list = false;
  if (parameterParams.isType<int>("Number")) {
    int numParameters = parameterParams.get<int>("Number");
    if (numParameters > 0) {
      num_param_vecs = 1;
      using_old_parameter_list = true;
    }
  }

  *out << "Number of parameter vectors  = " << num_param_vecs << std::endl;

  Teuchos::ParameterList& responseParams =
    problemParams.sublist("Response Functions");

  int num_response_vecs =
     responseParams.get("Number of Response Vectors", 0);
  bool using_old_response_list = false;
  if (responseParams.isType<int>("Number")) {
    int numParameters = responseParams.get<int>("Number");
    if (numParameters > 0) {
      num_response_vecs = 1;
      using_old_response_list = true;
    }
  }

  param_names.resize(num_param_vecs);
  for (int l = 0; l < num_param_vecs; ++l) {
    const Teuchos::ParameterList* pList =
      using_old_parameter_list ?
      &parameterParams :
      &(parameterParams.sublist(Albany::strint("Parameter Vector", l)));

    const int numParameters = pList->get<int>("Number");
    TEUCHOS_TEST_FOR_EXCEPTION(
      numParameters == 0,
      Teuchos::Exceptions::InvalidParameter,
      std::endl << "Error!  In Albany::ModelEvaluatorT constructor:  " <<
      "Parameter vector " << l << " has zero parameters!" << std::endl);

    param_names[l] = Teuchos::rcp(new Teuchos::Array<std::string>(numParameters));
    for (int k = 0; k < numParameters; ++k) {
      (*param_names[l])[k] =
        pList->get<std::string>(Albany::strint("Parameter", k));
    }

    *out << "Number of parameters in parameter vector "
      << l << " = " << numParameters << std::endl;
  }

  // Setup distributed parameters
  distParamLib = app->getDistParamLib();
  Teuchos::ParameterList& distParameterParams =
    problemParams.sublist("Distributed Parameters");
  num_dist_param_vecs =
    distParameterParams.get("Number of Parameter Vectors", 0);
  dist_param_names.resize(num_dist_param_vecs);
  *out << "Number of distributed parameters vectors  = " << num_dist_param_vecs
       << std::endl;
  for (int i=0; i<num_dist_param_vecs; i++) {
    std::string name =
      distParameterParams.get<std::string>(Albany::strint("Parameter",i));
    TEUCHOS_TEST_FOR_EXCEPTION(
      !distParamLib->has(name),
      Teuchos::Exceptions::InvalidParameter,
      std::endl << "Error!  In Albany::ModelEvaluator constructor:  " <<
      "Invalid distributed parameter name " << name << std::endl);
    dist_param_names[i] = name;
  }

  Teuchos::Array<Teuchos::RCP<Teuchos::Array<std::string> > > response_names;
  response_names.resize(num_response_vecs);
  for (int l = 0; l < num_response_vecs; ++l) {
    const Teuchos::ParameterList* pList =
      using_old_response_list ?
      &responseParams :
      &(responseParams.sublist(Albany::strint("Response Vector", l)));

    bool number_exists = pList->getEntryPtr("Number");

    if(number_exists){

      const int numParameters = pList->get<int>("Number");
      TEUCHOS_TEST_FOR_EXCEPTION(
        numParameters == 0,
        Teuchos::Exceptions::InvalidParameter,
        std::endl << "Error!  In Albany::ModelEvaluatorT constructor:  " <<
        "Response vector " << l << " has zero parameters!" << std::endl);

      response_names[l] = Teuchos::rcp(new Teuchos::Array<std::string>(numParameters));
      for (int k = 0; k < numParameters; ++k) {
        (*response_names[l])[k] =
          pList->get<std::string>(Albany::strint("Response", k));
      }
    }
  }

  *out << "Number of response vectors  = " << num_response_vecs << std::endl;

  sacado_param_vec.resize(num_param_vecs);
  tpetra_param_vec.resize(num_param_vecs);
  tpetra_param_map.resize(num_param_vecs);
  thyra_response_vec.resize(num_response_vecs);

  Teuchos::RCP<const Teuchos::Comm<int> > commT = app->getComm();
   for (int l = 0; l < tpetra_param_vec.size(); ++l) {
     try {
       // Initialize Sacado parameter vector
       // The following call will throw, and it is often due to an incorrect input line in the "Parameters" PL
       // in the input file. Give the user a hint about what might be happening
       app->getParamLib()->fillVector<PHAL::AlbanyTraits::Residual>(
         *(param_names[l]), sacado_param_vec[l]);
     }
     catch (const std::logic_error& le) {

       *out << "Error: exception thrown from ParamLib fillVector in file " << __FILE__ << " line " << __LINE__ << std::endl;
       *out << "This is probably due to something incorrect in the \"Parameters\" list in the input file, one of the lines:"
            << std::endl;
       for (int k = 0; k < param_names[l]->size(); ++k)
         *out << "      " << (*param_names[l])[k] << std::endl;

       throw le; // rethrow to shut things down
     }

     // Create Tpetra map for parameter vector
     Tpetra::LocalGlobal lg = Tpetra::LocallyReplicated;
     tpetra_param_map[l] =
       Teuchos::rcp(new Tpetra_Map(sacado_param_vec[l].size(), 0, commT, lg));

     // Create Tpetra vector for parameters
     tpetra_param_vec[l] = Teuchos::rcp(new Tpetra_Vector(tpetra_param_map[l]));
     for (unsigned int k = 0; k < sacado_param_vec[l].size(); ++k) {
       const Teuchos::ArrayRCP<ST> tpetra_param_vec_nonConstView = tpetra_param_vec[l]->get1dViewNonConst();
       tpetra_param_vec_nonConstView[k] = sacado_param_vec[l][k].baseValue;
     }
   }

   for (int l = 0; l < app->getNumResponses(); ++l) {

     // Create Thyra vector for responses
     Teuchos::RCP<const Tpetra_Map> mapT = app->getResponse(l)->responseMapT();
     Teuchos::RCP<const Thyra::VectorSpaceBase<ST> > gT_space = Thyra::createVectorSpace<ST>(mapT);
     thyra_response_vec[l] = Thyra::createMember(gT_space);

   }

  {

    // Determine the number of solution vectors (x, xdot, xdotdot)

    int num_sol_vectors = app->getAdaptSolMgrT()->getInitialSolution()->getNumVectors();

    if(num_sol_vectors > 1) // have x dot
      supports_xdot = true;

    if(num_sol_vectors > 2) // have both x dot and x dotdot
      supports_xdotdot = true;

    // Setup nominal values
    nominalValues = this->createInArgsImpl();

    // All the ME vectors are unallocated here
    allocateVectors();

    // TODO: Check if correct nominal values for parameters
    for (int l = 0; l < num_param_vecs; ++l) {
      Teuchos::RCP<const Tpetra_Map> map = tpetra_param_map[l];
      Teuchos::RCP<const Thyra::VectorSpaceBase<ST> > tpetra_param_space = Thyra::createVectorSpace<ST>(map);
      nominalValues.set_p(l, Thyra::createVector(tpetra_param_vec[l], tpetra_param_space));
    }
  }

  timer = Teuchos::TimeMonitor::getNewTimer("Albany: **Total Fill Time**");

}
예제 #2
0
Albany::ModelEvaluatorT::ModelEvaluatorT(
    const Teuchos::RCP<Albany::Application>& app_,
    const Teuchos::RCP<Teuchos::ParameterList>& appParams)
: app(app_)
{

  Teuchos::RCP<Teuchos::FancyOStream> out =
    Teuchos::VerboseObjectBase::getDefaultOStream();

  // Parameters (e.g., for sensitivities, SG expansions, ...)
  Teuchos::ParameterList& problemParams = appParams->sublist("Problem");
  Teuchos::ParameterList& parameterParams =
    problemParams.sublist("Parameters");

  num_param_vecs =
    parameterParams.get("Number of Parameter Vectors", 0);
  bool using_old_parameter_list = false;
  if (parameterParams.isType<int>("Number")) {
    int numParameters = parameterParams.get<int>("Number");
    if (numParameters > 0) {
      num_param_vecs = 1;
      using_old_parameter_list = true;
    }
  }

  *out << "Number of parameter vectors  = " << num_param_vecs << std::endl;

  Teuchos::ParameterList& responseParams =
    problemParams.sublist("Response Functions");

  int num_response_vecs =
     responseParams.get("Number of Response Vectors", 0);
  bool using_old_response_list = false;
  if (responseParams.isType<int>("Number")) {
    int numParameters = responseParams.get<int>("Number");
    if (numParameters > 0) {
      num_response_vecs = 1;
      using_old_response_list = true;
    }
  }

  param_names.resize(num_param_vecs);
  for (int l = 0; l < num_param_vecs; ++l) {
    const Teuchos::ParameterList* pList =
      using_old_parameter_list ?
      &parameterParams :
      &(parameterParams.sublist(Albany::strint("Parameter Vector", l)));

    const int numParameters = pList->get<int>("Number");
    TEUCHOS_TEST_FOR_EXCEPTION(
      numParameters == 0,
      Teuchos::Exceptions::InvalidParameter,
      std::endl << "Error!  In Albany::ModelEvaluatorT constructor:  " <<
      "Parameter vector " << l << " has zero parameters!" << std::endl);

    param_names[l] = Teuchos::rcp(new Teuchos::Array<std::string>(numParameters));
    for (int k = 0; k < numParameters; ++k) {
      (*param_names[l])[k] =
        pList->get<std::string>(Albany::strint("Parameter", k));
    }

    *out << "Number of parameters in parameter vector "
      << l << " = " << numParameters << std::endl;
  }
  
  // Setup distributed parameters
  distParamLib = app->getDistParamLib();
  Teuchos::ParameterList& distParameterParams =
    problemParams.sublist("Distributed Parameters");
  num_dist_param_vecs =
    distParameterParams.get("Number of Parameter Vectors", 0);
  dist_param_names.resize(num_dist_param_vecs);
  *out << "Number of distributed parameters vectors  = " << num_dist_param_vecs
       << std::endl;
  for (int i=0; i<num_dist_param_vecs; i++) {
    std::string name =
      distParameterParams.get<std::string>(Albany::strint("Parameter",i));
    TEUCHOS_TEST_FOR_EXCEPTION(
      !distParamLib->has(name),
      Teuchos::Exceptions::InvalidParameter,
      std::endl << "Error!  In Albany::ModelEvaluator constructor:  " <<
      "Invalid distributed parameter name " << name << std::endl);
    dist_param_names[i] = name;
  }

  Teuchos::Array<Teuchos::RCP<Teuchos::Array<std::string> > > response_names;
  response_names.resize(num_response_vecs);
  for (int l = 0; l < num_response_vecs; ++l) {
    const Teuchos::ParameterList* pList =
      using_old_response_list ?
      &responseParams :
      &(responseParams.sublist(Albany::strint("Response Vector", l)));

    bool number_exists = pList->getEntryPtr("Number");

    if(number_exists){

      const int numParameters = pList->get<int>("Number");
      TEUCHOS_TEST_FOR_EXCEPTION(
        numParameters == 0,
        Teuchos::Exceptions::InvalidParameter,
        std::endl << "Error!  In Albany::ModelEvaluatorT constructor:  " <<
        "Response vector " << l << " has zero parameters!" << std::endl);

      response_names[l] = Teuchos::rcp(new Teuchos::Array<std::string>(numParameters));
      for (int k = 0; k < numParameters; ++k) {
        (*response_names[l])[k] =
          pList->get<std::string>(Albany::strint("Response", k));
      }
    }
  }

  *out << "Number of response vectors  = " << num_response_vecs << std::endl;

  sacado_param_vec.resize(num_param_vecs);
  tpetra_param_vec.resize(num_param_vecs);
  tpetra_param_map.resize(num_param_vecs);
  thyra_response_vec.resize(num_response_vecs);

  Teuchos::RCP<const Teuchos::Comm<int> > commT = app->getComm(); 
   for (int l = 0; l < tpetra_param_vec.size(); ++l) {
     // Initialize Sacado parameter vector
     app->getParamLib()->fillVector<PHAL::AlbanyTraits::Residual>(
         *(param_names[l]), sacado_param_vec[l]);

     // Create Tpetra map for parameter vector
     Tpetra::LocalGlobal lg = Tpetra::LocallyReplicated;
     tpetra_param_map[l] =
       Teuchos::rcp(new Tpetra_Map(sacado_param_vec[l].size(), 0, commT, lg));

     // Create Tpetra vector for parameters
     tpetra_param_vec[l] = Teuchos::rcp(new Tpetra_Vector(tpetra_param_map[l]));
     for (unsigned int k = 0; k < sacado_param_vec[l].size(); ++k) {
       const Teuchos::ArrayRCP<ST> tpetra_param_vec_nonConstView = tpetra_param_vec[l]->get1dViewNonConst();
       tpetra_param_vec_nonConstView[k] = sacado_param_vec[l][k].baseValue;
     }
   }

   for (int l = 0; l < app->getNumResponses(); ++l) {

     // Create Thyra vector for responses
     Teuchos::RCP<const Tpetra_Map> mapT = app->getResponse(l)->responseMapT();
     Teuchos::RCP<const Thyra::VectorSpaceBase<ST> > gT_space = Thyra::createVectorSpace<ST>(mapT);
     thyra_response_vec[l] = Thyra::createMember(gT_space);

   }

  // Setup nominal values
  {
    nominalValues = this->createInArgsImpl();

    // All the ME vectors are unallocated here
    allocateVectors();

    // TODO: Check if correct nominal values for parameters
    for (int l = 0; l < num_param_vecs; ++l) {
      Teuchos::RCP<const Tpetra_Map> map = tpetra_param_map[l];
      Teuchos::RCP<const Thyra::VectorSpaceBase<ST> > tpetra_param_space = Thyra::createVectorSpace<ST>(map);
      nominalValues.set_p(l, Thyra::createVector(tpetra_param_vec[l], tpetra_param_space));
    }
  }

  timer = Teuchos::TimeMonitor::getNewTimer("Albany: **Total Fill Time**");

}