00001 // @HEADER 00002 // ************************************************************************ 00003 // 00004 // Phalanx: A Partial Differential Equation Field Evaluation 00005 // Kernel for Flexible Management of Complex Dependency Chains 00006 // Copyright (2008) Sandia Corporation 00007 // 00008 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, 00009 // the U.S. Government retains certain rights in this software. 00010 // 00011 // This library is free software; you can redistribute it and/or modify 00012 // it under the terms of the GNU Lesser General Public License as 00013 // published by the Free Software Foundation; either version 2.1 of the 00014 // License, or (at your option) any later version. 00015 // 00016 // This library is distributed in the hope that it will be useful, but 00017 // WITHOUT ANY WARRANTY; without even the implied warranty of 00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00019 // Lesser General Public License for more details. 00020 // 00021 // You should have received a copy of the GNU Lesser General Public 00022 // License along with this library; if not, write to the Free Software 00023 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 00024 // USA 00025 // 00026 // Questions? Contact Roger Pawlowski (rppawlo@sandia.gov), Sandia 00027 // National Laboratories. 00028 // 00029 // ************************************************************************ 00030 // @HEADER 00031 00032 #ifndef PHX_FIELD_EVALUATOR_MANAGER_HPP 00033 #define PHX_FIELD_EVALUATOR_MANAGER_HPP 00034 00035 #include "Phalanx_ConfigDefs.hpp" 00036 #include "Teuchos_RCP.hpp" 00037 #include "Phalanx_FieldTag.hpp" 00038 #include "Phalanx_FieldTag_STL_Functors.hpp" 00039 #include "Phalanx_Evaluator.hpp" 00040 #include "Phalanx_TypeStrings.hpp" 00041 00042 namespace PHX { 00043 00044 template<typename Traits> class FieldManager; 00045 00048 template<typename Traits> 00049 class EvaluatorManager { 00050 00051 public: 00052 00053 EvaluatorManager(const std::string& evaluator_type_name = "???"); 00054 00055 ~EvaluatorManager(); 00056 00058 void requireField(const PHX::FieldTag& v); 00059 00061 void 00062 registerEvaluator(const Teuchos::RCP<PHX::Evaluator<Traits> >& p); 00063 00069 void sortAndOrderEvaluators(); 00070 00073 void postRegistrationSetup(PHX::FieldManager<Traits>& vm); 00074 00076 void evaluateFields(typename Traits::EvalData d); 00077 00086 void preEvaluate(typename Traits::PreEvalData d); 00087 00095 void postEvaluate(typename Traits::PostEvalData d); 00096 00097 void setEvaluationTypeName(const std::string& evaluation_type_name); 00098 00099 const std::vector< Teuchos::RCP<PHX::FieldTag> >& getFieldTags(); 00100 00101 bool sortingCalled() const; 00102 00104 void print(std::ostream& os) const; 00105 00106 protected: 00107 00111 void createProviderEvaluationOrder(); 00112 00113 protected: 00114 00116 std::vector< Teuchos::RCP<PHX::FieldTag> > fields_; 00117 00119 00123 std::vector< Teuchos::RCP<PHX::Evaluator<Traits> > > 00124 varProviders; 00125 00126 std::vector< std::vector< Teuchos::RCP<PHX::FieldTag> > > 00127 providerVariables; 00128 00129 std::vector< std::vector< Teuchos::RCP<PHX::FieldTag> > > 00130 providerRequirements; 00131 00132 std::vector<std::string> providerNames; 00134 00135 00137 00142 std::vector<int> providerEvalOrderIndex; 00144 00145 std::string evaluation_type_name_; 00146 00148 bool sorting_called_; 00149 00150 }; 00151 00152 template<typename Traits> 00153 std::ostream& operator<<(std::ostream& os, 00154 const PHX::EvaluatorManager<Traits>& m); 00155 00156 } 00157 00158 #include "Phalanx_Evaluator_Manager_Def.hpp" 00159 00160 #endif