20#ifndef OPALX_SpinTBMTPusher_H
21#define OPALX_SpinTBMTPusher_H
25#include "Expression/IpplExpressions.h"
48 template <
typename SpinVec>
52 const double& charge,
const double& anom)
const {
60 const double bg2 =
dot(P, P);
61 const double gamma = Kokkos::sqrt(1.0 + bg2);
64 const double betaDotB =
dot(beta, Bf);
67 const double k1 = anom + 1.0 / gamma;
68 const double k2 = (anom * gamma) / (gamma + 1.0);
69 const double k3 = anom + 1.0 / (gamma + 1.0);
73 prefactor * (k1 * Bf - k2 * betaDotB * beta - (k3 /
Physics::c) * bcrossE);
75 const double omegaMag = Kokkos::sqrt(
dot(Omega, Omega));
76 const double phi = omegaMag * dt;
85 const int nSub =
static_cast<int>(Kokkos::ceil(phi /
maxAngle_m));
86 const double dphi = phi /
static_cast<double>(nSub);
87 const double cosDphi = Kokkos::cos(dphi);
88 const double sinDphi = Kokkos::sin(dphi);
93 static_cast<double>(Pol[0]),
static_cast<double>(Pol[1]),
94 static_cast<double>(Pol[2])};
95 for (
int i = 0; i < nSub; ++i) {
98 const double axisDotS =
dot(axis, S);
99 S = cosDphi * S + sinDphi * axisCrossS + (1.0 - cosDphi) * axisDotS * axis;
102 Pol[0] =
static_cast<float>(S[0]);
103 Pol[1] =
static_cast<float>(S[1]);
104 Pol[2] =
static_cast<float>(S[2]);
ippl::Vector< T, Dim > Vector_t
Vector3D cross(const Vector3D &lhs, const Vector3D &rhs)
Vector cross product.
double dot(const Vector3D &lhs, const Vector3D &rhs)
Vector dot product.
KOKKOS_INLINE_FUNCTION SpinTBMTPusher()=default
KOKKOS_INLINE_FUNCTION void evolve(SpinVec &Pol, const Vector_t< double, 3 > &P, const Vector_t< double, 3 > &Ef, const Vector_t< double, 3 > &Bf, const double &dt, const double &mass, const double &charge, const double &anom) const
static constexpr double maxAngle_m
constexpr double c
The velocity of light in m/s.