44 double phi = std::sqrt(vx * vx + vy * vy + vz * vz);
47 double factor = std::sin(phi / 2.0) / phi;
48 double S0 = std::cos(phi / 2.0);
49 double S1 = factor * vx;
50 double S2 = factor * vy;
51 double S3 = factor * vz;
53 R(0, 0) = 2.0 * (S1 * S1 + S0 * S0) - 1.0;
54 R(0, 1) = 2.0 * (S1 * S2 - S0 * S3);
55 R(0, 2) = 2.0 * (S1 * S3 + S0 * S2);
57 R(1, 0) = 2.0 * (S2 * S1 + S0 * S3);
58 R(1, 1) = 2.0 * (S2 * S2 + S0 * S0) - 1.0;
59 R(1, 2) = 2.0 * (S2 * S3 - S0 * S1);
61 R(2, 0) = 2.0 * (S3 * S1 - S0 * S2);
62 R(2, 1) = 2.0 * (S3 * S2 + S0 * S1);
63 R(2, 2) = 2.0 * (S3 * S3 + S0 * S0) - 1.0;
69 vx = (
R(2, 1) -
R(1, 2)) / 2.0;
70 vy = (
R(0, 2) -
R(2, 0)) / 2.0;
71 vz = (
R(1, 0) -
R(0, 1)) / 2.0;
72 double c = (
R(0, 0) +
R(1, 1) +
R(2, 2) - 1.0) / 2.0;
73 double s = std::sqrt(vx * vx + vy * vy + vz * vz);
74 double phi = std::atan2(s,
c);
79 vx = (vx > 0.0 ? phi : (-phi)) * std::sqrt(
std::max(
R(0, 0) -
c, 0.0) / (1.0 -
c));
80 vy = (vy > 0.0 ? phi : (-phi)) * std::sqrt(
std::max(
R(1, 1) -
c, 0.0) / (1.0 -
c));
81 vz = (vz > 0.0 ? phi : (-phi)) * std::sqrt(
std::max(
R(2, 2) -
c, 0.0) / (1.0 -
c));
82 }
else if(std::abs(s) > 1.0e-10) {
83 double factor = phi / s;
101 for(
int i = 0; i < 3; i++) {
102 for(
int j = 0; j < 3; j++) {
103 inv.
R(i, j) =
R(j, i);
112 return (
R(0, 1) == 0.0) && (
R(1, 0) == 0.0) && (
R(0, 2) == 0.0) && (
R(2, 0) == 0.0);
117 return (
R(1, 2) == 0.0) && (
R(2, 1) == 0.0) && (
R(1, 0) == 0.0) && (
R(0, 1) == 0.0);
122 return (
R(2, 0) == 0.0) && (
R(0, 2) == 0.0) && (
R(2, 1) == 0.0) && (
R(1, 2) == 0.0);
133 result.
R(1, 1) = result.
R(2, 2) = std::cos(angle);
134 result.
R(1, 2) = - (result.
R(2, 1) = std::sin(angle));
141 result.
R(2, 2) = result.
R(0, 0) = std::cos(angle);
142 result.
R(2, 0) = - (result.
R(0, 2) = std::sin(angle));
149 result.
R(0, 0) = result.
R(1, 1) = std::cos(angle);
150 result.
R(0, 1) = - (result.
R(1, 0) = std::sin(angle));
constexpr double c
The velocity of light in m/s.
KOKKOS_INLINE_FUNCTION Vector< T, Dim > max(const Vector< T, Dim > &a, const Vector< T, Dim > &b)
Rotation in 3-dimensional space.
static Rotation3D Identity()
Make identity.
static Rotation3D ZRotation(double angle)
Make rotation.
static Rotation3D YRotation(double angle)
Make rotation.
Rotation3D inverse() const
Inversion.
bool isPureXRotation() const
Test for rotation.
Vector3D getAxis() const
Get axis vector.
bool isPureZRotation() const
Test for rotation.
static Rotation3D XRotation(double angle)
Make rotation.
bool isPureYRotation() const
Test for rotation.
Rotation3D()
Default constructor.