38 case 0: rdm(0,1) = rdm(2,3) = 1; rdm(1,0) = rdm(3,2) = -1;
break;
39 case 1: rdm(0,1) = rdm(1,0) = -1; rdm(2,3) = rdm(3,2) = 1;
break;
40 case 2: rdm(0,3) = rdm(1,2) = rdm(2,1) = rdm(3,0) = 1;
break;
41 case 3: rdm(0,0) = rdm(2,2) = -1; rdm(1,1) = rdm(3,3) = 1;
break;
42 case 4: rdm(0,0) = rdm(3,3) = -1; rdm(1,1) = rdm(2,2) = 1;
break;
43 case 5: rdm(0,2) = rdm(2,0) = 1; rdm(1,3) = rdm(3,1) = -1;
break;
44 case 6: rdm(0,1) = rdm(1,0) = rdm(2,3) = rdm(3,2) = 1;
break;
45 case 7: rdm(0,3) = rdm(2,1) = 1; rdm(1,2) = rdm(3,0) = -1;
break;
46 case 8: rdm(0,1) = rdm(3,2) = 1; rdm(1,0) = rdm(2,3) = -1;
break;
47 case 9: rdm(0,2) = rdm(1,3) = -1; rdm(2,0) = rdm(3,1) = 1;
break;
48 case 10: rdm(0,2) = rdm(3,1) = 1; rdm(1,3) = rdm(2,0) = -1;
break;
49 case 11: rdm(0,2) = rdm(1,3) = rdm(2,0) = rdm(3,1) = -1;
break;
50 case 12: rdm(0,0) = rdm(1,1) = -1; rdm(2,2) = rdm(3,3) = 1;
break;
51 case 13: rdm(0,3) = rdm(3,0) = -1; rdm(1,2) = rdm(2,1) = 1;
break;
52 case 14: rdm(0,3) = rdm(1,2) = -1; rdm(2,1) = rdm(3,0) = 1;
break;
53 case 15: rdm(0,0) = rdm(1,1) = rdm(2,2) = rdm(3,3) = 1;
break;
55 "Index (i = " + std::to_string(i)
56 +
" out of range: 0 <= i <= 15");
break;
65 R = boost::numeric::ublas::identity_matrix<double>(4);
69 double mr, mg, mb, eps;
72 auto mult = [&](
short i) {
82 P =
vector_t({ mult(1), mult(2), mult(3)});
83 E =
vector_t({ mult(4), mult(5), mult(6)});
84 B =
vector_t({-mult(7), -mult(8), -mult(9)});
85 mr = boost::numeric::ublas::inner_prod(E, B);
86 mg = boost::numeric::ublas::inner_prod(B, P);
92 P =
vector_t({ mult(1), mult(2), mult(3)});
93 E =
vector_t({ mult(4), mult(5), mult(6)});
94 B =
vector_t({-mult(7), -mult(8), -mult(9)});
101 P =
vector_t({ mult(1), mult(2), mult(3)});
102 E =
vector_t({ mult(4), mult(5), mult(6)});
103 B =
vector_t({-mult(7), -mult(8), -mult(9)});
110 P =
vector_t({ mult(1), mult(2), mult(3)});
111 E =
vector_t({ mult(4), mult(5), mult(6)});
112 B =
vector_t({-mult(7), -mult(8), -mult(9)});
113 mr = boost::numeric::ublas::inner_prod(E, B);
120 transform(Ms, 2, 0.5 * std::atanh(mr / b(1)),
R, invR);
122 transform(Ms, 2, 0.5 * std::atanh(b(1) / mr),
R, invR);
126 P =
vector_t({ mult(1), mult(2), mult(3)});
127 E =
vector_t({ mult(4), mult(5), mult(6)});
128 B =
vector_t({-mult(7), -mult(8), -mult(9)});
131 mr = boost::numeric::ublas::inner_prod(E, B);
132 mg = boost::numeric::ublas::inner_prod(B, P);
133 mb = boost::numeric::ublas::inner_prod(E, P);
135 double P2 = boost::numeric::ublas::inner_prod(P, P);
136 double E2 = boost::numeric::ublas::inner_prod(E, E);
142 P(0) = mult(1); P(2) = mult(3);
153 sparse_matrix_t invR = boost::numeric::ublas::identity_matrix<double>(4);
154 sparse_matrix_t iRtot = boost::numeric::ublas::identity_matrix<double>(4);
156 for (
int i = 0; i < 6; ++i) {
160 S = matt_boost::gemmm<matrix_t>(
R, S, invR);
174 return 0.5 * (M + matt_boost::gemmm<matrix_t>(rdm0,boost::numeric::ublas::trans(M),rdm0));
187 M = matt_boost::gemmm<matrix_t>(
R,M,invR);
200 if ((i < 7 && i != 0) || (i > 10 && i != 14)) {
214 double s0 = 0.25 * ( sigma(0, 0) + sigma(1, 1) + sigma(2, 2) + sigma(3, 3) );
215 double s1 = 0.25 * (-sigma(0, 0) + sigma(1, 1) + sigma(2, 2) - sigma(3, 3) );
216 double s2 = 0.5 * ( sigma(0, 2) - sigma(1, 3) );
217 double s3 = 0.5 * ( sigma(0, 1) + sigma(2, 3) );
218 double s4 = 0.5 * ( sigma(0, 1) - sigma(2, 3) );
219 double s5 = -0.5 * ( sigma(0, 3) + sigma(1, 2) );
220 double s6 = 0.25 * ( sigma(0, 0) - sigma(1, 1) + sigma(2, 2) - sigma(3, 3) );
221 double s7 = 0.5 * ( sigma(0, 2) + sigma(1, 3) );
222 double s8 = 0.25 * ( sigma(0, 0) + sigma(1, 1) - sigma(2, 2) - sigma(3, 3) );
223 double s9 = 0.5 * ( sigma(0, 3) - sigma(1, 2) );
225 vector_t P(3); P(0) = s1; P(1) = s2; P(2) = s3;
226 vector_t E(3); E(0) = s4; E(1) = s5; E(2) = s6;
227 vector_t B(3); B(0) = s7; B(1) = s8; B(2) = s9;
229 double mr = boost::numeric::ublas::inner_prod(E, B);
230 double mg = boost::numeric::ublas::inner_prod(B, P);
231 double mb = boost::numeric::ublas::inner_prod(E, P);
256 double eps = - std::atanh(mr / b(1));
263 boost::numeric::ublas::inner_prod(E, E) -
264 boost::numeric::ublas::inner_prod(P, P));
277 "Case " + std::to_string(i) +
Tps< T > cos(const Tps< T > &x)
Cosine.
Tps< T > cosh(const Tps< T > &x)
Hyperbolic cosine.
Tps< T > sinh(const Tps< T > &x)
Hyperbolic sine.
Tps< T > sin(const Tps< T > &x)
Sine.
PETE_TBTree< FnArcTan2, PETE_Scalar< Vektor< T1, Dim > >, typename T2::PETE_Expr_t > atan2(const Vektor< T1, Dim > &l, const PETE_Expr< T2 > &r)
T::PETE_Expr_t::PETE_Return_t prod(const PETE_Expr< T > &expr)
PETE_TUTree< FnFabs, typename T::PETE_Expr_t > fabs(const PETE_Expr< T > &l)
BOOST_UBLAS_INLINE ublas::vector< V, A > cross_prod(ublas::vector< V, A > &v1, ublas::vector< V, A > &v2)
Computes the cross product of two vectors in .
BOOST_UBLAS_INLINE V trace(ublas::matrix< V > &e)
Computes the trace of a square matrix.
boost::numeric::ublas::compressed_matrix< double, boost::numeric::ublas::row_major > sparse_matrix_t
Sparse matrix type definition.
RealDiracMatrix()
Default constructor (sets only NumOfRDMs and DimOfRDMs)
void transform(matrix_t &, short, double, sparse_matrix_t &, sparse_matrix_t &)
matrix_t symplex(const matrix_t &)
boost::numeric::ublas::matrix< double > matrix_t
Dense matrix type definition.
boost::numeric::ublas::vector< double, std::vector< double > > vector_t
Dense vector type definition.
sparse_matrix_t getRDM(short)
void update(matrix_t &sigma, short i, sparse_matrix_t &R, sparse_matrix_t &invR)
void diagonalize(matrix_t &, sparse_matrix_t &, sparse_matrix_t &)
The base class for all OPAL exceptions.