49 #define LVARRAY_TENSOROPS_INIT_LOCAL_2( EXP ) { EXP[ 0 ], EXP[ 1 ] } 57 #define LVARRAY_TENSOROPS_ASSIGN_2( var, exp0, exp1 ) \ 58 var[ 0 ] = exp0; var[ 1 ] = exp1 64 #define LVARRAY_TENSOROPS_INIT_LOCAL_3( EXP ) { EXP[ 0 ], EXP[ 1 ], EXP[ 2 ] } 73 #define LVARRAY_TENSOROPS_ASSIGN_3( var, exp0, exp1, exp2 ) \ 74 var[ 0 ] = exp0; var[ 1 ] = exp1; var[ 2 ] = exp2 80 #define LVARRAY_TENSOROPS_INIT_LOCAL_6( EXP ) { EXP[ 0 ], EXP[ 1 ], EXP[ 2 ], EXP[ 3 ], EXP[ 4 ], EXP[ 5 ] } 92 #define LVARRAY_TENSOROPS_ASSIGN_6( var, exp0, exp1, exp2, exp3, exp4, exp5 ) \ 93 var[ 0 ] = exp0; var[ 1 ] = exp1; var[ 2 ] = exp2; var[ 3 ] = exp3; var[ 4 ] = exp4; var[ 5 ] = exp5 99 #define LVARRAY_TENSOROPS_INIT_LOCAL_2x2( EXP ) \ 100 { { EXP[ 0 ][ 0 ], EXP[ 0 ][ 1 ] }, \ 101 { EXP[ 1 ][ 0 ], EXP[ 1 ][ 1 ] } } 111 #define LVARRAY_TENSOROPS_ASSIGN_2x2( var, exp00, exp01, exp10, exp11 ) \ 112 var[ 0 ][ 0 ] = exp00; var[ 0 ][ 1 ] = exp01; \ 113 var[ 1 ][ 0 ] = exp10; var[ 1 ][ 1 ] = exp11 119 #define LVARRAY_TENSOROPS_INIT_LOCAL_3x3( EXP ) \ 120 { { EXP[ 0 ][ 0 ], EXP[ 0 ][ 1 ], EXP[ 0 ][ 2 ] }, \ 121 { EXP[ 1 ][ 0 ], EXP[ 1 ][ 1 ], EXP[ 1 ][ 2 ] }, \ 122 { EXP[ 2 ][ 0 ], EXP[ 2 ][ 1 ], EXP[ 2 ][ 2 ] } } 137 #define LVARRAY_TENSOROPS_ASSIGN_3x3( var, exp00, exp01, exp02, exp10, exp11, exp12, exp20, exp21, exp22 ) \ 138 var[ 0 ][ 0 ] = exp00; var[ 0 ][ 1 ] = exp01; var[ 0 ][ 2 ] = exp02; \ 139 var[ 1 ][ 0 ] = exp10; var[ 1 ][ 1 ] = exp11; var[ 1 ][ 2 ] = exp12; \ 140 var[ 2 ][ 0 ] = exp20; var[ 2 ][ 1 ] = exp21; var[ 2 ][ 2 ] = exp22 175 template< std::ptrdiff_t ISIZE,
typename T >
177 std::enable_if_t< HasStaticMember_SIZE< T > >
180 static_assert( ISIZE == T::SIZE,
181 "Expected the first dimension of size ISIZE, got an type of size T::SIZE." );
192 template< std::ptrdiff_t PROVIDED_SIZE,
typename T, std::ptrdiff_t INFERRED_SIZE >
196 static_assert( PROVIDED_SIZE == INFERRED_SIZE,
197 "Expected the first dimension of size PROVIDED_N, got an array of size INFERRED_N." );
210 template< std::ptrdiff_t PROVIDED_M,
211 std::ptrdiff_t PROVIDED_N,
213 std::ptrdiff_t INFERRED_M,
214 std::ptrdiff_t INFERRED_N >
216 void checkSizes( T
const ( &src )[ INFERRED_M ][ INFERRED_N ] )
218 static_assert( PROVIDED_M == INFERRED_M,
"Expected the first dimension of size PROVIDED_M, got an array of size INFERRED_M." );
219 static_assert( PROVIDED_N == INFERRED_N,
"Expected the second dimension of size PROVIDED_N, got an array of size INFERRED_N." );
230 template< std::ptrdiff_t ISIZE,
typename ARRAY >
232 std::enable_if_t< HasStaticMember_NDIM< ARRAY > >
235 static_assert( ARRAY::NDIM == 1,
"Must be a 1D array." );
237 #ifdef LVARRAY_BOUNDS_CHECK 252 template< std::ptrdiff_t ISIZE, std::ptrdiff_t JSIZE,
typename ARRAY >
254 std::enable_if_t< HasStaticMember_NDIM< ARRAY > >
257 static_assert( ARRAY::NDIM == 2,
"Must be a 1D array." );
258 #ifdef LVARRAY_BOUNDS_CHECK 269 template< std::ptrdiff_t ISIZE >
270 constexpr std::ptrdiff_t
SYM_SIZE = ( ISIZE * ( ISIZE + 1 ) ) / 2;
286 template< std::ptrdiff_t ISIZE,
typename VECTOR >
290 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
291 internal::checkSizes< ISIZE >( vector );
294 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
310 template< std::ptrdiff_t ISIZE,
typename VECTOR >
312 void fill( VECTOR && vector, std::remove_reference_t< decltype( vector[ 0 ] ) >
const value )
314 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
315 internal::checkSizes< ISIZE >( vector );
317 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
332 template< std::ptrdiff_t ISIZE, std::ptrdiff_t JSIZE,
typename MATRIX >
334 void fill( MATRIX && matrix, std::remove_reference_t< decltype( matrix[ 0 ][ 0 ] ) >
const value )
336 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
337 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
338 internal::checkSizes< ISIZE, JSIZE >( matrix );
340 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
342 for( std::ptrdiff_t j = 0; j < JSIZE; ++j )
344 matrix[ i ][ j ] = value;
358 template< std::ptrdiff_t ISIZE,
typename DST_VECTOR,
typename SRC_VECTOR >
360 void copy( DST_VECTOR && LVARRAY_RESTRICT_REF dstVector,
361 SRC_VECTOR
const & LVARRAY_RESTRICT_REF srcVector )
363 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
364 internal::checkSizes< ISIZE >( dstVector );
365 internal::checkSizes< ISIZE >( srcVector );
367 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
369 dstVector[ i ] = srcVector[ i ];
383 template< std::ptrdiff_t ISIZE, std::ptrdiff_t JSIZE,
typename DST_MATRIX,
typename SRC_MATRIX >
385 void copy( DST_MATRIX && LVARRAY_RESTRICT_REF dstMatrix,
386 SRC_MATRIX
const & LVARRAY_RESTRICT_REF srcMatrix )
388 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
389 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
390 internal::checkSizes< ISIZE, JSIZE >( dstMatrix );
391 internal::checkSizes< ISIZE, JSIZE >( srcMatrix );
393 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
395 for( std::ptrdiff_t j = 0; j < JSIZE; ++j )
397 dstMatrix[ i ][ j ] = srcMatrix[ i ][ j ];
410 template< std::ptrdiff_t ISIZE,
typename VECTOR >
412 void scale( VECTOR && vector, std::remove_reference_t< decltype( vector[ 0 ] ) >
const scale )
414 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
415 internal::checkSizes< ISIZE >( vector );
417 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
419 vector[ i ] *=
scale;
432 template< std::ptrdiff_t ISIZE, std::ptrdiff_t JSIZE,
typename MATRIX >
434 void scale( MATRIX && matrix, std::remove_reference_t< decltype( matrix[ 0 ][ 0 ] ) >
const scale )
436 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
437 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
438 internal::checkSizes< ISIZE, JSIZE >( matrix );
440 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
442 for( std::ptrdiff_t j = 0; j < JSIZE; ++j )
444 matrix[ i ][ j ] *=
scale;
459 template< std::ptrdiff_t ISIZE,
typename DST_VECTOR,
typename SRC_VECTOR >
461 void scaledCopy( DST_VECTOR && LVARRAY_RESTRICT_REF dstVector,
462 SRC_VECTOR
const & LVARRAY_RESTRICT_REF srcVector,
463 std::remove_reference_t< decltype( srcVector[ 0 ] ) >
const scale )
465 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
466 internal::checkSizes< ISIZE >( dstVector );
467 internal::checkSizes< ISIZE >( srcVector );
469 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
471 dstVector[ i ] =
scale * srcVector[ i ];
486 template< std::ptrdiff_t ISIZE, std::ptrdiff_t JSIZE,
typename DST_MATRIX,
typename SRC_MATRIX >
488 void scaledCopy( DST_MATRIX && LVARRAY_RESTRICT_REF dstMatrix,
489 SRC_MATRIX
const & LVARRAY_RESTRICT_REF srcMatrix,
490 std::remove_reference_t< decltype( srcMatrix[ 0 ][ 0 ] ) >
const scale )
492 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
493 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
494 internal::checkSizes< ISIZE, JSIZE >( dstMatrix );
495 internal::checkSizes< ISIZE, JSIZE >( srcMatrix );
497 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
499 for( std::ptrdiff_t j = 0; j < JSIZE; ++j )
501 dstMatrix[ i ][ j ] =
scale * srcMatrix[ i ][ j ];
514 template< std::ptrdiff_t M,
typename DST_VECTOR >
516 void addScalar( DST_VECTOR && LVARRAY_RESTRICT_REF dstVector,
517 std::remove_reference_t< decltype( dstVector[0] ) >
const value )
519 static_assert( M > 0,
"M must be greater than zero." );
520 internal::checkSizes< M >( dstVector );
522 for( std::ptrdiff_t i = 0; i < M; ++i )
524 dstVector[ i ] += value;
537 template< std::ptrdiff_t ISIZE,
typename DST_VECTOR,
typename SRC_VECTOR >
539 void add( DST_VECTOR && LVARRAY_RESTRICT_REF dstVector,
540 SRC_VECTOR
const & LVARRAY_RESTRICT_REF srcVector )
542 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
543 internal::checkSizes< ISIZE >( dstVector );
544 internal::checkSizes< ISIZE >( srcVector );
546 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
548 dstVector[ i ] += srcVector[ i ];
562 template< std::ptrdiff_t ISIZE, std::ptrdiff_t JSIZE,
typename DST_MATRIX,
typename SRC_MATRIX >
564 void add( DST_MATRIX && LVARRAY_RESTRICT_REF dstMatrix,
565 SRC_MATRIX
const & LVARRAY_RESTRICT_REF srcMatrix )
567 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
568 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
569 internal::checkSizes< ISIZE, JSIZE >( dstMatrix );
570 internal::checkSizes< ISIZE, JSIZE >( srcMatrix );
572 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
574 for( std::ptrdiff_t j = 0; j < JSIZE; ++j )
576 dstMatrix[ i ][ j ] += srcMatrix[ i ][ j ];
590 template< std::ptrdiff_t ISIZE,
typename DST_VECTOR,
typename SRC_VECTOR >
592 void subtract( DST_VECTOR && LVARRAY_RESTRICT_REF dstVector,
593 SRC_VECTOR
const & LVARRAY_RESTRICT_REF srcVector )
595 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
596 internal::checkSizes< ISIZE >( dstVector );
597 internal::checkSizes< ISIZE >( srcVector );
599 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
601 dstVector[ i ] -= srcVector[ i ];
615 template< std::ptrdiff_t ISIZE,
typename DST_VECTOR,
typename SRC_VECTOR >
617 void scaledAdd( DST_VECTOR && LVARRAY_RESTRICT_REF dstVector,
618 SRC_VECTOR
const & LVARRAY_RESTRICT_REF srcVector,
619 std::remove_reference_t< decltype( srcVector[ 0 ] ) >
const scale )
621 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
622 internal::checkSizes< ISIZE >( dstVector );
623 internal::checkSizes< ISIZE >( srcVector );
625 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
627 dstVector[ i ] = dstVector[ i ] +
scale * srcVector[ i ];
643 template< std::ptrdiff_t ISIZE, std::ptrdiff_t JSIZE,
typename DST_MATRIX,
typename SRC_MATRIX >
645 void scaledAdd( DST_MATRIX && LVARRAY_RESTRICT_REF dstMatrix,
646 SRC_MATRIX
const & LVARRAY_RESTRICT_REF srcMatrix,
647 std::remove_reference_t< decltype( srcMatrix[ 0 ][ 0 ] ) >
const scale )
649 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
650 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
651 internal::checkSizes< ISIZE, JSIZE >( dstMatrix );
652 internal::checkSizes< ISIZE, JSIZE >( srcMatrix );
654 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
656 for( std::ptrdiff_t j = 0; j < JSIZE; ++j )
658 dstMatrix[ i ][ j ] +=
scale * srcMatrix[ i ][ j ];
673 template< std::ptrdiff_t ISIZE,
typename DST_VECTOR,
typename VECTOR_A,
typename VECTOR_B >
676 VECTOR_A
const & LVARRAY_RESTRICT_REF vectorA,
677 VECTOR_B
const & LVARRAY_RESTRICT_REF vectorB )
679 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
680 internal::checkSizes< ISIZE >( dstVector );
681 internal::checkSizes< ISIZE >( vectorA );
682 internal::checkSizes< ISIZE >( vectorB );
684 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
686 dstVector[ i ] = vectorA[ i ] * vectorB[ i ];
704 template< std::ptrdiff_t ISIZE,
typename VECTOR >
708 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
709 internal::checkSizes< ISIZE >( vector );
711 auto norm = vector[ 0 ] * vector[ 0 ];
712 for( std::ptrdiff_t i = 1; i < ISIZE; ++i )
714 norm = norm + vector[ i ] * vector[ i ];
725 template< std::ptrdiff_t ISIZE,
typename VECTOR >
729 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
730 internal::checkSizes< ISIZE >( vector );
732 return math::sqrt( l2NormSquared< ISIZE >( vector ) );
742 template< std::ptrdiff_t ISIZE,
typename VECTOR >
746 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
747 internal::checkSizes< ISIZE >( vector );
749 auto const normInv =
math::invSqrt( l2NormSquared< ISIZE >( vector ) );
750 scale< ISIZE >( vector, normInv );
763 template< std::ptrdiff_t JSIZE,
typename VECTOR_A,
typename VECTOR_B >
765 auto AiBi( VECTOR_A
const & LVARRAY_RESTRICT_REF vectorA,
766 VECTOR_B
const & LVARRAY_RESTRICT_REF vectorB )
768 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
769 internal::checkSizes< JSIZE >( vectorA );
770 internal::checkSizes< JSIZE >( vectorB );
772 auto result = vectorA[ 0 ] * vectorB[ 0 ];
773 for( std::ptrdiff_t i = 1; i < JSIZE; ++i )
775 result = result + vectorA[ i ] * vectorB[ i ];
790 template<
typename DST_VECTOR,
typename VECTOR_A,
typename VECTOR_B >
793 VECTOR_A
const & LVARRAY_RESTRICT_REF vectorA,
794 VECTOR_B
const & LVARRAY_RESTRICT_REF vectorB )
796 internal::checkSizes< 3 >( dstVector );
797 internal::checkSizes< 3 >( vectorA );
798 internal::checkSizes< 3 >( vectorB );
800 dstVector[ 0 ] = vectorA[ 1 ] * vectorB[ 2 ] - vectorA[ 2 ] * vectorB[ 1 ];
801 dstVector[ 1 ] = vectorA[ 2 ] * vectorB[ 0 ] - vectorA[ 0 ] * vectorB[ 2 ];
802 dstVector[ 2 ] = vectorA[ 0 ] * vectorB[ 1 ] - vectorA[ 1 ] * vectorB[ 0 ];
825 template< std::ptrdiff_t ISIZE, std::ptrdiff_t JSIZE,
typename DST_MATRIX,
typename VECTOR_A,
typename VECTOR_B >
828 VECTOR_A
const & LVARRAY_RESTRICT_REF vectorA,
829 VECTOR_B
const & LVARRAY_RESTRICT_REF vectorB )
831 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
832 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
833 internal::checkSizes< ISIZE, JSIZE >( dstMatrix );
834 internal::checkSizes< ISIZE >( vectorA );
835 internal::checkSizes< JSIZE >( vectorB );
837 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
839 for( std::ptrdiff_t j = 0; j < JSIZE; ++j )
841 dstMatrix[ i ][ j ] = vectorA[ i ] * vectorB[ j ];
858 template< std::ptrdiff_t JSIZE, std::ptrdiff_t ISIZE,
typename DST_MATRIX,
typename VECTOR_A,
typename VECTOR_B >
861 VECTOR_A
const & LVARRAY_RESTRICT_REF vectorA,
862 VECTOR_B
const & LVARRAY_RESTRICT_REF vectorB )
864 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
865 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
866 internal::checkSizes< JSIZE, ISIZE >( dstMatrix );
867 internal::checkSizes< JSIZE >( vectorA );
868 internal::checkSizes< ISIZE >( vectorB );
870 for( std::ptrdiff_t i = 0; i < JSIZE; ++i )
872 for( std::ptrdiff_t j = 0; j < ISIZE; ++j )
874 dstMatrix[ i ][ j ] = dstMatrix[ i ][ j ] + vectorA[ i ] * vectorB[ j ];
891 template< std::ptrdiff_t ISIZE, std::ptrdiff_t JSIZE,
typename DST_VECTOR,
typename MATRIX_A,
typename VECTOR_B >
894 MATRIX_A
const & LVARRAY_RESTRICT_REF matrixA,
895 VECTOR_B
const & LVARRAY_RESTRICT_REF vectorB )
897 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
898 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
899 internal::checkSizes< ISIZE >( dstVector );
900 internal::checkSizes< ISIZE, JSIZE >( matrixA );
901 internal::checkSizes< JSIZE >( vectorB );
903 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
905 dstVector[ i ] = matrixA[ i ][ 0 ] * vectorB[ 0 ];
906 for( std::ptrdiff_t j = 1; j < JSIZE; ++j )
908 dstVector[ i ] = dstVector[ i ] + matrixA[ i ][ j ] * vectorB[ j ];
925 template< std::ptrdiff_t ISIZE, std::ptrdiff_t JSIZE,
typename DST_VECTOR,
typename MATRIX_A,
typename VECTOR_B >
928 MATRIX_A
const & LVARRAY_RESTRICT_REF matrixA,
929 VECTOR_B
const & LVARRAY_RESTRICT_REF vectorB )
931 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
932 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
933 internal::checkSizes< ISIZE >( dstVector );
934 internal::checkSizes< ISIZE, JSIZE >( matrixA );
935 internal::checkSizes< JSIZE >( vectorB );
937 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
939 for( std::ptrdiff_t j = 0; j < JSIZE; ++j )
941 dstVector[ i ] = dstVector[ i ] + matrixA[ i ][ j ] * vectorB[ j ];
959 template< std::ptrdiff_t ISIZE, std::ptrdiff_t JSIZE,
typename DST_VECTOR,
typename MATRIX_A,
typename VECTOR_B >
962 MATRIX_A
const & LVARRAY_RESTRICT_REF matrixA,
963 VECTOR_B
const & LVARRAY_RESTRICT_REF vectorB )
965 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
966 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
967 internal::checkSizes< ISIZE >( dstVector );
968 internal::checkSizes< JSIZE, ISIZE >( matrixA );
969 internal::checkSizes< JSIZE >( vectorB );
971 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
973 dstVector[ i ] = matrixA[ 0 ][ i ] * vectorB[ 0 ];
974 for( std::ptrdiff_t j = 1; j < JSIZE; ++j )
976 dstVector[ i ] = dstVector[ i ] + matrixA[ j ][ i ] * vectorB[ j ];
994 template< std::ptrdiff_t ISIZE, std::ptrdiff_t JSIZE,
typename DST_VECTOR,
typename MATRIX_A,
typename VECTOR_B >
997 MATRIX_A
const & LVARRAY_RESTRICT_REF matrixA,
998 VECTOR_B
const & LVARRAY_RESTRICT_REF vectorB )
1000 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
1001 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
1002 internal::checkSizes< ISIZE >( dstVector );
1003 internal::checkSizes< JSIZE, ISIZE >( matrixA );
1004 internal::checkSizes< JSIZE >( vectorB );
1006 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
1008 for( std::ptrdiff_t j = 0; j < JSIZE; ++j )
1010 dstVector[ i ] = dstVector[ i ] + matrixA[ j ][ i ] * vectorB[ j ];
1032 template< std::ptrdiff_t ISIZE, std::ptrdiff_t JSIZE,
typename DST_MATRIX,
typename SRC_MATRIX >
1034 void transpose( DST_MATRIX && LVARRAY_RESTRICT_REF dstMatrix,
1035 SRC_MATRIX
const & LVARRAY_RESTRICT_REF srcMatrix )
1037 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
1038 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
1039 internal::checkSizes< ISIZE, JSIZE >( dstMatrix );
1040 internal::checkSizes< JSIZE, ISIZE >( srcMatrix );
1042 for( std::ptrdiff_t i = 0; i < JSIZE; ++i )
1044 for( std::ptrdiff_t j = 0; j < ISIZE; ++j )
1046 dstMatrix[ j ][ i ] = srcMatrix[ i ][ j ];
1065 template< std::ptrdiff_t ISIZE,
1066 std::ptrdiff_t JSIZE,
1067 std::ptrdiff_t KSIZE,
1068 typename DST_MATRIX,
1073 MATRIX_A
const & LVARRAY_RESTRICT_REF matrixA,
1074 MATRIX_B
const & LVARRAY_RESTRICT_REF matrixB )
1076 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
1077 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
1078 static_assert( KSIZE > 0,
"KSIZE must be greater than zero." );
1079 internal::checkSizes< ISIZE, JSIZE >( dstMatrix );
1080 internal::checkSizes< ISIZE, KSIZE >( matrixA );
1081 internal::checkSizes< KSIZE, JSIZE >( matrixB );
1084 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
1086 for( std::ptrdiff_t j = 0; j < JSIZE; ++j )
1088 dstMatrix[ i ][ j ] = matrixA[ i ][ 0 ] * matrixB[ 0 ][ j ];
1089 for( std::ptrdiff_t k = 1; k < KSIZE; ++k )
1091 dstMatrix[ i ][ j ] = dstMatrix[ i ][ j ] + matrixA[ i ][ k ] * matrixB[ k ][ j ];
1111 template< std::ptrdiff_t ISIZE,
1112 std::ptrdiff_t JSIZE,
1113 std::ptrdiff_t KSIZE,
1114 typename DST_MATRIX,
1119 MATRIX_A
const & LVARRAY_RESTRICT_REF matrixA,
1120 MATRIX_B
const & LVARRAY_RESTRICT_REF matrixB )
1122 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
1123 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
1124 static_assert( KSIZE > 0,
"KSIZE must be greater than zero." );
1125 internal::checkSizes< ISIZE, JSIZE >( dstMatrix );
1126 internal::checkSizes< ISIZE, KSIZE >( matrixA );
1127 internal::checkSizes< KSIZE, JSIZE >( matrixB );
1130 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
1132 for( std::ptrdiff_t j = 0; j < JSIZE; ++j )
1134 for( std::ptrdiff_t k = 0; k < KSIZE; ++k )
1136 dstMatrix[ i ][ j ] = dstMatrix[ i ][ j ] + matrixA[ i ][ k ] * matrixB[ k ][ j ];
1156 template< std::ptrdiff_t ISIZE,
1157 std::ptrdiff_t JSIZE,
1158 std::ptrdiff_t KSIZE,
1159 typename DST_MATRIX,
1164 MATRIX_A
const & LVARRAY_RESTRICT_REF matrixA,
1165 MATRIX_B
const & LVARRAY_RESTRICT_REF matrixB )
1167 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
1168 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
1169 static_assert( KSIZE > 0,
"KSIZE must be greater than zero." );
1170 internal::checkSizes< ISIZE, JSIZE >( dstMatrix );
1171 internal::checkSizes< ISIZE, KSIZE >( matrixA );
1172 internal::checkSizes< JSIZE, KSIZE >( matrixB );
1175 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
1177 for( std::ptrdiff_t j = 0; j < JSIZE; ++j )
1179 dstMatrix[ i ][ j ] = matrixA[ i ][ 0 ] * matrixB[ j ][ 0 ];
1180 for( std::ptrdiff_t k = 1; k < KSIZE; ++k )
1182 dstMatrix[ i ][ j ] = dstMatrix[ i ][ j ] + matrixA[ i ][ k ] * matrixB[ j ][ k ];
1202 template< std::ptrdiff_t ISIZE,
1203 std::ptrdiff_t JSIZE,
1204 std::ptrdiff_t KSIZE,
1205 typename DST_MATRIX,
1210 MATRIX_A
const & LVARRAY_RESTRICT_REF matrixA,
1211 MATRIX_B
const & LVARRAY_RESTRICT_REF matrixB )
1213 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
1214 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
1215 static_assert( KSIZE > 0,
"KSIZE must be greater than zero." );
1216 internal::checkSizes< ISIZE, JSIZE >( dstMatrix );
1217 internal::checkSizes< ISIZE, KSIZE >( matrixA );
1218 internal::checkSizes< JSIZE, KSIZE >( matrixB );
1220 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
1222 for( std::ptrdiff_t j = 0; j < JSIZE; ++j )
1224 for( std::ptrdiff_t k = 0; k < KSIZE; ++k )
1226 dstMatrix[ i ][ j ] = dstMatrix[ i ][ j ] + matrixA[ i ][ k ] * matrixB[ j ][ k ];
1243 template< std::ptrdiff_t ISIZE,
1244 std::ptrdiff_t JSIZE,
1245 typename DST_MATRIX,
1249 MATRIX_A
const & LVARRAY_RESTRICT_REF matrixA )
1251 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
1252 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
1253 internal::checkSizes< ISIZE, ISIZE >( dstMatrix );
1254 internal::checkSizes< ISIZE, JSIZE >( matrixA );
1256 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
1258 for( std::ptrdiff_t j = 0; j < ISIZE; ++j )
1260 for( std::ptrdiff_t k = 0; k < JSIZE; ++k )
1262 dstMatrix[ i ][ j ] = dstMatrix[ i ][ j ] + matrixA[ i ][ k ] * matrixA[ j ][ k ];
1282 template< std::ptrdiff_t ISIZE,
1283 std::ptrdiff_t JSIZE,
1284 std::ptrdiff_t KSIZE,
1285 typename DST_MATRIX,
1290 MATRIX_A
const & LVARRAY_RESTRICT_REF matrixA,
1291 MATRIX_B
const & LVARRAY_RESTRICT_REF matrixB )
1293 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
1294 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
1295 static_assert( KSIZE > 0,
"KSIZE must be greater than zero." );
1296 internal::checkSizes< ISIZE, JSIZE >( dstMatrix );
1297 internal::checkSizes< KSIZE, ISIZE >( matrixA );
1298 internal::checkSizes< KSIZE, JSIZE >( matrixB );
1300 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
1302 for( std::ptrdiff_t j = 0; j < JSIZE; ++j )
1304 dstMatrix[ i ][ j ] = matrixA[ 0 ][ i ] * matrixB[ 0 ][ j ];
1305 for( std::ptrdiff_t k = 1; k < KSIZE; ++k )
1307 dstMatrix[ i ][ j ] = dstMatrix[ i ][ j ] + matrixA[ k ][ i ] * matrixB[ k ][ j ];
1324 template< std::ptrdiff_t ISIZE,
1325 std::ptrdiff_t JSIZE,
1326 typename DST_MATRIX,
1330 MATRIX_A
const & LVARRAY_RESTRICT_REF matrixA )
1332 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
1333 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
1334 internal::checkSizes< ISIZE, ISIZE >( dstMatrix );
1335 internal::checkSizes< JSIZE, ISIZE >( matrixA );
1337 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
1339 for( std::ptrdiff_t j = 0; j < ISIZE; ++j )
1341 dstMatrix[ i ][ j ] = matrixA[ 0 ][ i ] * matrixA[ 0 ][ j ];
1342 for( std::ptrdiff_t k = 1; k < JSIZE; ++k )
1344 dstMatrix[ i ][ j ] = dstMatrix[ i ][ j ] + matrixA[ k ][ i ] * matrixA[ k ][ j ];
1364 template< std::ptrdiff_t ISIZE,
1365 std::ptrdiff_t JSIZE,
1366 std::ptrdiff_t KSIZE,
1367 typename DST_MATRIX,
1372 MATRIX_A
const & LVARRAY_RESTRICT_REF matrixA,
1373 MATRIX_B
const & LVARRAY_RESTRICT_REF matrixB )
1375 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
1376 static_assert( JSIZE > 0,
"JSIZE must be greater than zero." );
1377 static_assert( KSIZE > 0,
"KSIZE must be greater than zero." );
1378 internal::checkSizes< ISIZE, JSIZE >( dstMatrix );
1379 internal::checkSizes< KSIZE, ISIZE >( matrixA );
1380 internal::checkSizes< KSIZE, JSIZE >( matrixB );
1382 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
1384 for( std::ptrdiff_t j = 0; j < JSIZE; ++j )
1386 for( std::ptrdiff_t k = 0; k < KSIZE; ++k )
1388 dstMatrix[ i ][ j ] = dstMatrix[ i ][ j ] + matrixA[ k ][ i ] * matrixB[ k ][ j ];
1408 template< std::ptrdiff_t ISIZE,
typename MATRIX >
1412 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
1413 internal::checkSizes< ISIZE, ISIZE >( matrix );
1415 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
1417 for( std::ptrdiff_t j = i + 1; j < ISIZE; ++j )
1419 auto const entryIJ = matrix[ i ][ j ];
1420 matrix[ i ][ j ] = matrix[ j ][ i ];
1421 matrix[ j ][ i ] = entryIJ;
1434 template< std::ptrdiff_t ISIZE,
typename MATRIX >
1436 void addIdentity( MATRIX && matrix, std::remove_reference_t< decltype( matrix[ 0 ][ 0 ] ) >
const scale )
1438 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
1439 internal::checkSizes< ISIZE, ISIZE >( matrix );
1441 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
1443 matrix[ i ][ i ] +=
scale;
1453 template< std::ptrdiff_t ISIZE,
typename MATRIX >
1457 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
1458 internal::checkSizes< ISIZE, ISIZE >( matrix );
1460 auto trace = matrix[ 0 ][ 0 ];
1461 for( std::ptrdiff_t i = 1; i < ISIZE; ++i )
1463 trace += matrix[ i ][ i ];
1485 template< std::ptrdiff_t ISIZE,
typename SYM_MATRIX >
1487 void symAddIdentity( SYM_MATRIX && symMatrix, std::remove_reference_t< decltype( symMatrix[ 0 ] ) >
const scale )
1489 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
1490 internal::checkSizes< SYM_SIZE< ISIZE > >( symMatrix );
1492 for( std::ptrdiff_t i = 0; i < ISIZE; ++i )
1494 symMatrix[ i ] +=
scale;
1504 template< std::ptrdiff_t ISIZE,
typename SYM_MATRIX >
1508 static_assert( ISIZE > 0,
"ISIZE must be greater than zero." );
1509 internal::checkSizes< SYM_SIZE< ISIZE > >( symMatrix );
1511 auto trace = symMatrix[ 0 ];
1512 for( std::ptrdiff_t i = 1; i < ISIZE; ++i )
1514 trace += symMatrix[ i ];
#define LVARRAY_UNUSED_VARIABLE(X)
Mark X as an unused variable, used to silence compiler warnings.
Definition: Macros.hpp:51
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void Rij_add_AikBkj(DST_MATRIX &&LVARRAY_RESTRICT_REF dstMatrix, MATRIX_A const &LVARRAY_RESTRICT_REF matrixA, MATRIX_B const &LVARRAY_RESTRICT_REF matrixB)
Multiply matrixA with matrixB and add the result to dstMatrix.
Definition: genericTensorOps.hpp:1118
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void subtract(DST_VECTOR &&LVARRAY_RESTRICT_REF dstVector, SRC_VECTOR const &LVARRAY_RESTRICT_REF srcVector)
Subtract srcVector from dstVector.
Definition: genericTensorOps.hpp:592
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void scaledCopy(DST_VECTOR &&LVARRAY_RESTRICT_REF dstVector, SRC_VECTOR const &LVARRAY_RESTRICT_REF srcVector, std::remove_reference_t< decltype(srcVector[0]) > const scale)
Copy srcVector scaled by scale into dstVector.
Definition: genericTensorOps.hpp:461
constexpr std::ptrdiff_t SYM_SIZE
The size of a symmetric MxM matrix in Voigt notation.
Definition: genericTensorOps.hpp:270
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void scaledAdd(DST_VECTOR &&LVARRAY_RESTRICT_REF dstVector, SRC_VECTOR const &LVARRAY_RESTRICT_REF srcVector, std::remove_reference_t< decltype(srcVector[0]) > const scale)
Add srcVector scaled by scale to dstVector.
Definition: genericTensorOps.hpp:617
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void add(DST_VECTOR &&LVARRAY_RESTRICT_REF dstVector, SRC_VECTOR const &LVARRAY_RESTRICT_REF srcVector)
Add srcVector to dstVector.
Definition: genericTensorOps.hpp:539
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void fill(VECTOR &&vector, std::remove_reference_t< decltype(vector[0]) > const value)
Set the entries of vector to value.
Definition: genericTensorOps.hpp:312
#define HAS_STATIC_MEMBER(NAME)
Macro that expands to a static constexpr bool templated on a type that is only true when the type has...
Definition: typeManipulation.hpp:109
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void Rij_add_AikBjk(DST_MATRIX &&LVARRAY_RESTRICT_REF dstMatrix, MATRIX_A const &LVARRAY_RESTRICT_REF matrixA, MATRIX_B const &LVARRAY_RESTRICT_REF matrixB)
Multiply matrixA with the transpose of matrixB and put the result into dstMatrix. ...
Definition: genericTensorOps.hpp:1209
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void Rij_eq_AiBj(DST_MATRIX &&LVARRAY_RESTRICT_REF dstMatrix, VECTOR_A const &LVARRAY_RESTRICT_REF vectorA, VECTOR_B const &LVARRAY_RESTRICT_REF vectorB)
Perform the outer product of vectorA and vectorB writing the result to dstMatrix. ...
Definition: genericTensorOps.hpp:827
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void Rij_add_AkiBkj(DST_MATRIX &&LVARRAY_RESTRICT_REF dstMatrix, MATRIX_A const &LVARRAY_RESTRICT_REF matrixA, MATRIX_B const &LVARRAY_RESTRICT_REF matrixB)
Multiply the transpose of matrixA with matrixB and add the result into dstMatrix. ...
Definition: genericTensorOps.hpp:1371
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void Ri_add_AjiBj(DST_VECTOR &&LVARRAY_RESTRICT_REF dstVector, MATRIX_A const &LVARRAY_RESTRICT_REF matrixA, VECTOR_B const &LVARRAY_RESTRICT_REF vectorB)
Perform the matrix vector multiplication of the transpose of matrixA and vectorB adding the result to...
Definition: genericTensorOps.hpp:996
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void hadamardProduct(DST_VECTOR &&LVARRAY_RESTRICT_REF dstVector, VECTOR_A const &LVARRAY_RESTRICT_REF vectorA, VECTOR_B const &LVARRAY_RESTRICT_REF vectorB)
Multiply the elements of vectorA and vectorB putting the result into dstVector.
Definition: genericTensorOps.hpp:675
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK auto trace(MATRIX const &matrix)
Definition: genericTensorOps.hpp:1455
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK auto l2Norm(VECTOR const &vector)
Definition: genericTensorOps.hpp:727
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void copy(DST_VECTOR &&LVARRAY_RESTRICT_REF dstVector, SRC_VECTOR const &LVARRAY_RESTRICT_REF srcVector)
Copy srcVector into dstVector.
Definition: genericTensorOps.hpp:360
#define CONSTEXPR_WITHOUT_BOUNDS_CHECK
Expands to constexpr when array bound checking is disabled.
Definition: Macros.hpp:609
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void Rij_add_AiBj(DST_MATRIX &&LVARRAY_RESTRICT_REF dstMatrix, VECTOR_A const &LVARRAY_RESTRICT_REF vectorA, VECTOR_B const &LVARRAY_RESTRICT_REF vectorB)
Perform the outer product of vectorA and vectorB adding the result to dstMatrix.
Definition: genericTensorOps.hpp:860
Contains the implementation of LvArray::ArraySlice.
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK auto l2NormSquared(VECTOR const &vector)
Definition: genericTensorOps.hpp:706
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void Ri_eq_AjiBj(DST_VECTOR &&LVARRAY_RESTRICT_REF dstVector, MATRIX_A const &LVARRAY_RESTRICT_REF matrixA, VECTOR_B const &LVARRAY_RESTRICT_REF vectorB)
Perform the matrix vector multiplication of the transpose of matrixA and vectorB writing the result t...
Definition: genericTensorOps.hpp:961
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void transpose(DST_MATRIX &&LVARRAY_RESTRICT_REF dstMatrix, SRC_MATRIX const &LVARRAY_RESTRICT_REF srcMatrix)
Store the transpose of the NxM matrix srcMatrix in dstMatrix.
Definition: genericTensorOps.hpp:1034
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void Rij_eq_AikBjk(DST_MATRIX &&LVARRAY_RESTRICT_REF dstMatrix, MATRIX_A const &LVARRAY_RESTRICT_REF matrixA, MATRIX_B const &LVARRAY_RESTRICT_REF matrixB)
Multiply matrixA with the transpose of matrixB and put the result into dstMatrix. ...
Definition: genericTensorOps.hpp:1163
Contains some portable math functions.
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK auto maxAbsoluteEntry(VECTOR &&vector)
Definition: genericTensorOps.hpp:288
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK auto AiBi(VECTOR_A const &LVARRAY_RESTRICT_REF vectorA, VECTOR_B const &LVARRAY_RESTRICT_REF vectorB)
Definition: genericTensorOps.hpp:765
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void addScalar(DST_VECTOR &&LVARRAY_RESTRICT_REF dstVector, std::remove_reference_t< decltype(dstVector[0]) > const value)
Add value to dstVector.
Definition: genericTensorOps.hpp:516
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void symAddIdentity(SYM_MATRIX &&symMatrix, std::remove_reference_t< decltype(symMatrix[0]) > const scale)
Add scale times the identity matrix to symMatrix.
Definition: genericTensorOps.hpp:1487
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK auto symTrace(SYM_MATRIX const &symMatrix)
Definition: genericTensorOps.hpp:1506
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void Rij_eq_AikBkj(DST_MATRIX &&LVARRAY_RESTRICT_REF dstMatrix, MATRIX_A const &LVARRAY_RESTRICT_REF matrixA, MATRIX_B const &LVARRAY_RESTRICT_REF matrixB)
Multiply matrixA with matrixB and put the result into dstMatrix.
Definition: genericTensorOps.hpp:1072
LVARRAY_HOST_DEVICE float sqrt(float const x)
Definition: math.hpp:461
The top level namespace.
Definition: Array.hpp:24
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void Rij_eq_AkiBkj(DST_MATRIX &&LVARRAY_RESTRICT_REF dstMatrix, MATRIX_A const &LVARRAY_RESTRICT_REF matrixA, MATRIX_B const &LVARRAY_RESTRICT_REF matrixB)
Multiply the transpose of matrixA with matrixB and put the result into dstMatrix. ...
Definition: genericTensorOps.hpp:1289
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void crossProduct(DST_VECTOR &&LVARRAY_RESTRICT_REF dstVector, VECTOR_A const &LVARRAY_RESTRICT_REF vectorA, VECTOR_B const &LVARRAY_RESTRICT_REF vectorB)
Compute the cross product of vectorA and vectorB and put it in dstVector.
Definition: genericTensorOps.hpp:792
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void addIdentity(MATRIX &&matrix, std::remove_reference_t< decltype(matrix[0][0]) > const scale)
Add scale times the identity matrix to matrix.
Definition: genericTensorOps.hpp:1436
LVARRAY_HOST_DEVICE constexpr T abs(T const x)
Definition: math.hpp:402
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void Rij_eq_AkiAkj(DST_MATRIX &&LVARRAY_RESTRICT_REF dstMatrix, MATRIX_A const &LVARRAY_RESTRICT_REF matrixA)
Multiply the transpose of matrixA with matrixA and put the result into dstMatrix. ...
Definition: genericTensorOps.hpp:1329
LVARRAY_HOST_DEVICE constexpr std::enable_if_t< std::is_arithmetic< T >::value, T > max(T const a, T const b)
Definition: math.hpp:311
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void scale(VECTOR &&vector, std::remove_reference_t< decltype(vector[0]) > const scale)
Multiply the entries of vector by scale.
Definition: genericTensorOps.hpp:412
LVARRAY_HOST_DEVICE float invSqrt(float const x)
Definition: math.hpp:503
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK auto normalize(VECTOR &&vector)
Scale vector to a unit vector.
Definition: genericTensorOps.hpp:744
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void Rij_add_AikAjk(DST_MATRIX &&LVARRAY_RESTRICT_REF dstMatrix, MATRIX_A const &LVARRAY_RESTRICT_REF matrixA)
Multiply matrixA with the transpose of itself and put the result into dstMatrix.
Definition: genericTensorOps.hpp:1248
#define LVARRAY_ERROR_IF_NE(lhs, rhs)
Raise a hard error if two values are not equal.
Definition: Macros.hpp:321
LVARRAY_HOST_DEVICE constexpr std::enable_if_t< HasStaticMember_SIZE< T > > checkSizes(T const &src)
Verify at compile time that the size of a user-provided type is as expected.
Definition: genericTensorOps.hpp:178
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void Ri_add_AijBj(DST_VECTOR &&LVARRAY_RESTRICT_REF dstVector, MATRIX_A const &LVARRAY_RESTRICT_REF matrixA, VECTOR_B const &LVARRAY_RESTRICT_REF vectorB)
Perform the matrix vector multiplication of matrixA and vectorB adding the result to dstVector...
Definition: genericTensorOps.hpp:927
#define LVARRAY_HOST_DEVICE
Mark a function for both host and device usage.
Definition: Macros.hpp:549
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK void Ri_eq_AijBj(DST_VECTOR &&LVARRAY_RESTRICT_REF dstVector, MATRIX_A const &LVARRAY_RESTRICT_REF matrixA, VECTOR_B const &LVARRAY_RESTRICT_REF vectorB)
Perform the matrix vector multiplication of matrixA and vectorB writing the result to dstVector...
Definition: genericTensorOps.hpp:893