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 ? ¶meterParams : &(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**"); }
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 ? ¶meterParams : &(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**"); }