00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef PHX_FIELD_EVALUATOR_FACTORY_DEF_HPP
00033 #define PHX_FIELD_EVALUATOR_FACTORY_DEF_HPP
00034
00035 #include <sstream>
00036 #include "Sacado_mpl_size.hpp"
00037 #include "boost/mpl/for_each.hpp"
00038 #include "boost/mpl/range_c.hpp"
00039 #include "Teuchos_TestForException.hpp"
00040 #include "Phalanx_Evaluator_Factory_UFO.hpp"
00041
00042
00043 template<typename Traits, typename FactoryTraits>
00044 Teuchos::RCP< std::vector< Teuchos::RCP<PHX::Evaluator_TemplateManager<Traits> > > >
00045 PHX::EvaluatorFactory<Traits, FactoryTraits>::
00046 buildEvaluators(const std::map<std::string, Teuchos::RCP<Teuchos::ParameterList> >& data)
00047 {
00048 Teuchos::RCP< std::vector< Teuchos::RCP<PHX::Evaluator_TemplateManager<Traits> > > > vector_tm =
00049 Teuchos::rcp(new std::vector< Teuchos::RCP<Evaluator_TemplateManager<Traits> > >);
00050
00051 std::map<std::string, Teuchos::RCP<Teuchos::ParameterList> >::const_iterator
00052 it = data.begin();
00053
00054 for (; it != data.end(); ++it) {
00055
00056 Teuchos::RCP< PHX::Evaluator_TemplateManager<Traits> > tm =
00057 Teuchos::rcp(new PHX::Evaluator_TemplateManager<Traits>);
00058
00059 Teuchos::RCP<Teuchos::ParameterList> p = it->second;
00060
00061 bool found_type = false;
00062 int object_type = p->get<int>("Type");
00063 static const int size = Sacado::mpl::size<typename FactoryTraits::EvaluatorTypes>::value;
00064 boost::mpl::for_each< boost::mpl::range_c<int,0,size> >( UFO<Traits,FactoryTraits>(object_type, p, tm, found_type) );
00065
00066 if (!found_type) {
00067 std::ostringstream msg;
00068 msg << "Unable to find model in EvaluatorFactory for "
00069 << it->first
00070 << ". Please make sure you have set a valid integer "
00071 << "for \"Type\" in the parameter list!";
00072 TEST_FOR_EXCEPTION(!found_type, std::logic_error, msg.str());
00073 }
00074
00075 vector_tm->push_back(tm);
00076
00077 }
00078
00079 return vector_tm;
00080
00081 }
00082
00083 template<typename Traits>
00084 void PHX::registerEvaluators(const Teuchos::RCP< std::vector< Teuchos::RCP<PHX::Evaluator_TemplateManager<Traits> > > >& providers, PHX::FieldManager<Traits>& fm)
00085 {
00086
00087 typename std::vector< Teuchos::RCP<Evaluator_TemplateManager<Traits> > >::iterator
00088 tm = providers->begin();
00089 for (; tm != providers->end(); ++tm) {
00090
00091
00092 typename PHX::FieldManager<Traits>::iterator vmit = fm.begin();
00093 typename Evaluator_TemplateManager<Traits>::iterator vpit =
00094 (*tm)->begin();
00095 for (; vpit != (*tm)->end(); ++vpit) {
00096 Teuchos::RCP<PHX::Evaluator<Traits> > vp =
00097 Teuchos::rcp_dynamic_cast<PHX::Evaluator<Traits> >(vpit.rcp());
00098 fm.registerEvaluator(vmit, vp);
00099 ++vmit;
00100 }
00101 }
00102
00103 }
00104
00105
00106 #endif