21 const auto eps = std::numeric_limits<double>::epsilon() * 10.;
26 : m_kz_sign(kz_sign), m_lambda(std::move(
eigenvalues)), m_b(std::move(b)),
27 m_magnetic_SLD(magnetic_SLD)
46 const Eigen::Matrix2cd exp2 = Eigen::DiagonalMatrix<complex_t, 2>(selection);
50 const double factor1 = 2. * (1. +
m_b.
z());
52 return Q * exp2 * Q.adjoint() / factor1;
57 throw std::runtime_error(
"Broken magnetic field vector");
120 Eigen::Matrix2cd result;
124 result << alpha + sign * beta * b.
z(), sign * beta * (b.
x() -
I * b.
y()),
125 sign * beta * (b.
x() +
I * b.
y()), alpha - sign * beta * b.
z();
143 if (std::abs(alpha * alpha - beta * beta) == 0.)
144 return Eigen::Matrix2cd::Zero();
147 result *= 2. / (alpha * alpha - beta * beta);
154 Eigen::Matrix2cd result;
157 const Eigen::Matrix2cd exp2 = Eigen::DiagonalMatrix<complex_t, 2>(
163 const double factor1 = 2. * (1. +
m_b.
z());
166 return Q * exp2 * Q.adjoint() / factor1;
171 throw std::runtime_error(
"Broken magnetic field vector");
178 if (exponent.imag() > -std::log(std::numeric_limits<double>::min()))
180 return std::exp(
I * exponent);
Defines the macro ASSERT.
#define ASSERT(condition)
std::complex< double > complex_t
Defines class MatrixRTCoefficients_v3.
double mag() const
Returns magnitude of the vector.
T z() const
Returns z-component in cartesian coordinate system.
T y() const
Returns y-component in cartesian coordinate system.
T x() const
Returns x-component in cartesian coordinate system.
Specular reflection and transmission coefficients in a layer in case of magnetic interactions between...
Eigen::Vector2cd R2plus() const override
Eigen::Matrix2cd computeDeltaMatrix(double thickness)
Eigen::Vector2cd R1plus() const override
Eigen::Matrix2cd TransformationMatrix(Eigen::Vector2d selection) const
Eigen::Matrix2cd T2Matrix() const
Eigen::Vector2cd m_lambda
wave propagation direction (-1 for direct one, 1 for time reverse)
Eigen::Vector2cd T1plus() const override
The following functions return the transmitted and reflected amplitudes for different incoming beam p...
Eigen::Matrix2cd computeInverseP() const
Eigen::Vector2cd R1min() const override
Eigen::Vector2cd T2min() const override
Eigen::Matrix2cd T1Matrix() const
Eigen::Matrix2cd computeP() const
Eigen::Matrix2cd pMatrixHelper(double sign) const
Eigen::Vector2cd getKz() const override
Returns z-part of the two wavevector eigenmodes.
kvector_t m_b
unit magnetic field vector
~MatrixRTCoefficients_v3() override
Eigen::Vector2cd R2min() const override
MatrixRTCoefficients_v3(double kz_sign, Eigen::Vector2cd eigenvalues, kvector_t b, double magnetic_SLD)
Eigen::Vector2cd T2plus() const override
Eigen::Vector2cd T1min() const override
MatrixRTCoefficients_v3 * clone() const override
complex_t GetImExponential(complex_t exponent)
Eigen::Vector2cd eigenvalues(complex_t kz, double b_mag)