21 namespace DeterminantDetail
23 template <
int dim,
class Scalar>
30 return A[0][0]*dA[1][1] + dA[0][0]*A[1][1] - A[0][1]*dA[1][0] - dA[0][1]*A[1][0];
40 for (
int i=0; i<3; ++i)
41 ret += A[0][i]*A[1][(i+1)%3]*dA[2][(i+2)%3] + A[0][i]*dA[1][(i+1)%3]*A[2][(i+2)%3] + dA[0][i]*A[1][(i+1)%3]*A[2][(i+2)%3]
42 - A[2][i]*A[1][(i+1)%3]*dA[0][(i+2)%3] - A[2][i]*dA[1][(i+1)%3]*A[0][(i+2)%3] - dA[2][i]*A[1][(i+1)%3]*A[0][(i+2)%3];
48 template <
int dim,
class Scalar>
55 return dA2[0][0]*dA1[1][1] + dA1[0][0]*dA2[1][1] - dA2[0][1]*dA1[1][0] - dA1[0][1]*dA2[1][0];
60 for (
int i=0; i<3; ++i)
61 ret += A[0][i]*dA2[1][(i+1)%3]*dA1[2][(i+2)%3] + A[0][i]*dA1[1][(i+1)%3]*dA2[2][(i+2)%3] + dA1[0][i]*A[1][(i+1)%3]*dA2[2][(i+2)%3]
62 + dA2[0][i]*A[1][(i+1)%3]*dA1[2][(i+2)%3] + dA2[0][i]*dA1[1][(i+1)%3]*A[2][(i+2)%3] + dA1[0][i]*dA2[1][(i+1)%3]*A[2][(i+2)%3]
63 - A[2][i]*dA2[1][(i+1)%3]*dA1[0][(i+2)%3] - A[2][i]*dA1[1][(i+1)%3]*dA2[0][(i+2)%3] - dA1[2][i]*A[1][(i+1)%3]*dA2[0][(i+2)%3]
64 - dA2[2][i]*A[1][(i+1)%3]*dA1[0][(i+2)%3] - dA2[2][i]*dA1[1][(i+1)%3]*A[0][(i+2)%3] - dA1[2][i]*dA2[1][(i+1)%3]*A[0][(i+2)%3];
70 template <
int dim,
class Scalar>
80 for (
int i=0; i<3; ++i)
81 ret += dA3[0][i]*dA2[1][(i+1)%3]*dA1[2][(i+2)%3] + dA3[0][i]*dA1[1][(i+1)%3]*dA2[2][(i+2)%3] + dA1[0][i]*dA3[1][(i+1)%3]*dA2[2][(i+2)%3]
82 + dA2[0][i]*dA3[1][(i+1)%3]*dA1[2][(i+2)%3] + dA2[0][i]*dA1[1][(i+1)%3]*dA3[2][(i+2)%3] + dA1[0][i]*dA2[1][(i+1)%3]*dA3[2][(i+2)%3]
83 - dA3[2][i]*dA2[1][(i+1)%3]*dA1[0][(i+2)%3] - dA3[2][i]*dA1[1][(i+1)%3]*dA2[0][(i+2)%3] - dA1[2][i]*dA3[1][(i+1)%3]*dA2[0][(i+2)%3]
84 - dA2[2][i]*dA3[1][(i+1)%3]*dA1[0][(i+2)%3] - dA2[2][i]*dA1[1][(i+1)%3]*dA3[0][(i+2)%3] - dA1[2][i]*dA2[1][(i+1)%3]*dA3[0][(i+2)%3];
100 template <
int dim,
class Scalar=
double,
bool byValue=true>
103 static_assert(0<dim && dim<=3,
"determinant implemented only for dimensions 1-3");
115 return A.determinant();
120 return DeterminantDetail::determinantD1(A,dA);
125 return DeterminantDetail::determinantD2(A,dA1,dA2);
130 return DeterminantDetail::determinantD3(A,dA1,dA2,dA3);
134 std::conditional_t<byValue,Matrix,Matrix const&> A;
A class for computing determinants and their derivatives.
Determinant(Determinant const &)=default
double d1(Matrix const &dA) const
double d3(Matrix const &dA1, Matrix const &dA2, Matrix const &dA3) const
Determinant & operator=(Determinant const &)=default
double d2(Matrix const &dA1, Matrix const &dA2) const
Determinant(Matrix const &A_)