15 #include "Eigen/Dense" 
   21 static constexpr 
int LTmn = LogArea::Tmn::id;
 
   24   using Eigen::Matrix4d;
 
   25   using Eigen::Vector4d;
 
   49   logg[
LTmn].debug(
"Looking for Landau frame for T_{mu}^{nu} ", A);
 
   50   Eigen::EigenSolver<Matrix4d> es(A);
 
   52   Vector4d eig_im = es.eigenvalues().imag();
 
   53   Vector4d eig_re = es.eigenvalues().real();
 
   54   size_t i_maxeigenvalue = 0;
 
   55   for (
size_t i = 0; i < 4; i++) {
 
   56     if (eig_re(i_maxeigenvalue) < eig_re(i)) {
 
   66   if (i_maxeigenvalue != 0) {
 
   68         "The Tmn diagonalization code previously relied on assumption that" 
   69         " 0th eigenvalue is the largest one. It seems to be always fulfilled " 
   70         "in practice, but not guaranteed by Eigen. Here is Tmn * gmn, ",
 
   71         A, 
" for which it is not fulfilled. Please let Dima(oliiny) know.");
 
   73   for (
size_t i = 0; i < 4; i++) {
 
   75       logg[
LTmn].error(
"Tmn*gmn\n ", A, 
"\n has a complex eigenvalue ",
 
   76                        eig_re(i), 
" + i * ", eig_im(i));
 
   80                        "\nenergy density eigenvalue is not positive ",
 
   81                        eig_re(i), 
" + i * ", eig_im(i));
 
   82       logg[
LTmn].error(
"i_max = ", i_maxeigenvalue);
 
   85       logg[
LTmn].error(
"Tmn*gmn\n", A, 
"\npressure eigenvalue is not negative ",
 
   86                        eig_re(i), 
" + i * ", eig_im(i));
 
   90   Vector4d tmp = es.eigenvectors().col(i_maxeigenvalue).real();
 
   98   const double u_sqr = u.
sqr();
 
  100     u /= std::sqrt(u_sqr);
 
  103         "Landau frame is not defined.", 
" Eigen vector", u, 
" of ", A,
 
  104         " is not time-like and",
 
  105         " cannot be 4-velocity. This may happen if energy-momentum",
 
  106         " tensor was constructed for a massless particle.");
 
  113   using Eigen::Matrix4d;
 
  125   L << u[0], u[1], u[2], u[3],
 
  126        u[1], u[1] * tmp.
x1() + 1.0, u[2] * tmp.
x1(), u[3] * tmp.
x1(),
 
  127        u[2], u[1] * tmp.
x2(), u[2] * tmp.
x2() + 1.0, u[3] * tmp.
x2(),
 
  128        u[3], u[1] * tmp.
x3(), u[2] * tmp.
x3(), u[3] * tmp.
x3() + 1.0;
 
  134                                         R(1, 1), 
R(1, 2), 
R(1, 3),
 
  146   Tmn_[4] += mom[1] * tmp.
x1();
 
  147   Tmn_[5] += mom[1] * tmp.
x2();
 
  148   Tmn_[6] += mom[1] * tmp.
x3();
 
  149   Tmn_[7] += mom[2] * tmp.
x2();
 
  150   Tmn_[8] += mom[2] * tmp.
x3();
 
  151   Tmn_[9] += mom[3] * tmp.
x3();
 
  162   for (
size_t mu = 0; mu < 4; mu++) {
 
  163     for (
size_t nu = 0; nu < 4; nu++) {
 
  164       out << std::setprecision(3) << std::setw(12) << std::fixed
 
The EnergyMomentumTensor class represents a symmetric positive semi-definite energy-momentum tensor .
EnergyMomentumTensor boosted(const FourVector &u) const
Boost to a given 4-velocity.
FourVector landau_frame_4velocity() const
Find the Landau frame 4-velocity from energy-momentum tensor.
tmn_type Tmn_
The internal storage of the components.
EnergyMomentumTensor()
Default constructor (nulls all components)
static std::int8_t tmn_index(std::int8_t mu, std::int8_t nu)
Access the index of component .
void add_particle(const FourVector &mom)
Given momentum of the particle adds  to the energy momentum tensor.
The FourVector class holds relevant values in Minkowski spacetime with (+, −, −, −) metric signature.
double sqr() const
calculate the square of the vector (which is a scalar)
ThreeVector threevec() const
ParticleData contains the dynamic information of a certain particle.
The ThreeVector class represents a physical three-vector  with the components .
@ Tmn
Energy-momentum tensor in lab frame.
std::ostream & operator<<(std::ostream &out, const ActionPtr &action)
Convenience: dereferences the ActionPtr to Action.
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > logg
An array that stores all pre-configured Logger objects.
static constexpr int LTmn
constexpr double really_small
Numerical error tolerance.
Generic numerical functions.