11#ifndef PANZER_SUM_IMPL_HPP
12#define PANZER_SUM_IMPL_HPP
21template<
typename EvalT,
typename Traits>
24 const Teuchos::ParameterList& p)
26 std::string sum_name = p.get<std::string>(
"Sum Name");
27 Teuchos::RCP<std::vector<std::string> > value_names =
28 p.get<Teuchos::RCP<std::vector<std::string> > >(
"Values Names");
29 Teuchos::RCP<PHX::DataLayout> data_layout =
30 p.get< Teuchos::RCP<PHX::DataLayout> >(
"Data Layout");
32 TEUCHOS_ASSERT(
static_cast<int>(value_names->size()) <
MAX_VALUES);
35 auto local_scalars = PHX::View<double *>(
"scalars",value_names->size());
36 auto local_scalars_host = Kokkos::create_mirror_view(local_scalars);
37 if(p.isType<Teuchos::RCP<
const std::vector<double> > >(
"Scalars")) {
38 auto scalars_v = *p.get<Teuchos::RCP<const std::vector<double> > >(
"Scalars");
41 TEUCHOS_ASSERT(scalars_v.size()==value_names->size());
43 for (std::size_t i=0; i < value_names->size(); ++i)
44 local_scalars_host(i) = scalars_v[i];
47 for (std::size_t i=0; i < value_names->size(); ++i)
48 local_scalars_host(i) = 1.0;
50 Kokkos::deep_copy(local_scalars,local_scalars_host);
54 sum = PHX::MDField<ScalarT>(sum_name, data_layout);
56 this->addEvaluatedField(
sum);
58 for (std::size_t i=0; i < value_names->size(); ++i) {
59 values[i] = PHX::MDField<const ScalarT>( (*value_names)[i], data_layout);
60 this->addDependentField(
values[i]);
70 std::string n =
"Sum Evaluator";
75template<
typename EvalT,
typename Traits>
87template<
typename EvalT,
typename TRAITS>
88template<
unsigned int RANK>
91 auto num_vals =
scalars.extent(0);
96 for (std::size_t iv = 0; iv < num_vals; ++iv)
101 const size_t dim_1 =
sum.extent(1);
102 for (std::size_t j = 0; j < dim_1; ++j)
103 for (std::size_t iv = 0; iv < num_vals; ++iv)
108 const size_t dim_1 =
sum.extent(1),dim_2 =
sum.extent(2);
109 for (std::size_t j = 0; j < dim_1; ++j)
110 for (std::size_t k = 0; k < dim_2; ++k)
111 for (std::size_t iv = 0; iv < num_vals; ++iv)
116 const size_t dim_1 =
sum.extent(1),dim_2 =
sum.extent(2),dim_3 =
sum.extent(3);
117 for (std::size_t j = 0; j < dim_1; ++j)
118 for (std::size_t k = 0; k < dim_2; ++k)
119 for (std::size_t l = 0; l < dim_3; ++l)
120 for (std::size_t iv = 0; iv < num_vals; ++iv)
125 const size_t dim_1 =
sum.extent(1),dim_2 =
sum.extent(2),dim_3 =
sum.extent(3),dim_4 =
sum.extent(4);
126 for (std::size_t j = 0; j < dim_1; ++j)
127 for (std::size_t k = 0; k < dim_2; ++k)
128 for (std::size_t l = 0; l < dim_3; ++l)
129 for (std::size_t m = 0; m < dim_4; ++m)
130 for (std::size_t iv = 0; iv < num_vals; ++iv)
135 const size_t dim_1 =
sum.extent(1),dim_2 =
sum.extent(2),dim_3 =
sum.extent(3),dim_4 =
sum.extent(4),dim_5 =
sum.extent(5);
136 for (std::size_t j = 0; j < dim_1; ++j)
137 for (std::size_t k = 0; k < dim_2; ++k)
138 for (std::size_t l = 0; l < dim_3; ++l)
139 for (std::size_t m = 0; m < dim_4; ++m)
140 for (std::size_t n = 0; n < dim_5; ++n)
141 for (std::size_t iv = 0; iv < num_vals; ++iv)
142 sum(i,j,k,l,m,n) +=
scalars(iv)*(
values[iv](i,j,k,l,m,n));
147template<
typename EvalT,
typename Traits>
156 size_t rank =
sum.rank();
157 const size_t length =
sum.extent(0);
160 Kokkos::parallel_for(Kokkos::RangePolicy<
PanzerSumTag<1> >(0, length), *
this);
164 Kokkos::parallel_for(Kokkos::RangePolicy<
PanzerSumTag<2> >(0, length), *
this);
168 Kokkos::parallel_for(Kokkos::RangePolicy<
PanzerSumTag<3> >(0, length), *
this);
172 Kokkos::parallel_for(Kokkos::RangePolicy<
PanzerSumTag<4> >(0, length), *
this);
176 Kokkos::parallel_for(Kokkos::RangePolicy<
PanzerSumTag<5> >(0, length), *
this);
180 Kokkos::parallel_for(Kokkos::RangePolicy<
PanzerSumTag<6> >(0, length), *
this);
184 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::runtime_error,
"ERROR: rank of sum is higher than supported");
195template<
typename EvalT,
typename TRAITS,
typename Tag0>
197SumStatic(
const Teuchos::ParameterList& p)
199 std::string sum_name = p.get<std::string>(
"Sum Name");
200 Teuchos::RCP<std::vector<std::string> > value_names =
201 p.get<Teuchos::RCP<std::vector<std::string> > >(
"Values Names");
202 Teuchos::RCP<PHX::DataLayout> data_layout =
203 p.get< Teuchos::RCP<PHX::DataLayout> >(
"Data Layout");
206 TEUCHOS_ASSERT(data_layout->rank()==1);
208 sum = PHX::MDField<ScalarT,Tag0>(sum_name, data_layout);
210 this->addEvaluatedField(
sum);
212 values.resize(value_names->size());
213 for (std::size_t i=0; i < value_names->size(); ++i) {
214 values[i] = PHX::MDField<const ScalarT,Tag0>( (*value_names)[i], data_layout);
215 this->addDependentField(
values[i]);
218 std::string n =
"SumStatic Rank 1 Evaluator";
224template<
typename EvalT,
typename TRAITS,
typename Tag0>
229 for (std::size_t i = 0; i <
sum.extent(0); ++i)
230 for (std::size_t d = 0; d <
values.size(); ++d)
237template<
typename EvalT,
typename TRAITS,
typename Tag0,
typename Tag1>
239SumStatic(
const Teuchos::ParameterList& p)
241 std::string sum_name = p.get<std::string>(
"Sum Name");
242 Teuchos::RCP<std::vector<std::string> > value_names =
243 p.get<Teuchos::RCP<std::vector<std::string> > >(
"Values Names");
244 Teuchos::RCP<PHX::DataLayout> data_layout =
245 p.get< Teuchos::RCP<PHX::DataLayout> >(
"Data Layout");
248 if(p.isType<Teuchos::RCP<
const std::vector<double> > >(
"Scalars")) {
249 Teuchos::RCP<const std::vector<double> > scalar_values
250 = p.get<Teuchos::RCP<const std::vector<double> > >(
"Scalars");
253 TEUCHOS_ASSERT(scalar_values->size()==value_names->size());
256 PHX::View<double*> scalars_nc = PHX::View<double*>(
"scalars",scalar_values->size());
258 for(std::size_t i=0;i<scalar_values->size();i++)
259 scalars_nc(i) = (*scalar_values)[i];
268 TEUCHOS_ASSERT(data_layout->rank()==2);
270 sum = PHX::MDField<ScalarT,Tag0,Tag1>(sum_name, data_layout);
272 this->addEvaluatedField(
sum);
274 values.resize(value_names->size());
275 for (std::size_t i=0; i < value_names->size(); ++i) {
276 values[i] = PHX::MDField<const ScalarT,Tag0,Tag1>( (*value_names)[i], data_layout);
277 this->addDependentField(
values[i]);
282 std::string n =
"SumStatic Rank 2 Evaluator";
288template<
typename EvalT,
typename TRAITS,
typename Tag0,
typename Tag1>
290SumStatic(
const std::vector<PHX::Tag<typename EvalT::ScalarT>> & inputs,
291 const std::vector<double> & scalar_values,
292 const PHX::Tag<typename EvalT::ScalarT> & output)
294 TEUCHOS_ASSERT(scalar_values.size()==inputs.size());
303 PHX::View<double*> scalars_nc = PHX::View<double*>(
"scalars",scalar_values.size());
305 for(std::size_t i=0;i<scalar_values.size();i++)
306 scalars_nc(i) = scalar_values[i];
315 this->addEvaluatedField(
sum);
317 values.resize(inputs.size());
318 for (std::size_t i=0; i < inputs.size(); ++i) {
320 this->addDependentField(
values[i]);
325 std::string n =
"SumStatic Rank 2 Evaluator";
331template<
typename EvalT,
typename TRAITS,
typename Tag0,
typename Tag1>
336 for (std::size_t i=0; i <
values.size(); ++i)
342template<
typename EvalT,
typename TRAITS,
typename Tag0,
typename Tag1>
350 Kokkos::parallel_for(Kokkos::RangePolicy<PHX::ExecutionSpace,ScalarsTag>(0,
sum.extent(0)), *
this);
352 Kokkos::parallel_for(Kokkos::RangePolicy<PHX::ExecutionSpace,NoScalarsTag>(0,
sum.extent(0)), *
this);
357template<
typename EvalT,
typename TRAITS,
typename Tag0,
typename Tag1>
358KOKKOS_INLINE_FUNCTION
363 for (
int j = 0; j <
sum.extent_int(1); ++j)
370template<
typename EvalT,
typename TRAITS,
typename Tag0,
typename Tag1>
371KOKKOS_INLINE_FUNCTION
376 for (
int j = 0; j <
sum.extent_int(1); ++j)
434template<
typename EvalT,
typename TRAITS,
typename Tag0,
typename Tag1,
typename Tag2>
435Teuchos::RCP<PHX::Evaluator<TRAITS> >
437 const std::vector<std::string> & value_names,
438 const Teuchos::RCP<PHX::DataLayout> & data_layout)
440 Teuchos::ParameterList p;
441 p.set<std::string>(
"Sum Name",sum_name);
442 p.set<Teuchos::RCP<std::vector<std::string> > >(
"Values Names",Teuchos::rcp(
new std::vector<std::string>(value_names)));
443 p.set< Teuchos::RCP<PHX::DataLayout> >(
"Data Layout",data_layout);
PHX::View< const double * > scalars
static const int MAX_VALUES
KOKKOS_INLINE_FUNCTION void operator()(PanzerSumTag< RANK >, const int &i) const
PHX::MDField< const ScalarT > values[MAX_VALUES]
Sum(const Teuchos::ParameterList &p)
std::size_t cell_data_size
typename EvalT::ScalarT ScalarT
void evaluateFields(typename Traits::EvalData d)
PHX::MDField< ScalarT > sum
void postRegistrationSetup(typename Traits::SetupData d, PHX::FieldManager< Traits > &fm)
PHX::View< const double * > scalars
std::vector< PHX::MDField< const ScalarT, Tag0, Tag1 > > values
PHX::View< const ScalarT ** > value_views[MAX_VALUES]
SumStatic(const Teuchos::ParameterList &p)
PHX::MDField< ScalarT, Tag0, Tag1 > sum
PHX::MDField< ScalarT, Tag0 > sum
std::vector< PHX::MDField< const ScalarT, Tag0 > > values
SumStatic(const Teuchos::ParameterList &p)
void evaluateFields(typename TRAITS::EvalData d)
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)
const panzer::Workset & EvalData
Data type passed to PHX::Evaluator::evaluateFields(): a single workset holding the cell data for one ...
const SD & SetupData
Data type passed to PHX::Evaluator::postRegistrationSetup().