1 #ifndef INTREPID_ARRAYTOOLSDEFSCALAR_KOKKOS_HPP 2 #define INTREPID_ARRAYTOOLSDEFSCALAR_KOKKOS_HPP 4 #ifdef HAVE_INTREPID_KOKKOSCORE 14 template<
class ViewType,
class ViewType1,
class ViewType2>
15 struct PFor__Recip_Not_Const2_2 {
17 typename ViewType1::const_type inputDataLeft;
18 typename ViewType2::const_type inputDataRight;
19 PFor__Recip_Not_Const2_2(ViewType outputData_, ViewType1 inputDataLeft_,
20 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
22 KOKKOS_INLINE_FUNCTION
23 void operator() (
int i)
const {
24 for(
int j = 0; j < outputData.dimension_1(); j++){
25 outputData(i,j) = inputDataRight(i,j)/inputDataLeft(i,j);
29 template<
class ViewType,
class ViewType1,
class ViewType2>
30 struct PFor_Not_Recip_Not_Const2_2 {
32 typename ViewType1::const_type inputDataLeft;
33 typename ViewType2::const_type inputDataRight;
34 PFor_Not_Recip_Not_Const2_2(ViewType outputData_, ViewType1 inputDataLeft_,
35 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
37 KOKKOS_INLINE_FUNCTION
38 void operator() (
int i)
const {
39 for(
int j = 0; j < outputData.dimension_1(); j++){
40 outputData(i,j) = inputDataRight(i,j)*inputDataLeft(i,j);
44 template<
class ViewType,
class ViewType1,
class ViewType2>
45 struct PFor__Recip__Const2_2 {
47 typename ViewType1::const_type inputDataLeft;
48 typename ViewType2::const_type inputDataRight;
49 PFor__Recip__Const2_2(ViewType outputData_, ViewType1 inputDataLeft_,
50 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
52 KOKKOS_INLINE_FUNCTION
53 void operator() (
int i)
const {
54 for(
int j = 0; j < outputData.dimension_1(); j++){
55 outputData(i,j) = inputDataRight(i,j)/inputDataLeft(i,0);
59 template<
class ViewType,
class ViewType1,
class ViewType2>
60 struct PFor_Not_Recip__Const2_2 {
62 typename ViewType1::const_type inputDataLeft;
63 typename ViewType2::const_type inputDataRight;
64 PFor_Not_Recip__Const2_2(ViewType outputData_, ViewType1 inputDataLeft_,
65 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
67 KOKKOS_INLINE_FUNCTION
68 void operator() (
int i)
const {
69 for(
int j = 0; j < outputData.dimension_1(); j++){
70 outputData(i,j) = inputDataRight(i,j)*inputDataLeft(i,0);
78 template<
class ArrayOutData,
class ArrayInDataLeft,
class ArrayInDataRight,
class Layout,
class MemorySpace>
79 struct ArrayTools::scalarMultiplyDataData2Kokkos<ArrayOutData, ArrayInDataLeft, ArrayInDataRight, Layout, MemorySpace,2,2>{
80 scalarMultiplyDataData2Kokkos(ArrayOutData & outputData,
81 ArrayInDataLeft & inputDataLeft,
82 ArrayInDataRight & inputDataRight,
83 const bool reciprocal){
85 #ifdef HAVE_INTREPID_DEBUG 86 TEUCHOS_TEST_FOR_EXCEPTION( (inputDataLeft.rank() != 2), std::invalid_argument,
87 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Left input data container must have rank 2.");
88 TEUCHOS_TEST_FOR_EXCEPTION( ( (inputDataRight.rank() != 2)), std::invalid_argument,
89 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Right input data container must have rank 2.");
90 TEUCHOS_TEST_FOR_EXCEPTION( (outputData.rank() != inputDataRight.rank()), std::invalid_argument,
91 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Right input and output data containers must have the same rank.");
92 TEUCHOS_TEST_FOR_EXCEPTION( (inputDataRight.dimension(0) != inputDataLeft.dimension(0) ), std::invalid_argument,
93 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Zeroth dimensions (number of integration domains) of the left and right data input containers must agree!");
94 TEUCHOS_TEST_FOR_EXCEPTION( ( (inputDataRight.dimension(1) != inputDataLeft.dimension(1)) && (inputDataLeft.dimension(1) != 1) ), std::invalid_argument,
95 ">>> ERROR (ArrayTools::scalarMultiplyDataData): First dimensions of the left and right data input containers (number of integration points) must agree or first dimension of the left data input container must be 1!");
96 for (
int i=0; i<inputDataRight.rank(); i++) {
97 std::string errmsg =
">>> ERROR (ArrayTools::scalarMultiplyDataData): Dimension ";
98 errmsg += (char)(48+i);
99 errmsg +=
" of the right input and output data containers must agree!";
100 TEUCHOS_TEST_FOR_EXCEPTION( (inputDataRight.dimension(i) != outputData.dimension(i)), std::invalid_argument, errmsg );
108 int numCells = outputData.dimension(0);
109 int numDataPoints = inputDataLeft.dimension(1);
111 if (numDataPoints != 1) {
113 Kokkos::parallel_for(numCells,PFor__Recip_Not_Const2_2<ArrayOutData,ArrayInDataLeft,ArrayInDataRight>(outputData, inputDataLeft,
118 Kokkos::parallel_for(numCells,PFor_Not_Recip_Not_Const2_2<ArrayOutData,ArrayInDataLeft,ArrayInDataRight>(outputData, inputDataLeft,
124 Kokkos::parallel_for(numCells,PFor__Recip__Const2_2<ArrayOutData,ArrayInDataLeft,ArrayInDataRight>(outputData, inputDataLeft,
128 Kokkos::parallel_for(numCells,PFor_Not_Recip__Const2_2<ArrayOutData,ArrayInDataLeft,ArrayInDataRight>(outputData, inputDataLeft,
138 #if defined( KOKKOS_HAVE_CXX11 ) 139 #define VECTOR_LENGTH 32 140 typedef Kokkos::TeamVectorPolicy<8> team_policy;
141 typedef team_policy::member_type team_member ;
144 template<
class ViewType,
class ViewType1,
class ViewType2>
145 struct PFor__Recip_Not_Const3_3 {
147 typename ViewType1::const_type inputDataLeft;
148 typename ViewType2::const_type inputDataRight;
149 PFor__Recip_Not_Const3_3(ViewType outputData_, ViewType1 inputDataLeft_,
150 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
152 KOKKOS_INLINE_FUNCTION
153 void operator() (
const team_member & thread)
const {
154 int i = thread.league_rank();
155 thread.team_par_for(outputData.dimension_1(),[&] (
const int& j){
156 thread.vector_par_for(outputData.dimension_2(),[&] (
const int& k){
157 outputData(i,j,k) = inputDataRight(i,j,k)/inputDataLeft(i,j);
189 template<
class ViewType,
class ViewType1,
class ViewType2>
190 struct PFor_Not_Recip_Not_Const3_3 {
192 typename ViewType1::const_type inputDataLeft;
193 typename ViewType2::const_type inputDataRight;
194 PFor_Not_Recip_Not_Const3_3(ViewType outputData_, ViewType1 inputDataLeft_,
195 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
197 KOKKOS_INLINE_FUNCTION
198 void operator() (
int i)
const {
199 for(
int j = 0; j < outputData.dimension_1(); j++){
200 for(
int k = 0; k < outputData.dimension_2(); k++){
201 outputData(i,j,k) = inputDataRight(i,j,k)*inputDataLeft(i,j);
206 template<
class ViewType,
class ViewType1,
class ViewType2>
207 struct PFor__Recip__Const3_3 {
209 typename ViewType1::const_type inputDataLeft;
210 typename ViewType2::const_type inputDataRight;
211 PFor__Recip__Const3_3(ViewType outputData_, ViewType1 inputDataLeft_,
212 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
214 KOKKOS_INLINE_FUNCTION
215 void operator() (
int i)
const {
216 for(
int j = 0; j < outputData.dimension_1(); j++){
217 for(
int k = 0; k < outputData.dimension_2(); k++){
218 outputData(i,j,k) = inputDataRight(i,j,k)/inputDataLeft(i,0);
224 template<
class ViewType,
class ViewType1,
class ViewType2>
225 struct PFor_Not_Recip__Const3_3 {
227 typename ViewType1::const_type inputDataLeft;
228 typename ViewType2::const_type inputDataRight;
229 PFor_Not_Recip__Const3_3(ViewType outputData_, ViewType1 inputDataLeft_,
230 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
232 KOKKOS_INLINE_FUNCTION
233 void operator() (
int i)
const {
234 for(
int j = 0; j < outputData.dimension_1(); j++){
235 for(
int k = 0; k < outputData.dimension_2(); k++){
236 outputData(i,j,k) = inputDataRight(i,j,k)*inputDataLeft(i,0);
245 template<
class ArrayOutData,
class ArrayInDataLeft,
class ArrayInDataRight,
class Layout,
class MemorySpace>
246 struct ArrayTools::scalarMultiplyDataData2Kokkos<ArrayOutData, ArrayInDataLeft, ArrayInDataRight, Layout, MemorySpace,3,3>{
247 scalarMultiplyDataData2Kokkos(ArrayOutData & outputData,
248 ArrayInDataLeft & inputDataLeft,
249 ArrayInDataRight & inputDataRight,
250 const bool reciprocal){
251 #ifdef HAVE_INTREPID_DEBUG 252 TEUCHOS_TEST_FOR_EXCEPTION( (inputDataLeft.rank() != 2), std::invalid_argument,
253 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Left input data container must have rank 2.");
254 TEUCHOS_TEST_FOR_EXCEPTION( ( (inputDataRight.rank() != 3)), std::invalid_argument,
255 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Right input data container must have rank 3.");
256 TEUCHOS_TEST_FOR_EXCEPTION( (outputData.rank() != inputDataRight.rank()), std::invalid_argument,
257 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Right input and output data containers must have the same rank of 3.");
258 TEUCHOS_TEST_FOR_EXCEPTION( (inputDataRight.dimension(0) != inputDataLeft.dimension(0) ), std::invalid_argument,
259 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Zeroth dimensions (number of integration domains) of the left and right data input containers must agree!");
260 TEUCHOS_TEST_FOR_EXCEPTION( ( (inputDataRight.dimension(1) != inputDataLeft.dimension(1)) && (inputDataLeft.dimension(1) != 1) ), std::invalid_argument,
261 ">>> ERROR (ArrayTools::scalarMultiplyDataData): First dimensions of the left and right data input containers (number of integration points) must agree or first dimension of the left data input container must be 1!");
262 for (
int i=0; i<inputDataRight.rank(); i++) {
263 std::string errmsg =
">>> ERROR (ArrayTools::scalarMultiplyDataData): Dimension ";
264 errmsg += (char)(48+i);
265 errmsg +=
" of the right input and output data containers must agree!";
266 TEUCHOS_TEST_FOR_EXCEPTION( (inputDataRight.dimension(i) != outputData.dimension(i)), std::invalid_argument, errmsg );
274 int numCells = outputData.dimension(0);
275 int numDataPoints = inputDataLeft.dimension(1);
277 if (numDataPoints != 1) {
280 #if defined( KOKKOS_HAVE_CXX11 ) 281 const team_policy policy( numCells , 2 );
282 Kokkos::parallel_for(policy,PFor__Recip_Not_Const3_3<ArrayOutData,ArrayInDataLeft,ArrayInDataRight>(outputData, inputDataLeft, inputDataRight));
287 Kokkos::parallel_for(numCells,PFor_Not_Recip_Not_Const3_3<ArrayOutData,ArrayInDataLeft,ArrayInDataRight>(outputData, inputDataLeft,
295 Kokkos::parallel_for(numCells,PFor__Recip__Const3_3<ArrayOutData,ArrayInDataLeft,ArrayInDataRight >(outputData, inputDataLeft,
300 Kokkos::parallel_for(numCells,PFor_Not_Recip__Const3_3<ArrayOutData,ArrayInDataLeft,ArrayInDataRight >(outputData, inputDataLeft,
309 template<
class ViewType,
class ViewType1,
class ViewType2>
310 struct PFor__Recip_Not_Const4_4 {
312 typename ViewType1::const_type inputDataLeft;
313 typename ViewType2::const_type inputDataRight;
314 PFor__Recip_Not_Const4_4(ViewType outputData_, ViewType1 inputDataLeft_,
315 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
317 KOKKOS_INLINE_FUNCTION
318 void operator() (
int i)
const {
319 for(
int j = 0; j < outputData.dimension_1(); j++){
320 for(
int k = 0; k < outputData.dimension_2(); k++){
321 for(
int l = 0; l < outputData.dimension_3(); l++){
322 outputData(i,j,k,l) = inputDataRight(i,j,k,l)/inputDataLeft(i,j);
328 template<
class ViewType,
class ViewType1,
class ViewType2>
329 struct PFor_Not_Recip_Not_Const4_4 {
331 typename ViewType1::const_type inputDataLeft;
332 typename ViewType2::const_type inputDataRight;
333 PFor_Not_Recip_Not_Const4_4(ViewType outputData_, ViewType1 inputDataLeft_,
334 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
336 KOKKOS_INLINE_FUNCTION
337 void operator() (
int i)
const {
338 for(
int j = 0; j < outputData.dimension_1(); j++){
339 for(
int k = 0; k < outputData.dimension_2(); k++){
340 for(
int l = 0; l < outputData.dimension_3(); l++){
341 outputData(i,j,k,l) = inputDataRight(i,j,k,l)*inputDataLeft(i,j);
347 template<
class ViewType,
class ViewType1,
class ViewType2>
348 struct PFor__Recip__Const4_4 {
350 typename ViewType1::const_type inputDataLeft;
351 typename ViewType2::const_type inputDataRight;
352 PFor__Recip__Const4_4(ViewType outputData_, ViewType1 inputDataLeft_,
353 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
355 KOKKOS_INLINE_FUNCTION
356 void operator() (
int i)
const {
357 for(
int j = 0; j < outputData.dimension_1(); j++){
358 for(
int k = 0; k < outputData.dimension_2(); k++){
359 for(
int l = 0; l < outputData.dimension_3(); l++){
360 outputData(i,j,k,l) = inputDataRight(i,j,k,l)/inputDataLeft(i,0);
366 template<
class ViewType,
class ViewType1,
class ViewType2>
367 struct PFor_Not_Recip__Const4_4 {
369 typename ViewType1::const_type inputDataLeft;
370 typename ViewType2::const_type inputDataRight;
371 PFor_Not_Recip__Const4_4(ViewType outputData_, ViewType1 inputDataLeft_,
372 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
374 KOKKOS_INLINE_FUNCTION
375 void operator() (
int i)
const {
376 for(
int j = 0; j < outputData.dimension_1(); j++){
377 for(
int k = 0; k < outputData.dimension_2(); k++){
378 for(
int l = 0; l < outputData.dimension_3(); l++){
379 outputData(i,j,k,l) = inputDataRight(i,j,k,l)/inputDataLeft(i,0);
390 template<
class ArrayOutData,
class ArrayInDataLeft,
class ArrayInDataRight,
class Layout,
class MemorySpace>
391 struct ArrayTools::scalarMultiplyDataData2Kokkos<ArrayOutData, ArrayInDataLeft, ArrayInDataRight, Layout, MemorySpace,4,4>{
392 scalarMultiplyDataData2Kokkos(ArrayOutData& outputData,
393 ArrayInDataLeft& inputDataLeft,
394 ArrayInDataRight& inputDataRight,
395 const bool reciprocal){
396 #ifdef HAVE_INTREPID_DEBUG 397 TEUCHOS_TEST_FOR_EXCEPTION( (inputDataLeft.rank() != 2), std::invalid_argument,
398 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Left input data container must have rank 2.");
399 TEUCHOS_TEST_FOR_EXCEPTION( ( (inputDataRight.rank() != 4)), std::invalid_argument,
400 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Right input data container must have rank 4.");
401 TEUCHOS_TEST_FOR_EXCEPTION( (outputData.rank() != inputDataRight.rank()), std::invalid_argument,
402 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Right input and output data containers must have the same rank of 4.");
403 TEUCHOS_TEST_FOR_EXCEPTION( (inputDataRight.dimension(0) != inputDataLeft.dimension(0) ), std::invalid_argument,
404 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Zeroth dimensions (number of integration domains) of the left and right data input containers must agree!");
405 TEUCHOS_TEST_FOR_EXCEPTION( ( (inputDataRight.dimension(1) != inputDataLeft.dimension(1)) && (inputDataLeft.dimension(1) != 1) ), std::invalid_argument,
406 ">>> ERROR (ArrayTools::scalarMultiplyDataData): First dimensions of the left and right data input containers (number of integration points) must agree or first dimension of the left data input container must be 1!");
407 for (
int i=0; i<inputDataRight.rank(); i++) {
408 std::string errmsg =
">>> ERROR (ArrayTools::scalarMultiplyDataData): Dimension ";
409 errmsg += (char)(48+i);
410 errmsg +=
" of the right input and output data containers must agree!";
411 TEUCHOS_TEST_FOR_EXCEPTION( (inputDataRight.dimension(i) != outputData.dimension(i)), std::invalid_argument, errmsg );
418 int numCells = outputData.dimension(0);
419 int numDataPoints = inputDataLeft.dimension(1);
421 if (numDataPoints != 1) {
423 Kokkos::parallel_for(numCells,PFor__Recip_Not_Const4_4<ArrayOutData,ArrayInDataLeft,ArrayInDataRight>(outputData, inputDataLeft,
427 Kokkos::parallel_for(numCells,PFor_Not_Recip_Not_Const4_4<ArrayOutData,ArrayInDataLeft,ArrayInDataRight >(outputData, inputDataLeft,
435 Kokkos::parallel_for(numCells,PFor__Recip__Const4_4<ArrayOutData,ArrayInDataLeft,ArrayInDataRight>(outputData, inputDataLeft,
439 Kokkos::parallel_for(numCells,PFor_Not_Recip__Const4_4<ArrayOutData,ArrayInDataLeft,ArrayInDataRight >(outputData, inputDataLeft,
449 template<
class ViewType,
class ViewType1,
class ViewType2>
450 struct PFor__Recip_Not_Const1_2 {
452 typename ViewType1::const_type inputDataLeft;
453 typename ViewType2::const_type inputDataRight;
454 PFor__Recip_Not_Const1_2(ViewType outputData_, ViewType1 inputDataLeft_,
455 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
457 KOKKOS_INLINE_FUNCTION
458 void operator() (
int i)
const {
459 for(
int j = 0; j < outputData.dimension_1(); j++){
460 outputData(i,j) = inputDataRight(j)/inputDataLeft(i,j);
464 template<
class ViewType,
class ViewType1,
class ViewType2>
465 struct PFor_Not_Recip_Not_Const1_2 {
467 typename ViewType1::const_type inputDataLeft;
468 typename ViewType2::const_type inputDataRight;
469 PFor_Not_Recip_Not_Const1_2(ViewType outputData_, ViewType1 inputDataLeft_,
470 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
472 KOKKOS_INLINE_FUNCTION
473 void operator() (
int i)
const {
474 for(
int j = 0; j < outputData.dimension_1(); j++){
475 outputData(i,j) = inputDataRight(j)*inputDataLeft(i,j);
479 template<
class ViewType,
class ViewType1,
class ViewType2>
480 struct PFor__Recip__Const1_2 {
482 typename ViewType1::const_type inputDataLeft;
483 typename ViewType2::const_type inputDataRight;
484 PFor__Recip__Const1_2(ViewType outputData_, ViewType1 inputDataLeft_,
485 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
487 KOKKOS_INLINE_FUNCTION
488 void operator() (
int i)
const {
489 for(
int j = 0; j < outputData.dimension_1(); j++){
490 outputData(i,j) = inputDataRight(j)/inputDataLeft(i,0);
494 template<
class ViewType,
class ViewType1,
class ViewType2>
495 struct PFor_Not_Recip__Const1_2 {
497 typename ViewType1::const_type inputDataLeft;
498 typename ViewType2::const_type inputDataRight;
499 PFor_Not_Recip__Const1_2(ViewType outputData_, ViewType1 inputDataLeft_,
500 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
502 KOKKOS_INLINE_FUNCTION
503 void operator() (
int i)
const {
504 for(
int j = 0; j < outputData.dimension_1(); j++){
505 outputData(i,j) = inputDataRight(j)*inputDataLeft(i,0);
513 template<
class ArrayOutData,
class ArrayInDataLeft,
class ArrayInDataRight,
class Layout,
class MemorySpace>
514 struct ArrayTools::scalarMultiplyDataData2Kokkos<ArrayOutData, ArrayInDataLeft, ArrayInDataRight, Layout, MemorySpace,1,2>{
515 scalarMultiplyDataData2Kokkos(ArrayOutData& outputData,
516 ArrayInDataLeft& inputDataLeft,
517 ArrayInDataRight& inputDataRight,
518 const bool reciprocal){
519 #ifdef HAVE_INTREPID_DEBUG 520 TEUCHOS_TEST_FOR_EXCEPTION( (inputDataLeft.rank() != 2), std::invalid_argument,
521 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Left input data container must have rank 2.");
522 TEUCHOS_TEST_FOR_EXCEPTION( ( (inputDataRight.rank() != 1) ), std::invalid_argument,
523 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Right input data container must have rank 1.");
524 TEUCHOS_TEST_FOR_EXCEPTION( (outputData.rank() != inputDataRight.rank()+1), std::invalid_argument,
525 ">>> ERROR (ArrayTools::scalarMultiplyDataData): The rank of the right input data container must be one less than the rank of the output data container.");
526 TEUCHOS_TEST_FOR_EXCEPTION( ( (inputDataRight.dimension(0) != inputDataLeft.dimension(1)) && (inputDataLeft.dimension(1) != 1) ), std::invalid_argument,
527 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Zeroth dimension of the right input data container and first dimension of the left data input container (number of integration points) must agree or first dimension of the left data input container must be 1!");
528 TEUCHOS_TEST_FOR_EXCEPTION( ( inputDataLeft.dimension(0) != outputData.dimension(0) ), std::invalid_argument,
529 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Zeroth dimensions of data output and left data input containers (number of integration domains) must agree!");
530 for (
int i=0; i<inputDataRight.rank(); i++) {
531 std::string errmsg =
">>> ERROR (ArrayTools::scalarMultiplyDataData): Dimensions ";
532 errmsg += (char)(48+i);
534 errmsg += (char)(48+i+1);
535 errmsg +=
" of the right input and output data containers must agree!";
536 TEUCHOS_TEST_FOR_EXCEPTION( (inputDataRight.dimension(i) != outputData.dimension(i+1)), std::invalid_argument, errmsg );
541 int numCells = outputData.dimension(0);
542 int numDataPoints = inputDataLeft.dimension(1);
544 if (numDataPoints != 1) {
546 Kokkos::parallel_for(numCells,PFor__Recip_Not_Const1_2<ArrayOutData,ArrayInDataLeft,ArrayInDataRight >(outputData, inputDataLeft,
550 Kokkos::parallel_for(numCells,PFor_Not_Recip_Not_Const1_2<ArrayOutData,ArrayInDataLeft,ArrayInDataRight>(outputData, inputDataLeft,
556 Kokkos::parallel_for(numCells,PFor__Recip__Const1_2<ArrayOutData,ArrayInDataLeft,ArrayInDataRight>(outputData, inputDataLeft,
560 Kokkos::parallel_for(numCells,PFor_Not_Recip__Const1_2<ArrayOutData,ArrayInDataLeft,ArrayInDataRight>(outputData, inputDataLeft,
568 template<
class ViewType,
class ViewType1,
class ViewType2>
569 struct PFor__Recip_Not_Const2_3 {
571 typename ViewType1::const_type inputDataLeft;
572 typename ViewType2::const_type inputDataRight;
573 PFor__Recip_Not_Const2_3(ViewType outputData_, ViewType1 inputDataLeft_,
574 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
576 KOKKOS_INLINE_FUNCTION
577 void operator() (
int i)
const {
579 for(
int j = 0; j < outputData.dimension_1(); j++){
580 for(
int k = 0; k < outputData.dimension_2(); k++){
581 outputData(i,j,k) = inputDataRight(j,k)/inputDataLeft(i,j);
586 template<
class ViewType,
class ViewType1,
class ViewType2>
587 struct PFor_Not_Recip_Not_Const2_3 {
589 typename ViewType1::const_type inputDataLeft;
590 typename ViewType2::const_type inputDataRight;
591 PFor_Not_Recip_Not_Const2_3(ViewType outputData_, ViewType1 inputDataLeft_,
592 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
594 KOKKOS_INLINE_FUNCTION
595 void operator() (
int i)
const {
596 for(
int j = 0; j < outputData.dimension_1(); j++){
597 for(
int k = 0; k < outputData.dimension_2(); k++){
598 outputData(i,j,k) = inputDataRight(j,k)*inputDataLeft(i,j);
603 template<
class ViewType,
class ViewType1,
class ViewType2>
604 struct PFor__Recip__Const2_3 {
606 typename ViewType1::const_type inputDataLeft;
607 typename ViewType2::const_type inputDataRight;
608 PFor__Recip__Const2_3(ViewType outputData_, ViewType1 inputDataLeft_,
609 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
611 KOKKOS_INLINE_FUNCTION
612 void operator() (
int i)
const {
613 for(
int j = 0; j < outputData.dimension_1(); j++){
614 for(
int k = 0; k < outputData.dimension_2(); k++){
615 outputData(i,j,k) = inputDataRight(j,k)/inputDataLeft(i,0);
620 template<
class ViewType,
class ViewType1,
class ViewType2>
621 struct PFor_Not_Recip__Const2_3 {
623 typename ViewType1::const_type inputDataLeft;
624 typename ViewType2::const_type inputDataRight;
625 PFor_Not_Recip__Const2_3(ViewType outputData_, ViewType1 inputDataLeft_,
626 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
628 KOKKOS_INLINE_FUNCTION
629 void operator() (
int i)
const {
630 for(
int j = 0; j < outputData.dimension_1(); j++){
631 for(
int k = 0; k < outputData.dimension_2(); k++){
632 outputData(i,j,k) = inputDataRight(j,k)*inputDataLeft(i,0);
641 template<
class ArrayOutData,
class ArrayInDataLeft,
class ArrayInDataRight,
class Layout,
class MemorySpace>
642 struct ArrayTools::scalarMultiplyDataData2Kokkos<ArrayOutData, ArrayInDataLeft, ArrayInDataRight, Layout, MemorySpace,2,3>{
643 scalarMultiplyDataData2Kokkos(ArrayOutData& outputData,
644 ArrayInDataLeft& inputDataLeft,
645 ArrayInDataRight& inputDataRight,
646 const bool reciprocal){
648 #ifdef HAVE_INTREPID_DEBUG 649 TEUCHOS_TEST_FOR_EXCEPTION( (inputDataLeft.rank() != 2), std::invalid_argument,
650 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Left input data container must have rank 2.");
651 TEUCHOS_TEST_FOR_EXCEPTION( ( (inputDataRight.rank() != 2) ), std::invalid_argument,
652 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Right input data container must have rank 2.");
653 TEUCHOS_TEST_FOR_EXCEPTION( (outputData.rank() != inputDataRight.rank()+1), std::invalid_argument,
654 ">>> ERROR (ArrayTools::scalarMultiplyDataData): The rank of the right input data container must be one less than the rank of the output data container.");
655 TEUCHOS_TEST_FOR_EXCEPTION( ( (inputDataRight.dimension(0) != inputDataLeft.dimension(1)) && (inputDataLeft.dimension(1) != 1) ), std::invalid_argument,
656 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Zeroth dimension of the right input data container and first dimension of the left data input container (number of integration points) must agree or first dimension of the left data input container must be 1!");
657 TEUCHOS_TEST_FOR_EXCEPTION( ( inputDataLeft.dimension(0) != outputData.dimension(0) ), std::invalid_argument,
658 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Zeroth dimensions of data output and left data input containers (number of integration domains) must agree!");
659 for (
int i=0; i<inputDataRight.rank(); i++) {
660 std::string errmsg =
">>> ERROR (ArrayTools::scalarMultiplyDataData): Dimensions ";
661 errmsg += (char)(48+i);
663 errmsg += (char)(48+i+1);
664 errmsg +=
" of the right input and output data containers must agree!";
665 TEUCHOS_TEST_FOR_EXCEPTION( (inputDataRight.dimension(i) != outputData.dimension(i+1)), std::invalid_argument, errmsg );
669 int numCells = outputData.dimension(0);
670 int numDataPoints = inputDataLeft.dimension(1);
671 if (numDataPoints != 1) {
673 Kokkos::parallel_for(numCells,PFor__Recip_Not_Const2_3<ArrayOutData,ArrayInDataLeft,ArrayInDataRight>(outputData, inputDataLeft,
677 Kokkos::parallel_for(numCells,PFor_Not_Recip_Not_Const2_3<ArrayOutData,ArrayInDataLeft,ArrayInDataRight>(outputData, inputDataLeft,
683 Kokkos::parallel_for(numCells,PFor__Recip__Const2_3<ArrayOutData,ArrayInDataLeft,ArrayInDataRight>(outputData, inputDataLeft,
687 Kokkos::parallel_for(numCells,PFor_Not_Recip__Const2_3<ArrayOutData,ArrayInDataLeft,ArrayInDataRight>(outputData, inputDataLeft,
696 template<
class ViewType,
class ViewType1,
class ViewType2>
697 struct PFor__Recip_Not_Const3_4 {
699 typename ViewType1::const_type inputDataLeft;
700 typename ViewType2::const_type inputDataRight;
701 PFor__Recip_Not_Const3_4(ViewType outputData_, ViewType1 inputDataLeft_,
702 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
704 KOKKOS_INLINE_FUNCTION
705 void operator() (
int i)
const {
706 for(
int j = 0; j < outputData.dimension_1(); j++){
707 for(
int k = 0; k < outputData.dimension_2(); k++){
708 for(
int l = 0; l < outputData.dimension_3(); l++){
709 outputData(i,j,k,l) = inputDataRight(j,k,l)/inputDataLeft(i,j);
715 template<
class ViewType,
class ViewType1,
class ViewType2>
716 struct PFor_Not_Recip_Not_Const3_4 {
718 typename ViewType1::const_type inputDataLeft;
719 typename ViewType2::const_type inputDataRight;
720 PFor_Not_Recip_Not_Const3_4(ViewType outputData_, ViewType1 inputDataLeft_,
721 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
723 KOKKOS_INLINE_FUNCTION
724 void operator() (
int i)
const {
725 for(
int j = 0; j < outputData.dimension_1(); j++){
726 for(
int k = 0; k < outputData.dimension_2(); k++){
727 for(
int l = 0; l < outputData.dimension_3(); l++){
728 outputData(i,j,k,l) = inputDataRight(j,k,l)*inputDataLeft(i,j);
734 template<
class ViewType,
class ViewType1,
class ViewType2>
735 struct PFor__Recip__Const3_4 {
737 typename ViewType1::const_type inputDataLeft;
738 typename ViewType2::const_type inputDataRight;
739 PFor__Recip__Const3_4(ViewType outputData_, ViewType1 inputDataLeft_,
740 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
742 KOKKOS_INLINE_FUNCTION
743 void operator() (
int i)
const {
744 for(
int j = 0; j < outputData.dimension_1(); j++){
745 for(
int k = 0; k < outputData.dimension_2(); k++){
746 for(
int l = 0; l < outputData.dimension_3(); l++){
747 outputData(i,j,k,l) = inputDataRight(j,k,l)/inputDataLeft(i,0);
753 template<
class ViewType,
class ViewType1,
class ViewType2>
754 struct PFor_Not_Recip__Const3_4 {
756 typename ViewType1::const_type inputDataLeft;
757 typename ViewType2::const_type inputDataRight;
758 PFor_Not_Recip__Const3_4(ViewType outputData_, ViewType1 inputDataLeft_,
759 ViewType2 inputDataRight_):outputData(outputData_),inputDataLeft(inputDataLeft_),inputDataRight(inputDataRight_) {}
761 KOKKOS_INLINE_FUNCTION
762 void operator() (
int i)
const {
763 for(
int j = 0; j < outputData.dimension_1(); j++){
764 for(
int k = 0; k < outputData.dimension_2(); k++){
765 for(
int l = 0; l < outputData.dimension_3(); l++){
766 outputData(i,j,k,l) = inputDataRight(j,k,l)/inputDataLeft(i,0);
776 template<
class ArrayOutData,
class ArrayInDataLeft,
class ArrayInDataRight,
class Layout,
class MemorySpace>
777 struct ArrayTools::scalarMultiplyDataData2Kokkos<ArrayOutData, ArrayInDataLeft, ArrayInDataRight, Layout, MemorySpace,3,4>{
778 scalarMultiplyDataData2Kokkos(ArrayOutData& outputData,
779 ArrayInDataLeft& inputDataLeft,
780 ArrayInDataRight& inputDataRight,
781 const bool reciprocal){
782 #ifdef HAVE_INTREPID_DEBUG 783 TEUCHOS_TEST_FOR_EXCEPTION( (inputDataLeft.rank() != 2), std::invalid_argument,
784 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Left input data container must have rank 2.");
785 TEUCHOS_TEST_FOR_EXCEPTION( ( (inputDataRight.rank() != 3) ), std::invalid_argument,
786 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Right input data container must have rank 3.");
787 TEUCHOS_TEST_FOR_EXCEPTION( (outputData.rank() != inputDataRight.rank()+1), std::invalid_argument,
788 ">>> ERROR (ArrayTools::scalarMultiplyDataData): The rank of the right input data container must be one less than the rank of the output data container.");
789 TEUCHOS_TEST_FOR_EXCEPTION( ( (inputDataRight.dimension(0) != inputDataLeft.dimension(1)) && (inputDataLeft.dimension(1) != 1) ), std::invalid_argument,
790 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Zeroth dimension of the right input data container and first dimension of the left data input container (number of integration points) must agree or first dimension of the left data input container must be 1!");
791 TEUCHOS_TEST_FOR_EXCEPTION( ( inputDataLeft.dimension(0) != outputData.dimension(0) ), std::invalid_argument,
792 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Zeroth dimensions of data output and left data input containers (number of integration domains) must agree!");
793 for (
int i=0; i<inputDataRight.rank(); i++) {
794 std::string errmsg =
">>> ERROR (ArrayTools::scalarMultiplyDataData): Dimensions ";
795 errmsg += (char)(48+i);
797 errmsg += (char)(48+i+1);
798 errmsg +=
" of the right input and output data containers must agree!";
799 TEUCHOS_TEST_FOR_EXCEPTION( (inputDataRight.dimension(i) != outputData.dimension(i+1)), std::invalid_argument, errmsg );
804 int numCells = outputData.dimension(0);
805 int numDataPoints = inputDataLeft.dimension(1);
809 if (numDataPoints != 1) {
811 Kokkos::parallel_for(numCells,PFor__Recip_Not_Const3_4<ArrayOutData,ArrayInDataLeft,ArrayInDataRight>(outputData, inputDataLeft,
815 Kokkos::parallel_for(numCells,PFor_Not_Recip_Not_Const3_4<ArrayOutData,ArrayInDataLeft,ArrayInDataRight >(outputData, inputDataLeft,
821 Kokkos::parallel_for(numCells,PFor__Recip__Const3_4<ArrayOutData,ArrayInDataLeft,ArrayInDataRight>(outputData, inputDataLeft,
825 Kokkos::parallel_for(numCells,PFor_Not_Recip__Const3_4<ArrayOutData,ArrayInDataLeft,ArrayInDataRight>(outputData, inputDataLeft,