43 #ifndef PANZER_SUM_IMPL_HPP 44 #define PANZER_SUM_IMPL_HPP 50 #include "Phalanx_MDField_Utilities.hpp" 53 #define PANZER_USE_FAST_SUM 0 60 std::string sum_name = p.get<std::string>(
"Sum Name");
69 auto local_scalars = Kokkos::View<double *,PHX::Device>(
"scalars",value_names->size());
70 if(p.isType<
Teuchos::RCP<
const std::vector<double> > >(
"Scalars")) {
76 for (std::size_t i=0; i < value_names->size(); ++i)
77 local_scalars(i) = scalars_v[i];
80 for (std::size_t i=0; i < value_names->size(); ++i)
81 local_scalars(i) = 1.0;
86 sum = PHX::MDField<ScalarT>(sum_name, data_layout);
88 this->addEvaluatedField(
sum);
90 for (std::size_t i=0; i < value_names->size(); ++i) {
91 values[i] = PHX::MDField<const ScalarT>( (*value_names)[i], data_layout);
92 this->addDependentField(
values[i]);
102 std::string n =
"Sum Evaluator";
109 this->utils.setFieldData(
sum,fm);
110 for (std::size_t i=0; i <
scalars.dimension_0(); ++i)
111 this->utils.setFieldData(
values[i],fm);
118 template<
typename EvalT,
typename TRAITS>
119 template<
unsigned int RANK>
120 KOKKOS_INLINE_FUNCTION
122 auto num_vals =
scalars.dimension_0();
127 for (std::size_t iv = 0; iv < num_vals; ++iv)
132 const size_t dim_1 =
sum.dimension(1);
133 for (std::size_t j = 0; j < dim_1; ++j)
134 for (std::size_t iv = 0; iv < num_vals; ++iv)
139 const size_t dim_1 =
sum.dimension(1),dim_2 =
sum.dimension(2);
140 for (std::size_t j = 0; j < dim_1; ++j)
141 for (std::size_t k = 0; k < dim_2; ++k)
142 for (std::size_t iv = 0; iv < num_vals; ++iv)
147 const size_t dim_1 =
sum.dimension(1),dim_2 =
sum.dimension(2),dim_3 =
sum.dimension(3);
148 for (std::size_t j = 0; j < dim_1; ++j)
149 for (std::size_t k = 0; k < dim_2; ++k)
150 for (std::size_t l = 0; l < dim_3; ++l)
151 for (std::size_t iv = 0; iv < num_vals; ++iv)
156 const size_t dim_1 =
sum.dimension(1),dim_2 =
sum.dimension(2),dim_3 =
sum.dimension(3),dim_4 =
sum.dimension(4);
157 for (std::size_t j = 0; j < dim_1; ++j)
158 for (std::size_t k = 0; k < dim_2; ++k)
159 for (std::size_t l = 0; l < dim_3; ++l)
160 for (std::size_t m = 0; m < dim_4; ++m)
161 for (std::size_t iv = 0; iv < num_vals; ++iv)
166 const size_t dim_1 =
sum.dimension(1),dim_2 =
sum.dimension(2),dim_3 =
sum.dimension(3),dim_4 =
sum.dimension(4),dim_5 =
sum.dimension(5);
167 for (std::size_t j = 0; j < dim_1; ++j)
168 for (std::size_t k = 0; k < dim_2; ++k)
169 for (std::size_t l = 0; l < dim_3; ++l)
170 for (std::size_t m = 0; m < dim_4; ++m)
171 for (std::size_t n = 0; n < dim_5; ++n)
172 for (std::size_t iv = 0; iv < num_vals; ++iv)
173 sum(i,j,k,l,m,n) +=
scalars(iv)*(
values[iv](i,j,k,l,m,n));
181 sum.deep_copy(ScalarT(0.0));
183 #if PANZER_USE_FAST_SUM 184 sum.deep_copy(ScalarT(0.0));
185 for (std::size_t j = 0; j <
values.size(); ++j) {
187 PHX::MDFieldIterator<ScalarT> sum_it(
sum);
188 PHX::MDFieldIterator<const ScalarT> values_it(
values[j]);
191 ! (sum_it.done() || values_it.done());
192 ++sum_it, ++values_it)
193 *sum_it +=
scalars[j]*(*values_it);
196 size_t rank =
sum.rank();
197 const size_t length =
sum.dimension(0);
200 Kokkos::parallel_for(Kokkos::RangePolicy<
PanzerSumTag<1> >(0, length), *
this);
204 Kokkos::parallel_for(Kokkos::RangePolicy<
PanzerSumTag<2> >(0, length), *
this);
208 Kokkos::parallel_for(Kokkos::RangePolicy<
PanzerSumTag<3> >(0, length), *
this);
212 Kokkos::parallel_for(Kokkos::RangePolicy<
PanzerSumTag<4> >(0, length), *
this);
216 Kokkos::parallel_for(Kokkos::RangePolicy<
PanzerSumTag<5> >(0, length), *
this);
220 Kokkos::parallel_for(Kokkos::RangePolicy<
PanzerSumTag<6> >(0, length), *
this);
233 template<
typename EvalT,
typename TRAITS,
typename Tag0>
237 std::string sum_name = p.
get<std::string>(
"Sum Name");
246 sum = PHX::MDField<ScalarT,Tag0>(sum_name, data_layout);
248 this->addEvaluatedField(
sum);
250 values.resize(value_names->size());
251 for (std::size_t i=0; i < value_names->size(); ++i) {
252 values[i] = PHX::MDField<const ScalarT,Tag0>( (*value_names)[i], data_layout);
253 this->addDependentField(
values[i]);
256 std::string n =
"SumStatic Rank 1 Evaluator";
262 template<
typename EvalT,
typename TRAITS,
typename Tag0>
267 this->utils.setFieldData(
sum,fm);
268 for (std::size_t i=0; i <
values.size(); ++i)
269 this->utils.setFieldData(
values[i],fm);
274 template<
typename EvalT,
typename TRAITS,
typename Tag0>
279 for (std::size_t i = 0; i <
sum.dimension_0(); ++i)
280 for (std::size_t d = 0; d <
values.size(); ++d)
287 template<
typename EvalT,
typename TRAITS,
typename Tag0,
typename Tag1>
291 std::string sum_name = p.
get<std::string>(
"Sum Name");
306 Kokkos::View<double*,PHX::Device> scalars_nc
307 = Kokkos::View<double*,PHX::Device>(
"scalars",scalar_values->size());
309 for(std::size_t i=0;i<scalar_values->size();i++)
310 scalars_nc(i) = (*scalar_values)[i];
321 sum = PHX::MDField<ScalarT,Tag0,Tag1>(sum_name, data_layout);
323 this->addEvaluatedField(
sum);
325 values.resize(value_names->size());
326 for (std::size_t i=0; i < value_names->size(); ++i) {
327 values[i] = PHX::MDField<const ScalarT,Tag0,Tag1>( (*value_names)[i], data_layout);
328 this->addDependentField(
values[i]);
330 numValues = value_names->size();
333 std::string n =
"SumStatic Rank 2 Evaluator";
339 template<
typename EvalT,
typename TRAITS,
typename Tag0,
typename Tag1>
344 this->utils.setFieldData(
sum,fm);
345 for (std::size_t i=0; i <
values.size(); ++i) {
346 this->utils.setFieldData(
values[i],fm);
347 value_views[i] =
values[i].get_static_view();
353 template<
typename EvalT,
typename TRAITS,
typename Tag0,
typename Tag1>
361 Kokkos::parallel_for(Kokkos::RangePolicy<PHX::Device,ScalarsTag>(0,
sum.dimension_0()), *
this);
363 Kokkos::parallel_for(Kokkos::RangePolicy<PHX::Device,NoScalarsTag>(0,
sum.dimension_0()), *
this);
368 template<
typename EvalT,
typename TRAITS,
typename Tag0,
typename Tag1>
369 KOKKOS_INLINE_FUNCTION
373 for (
int i=0;i<numValues;i++) {
374 for (
int j = 0; j <
sum.extent_int(1); ++j)
381 template<
typename EvalT,
typename TRAITS,
typename Tag0,
typename Tag1>
382 KOKKOS_INLINE_FUNCTION
386 for (
int i=0;i<numValues;i++) {
387 for (
int j = 0; j <
sum.extent_int(1); ++j)
388 sum(c,j) += value_views[i](c,j);
459 template<
typename EvalT,
typename TRAITS,
typename Tag0,
typename Tag1,
typename Tag2>
462 const std::vector<std::string> & value_names,
466 p.
set<std::string>(
"Sum Name",sum_name);
PHX::MDField< ScalarT > sum
Teuchos::RCP< PHX::Evaluator< TRAITS > > buildStaticSumEvaluator(const std::string &sum_name, const std::vector< std::string > &value_names, const Teuchos::RCP< PHX::DataLayout > &data_layout)
T & get(const std::string &name, T def_value)
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Kokkos::View< const double *, PHX::Device > scalars
void operator()(const FieldMultTag< NUM_FIELD_MULT > &, const std::size_t &cell) const
std::size_t cell_data_size
SumStatic(const Teuchos::ParameterList &p)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
std::vector< ScalarT > values
bool isType(const std::string &name) const
PHX_EVALUATOR_CTOR(BasisValues_Evaluator, p)
PHX_EVALUATE_FIELDS(BasisValues_Evaluator, workset)
static const int MAX_VALUES
void evaluateFields(typename TRAITS::EvalData d)
void postRegistrationSetup(typename TRAITS::SetupData d, PHX::FieldManager< TRAITS > &fm)
#define TEUCHOS_ASSERT(assertion_test)
PHX_POST_REGISTRATION_SETUP(BasisValues_Evaluator, sd, fm)