Intrepid
Intrepid_ArrayTools.hpp
Go to the documentation of this file.
1// @HEADER
2// ************************************************************************
3//
4// Intrepid Package
5// Copyright (2007) Sandia Corporation
6//
7// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8// license for use of this work by or on behalf of the U.S. Government.
9//
10// Redistribution and use in source and binary forms, with or without
11// modification, are permitted provided that the following conditions are
12// met:
13//
14// 1. Redistributions of source code must retain the above copyright
15// notice, this list of conditions and the following disclaimer.
16//
17// 2. Redistributions in binary form must reproduce the above copyright
18// notice, this list of conditions and the following disclaimer in the
19// documentation and/or other materials provided with the distribution.
20//
21// 3. Neither the name of the Corporation nor the names of the
22// contributors may be used to endorse or promote products derived from
23// this software without specific prior written permission.
24//
25// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36//
37// Questions? Contact Pavel Bochev (pbboche@sandia.gov)
38// Denis Ridzal (dridzal@sandia.gov), or
39// Kara Peterson (kjpeter@sandia.gov)
40//
41// ************************************************************************
42// @HEADER
43
50#ifndef INTREPID_ARRAYTOOLS_HPP
51#define INTREPID_ARRAYTOOLS_HPP
52
53#include "Intrepid_ConfigDefs.hpp"
54#include "Intrepid_Types.hpp"
55#include "Teuchos_BLAS.hpp"
56#include "Teuchos_Assert.hpp"
57#include <Intrepid_Rank.hpp>
58
59namespace Intrepid {
60
67 class ArrayTools {
68 public:
69
90 /* template<class Scalar, class ArrayOutFields, class ArrayInFieldsLeft, class ArrayInFieldsRight>
91 static void contractFieldFieldScalarTemp(ArrayOutFields & outputFields,
92 const ArrayInFieldsLeft & leftFields,
93 const ArrayInFieldsRight & rightFields,
94 const ECompEngine compEngine,
95 const bool sumInto = false);
96
97*/
119 /* template<class Scalar, class ArrayOutFields, class ArrayInFieldsLeft, class ArrayInFieldsRight>
120 static void contractFieldFieldVectorTemp(ArrayOutFields & outputFields,
121 const ArrayInFieldsLeft & leftFields,
122 const ArrayInFieldsRight & rightFields,
123 const ECompEngine compEngine,
124 const bool sumInto = false);
125*/
126
149 /*
150 template<class Scalar, class ArrayOutFields, class ArrayInFieldsLeft, class ArrayInFieldsRight>
151 static void contractFieldFieldTensorTemp(ArrayOutFields & outputFields,
152 const ArrayInFieldsLeft & leftFields,
153 const ArrayInFieldsRight & rightFields,
154 const ECompEngine compEngine,
155 const bool sumInto = false);
156 */
157
177 /*
178 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields>
179 static void contractDataFieldScalarTemp(ArrayOutFields & outputFields,
180 const ArrayInData & inputData,
181 const ArrayInFields & inputFields,
182 const ECompEngine compEngine,
183 const bool sumInto = false);
184*/
185
205 /*
206 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields>
207 static void contractDataFieldVectorTemp(ArrayOutFields & outputFields,
208 const ArrayInData & inputData,
209 const ArrayInFields & inputFields,
210 const ECompEngine compEngine,
211 const bool sumInto = false);
212*/
213
234 /*
235 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields>
236 static void contractDataFieldTensorTemp(ArrayOutFields & outputFields,
237 const ArrayInData & inputData,
238 const ArrayInFields & inputFields,
239 const ECompEngine compEngine,
240 const bool sumInto = false);
241
242*/
259 /*
260 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
261 static void contractDataDataScalarTemp(ArrayOutData & outputData,
262 const ArrayInDataLeft & inputDataLeft,
263 const ArrayInDataRight & inputDataRight,
264 const ECompEngine compEngine,
265 const bool sumInto = false);
266*/
267
284 /* template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
285 static void contractDataDataVectorTemp(ArrayOutData & outputData,
286 const ArrayInDataLeft & inputDataLeft,
287 const ArrayInDataRight & inputDataRight,
288 const ECompEngine compEngine,
289 const bool sumInto = false);
290
291*/
309 /* template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
310 static void contractDataDataTensorTemp(ArrayOutData & outputData,
311 const ArrayInDataLeft & inputDataLeft,
312 const ArrayInDataRight & inputDataRight,
313 const ECompEngine compEngine,
314 const bool sumInto = false);
315*/
316
346 template<class Scalar, class ArrayOutFields, class ArrayInFieldsLeft, class ArrayInFieldsRight>
347 static void contractFieldFieldScalar(ArrayOutFields & outputFields,
348 const ArrayInFieldsLeft & leftFields,
349 const ArrayInFieldsRight & rightFields,
350 const ECompEngine compEngine,
351 const bool sumInto = false);
352
353
375 template<class Scalar, class ArrayOutFields, class ArrayInFieldsLeft, class ArrayInFieldsRight>
376 static void contractFieldFieldVector(ArrayOutFields & outputFields,
377 const ArrayInFieldsLeft & leftFields,
378 const ArrayInFieldsRight & rightFields,
379 const ECompEngine compEngine,
380 const bool sumInto = false);
381
382
405 template<class Scalar, class ArrayOutFields, class ArrayInFieldsLeft, class ArrayInFieldsRight>
406 static void contractFieldFieldTensor(ArrayOutFields & outputFields,
407 const ArrayInFieldsLeft & leftFields,
408 const ArrayInFieldsRight & rightFields,
409 const ECompEngine compEngine,
410 const bool sumInto = false);
411
412
431 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields>
432 static void contractDataFieldScalar(ArrayOutFields & outputFields,
433 const ArrayInData & inputData,
434 const ArrayInFields & inputFields,
435 const ECompEngine compEngine,
436 const bool sumInto = false);
437
438
458 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields>
459 static void contractDataFieldVector(ArrayOutFields & outputFields,
460 const ArrayInData & inputData,
461 const ArrayInFields & inputFields,
462 const ECompEngine compEngine,
463 const bool sumInto = false);
464
465
486 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields>
487 static void contractDataFieldTensor(ArrayOutFields & outputFields,
488 const ArrayInData & inputData,
489 const ArrayInFields & inputFields,
490 const ECompEngine compEngine,
491 const bool sumInto = false);
492
493
510 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
511 static void contractDataDataScalar(ArrayOutData & outputData,
512 const ArrayInDataLeft & inputDataLeft,
513 const ArrayInDataRight & inputDataRight,
514 const ECompEngine compEngine,
515 const bool sumInto = false);
516
517
534 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
535 static void contractDataDataVector(ArrayOutData & outputData,
536 const ArrayInDataLeft & inputDataLeft,
537 const ArrayInDataRight & inputDataRight,
538 const ECompEngine compEngine,
539 const bool sumInto = false);
540
541
559 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
560 static void contractDataDataTensor(ArrayOutData & outputData,
561 const ArrayInDataLeft & inputDataLeft,
562 const ArrayInDataRight & inputDataRight,
563 const ECompEngine compEngine,
564 const bool sumInto = false);
565
566
596 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields>
597 static void scalarMultiplyDataField(ArrayOutFields & outputFields,
598 const ArrayInData & inputData,
599 const ArrayInFields & inputFields,
600 const bool reciprocal = false);
601
602 template<class ArrayOutFields, class ArrayInData, class ArrayInFields, class Layout, class MemorySpace,int infieldRank,int outfieldRank>
604 /*
605
606 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields>
607 static void scalarMultiplyDataFieldTemp(ArrayOutFields & outputFields,
608 const ArrayInData & inputData,
609 ArrayInFields & inputFields,
610 const bool reciprocal=false);*/
639 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
640 static void scalarMultiplyDataData(ArrayOutData & outputData,
641 const ArrayInDataLeft & inputDataLeft,
642 const ArrayInDataRight & inputDataRight,
643 const bool reciprocal = false);
644
673 template<class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight, class Layout, class MemorySpace,int invalRank,int outvalRank>
675 /*
676 template<class Scalar,class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
677 static void scalarMultiplyDataDataTemp(ArrayOutData & outputData,
678 ArrayInDataLeft & inputDataLeft,
679 ArrayInDataRight & inputDataRight,
680 const bool reciprocal=false);*/
681
711 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields>
712 static void dotMultiplyDataField(ArrayOutFields & outputFields,
713 const ArrayInData & inputDataLeft,
714 const ArrayInFields & inputFields);
715
716
743 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
744 static void dotMultiplyDataData(ArrayOutData & outputData,
745 const ArrayInDataLeft & inputDataLeft,
746 const ArrayInDataRight & inputDataRight);
747
748
770 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields>
771 static void crossProductDataField(ArrayOutFields & outputFields,
772 const ArrayInData & inputData,
773 const ArrayInFields & inputFields);
774
775
796 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
797 static void crossProductDataData(ArrayOutData & outputData,
798 const ArrayInDataLeft & inputDataLeft,
799 const ArrayInDataRight & inputDataRight);
800
801
824 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields>
825 static void outerProductDataField(ArrayOutFields & outputFields,
826 const ArrayInData & inputData,
827 const ArrayInFields & inputFields);
828
829
851 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
852 static void outerProductDataData(ArrayOutData & outputData,
853 const ArrayInDataLeft & inputDataLeft,
854 const ArrayInDataRight & inputDataRight);
855
856
892 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields>
893 static void matvecProductDataField(ArrayOutFields & outputFields,
894 const ArrayInData & inputData,
895 const ArrayInFields & inputFields,
896 const char transpose = 'N');
897 /*
898 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields>
899 static void matvecProductDataFieldTemp(ArrayOutFields & outputFields,
900 const ArrayInData & inputData,
901 const ArrayInFields & inputFields,
902 const char transpose = 'N');
903 */
904
937 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
938 static void matvecProductDataData(ArrayOutData & outputData,
939 const ArrayInDataLeft & inputDataLeft,
940 const ArrayInDataRight & inputDataRight,
941 const char transpose = 'N');
942 /*
943 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
944 static void matvecProductDataDataTemp(ArrayOutData & outputData,
945 const ArrayInDataLeft & inputDataLeft,
946 const ArrayInDataRight & inputDataRight,
947 const char transpose = 'N');
948 */
949
984 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields>
985 static void matmatProductDataField(ArrayOutFields & outputFields,
986 const ArrayInData & inputData,
987 const ArrayInFields & inputFields,
988 const char transpose = 'N');
989
990
991
1025 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
1026 static void matmatProductDataData(ArrayOutData & outputData,
1027 const ArrayInDataLeft & inputDataLeft,
1028 const ArrayInDataRight & inputDataRight,
1029 const char transpose = 'N');
1030
1031 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight,int inleftrank,int inrankright>
1033
1034 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight,int inrightrank>
1036 /*
1037 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
1038 static void matmatProductDataDataTemp(ArrayOutData & outputData,
1039 const ArrayInDataLeft & inputDataLeft,
1040 const ArrayInDataRight & inputDataRight,
1041 const char transpose = 'N'); */
1058 template<class Scalar, class ArrayOutFields, class ArrayInFields>
1059 static void cloneFields(ArrayOutFields & outputFields,
1060 const ArrayInFields & inputFields);
1061
1062
1063 template<class ArrayOutFields, class ArrayInFields, class Layout, class MemorySpace,int invalRank,int outvalRank>
1065 /*
1066 template<class Scalar,class ArrayOutFields, class ArrayInFields>
1067 static void cloneFieldsTemp(ArrayOutFields & outputFields,
1068 const ArrayInFields & inputFields);
1069*/
1088 template<class Scalar, class ArrayOutFields, class ArrayInFactors, class ArrayInFields>
1089 static void cloneScaleFields(ArrayOutFields & outputFields,
1090 const ArrayInFactors & inputFactors,
1091 const ArrayInFields & inputFields);
1092
1093
1109 template<class Scalar, class ArrayInOutFields, class ArrayInFactors>
1110 static void scaleFields(ArrayInOutFields & inoutFields,
1111 const ArrayInFactors & inputFactors);
1112
1113
1114 }; // end class ArrayTools
1115
1116} // end namespace Intrepid
1117
1123
1124#endif
Definition file for clone / scale operations of the array tools interface.
Definition file for contraction (integration) operations of the array tools class.
Definition file for dot-multiply operations of the array tools interface.
Definition file for scalar multiply operations of the array tools interface.
Definition file for tensor multiply operations of the array tools interface.
Contains definitions of custom data types in Intrepid.
Utility class that provides methods for higher-order algebraic manipulation of user-defined arrays,...
static void contractFieldFieldTensor(ArrayOutFields &outputFields, const ArrayInFieldsLeft &leftFields, const ArrayInFieldsRight &rightFields, const ECompEngine compEngine, const bool sumInto=false)
Contracts the "point" and "space" dimensions P, D1, and D2 of two rank-5 containers with dimensions (...
static void matvecProductDataData(ArrayOutData &outputData, const ArrayInDataLeft &inputDataLeft, const ArrayInDataRight &inputDataRight, const char transpose='N')
There are two use cases: (1) matrix-vector product of a rank-3 container inputDataRight with dimensio...
static void outerProductDataField(ArrayOutFields &outputFields, const ArrayInData &inputData, const ArrayInFields &inputFields)
There are two use cases: (1) outer product of a rank-4 container inputFields with dimensions (C,...
static void scaleFields(ArrayInOutFields &inoutFields, const ArrayInFactors &inputFactors)
Multiplies, in place, a rank-2, 3, or 4 container with dimensions (C,F,P), (C,F,P,...
static void contractDataDataScalar(ArrayOutData &outputData, const ArrayInDataLeft &inputDataLeft, const ArrayInDataRight &inputDataRight, const ECompEngine compEngine, const bool sumInto=false)
Contracts the "point" dimensions P of rank-2 containers with dimensions (C,P), and returns the result...
static void dotMultiplyDataField(ArrayOutFields &outputFields, const ArrayInData &inputDataLeft, const ArrayInFields &inputFields)
There are two use cases: (1) dot product of a rank-3, 4 or 5 container inputFields with dimensions (C...
static void scalarMultiplyDataData(ArrayOutData &outputData, const ArrayInDataLeft &inputDataLeft, const ArrayInDataRight &inputDataRight, const bool reciprocal=false)
There are two use cases: (1) multiplies a rank-2, 3, or 4 container inputDataRight with dimensions (C...
static void contractDataFieldScalar(ArrayOutFields &outputFields, const ArrayInData &inputData, const ArrayInFields &inputFields, const ECompEngine compEngine, const bool sumInto=false)
Contracts the "point" dimensions P of a rank-3 containers and a rank-2 container with dimensions (C,...
static void cloneFields(ArrayOutFields &outputFields, const ArrayInFields &inputFields)
Replicates a rank-2, 3, or 4 container with dimensions (F,P), (F,P,D1) or (F,P,D1,...
static void contractDataDataVector(ArrayOutData &outputData, const ArrayInDataLeft &inputDataLeft, const ArrayInDataRight &inputDataRight, const ECompEngine compEngine, const bool sumInto=false)
Contracts the "point" and "space" dimensions P and D of rank-3 containers with dimensions (C,...
static void contractFieldFieldVector(ArrayOutFields &outputFields, const ArrayInFieldsLeft &leftFields, const ArrayInFieldsRight &rightFields, const ECompEngine compEngine, const bool sumInto=false)
Contracts the "point" and "space" dimensions P and D1 of two rank-4 containers with dimensions (C,...
static void dotMultiplyDataData(ArrayOutData &outputData, const ArrayInDataLeft &inputDataLeft, const ArrayInDataRight &inputDataRight)
There are two use cases: (1) dot product of a rank-2, 3 or 4 container inputDataRight with dimensions...
static void matvecProductDataField(ArrayOutFields &outputFields, const ArrayInData &inputData, const ArrayInFields &inputFields, const char transpose='N')
There are two use cases: (1) matrix-vector product of a rank-4 container inputFields with dimensions ...
static void crossProductDataField(ArrayOutFields &outputFields, const ArrayInData &inputData, const ArrayInFields &inputFields)
There are two use cases: (1) cross product of a rank-4 container inputFields with dimensions (C,...
static void scalarMultiplyDataField(ArrayOutFields &outputFields, const ArrayInData &inputData, const ArrayInFields &inputFields, const bool reciprocal=false)
There are two use cases: (1) multiplies a rank-3, 4, or 5 container inputFields with dimensions (C,...
static void matmatProductDataData(ArrayOutData &outputData, const ArrayInDataLeft &inputDataLeft, const ArrayInDataRight &inputDataRight, const char transpose='N')
There are two use cases: (1) matrix-matrix product of a rank-4 container inputDataRight with dimensio...
static void contractDataFieldVector(ArrayOutFields &outputFields, const ArrayInData &inputData, const ArrayInFields &inputFields, const ECompEngine compEngine, const bool sumInto=false)
Contracts the "point" and "space" dimensions P and D of a rank-4 container and a rank-3 container wit...
static void contractDataDataTensor(ArrayOutData &outputData, const ArrayInDataLeft &inputDataLeft, const ArrayInDataRight &inputDataRight, const ECompEngine compEngine, const bool sumInto=false)
Contracts the "point" and "space" dimensions P, D1 and D2 of rank-4 containers with dimensions (C,...
static void matmatProductDataField(ArrayOutFields &outputFields, const ArrayInData &inputData, const ArrayInFields &inputFields, const char transpose='N')
There are two use cases: (1) matrix-matrix product of a rank-5 container inputFields with dimensions ...
static void cloneScaleFields(ArrayOutFields &outputFields, const ArrayInFactors &inputFactors, const ArrayInFields &inputFields)
Multiplies a rank-2, 3, or 4 container with dimensions (F,P), (F,P,D1) or (F,P,D1,...
static void contractFieldFieldScalar(ArrayOutFields &outputFields, const ArrayInFieldsLeft &leftFields, const ArrayInFieldsRight &rightFields, const ECompEngine compEngine, const bool sumInto=false)
Contracts the "point" dimension P of two rank-3 containers with dimensions (C,L,P) and (C,...
static void outerProductDataData(ArrayOutData &outputData, const ArrayInDataLeft &inputDataLeft, const ArrayInDataRight &inputDataRight)
There are two use cases: (1) outer product of a rank-3 container inputDataRight with dimensions (C,...
static void contractDataFieldTensor(ArrayOutFields &outputFields, const ArrayInData &inputData, const ArrayInFields &inputFields, const ECompEngine compEngine, const bool sumInto=false)
Contracts the "point" and "space" dimensions P, D1 and D2 of a rank-5 container and a rank-4 containe...
static void crossProductDataData(ArrayOutData &outputData, const ArrayInDataLeft &inputDataLeft, const ArrayInDataRight &inputDataRight)
There are two use cases: (1) cross product of a rank-3 container inputDataRight with dimensions (C,...
There are two use cases: (1) dot product of a rank-3, 4 or 5 container inputFields with dimensions (C...