From a3a4bb59bc50c2fe415fd6aab4c88dd2b055899b Mon Sep 17 00:00:00 2001 From: Randolf Beerwerth <r.beerwerth@fz-juelich.de> Date: Tue, 22 Sep 2020 12:12:17 +0200 Subject: [PATCH] Correctly implement k = 0 corner case --- .../SpecularMagneticNewStrategy.cpp | 22 ++++++++++++------- Core/RT/MatrixRTCoefficients_v3.cpp | 7 +++--- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/Core/Multilayer/SpecularMagneticNewStrategy.cpp b/Core/Multilayer/SpecularMagneticNewStrategy.cpp index e6ace084c63..6dac8e0bf6e 100644 --- a/Core/Multilayer/SpecularMagneticNewStrategy.cpp +++ b/Core/Multilayer/SpecularMagneticNewStrategy.cpp @@ -56,6 +56,8 @@ std::vector<MatrixRTCoefficients_v3> SpecularMagneticNewStrategy::computeTR(const std::vector<Slice>& slices, const std::vector<complex_t>& kzs) const { + const size_t N = slices.size(); + if (slices.size() != kzs.size()) throw std::runtime_error( "Error in SpecularMagnetic_::execute: kz vector and slices size shall coinside."); @@ -63,9 +65,9 @@ SpecularMagneticNewStrategy::computeTR(const std::vector<Slice>& slices, return {}; std::vector<MatrixRTCoefficients_v3> result; - result.reserve(slices.size()); + result.reserve(N); - const double kz_sign = kzs.front().real() > 0.0 ? 1.0 : -1.0; // save sign to restore it later + const double kz_sign = kzs.front().real() >= 0.0 ? 1.0 : -1.0; // save sign to restore it later auto B_0 = slices.front().bField(); result.emplace_back(kz_sign, eigenvalues(kzs.front(), 0.0), kvector_t{0.0, 0.0, 0.0}, 0.0); @@ -76,12 +78,16 @@ SpecularMagneticNewStrategy::computeTR(const std::vector<Slice>& slices, B.mag() > eps ? B / B.mag() : kvector_t{0.0, 0.0, 0.0}, magnetic_SLD); } - if (std::abs(kzs[0]) < std::sqrt(eps)) { - for (size_t i = 0, size = slices.size(); i < size; ++i) { - if (std::abs(kzs[i]) >= std::sqrt(eps)) { - result[i].m_T << 0, 0, 0, 0; - result[i].m_R << 0, 0, 0, 0; - } + if(N == 1){ + result[0].m_T = Eigen::Matrix2cd::Identity(); + result[0].m_R = Eigen::Matrix2cd::Zero(); + return result; + }else if(kzs[0] == 0.0){ + result[0].m_T = Eigen::Matrix2cd::Identity(); + result[0].m_R = -Eigen::Matrix2cd::Identity(); + for (size_t i = 1; i < N; ++i) { + result[i].m_T.setZero(); + result[i].m_R.setZero(); } return result; } diff --git a/Core/RT/MatrixRTCoefficients_v3.cpp b/Core/RT/MatrixRTCoefficients_v3.cpp index 18b4ec09c8c..b72cfead875 100644 --- a/Core/RT/MatrixRTCoefficients_v3.cpp +++ b/Core/RT/MatrixRTCoefficients_v3.cpp @@ -54,9 +54,9 @@ Eigen::Matrix2cd MatrixRTCoefficients_v3::TransformationMatrix(complex_t eigenva } else if (m_b.mag() < eps && eigenvalue != 0.) return exp2; - // result = Eigen::Matrix2cd(Eigen::DiagonalMatrix<complex_t, 2>({0.5, 0.5})); + else if (m_b.mag() < eps && eigenvalue == 0.) - return Eigen::Matrix2cd(Eigen::DiagonalMatrix<complex_t, 2>({0.5, 0.5})); + return exp2; throw std::runtime_error("Broken magnetic field vector"); } @@ -145,7 +145,8 @@ Eigen::Matrix2cd MatrixRTCoefficients_v3::computeInverseP() const const complex_t beta = m_lambda(1) - m_lambda(0); if (std::abs(alpha * alpha - beta * beta) < eps) - throw std::runtime_error("Singular p_m"); +// throw std::runtime_error("Singular p_m"); + return Eigen::Matrix2cd::Zero(); Eigen::Matrix2cd result = pMatrixHelper(-1.); result *= 2. / (alpha * alpha - beta * beta); -- GitLab