Panzer  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Panzer_Sum_impl.hpp
Go to the documentation of this file.
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Panzer: A partial differential equation assembly
5 // engine for strongly coupled complex multiphysics systems
6 // Copyright (2011) Sandia Corporation
7 //
8 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9 // the U.S. Government retains certain rights in this software.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact Roger P. Pawlowski (rppawlo@sandia.gov) and
39 // Eric C. Cyr (eccyr@sandia.gov)
40 // ***********************************************************************
41 // @HEADER
42 
43 #ifndef PANZER_SUM_IMPL_HPP
44 #define PANZER_SUM_IMPL_HPP
45 
46 #include <cstddef>
47 #include <string>
48 #include <vector>
49 
50 namespace panzer {
51 
52 //**********************************************************************
53 template<typename EvalT, typename Traits>
56  const Teuchos::ParameterList& p)
57 {
58  std::string sum_name = p.get<std::string>("Sum Name");
60  p.get<Teuchos::RCP<std::vector<std::string> > >("Values Names");
61  Teuchos::RCP<PHX::DataLayout> data_layout =
62  p.get< Teuchos::RCP<PHX::DataLayout> >("Data Layout");
63 
64  TEUCHOS_ASSERT(static_cast<int>(value_names->size()) < MAX_VALUES);
65 
66  // check if the user wants to scale each term independently
67  auto local_scalars = PHX::View<double *>("scalars",value_names->size());
68  auto local_scalars_host = Kokkos::create_mirror_view(local_scalars);
69  if(p.isType<Teuchos::RCP<const std::vector<double> > >("Scalars")) {
70  auto scalars_v = *p.get<Teuchos::RCP<const std::vector<double> > >("Scalars");
71 
72  // safety/sanity check
73  TEUCHOS_ASSERT(scalars_v.size()==value_names->size());
74 
75  for (std::size_t i=0; i < value_names->size(); ++i)
76  local_scalars_host(i) = scalars_v[i];
77  }
78  else {
79  for (std::size_t i=0; i < value_names->size(); ++i)
80  local_scalars_host(i) = 1.0;
81  }
82  Kokkos::deep_copy(local_scalars,local_scalars_host);
83 
84  scalars = local_scalars;
85 
86  sum = PHX::MDField<ScalarT>(sum_name, data_layout);
87 
88  this->addEvaluatedField(sum);
89 
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]);
93  }
94  /*
95  values.resize(value_names->size());
96  for (std::size_t i=0; i < value_names->size(); ++i) {
97  values[i] = PHX::MDField<const ScalarT>( (*value_names)[i], data_layout);
98  this->addDependentField(values[i]);
99  }
100  */
101 
102  std::string n = "Sum Evaluator";
103  this->setName(n);
104 }
105 
106 //**********************************************************************
107 template<typename EvalT, typename Traits>
108 void
111  typename Traits::SetupData /* worksets */,
112  PHX::FieldManager<Traits>& /* fm */)
113 {
114  cell_data_size = sum.size() / sum.fieldTag().dataLayout().extent(0);
115 }
116 
117 
118 //**********************************************************************
119 template<typename EvalT, typename TRAITS>
120 template<unsigned int RANK>
121 KOKKOS_INLINE_FUNCTION
123  auto num_vals = scalars.extent(0);
124 
125 
126  if (RANK == 1 )
127  {
128  for (std::size_t iv = 0; iv < num_vals; ++iv)
129  sum(i) += scalars(iv)*(values[iv](i));
130  }
131  else if (RANK == 2)
132  {
133  const size_t dim_1 = sum.extent(1);
134  for (std::size_t j = 0; j < dim_1; ++j)
135  for (std::size_t iv = 0; iv < num_vals; ++iv)
136  sum(i,j) += scalars(iv)*(values[iv](i,j));
137  }
138  else if (RANK == 3)
139  {
140  const size_t dim_1 = sum.extent(1),dim_2 = sum.extent(2);
141  for (std::size_t j = 0; j < dim_1; ++j)
142  for (std::size_t k = 0; k < dim_2; ++k)
143  for (std::size_t iv = 0; iv < num_vals; ++iv)
144  sum(i,j,k) += scalars(iv)*(values[iv](i,j,k));
145  }
146  else if (RANK == 4)
147  {
148  const size_t dim_1 = sum.extent(1),dim_2 = sum.extent(2),dim_3 = sum.extent(3);
149  for (std::size_t j = 0; j < dim_1; ++j)
150  for (std::size_t k = 0; k < dim_2; ++k)
151  for (std::size_t l = 0; l < dim_3; ++l)
152  for (std::size_t iv = 0; iv < num_vals; ++iv)
153  sum(i,j,k,l) += scalars(iv)*(values[iv](i,j,k,l));
154  }
155  else if (RANK == 5)
156  {
157  const size_t dim_1 = sum.extent(1),dim_2 = sum.extent(2),dim_3 = sum.extent(3),dim_4 = sum.extent(4);
158  for (std::size_t j = 0; j < dim_1; ++j)
159  for (std::size_t k = 0; k < dim_2; ++k)
160  for (std::size_t l = 0; l < dim_3; ++l)
161  for (std::size_t m = 0; m < dim_4; ++m)
162  for (std::size_t iv = 0; iv < num_vals; ++iv)
163  sum(i,j,k,l,m) += scalars(iv)*(values[iv](i,j,k,l,m));
164  }
165  else if (RANK == 6)
166  {
167  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);
168  for (std::size_t j = 0; j < dim_1; ++j)
169  for (std::size_t k = 0; k < dim_2; ++k)
170  for (std::size_t l = 0; l < dim_3; ++l)
171  for (std::size_t m = 0; m < dim_4; ++m)
172  for (std::size_t n = 0; n < dim_5; ++n)
173  for (std::size_t iv = 0; iv < num_vals; ++iv)
174  sum(i,j,k,l,m,n) += scalars(iv)*(values[iv](i,j,k,l,m,n));
175  }
176 }
177 
178 //**********************************************************************
179 template<typename EvalT, typename Traits>
180 void
183  typename Traits::EvalData /* workset */)
184 {
185 
186  sum.deep_copy(ScalarT(0.0));
187 
188  size_t rank = sum.rank();
189  const size_t length = sum.extent(0);
190  if (rank == 1 )
191  {
192  Kokkos::parallel_for(Kokkos::RangePolicy<PanzerSumTag<1> >(0, length), *this);
193  }
194  else if (rank == 2)
195  {
196  Kokkos::parallel_for(Kokkos::RangePolicy<PanzerSumTag<2> >(0, length), *this);
197  }
198  else if (rank == 3)
199  {
200  Kokkos::parallel_for(Kokkos::RangePolicy<PanzerSumTag<3> >(0, length), *this);
201  }
202  else if (rank == 4)
203  {
204  Kokkos::parallel_for(Kokkos::RangePolicy<PanzerSumTag<4> >(0, length), *this);
205  }
206  else if (rank == 5)
207  {
208  Kokkos::parallel_for(Kokkos::RangePolicy<PanzerSumTag<5> >(0, length), *this);
209  }
210  else if (rank == 6)
211  {
212  Kokkos::parallel_for(Kokkos::RangePolicy<PanzerSumTag<6> >(0, length), *this);
213  }
214  else
215  {
216  TEUCHOS_TEST_FOR_EXCEPTION(true, std::runtime_error, "ERROR: rank of sum is higher than supported");
217  }
218 }
219 
220 
221 //**********************************************************************
222 //**********************************************************************
223 // Sum Static
224 //**********************************************************************
225 //**********************************************************************
226 
227 template<typename EvalT, typename TRAITS,typename Tag0>
230 {
231  std::string sum_name = p.get<std::string>("Sum Name");
233  p.get<Teuchos::RCP<std::vector<std::string> > >("Values Names");
234  Teuchos::RCP<PHX::DataLayout> data_layout =
235  p.get< Teuchos::RCP<PHX::DataLayout> >("Data Layout");
236 
237  // sanity check
238  TEUCHOS_ASSERT(data_layout->rank()==1);
239 
240  sum = PHX::MDField<ScalarT,Tag0>(sum_name, data_layout);
241 
242  this->addEvaluatedField(sum);
243 
244  values.resize(value_names->size());
245  for (std::size_t i=0; i < value_names->size(); ++i) {
246  values[i] = PHX::MDField<const ScalarT,Tag0>( (*value_names)[i], data_layout);
247  this->addDependentField(values[i]);
248  }
249 
250  std::string n = "SumStatic Rank 1 Evaluator";
251  this->setName(n);
252 }
253 
254 //**********************************************************************
255 
256 template<typename EvalT, typename TRAITS,typename Tag0>
258 evaluateFields(typename TRAITS::EvalData /* d */)
259 {
260  sum.deep_copy(ScalarT(0.0));
261  for (std::size_t i = 0; i < sum.extent(0); ++i)
262  for (std::size_t d = 0; d < values.size(); ++d)
263  sum(i) += (values[d])(i);
264 }
265 
266 //**********************************************************************
267 //**********************************************************************
268 
269 template<typename EvalT, typename TRAITS,typename Tag0,typename Tag1>
272 {
273  std::string sum_name = p.get<std::string>("Sum Name");
275  p.get<Teuchos::RCP<std::vector<std::string> > >("Values Names");
276  Teuchos::RCP<PHX::DataLayout> data_layout =
277  p.get< Teuchos::RCP<PHX::DataLayout> >("Data Layout");
278 
279  // check if the user wants to scale each term independently
280  if(p.isType<Teuchos::RCP<const std::vector<double> > >("Scalars")) {
282  = p.get<Teuchos::RCP<const std::vector<double> > >("Scalars");
283 
284  // safety/sanity check
285  TEUCHOS_ASSERT(scalar_values->size()==value_names->size());
286  useScalars = true;
287 
288  PHX::View<double*> scalars_nc = PHX::View<double*>("scalars",scalar_values->size());
289 
290  for(std::size_t i=0;i<scalar_values->size();i++)
291  scalars_nc(i) = (*scalar_values)[i];
292 
293  scalars = scalars_nc;
294  }
295  else {
296  useScalars = false;
297  }
298 
299  // sanity check
300  TEUCHOS_ASSERT(data_layout->rank()==2);
301 
302  sum = PHX::MDField<ScalarT,Tag0,Tag1>(sum_name, data_layout);
303 
304  this->addEvaluatedField(sum);
305 
306  values.resize(value_names->size());
307  for (std::size_t i=0; i < value_names->size(); ++i) {
308  values[i] = PHX::MDField<const ScalarT,Tag0,Tag1>( (*value_names)[i], data_layout);
309  this->addDependentField(values[i]);
310  }
311  numValues = value_names->size();
312  TEUCHOS_ASSERT(numValues<=MAX_VALUES);
313 
314  std::string n = "SumStatic Rank 2 Evaluator";
315  this->setName(n);
316 }
317 
318 //**********************************************************************
319 
320 template<typename EvalT, typename TRAITS,typename Tag0,typename Tag1>
322 SumStatic(const std::vector<PHX::Tag<typename EvalT::ScalarT>> & inputs,
323  const std::vector<double> & scalar_values,
324  const PHX::Tag<typename EvalT::ScalarT> & output)
325 {
326  TEUCHOS_ASSERT(scalar_values.size()==inputs.size());
327 
328  // check if the user wants to scale each term independently
329  if(scalars.size()==0) {
330  useScalars = false;
331  }
332  else {
333  useScalars = true;
334 
335  PHX::View<double*> scalars_nc = PHX::View<double*>("scalars",scalar_values.size());
336 
337  for(std::size_t i=0;i<scalar_values.size();i++)
338  scalars_nc(i) = scalar_values[i];
339 
340  scalars = scalars_nc;
341  }
342 
343  // sanity check
344  TEUCHOS_ASSERT(inputs.size()<=MAX_VALUES);
345 
346  sum = output;
347  this->addEvaluatedField(sum);
348 
349  values.resize(inputs.size());
350  for (std::size_t i=0; i < inputs.size(); ++i) {
351  values[i] = inputs[i];
352  this->addDependentField(values[i]);
353  }
354 
355  numValues = inputs.size();
356 
357  std::string n = "SumStatic Rank 2 Evaluator";
358  this->setName(n);
359 }
360 
361 //**********************************************************************
362 
363 template<typename EvalT, typename TRAITS,typename Tag0,typename Tag1>
365 postRegistrationSetup(typename TRAITS::SetupData /* d */,
366  PHX::FieldManager<TRAITS>& /* fm */)
367 {
368  for (std::size_t i=0; i < values.size(); ++i)
369  value_views[i] = values[i].get_static_view();
370 }
371 
372 //**********************************************************************
373 
374 template<typename EvalT, typename TRAITS,typename Tag0,typename Tag1>
376 evaluateFields(typename TRAITS::EvalData /* d */)
377 {
378  sum.deep_copy(ScalarT(0.0));
379 
380  // Kokkos::parallel_for(sum.extent(0), *this);
381  if(useScalars)
382  Kokkos::parallel_for(Kokkos::RangePolicy<PHX::Device,ScalarsTag>(0,sum.extent(0)), *this);
383  else
384  Kokkos::parallel_for(Kokkos::RangePolicy<PHX::Device,NoScalarsTag>(0,sum.extent(0)), *this);
385 }
386 
387 //**********************************************************************
388 
389 template<typename EvalT, typename TRAITS,typename Tag0,typename Tag1>
390 KOKKOS_INLINE_FUNCTION
392 operator()(const ScalarsTag, const unsigned c ) const
393 {
394  for (int i=0;i<numValues;i++) {
395  for (int j = 0; j < sum.extent_int(1); ++j)
396  sum(c,j) += scalars(i)*value_views[i](c,j);
397  }
398 }
399 
400 //**********************************************************************
401 
402 template<typename EvalT, typename TRAITS,typename Tag0,typename Tag1>
403 KOKKOS_INLINE_FUNCTION
405 operator()(const NoScalarsTag, const unsigned c ) const
406 {
407  for (int i=0;i<numValues;i++) {
408  for (int j = 0; j < sum.extent_int(1); ++j)
409  sum(c,j) += value_views[i](c,j);
410  }
411 }
412 
413 
414 //**********************************************************************
415 //**********************************************************************
416 
417 /*
418 template<typename EvalT, typename TRAITS,typename Tag0,typename Tag1,typename Tag2>
419 SumStatic<EvalT,TRAITS,Tag0,Tag1,Tag2>::
420 SumStatic(const Teuchos::ParameterList& p)
421 {
422  std::string sum_name = p.get<std::string>("Sum Name");
423  Teuchos::RCP<std::vector<std::string> > value_names =
424  p.get<Teuchos::RCP<std::vector<std::string> > >("Values Names");
425  Teuchos::RCP<PHX::DataLayout> data_layout =
426  p.get< Teuchos::RCP<PHX::DataLayout> >("Data Layout");
427 
428  // sanity check
429  TEUCHOS_ASSERT(data_layout->rank()==3);
430 
431  sum = PHX::MDField<ScalarT,Tag0,Tag1,Tag2>(sum_name, data_layout);
432 
433  this->addEvaluatedField(sum);
434 
435  values.resize(value_names->size());
436  for (std::size_t i=0; i < value_names->size(); ++i) {
437  values[i] = PHX::MDField<ScalarT,Tag0,Tag1,Tag2>( (*value_names)[i], data_layout);
438  this->addDependentField(values[i]);
439  }
440 
441  std::string n = "Sum Evaluator";
442  this->setName(n);
443 }
444 */
445 
446 //**********************************************************************
447 
448 /*
449 template<typename EvalT, typename TRAITS,typename Tag0,typename Tag1,typename Tag2>
450 void SumStatic<EvalT,TRAITS,Tag0,Tag1,Tag2>::
451 evaluateFields(typename TRAITS::EvalData d)
452 {
453  sum.deep_copy(ScalarT(0.0));
454 
455  for (std::size_t d = 0; d < values.size(); ++d)
456  for (std::size_t i = 0; i < sum.extent(0); ++i)
457  for (std::size_t j = 0; j < sum.extent(1); ++j)
458  for (std::size_t k = 0; k < sum.extent(2); ++k)
459  sum(i,j,k) += (values[d])(i);
460 }
461 */
462 
463 //**********************************************************************
464 //**********************************************************************
465 
466 template<typename EvalT, typename TRAITS,typename Tag0,typename Tag1,typename Tag2>
468 buildStaticSumEvaluator(const std::string & sum_name,
469  const std::vector<std::string> & value_names,
470  const Teuchos::RCP<PHX::DataLayout> & data_layout)
471 {
473  p.set<std::string>("Sum Name",sum_name);
474  p.set<Teuchos::RCP<std::vector<std::string> > >("Values Names",Teuchos::rcp(new std::vector<std::string>(value_names)));
475  p.set< Teuchos::RCP<PHX::DataLayout> >("Data Layout",data_layout);
476 
478 }
479 
480 }
481 
482 #endif
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)
Sum(const Teuchos::ParameterList &p)
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)
EvalT::ScalarT ScalarT
Definition: Panzer_Sum.hpp:120
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
void postRegistrationSetup(typename Traits::SetupData d, PHX::FieldManager< Traits > &fm)
KOKKOS_INLINE_FUNCTION void operator()(PanzerSumTag< RANK >, const int &i) const
SumStatic(const Teuchos::ParameterList &p)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
virtual void postRegistrationSetup(typename Traits::SetupData d, PHX::FieldManager< Traits > &vm)=0
void evaluateFields(typename Traits::EvalData d)
typename EvalT::ScalarT ScalarT
Definition: Panzer_Sum.hpp:88
bool isType(const std::string &name) const
void evaluateFields(typename TRAITS::EvalData d)
#define TEUCHOS_ASSERT(assertion_test)