20 const double pi2_15 = std::pow(
M_PI_2, 1.5);
25 double sigma,
bool inverse)
const
27 if (sigma < 10 * std::numeric_limits<double>::epsilon())
28 return Eigen::Matrix2cd{Eigen::Matrix2cd::Identity()};
30 const double sigeff = pi2_15 * sigma;
31 const auto b = coeff.
m_b;
33 if (std::abs(b.mag() - 1.) < std::numeric_limits<double>::epsilon() * 10.) {
35 const double factor1 = 2. * (1. + b.z());
36 Q << (1. + b.z()), (
I * b.y() - b.x()), (b.x() +
I * b.y()), (b.z() + 1.);
46 const Eigen::Matrix2cd lambda = Eigen::DiagonalMatrix<complex_t, 2>({l1, l2});
48 return Q * lambda * Q.adjoint() / factor1;
50 }
else if (b.mag() < 10 * std::numeric_limits<double>::epsilon()) {
55 const Eigen::Matrix2cd lambda = Eigen::DiagonalMatrix<complex_t, 2>({alpha, alpha});
60 throw std::runtime_error(
"Broken magnetic field vector");
63 std::pair<Eigen::Matrix2cd, Eigen::Matrix2cd>
68 Eigen::Matrix2cd R{Eigen::Matrix2cd::Identity()};
69 Eigen::Matrix2cd RInv{Eigen::Matrix2cd::Identity()};
80 const Eigen::Matrix2cd mp = 0.5 * (RInv + mproduct * R);
81 const Eigen::Matrix2cd mm = 0.5 * (RInv - mproduct * R);
std::complex< double > complex_t
Defines M_PI and some more mathematical constants.
Defines functions in namespace Math.
Defines class SpecularMagneticTanhStrategy.
Specular reflection and transmission coefficients in a layer in case of magnetic interactions between...
Eigen::Matrix2cd computeInverseP() const
Eigen::Vector2cd m_lambda
wave propagation direction (-1 for direct one, 1 for time reverse)
kvector_t m_b
unit magnetic field vector
Eigen::Matrix2cd computeP() const
virtual std::pair< Eigen::Matrix2cd, Eigen::Matrix2cd > computeBackwardsSubmatrices(const MatrixRTCoefficients &coeff_i, const MatrixRTCoefficients &coeff_i1, double sigma) const
Eigen::Matrix2cd computeRoughnessMatrix(const MatrixRTCoefficients &coeff, double sigma, bool inverse=false) const
complex_t tanhc(const complex_t z)
Complex tanhc function: .