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_MANAGER_DEF_HPP
00033 #define PHX_FIELD_MANAGER_DEF_HPP
00034
00035 #include "Sacado_mpl_size.hpp"
00036 #include "boost/mpl/at.hpp"
00037 #include "Phalanx_EvaluationContainer_TemplateBuilder.hpp"
00038
00039
00040 template<typename Traits>
00041 inline
00042 PHX::FieldManager<Traits>::FieldManager() :
00043 m_max_num_cells(0)
00044 {
00045 m_num_evaluation_types =
00046 Sacado::mpl::size<typename Traits::EvalTypes>::value;
00047 PHX::EvaluationContainer_TemplateBuilder<Traits> builder;
00048 m_eval_containers.buildObjects(builder);
00049 }
00050
00051
00052 template<typename Traits>
00053 inline
00054 PHX::FieldManager<Traits>::~FieldManager()
00055 { }
00056
00057
00058 template<typename Traits>
00059 template<typename DataT, typename EvalT>
00060 inline
00061 void PHX::FieldManager<Traits>::
00062 getFieldData(PHX::Field<DataT>& f)
00063 {
00064 f.setFieldData(m_eval_containers.template
00065 getAsObject<EvalT>()->template getFieldData<DataT>(f.fieldTag()) );
00066 }
00067
00068
00069 template<typename Traits>
00070 template<typename DataT, typename EvalT, PHX::ArrayOrder Order,
00071 typename Tag0, typename Tag1, typename Tag2, typename Tag3,
00072 typename Tag4, typename Tag5, typename Tag6, typename Tag7>
00073 inline
00074 void PHX::FieldManager<Traits>::
00075 getFieldData(PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,
00076 Tag5,Tag6,Tag7>& f)
00077 {
00078 f.setFieldData(m_eval_containers.template
00079 getAsObject<EvalT>()->template getFieldData<DataT>(f.fieldTag()) );
00080 }
00081
00082
00083 template<typename Traits>
00084 template<typename DataT, typename EvalT>
00085 inline
00086 void PHX::FieldManager<Traits>::
00087 getFieldData(const PHX::FieldTag& t, Teuchos::ArrayRCP<DataT>& d)
00088 {
00089 d = m_eval_containers.template
00090 getAsObject<EvalT>()->template getFieldData<DataT>(t);
00091 }
00092
00093
00094 template<typename Traits>
00095 inline
00096 void PHX::FieldManager<Traits>::
00097 requireFieldForAllEvaluationTypes(const PHX::FieldTag& t)
00098 {
00099 typedef PHX::EvaluationContainer_TemplateManager<Traits> SCTM;
00100
00101 typename SCTM::iterator it = m_eval_containers.begin();
00102 for (; it != m_eval_containers.end(); ++it) {
00103 it->requireField(t);
00104 }
00105 }
00106
00107
00108 template<typename Traits>
00109 template<typename EvalT>
00110 inline
00111 void PHX::FieldManager<Traits>::
00112 requireField(const PHX::FieldTag& t)
00113 {
00114 m_eval_containers.template getAsBase<EvalT>()->requireField(t);
00115 }
00116
00117
00118 template<typename Traits>
00119 inline
00120 void PHX::FieldManager<Traits>::
00121 registerEvaluatorForAllEvaluationTypes(const Teuchos::RCP<PHX::Evaluator<Traits> >& e)
00122 {
00123 typedef PHX::EvaluationContainer_TemplateManager<Traits> SCTM;
00124
00125 typename SCTM::iterator it = m_eval_containers.begin();
00126 for (; it != m_eval_containers.end(); ++it) {
00127 it->registerEvaluator(e);
00128 }
00129 }
00130
00131
00132 template<typename Traits>
00133 template<typename EvalT>
00134 inline
00135 void PHX::FieldManager<Traits>::
00136 registerEvaluator(const Teuchos::RCP<PHX::Evaluator<Traits> >& e)
00137 {
00138 m_eval_containers.template getAsBase<EvalT>()->registerEvaluator(e);
00139 }
00140
00141
00142 template<typename Traits>
00143 inline
00144 void PHX::FieldManager<Traits>::
00145 registerEvaluator(FieldManager::iterator it,
00146 const Teuchos::RCP<PHX::Evaluator<Traits> >& e)
00147 {
00148 it->registerEvaluator(e);
00149 }
00150
00151
00152 template<typename Traits>
00153 inline
00154 void PHX::FieldManager<Traits>::
00155 postRegistrationSetup(std::size_t max_num_cells)
00156 {
00157 m_max_num_cells = max_num_cells;
00158
00159 typedef PHX::EvaluationContainer_TemplateManager<Traits> SCTM;
00160 typename SCTM::iterator it = m_eval_containers.begin();
00161 for (; it != m_eval_containers.end(); ++it)
00162 it->postRegistrationSetup(m_max_num_cells, *this);
00163 }
00164
00165
00166 template<typename Traits>
00167 template<typename EvalT>
00168 inline
00169 void PHX::FieldManager<Traits>::
00170 evaluateFields(typename Traits::EvalData d)
00171 {
00172 m_eval_containers.template getAsBase<EvalT>()->evaluateFields(d);
00173 }
00174
00175
00176 template<typename Traits>
00177 template<typename EvalT>
00178 inline
00179 void PHX::FieldManager<Traits>::
00180 preEvaluate(typename Traits::PreEvalData d)
00181 {
00182 m_eval_containers.template getAsBase<EvalT>()->preEvaluate(d);
00183 }
00184
00185
00186 template<typename Traits>
00187 template<typename EvalT>
00188 inline
00189 void PHX::FieldManager<Traits>::
00190 postEvaluate(typename Traits::PostEvalData d)
00191 {
00192 m_eval_containers.template getAsBase<EvalT>()->postEvaluate(d);
00193 }
00194
00195
00196 template<typename Traits>
00197 inline
00198 std::size_t PHX::FieldManager<Traits>::getMaxNumCells() const
00199 {
00200 return m_max_num_cells;
00201 }
00202
00203
00204 template<typename Traits>
00205 inline
00206 typename PHX::FieldManager<Traits>::iterator
00207 PHX::FieldManager<Traits>::begin()
00208 {
00209 return m_eval_containers.begin();
00210 }
00211
00212
00213 template<typename Traits>
00214 inline
00215 typename PHX::FieldManager<Traits>::iterator
00216 PHX::FieldManager<Traits>::end()
00217 {
00218 return m_eval_containers.end();
00219 }
00220
00221
00222 template<typename Traits>
00223 inline
00224 void PHX::FieldManager<Traits>::print(std::ostream& os) const
00225 {
00226 typedef PHX::EvaluationContainer_TemplateManager<Traits> SCTM;
00227 typename SCTM::const_iterator it = m_eval_containers.begin();
00228 for (; it != m_eval_containers.end(); ++it)
00229 os << (*it);
00230 }
00231
00232
00233 template<typename Traits>
00234 inline
00235 std::ostream& PHX::operator<<(std::ostream& os,
00236 const PHX::FieldManager<Traits>& vm)
00237 {
00238 vm.print(os);
00239 return os;
00240 }
00241
00242
00243
00244 #endif