49 #ifndef INTREPID_UTILS_HPP
50 #define INTREPID_UTILS_HPP
52 #include "Intrepid_ConfigDefs.hpp"
54 #include "Teuchos_Array.hpp"
55 #include "Teuchos_oblackholestream.hpp"
56 #include "Teuchos_RCP.hpp"
57 #include "Intrepid_KokkosRank.hpp"
80 int getFieldRank(
const EFunctionSpace spaceType);
119 int getOperatorRank(
const EFunctionSpace spaceType,
120 const EOperator operatorType,
130 int getOperatorOrder(
const EOperator operatorType);
158 int getDkEnumeration(
const int xMult,
159 const int yMult = -1,
160 const int zMult = -1);
172 void getDkMultiplicities(Teuchos::Array<int>& partialMult,
173 const int derivativeEnum,
174 const EOperator operatorType,
197 int getDkCardinality(
const EOperator operatorType,
221 void setOrdinalTagData(std::vector<std::vector<std::vector<int> > > &tagToOrdinal,
222 std::vector<std::vector<int> > &ordinalToTag,
240 enum TypeOfExactData{
241 INTREPID_UTILS_FRACTION=0,
242 INTREPID_UTILS_SCALAR
263 template<
class Scalar>
264 int compareToAnalytic(
const Teuchos::Array< Teuchos::Array<Scalar> > testMat,
265 std::ifstream & inputFile,
268 TypeOfExactData analyticDataType = INTREPID_UTILS_FRACTION);
283 template<
class Scalar>
284 int compareToAnalytic(
const Scalar * testMat,
285 std::ifstream & inputFile,
288 TypeOfExactData analyticDataType = INTREPID_UTILS_FRACTION);
301 template<
class Scalar>
302 void getAnalytic(Teuchos::Array< Teuchos::Array<Scalar> > & testMat,
303 std::ifstream & inputFile,
304 TypeOfExactData analyticDataType = INTREPID_UTILS_FRACTION);
315 template<
class Scalar>
316 void getAnalytic(Scalar * testMat,
317 std::ifstream & inputFile,
318 TypeOfExactData analyticDataType = INTREPID_UTILS_FRACTION);
338 template<
class Array>
339 bool requireRankRange(std::string& errmsg,
341 const int lowerBound,
342 const int upperBound);
354 template<
class Array1,
class Array2>
355 bool requireRankMatch(std::string& errmsg,
356 const Array1& array1,
357 const Array2& array2);
371 template<
class Array>
372 bool requireDimensionRange(std::string& errmsg,
375 const int lowerBound,
376 const int upperBound);
390 template<
class Array1,
class Array2>
391 bool requireDimensionMatch(std::string& errmsg,
392 const Array1& array1,
394 const Array2& array2,
411 template<
class Array1,
class Array2>
412 bool requireDimensionMatch(std::string& errmsg,
413 const Array1& array1,
414 const int a1_dim0,
const int a1_dim1,
415 const Array2& array2,
416 const int a2_dim0,
const int a2_dim1);
434 template<
class Array1,
class Array2>
435 bool requireDimensionMatch(std::string& errmsg,
436 const Array1& array1,
437 const int a1_dim0,
const int a1_dim1,
const int a1_dim2,
438 const Array2& array2,
439 const int a2_dim0,
const int a2_dim1,
const int a2_dim2);
459 template<
class Array1,
class Array2>
460 bool requireDimensionMatch(std::string& errmsg,
461 const Array1& array1,
462 const int a1_dim0,
const int a1_dim1,
const int a1_dim2,
const int a1_dim3,
463 const Array2& array2,
464 const int a2_dim0,
const int a2_dim1,
const int a2_dim2,
const int a2_dim3);
486 template<
class Array1,
class Array2>
487 bool requireDimensionMatch(std::string& errmsg,
488 const Array1& array1,
489 const int a1_dim0,
const int a1_dim1,
490 const int a1_dim2,
const int a1_dim3,
const int a1_dim4,
491 const Array2& array2,
492 const int a2_dim0,
const int a2_dim1,
493 const int a2_dim2,
const int a2_dim3,
const int a2_dim4);
505 template<
class Array1,
class Array2>
506 bool requireDimensionMatch(std::string& errmsg,
507 const Array1& array1,
508 const Array2& array2);
527 template<
class Scalar>
528 int compareToAnalytic(
const Teuchos::Array< Teuchos::Array<Scalar> > testMat,
529 std::ifstream & inputFile,
532 TypeOfExactData analyticDataType ) {
536 Teuchos::RCP<std::ostream> outStream;
537 Teuchos::oblackholestream bhs;
539 outStream = Teuchos::rcp(&std::cout,
false);
541 outStream = Teuchos::rcp(&bhs,
false);
544 Teuchos::oblackholestream oldFormatState;
545 oldFormatState.copyfmt(std::cout);
554 while (! inputFile.eof() )
556 std::getline (inputFile,line);
557 std::istringstream linestream(line);
560 while( linestream >> chunk ) {
563 std::string::size_type loc = chunk.find(
"/", 0);
564 if( loc != std::string::npos ) {
565 chunk.replace( loc, 1,
" ");
566 std::istringstream chunkstream(chunk);
569 testentry = (Scalar)(num1)/(Scalar)(num2);
570 abstol = ( std::fabs(testentry) < reltol ? reltol : std::fabs(reltol*testentry) );
571 absdiff = std::fabs(testentry - testMat[i][j]);
572 if (absdiff > abstol) {
574 *outStream <<
"FAILURE --> ";
576 *outStream <<
"entry[" << i <<
"," << j <<
"]:" <<
" "
577 << testMat[i][j] <<
" " << num1 <<
"/" << num2 <<
" "
578 << absdiff <<
" " <<
"<?" <<
" " << abstol <<
"\n";
581 std::istringstream chunkstream(chunk);
582 if (analyticDataType == INTREPID_UTILS_FRACTION) {
584 testentry = (Scalar)(num1);
586 else if (analyticDataType == INTREPID_UTILS_SCALAR)
587 chunkstream >> testentry;
588 abstol = ( std::fabs(testentry) < reltol ?reltol : std::fabs(reltol*testentry) );
589 absdiff = std::fabs(testentry - testMat[i][j]);
590 if (absdiff > abstol) {
592 *outStream <<
"FAILURE --> ";
594 *outStream <<
"entry[" << i <<
"," << j <<
"]:" <<
" "
595 << testMat[i][j] <<
" " << testentry <<
" "
596 << absdiff <<
" " <<
"<?" <<
" " << abstol <<
"\n";
604 std::cout.copyfmt(oldFormatState);
611 template<
class Scalar>
612 int compareToAnalytic(
const Scalar * testMat,
613 std::ifstream & inputFile,
616 TypeOfExactData analyticDataType ) {
620 Teuchos::RCP<std::ostream> outStream;
621 Teuchos::oblackholestream bhs;
623 outStream = Teuchos::rcp(&std::cout,
false);
625 outStream = Teuchos::rcp(&bhs,
false);
628 Teuchos::oblackholestream oldFormatState;
629 oldFormatState.copyfmt(std::cout);
635 int i=0, j=0, offset=0;
638 while (! inputFile.eof() )
640 std::getline (inputFile,line);
641 std::istringstream linestream(line);
644 while( linestream >> chunk ) {
647 std::string::size_type loc = chunk.find(
"/", 0);
648 if( loc != std::string::npos ) {
649 chunk.replace( loc, 1,
" ");
650 std::istringstream chunkstream(chunk);
653 testentry = (Scalar)(num1)/(Scalar)(num2);
654 abstol = ( std::fabs(testentry) < reltol ? reltol : std::fabs(reltol*testentry) );
655 absdiff = std::fabs(testentry - testMat[i*offset+j]);
656 if (absdiff > abstol) {
658 *outStream <<
"FAILURE --> ";
660 *outStream <<
"entry[" << i <<
"," << j <<
"]:" <<
" "
661 << testMat[i*offset+j] <<
" " << num1 <<
"/" << num2 <<
" "
662 << absdiff <<
" " <<
"<?" <<
" " << abstol <<
"\n";
665 std::istringstream chunkstream(chunk);
666 if (analyticDataType == INTREPID_UTILS_FRACTION) {
668 testentry = (Scalar)(num1);
670 else if (analyticDataType == INTREPID_UTILS_SCALAR)
671 chunkstream >> testentry;
672 abstol = ( std::fabs(testentry) < reltol ?reltol : std::fabs(reltol*testentry) );
673 absdiff = std::fabs(testentry - testMat[i*offset+j]);
674 if (absdiff > abstol) {
676 *outStream <<
"FAILURE --> ";
678 *outStream <<
"entry[" << i <<
"," << j <<
"]:" <<
" "
679 << testMat[i*offset+j] <<
" " << testentry <<
" "
680 << absdiff <<
" " <<
"<?" <<
" " << abstol <<
"\n";
689 std::cout.copyfmt(oldFormatState);
696 template<
class Scalar>
697 void getAnalytic(Teuchos::Array< Teuchos::Array<Scalar> > & testMat,
698 std::ifstream & inputFile,
699 TypeOfExactData analyticDataType ) {
702 Teuchos::oblackholestream oldFormatState;
703 oldFormatState.copyfmt(std::cout);
709 while (! inputFile.eof() )
711 std::getline (inputFile,line);
712 std::istringstream linestream(line);
715 while( linestream >> chunk ) {
718 std::string::size_type loc = chunk.find(
"/", 0);
719 if( loc != std::string::npos ) {
720 chunk.replace( loc, 1,
" ");
721 std::istringstream chunkstream(chunk);
724 testentry = (Scalar)(num1)/(Scalar)(num2);
725 testMat[i][j] = testentry;
728 std::istringstream chunkstream(chunk);
729 if (analyticDataType == INTREPID_UTILS_FRACTION) {
731 testentry = (Scalar)(num1);
733 else if (analyticDataType == INTREPID_UTILS_SCALAR)
734 chunkstream >> testentry;
735 testMat[i][j] = testentry;
743 std::cout.copyfmt(oldFormatState);
748 template<
class Scalar>
749 void getAnalytic(Scalar * testMat,
750 std::ifstream & inputFile,
751 TypeOfExactData analyticDataType) {
754 Teuchos::oblackholestream oldFormatState;
755 oldFormatState.copyfmt(std::cout);
759 int i=0, j=0, offset=0;
761 while (! inputFile.eof() )
763 std::getline (inputFile,line);
764 std::istringstream linestream(line);
767 while( linestream >> chunk ) {
770 std::string::size_type loc = chunk.find(
"/", 0);
771 if( loc != std::string::npos ) {
772 chunk.replace( loc, 1,
" ");
773 std::istringstream chunkstream(chunk);
776 testentry = (Scalar)(num1)/(Scalar)(num2);
777 testMat[i*offset+j] = testentry;
780 std::istringstream chunkstream(chunk);
781 if (analyticDataType == INTREPID_UTILS_FRACTION) {
783 testentry = (Scalar)(num1);
785 else if (analyticDataType == INTREPID_UTILS_SCALAR)
786 chunkstream >> testentry;
787 testMat[i*offset+j] = testentry;
796 std::cout.copyfmt(oldFormatState);
807 template<
class Array>
808 bool requireRankRange(std::string& errmsg,
810 const int lowerBound,
811 const int upperBound){
813 TEUCHOS_TEST_FOR_EXCEPTION( (lowerBound > upperBound) , std::invalid_argument,
814 ">>> ERROR (Intrepid_Utils::requireRankRange): lowerBound <= upperBound required!");
817 if( (lowerBound == upperBound) && !(getrank(array) == (
size_t)lowerBound) ) {
818 errmsg +=
"\n>>> Array rank = ";
819 errmsg += (char)(48 + getrank(array) );
820 errmsg +=
" while rank-";
821 errmsg += (char) (48 + lowerBound);
822 errmsg +=
" array required.";
825 else if ( (lowerBound < upperBound) && !( ((size_t)lowerBound <= getrank(array) ) && (getrank(array) <= (size_t)upperBound) ) ){
826 errmsg +=
"\n>>> Array rank = ";
827 errmsg += (char)(48 + getrank(array) );
828 errmsg +=
" while a rank between ";
829 errmsg += (char) (48 + lowerBound);
831 errmsg += (char) (48 + upperBound);
832 errmsg +=
" is required.";
839 template<
class Array1,
class Array2>
840 bool requireRankMatch(std::string& errmsg,
841 const Array1& array1,
842 const Array2& array2){
844 if(getrank(array1) != getrank(array2) ) {
845 errmsg +=
"\n>>> Array ranks are required to match.";
852 template<
class Array>
853 bool requireDimensionRange(std::string& errmsg,
856 const int lowerBound,
857 const int upperBound){
859 TEUCHOS_TEST_FOR_EXCEPTION( (lowerBound > upperBound) , std::invalid_argument,
860 ">>> ERROR (Intrepid_Utils::requireDimensionRange): lowerBound <= upperBound required!");
861 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= dim) && ((
size_t)dim < getrank(array) ) ),
862 std::invalid_argument,
863 ">>> ERROR (Intrepid_Utils::requireDimensionRange): 0 <= dim < array.rank() required!");
866 if( (lowerBound > upperBound) || ( (
size_t)dim >= getrank(array) ) ) {
867 errmsg +=
"\n>>> Unexpected error: ";
870 if( (lowerBound == upperBound) && !(static_cast<int>(array.dimension(dim)) == lowerBound) ) {
871 errmsg +=
"\n>>> dimension(";
872 errmsg += (char)(48 + dim);
874 errmsg += (char)(48 + array.dimension(dim) );
875 errmsg +=
" while dimension(";
876 errmsg += (char)(48 + dim);
878 errmsg += (char)(48 + lowerBound);
879 errmsg +=
" required.";
882 else if( (lowerBound < upperBound) &&
883 !( ((size_t)lowerBound <= (
size_t)array.dimension(dim) ) && (static_cast<size_t>(array.dimension(dim)) <= (
size_t)upperBound) ) ){
884 errmsg +=
"\n>>> dimension(";
885 errmsg += (char)(48 + dim);
887 errmsg += (char)(48 + array.dimension(dim) );
889 errmsg += (char)(48 + lowerBound);
890 errmsg +=
" <= dimension(";
891 errmsg += (char)(48 + dim);
893 errmsg +=(char)(48 + upperBound);
894 errmsg +=
" required.";
902 template<
class Array1,
class Array2>
903 bool requireDimensionMatch(std::string& errmsg,
904 const Array1& array1,
906 const Array2& array2,
909 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a1_dim0) && ((
size_t)a1_dim0 < getrank(array1) ) ),
910 std::invalid_argument,
911 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a1_dim0 < array1.rank() required!");
912 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a2_dim0) && ((
size_t)a2_dim0 < getrank(array2) ) ),
913 std::invalid_argument,
914 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a2_dim0 < array2.rank() required!");
917 if(static_cast<int>(array1.dimension(a1_dim0)) != static_cast<int>(array2.dimension(a2_dim0)) ){
918 errmsg +=
"\n>>> dimension(";
919 errmsg += (char)(48 + a1_dim0);
920 errmsg +=
") of 1st array and dimension(";
921 errmsg += (char)(48 + a2_dim0);
922 errmsg +=
") of 2nd array are required to match.";
930 template<
class Array1,
class Array2>
931 bool requireDimensionMatch(std::string& errmsg,
932 const Array1& array1,
933 const int a1_dim0,
const int a1_dim1,
934 const Array2& array2,
935 const int a2_dim0,
const int a2_dim1){
937 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a1_dim0) && ((
size_t)a1_dim0 < getrank(array1) ) ),
938 std::invalid_argument,
939 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a1_dim0 < array1.rank() required!");
940 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a1_dim1) && ((
size_t)a1_dim1 < getrank(array1) ) ),
941 std::invalid_argument,
942 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a1_dim1 < array1.rank() required!");
943 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a2_dim0) && ((
size_t)a2_dim0 < getrank(array2) ) ),
944 std::invalid_argument,
945 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a2_dim0 < array2.rank() required!");
946 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a2_dim1) && ((
size_t)a2_dim1 < getrank(array2) ) ),
947 std::invalid_argument,
948 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a2_dim1 < array2.rank() required!");
951 if( !requireDimensionMatch(errmsg, array1, a1_dim0, array2, a2_dim0) ){
954 if( !requireDimensionMatch(errmsg, array1, a1_dim1, array2, a2_dim1) ){
962 template<
class Array1,
class Array2>
963 bool requireDimensionMatch(std::string& errmsg,
964 const Array1& array1,
965 const int a1_dim0,
const int a1_dim1,
const int a1_dim2,
966 const Array2& array2,
967 const int a2_dim0,
const int a2_dim1,
const int a2_dim2){
969 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a1_dim0) && ((
size_t)a1_dim0 < getrank(array1) ) ),
970 std::invalid_argument,
971 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a1_dim0 < array1.rank() required!");
972 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a1_dim1) && ((
size_t)a1_dim1 < getrank(array1) ) ),
973 std::invalid_argument,
974 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a1_dim1 < array1.rank() required!");
975 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a1_dim2) && ((
size_t)a1_dim2 < getrank(array1) ) ),
976 std::invalid_argument,
977 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a1_dim2 < array1.rank() required!");
978 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a2_dim0) && ((
size_t)a2_dim0 < getrank(array2) ) ),
979 std::invalid_argument,
980 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a2_dim0 < array2.rank() required!");
981 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a2_dim1) && ((
size_t)a2_dim1 < getrank(array2) ) ),
982 std::invalid_argument,
983 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a2_dim1 < array2.rank() required!");
984 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a2_dim2) && ((
size_t)a2_dim2 < getrank(array2) ) ),
985 std::invalid_argument,
986 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a2_dim2 < array2.rank() required!");
990 if( !requireDimensionMatch(errmsg, array1, a1_dim0, array2, a2_dim0) ){
993 if( !requireDimensionMatch(errmsg, array1, a1_dim1, array2, a2_dim1) ){
996 if( !requireDimensionMatch(errmsg, array1, a1_dim2, array2, a2_dim2) ){
1004 template<
class Array1,
class Array2>
1005 bool requireDimensionMatch(std::string& errmsg,
1006 const Array1& array1,
1007 const int a1_dim0,
const int a1_dim1,
const int a1_dim2,
const int a1_dim3,
1008 const Array2& array2,
1009 const int a2_dim0,
const int a2_dim1,
const int a2_dim2,
const int a2_dim3){
1011 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a1_dim0) && ((
size_t)a1_dim0 < getrank(array1) ) ),
1012 std::invalid_argument,
1013 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a1_dim0 < array1.rank() required!");
1014 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a1_dim1) && ((
size_t)a1_dim1 < getrank(array1) ) ),
1015 std::invalid_argument,
1016 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a1_dim1 < array1.rank() required!");
1017 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a1_dim2) && ((
size_t)a1_dim2 < getrank(array1) ) ),
1018 std::invalid_argument,
1019 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a1_dim2 < array1.rank() required!");
1020 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a1_dim3) && ((
size_t)a1_dim3 < getrank(array1) ) ),
1021 std::invalid_argument,
1022 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a1_dim3 < array1.rank() required!");
1023 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a2_dim0) && ((
size_t)a2_dim0 < getrank(array2) ) ),
1024 std::invalid_argument,
1025 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a2_dim0 < array2.rank() required!");
1026 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a2_dim1) && ((
size_t)a2_dim1 < getrank(array2) ) ),
1027 std::invalid_argument,
1028 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a2_dim1 < array2.rank() required!");
1029 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a2_dim2) && ((
size_t)a2_dim2 < getrank(array2) ) ),
1030 std::invalid_argument,
1031 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a2_dim2 < array2.rank() required!");
1032 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a2_dim3) && ((
size_t)a2_dim3 < getrank(array2) ) ),
1033 std::invalid_argument,
1034 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a2_dim3 < array2.rank() required!");
1036 if( !requireDimensionMatch(errmsg, array1, static_cast<int>(a1_dim0), array2, static_cast<int>(a2_dim0)) ){
1039 if( !requireDimensionMatch(errmsg, array1, a1_dim1, array2, a2_dim1) ){
1042 if( !requireDimensionMatch(errmsg, array1, a1_dim2, array2, a2_dim2) ){
1045 if( !requireDimensionMatch(errmsg, array1, a1_dim3, array2, a2_dim3) ){
1053 template<
class Array1,
class Array2>
1054 bool requireDimensionMatch(std::string& errmsg,
1055 const Array1& array1,
1056 const int a1_dim0,
const int a1_dim1,
const int a1_dim2,
1057 const int a1_dim3,
const int a1_dim4,
1058 const Array2& array2,
1059 const int a2_dim0,
const int a2_dim1,
const int a2_dim2,
1060 const int a2_dim3,
const int a2_dim4){
1062 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a1_dim0) && ((
size_t)a1_dim0 < getrank(array1) ) ),
1063 std::invalid_argument,
1064 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a1_dim0 < array1.rank() required!");
1065 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a1_dim1) && ((
size_t)a1_dim1 < getrank(array1) ) ),
1066 std::invalid_argument,
1067 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a1_dim1 < array1.rank() required!");
1068 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a1_dim2) && ((
size_t)a1_dim2 < getrank(array1) ) ),
1069 std::invalid_argument,
1070 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a1_dim2 < array1.rank() required!");
1071 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a1_dim3) && ((
size_t)a1_dim3 < getrank(array1) ) ),
1072 std::invalid_argument,
1073 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a1_dim3 < array1.rank() required!");
1074 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a1_dim4) && ((
size_t)a1_dim4 < getrank(array1) ) ),
1075 std::invalid_argument,
1076 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a1_dim4 < array1.rank() required!");
1077 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a2_dim0) && ((
size_t)a2_dim0 < getrank(array2) ) ),
1078 std::invalid_argument,
1079 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a2_dim0 < array2.rank() required!");
1080 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a2_dim1) && ((
size_t)a2_dim1 < getrank(array2) ) ),
1081 std::invalid_argument,
1082 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a2_dim1 < array2.rank() required!");
1083 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a2_dim2) && ((
size_t)a2_dim2 < getrank(array2) ) ),
1084 std::invalid_argument,
1085 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a2_dim2 < array2.rank() required!");
1086 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a2_dim3) && ((
size_t)a2_dim3 < getrank(array2) ) ),
1087 std::invalid_argument,
1088 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a2_dim3 < array2.rank() required!");
1089 TEUCHOS_TEST_FOR_EXCEPTION( !( (0 <= a2_dim4) && ((
size_t)a2_dim4 < getrank(array2) ) ),
1090 std::invalid_argument,
1091 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): 0 <= a2_dim4 < array2.rank() required!");
1094 if( !requireDimensionMatch(errmsg, array1, a1_dim0, array2, a2_dim0) ){
1097 if( !requireDimensionMatch(errmsg, array1, a1_dim1, array2, a2_dim1) ){
1100 if( !requireDimensionMatch(errmsg, array1, a1_dim2, array2, a2_dim2) ){
1103 if( !requireDimensionMatch(errmsg, array1, a1_dim3, array2, a2_dim3) ){
1106 if( !requireDimensionMatch(errmsg, array1, a1_dim4, array2, a2_dim4) ){
1114 template<
class Array1,
class Array2>
1115 bool requireDimensionMatch(std::string& errmsg,
1116 const Array1& array1,
1117 const Array2& array2){
1119 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankMatch(errmsg, array1, array2 ), std::invalid_argument,
1120 ">>> ERROR (Intrepid_Utils::requireDimensionMatch): Arrays with equal ranks are required to test for all dimensions match." )
1123 for(
size_t dim = 0; dim < getrank(array1); dim++){
1124 if( !requireDimensionMatch(errmsg, array1, dim, array2, dim) ){
Contains definitions of custom data types in Intrepid.