diff --git a/Core/Multilayer/IFresnelMap.h b/Core/Multilayer/IFresnelMap.h index b5f4a505615488d35fadd56bfdd8075c1a086b5e..46642dfe53c587022732e4c7e87e60b100c079c2 100644 --- a/Core/Multilayer/IFresnelMap.h +++ b/Core/Multilayer/IFresnelMap.h @@ -22,6 +22,7 @@ class ILayerRTCoefficients; class MultiLayer; class SimulationElement; +class SpecularSimulationElement; //! Holds the necessary information to calculate the radiation wavefunction in every layer //! for different incoming (outgoing) angles of the beam in the top layer @@ -44,6 +45,7 @@ public: //! Fills simulation element specular data virtual void fillSpecularData(SimulationElement& sim_element) const = 0; + virtual void fillSpecularData(SpecularSimulationElement& sim_element) const = 0; //! Sets the multilayer to be used for the Fresnel calculations. virtual void setMultilayer(const MultiLayer& multilayer); diff --git a/Core/Multilayer/MatrixFresnelMap.cpp b/Core/Multilayer/MatrixFresnelMap.cpp index d65a4cf3515a4a605010ce380a29043de2def034..37fc2181bb81ad3274bf2eead1b72e5d0f21b8da 100644 --- a/Core/Multilayer/MatrixFresnelMap.cpp +++ b/Core/Multilayer/MatrixFresnelMap.cpp @@ -19,6 +19,7 @@ #include "SimulationElement.h" #include "SpecularData.h" #include "SpecularMagnetic.h" +#include "SpecularSimulationElement.h" namespace { std::vector<MatrixRTCoefficients> calculateCoefficients(const MultiLayer& multilayer, @@ -57,6 +58,17 @@ void MatrixFresnelMap::fillSpecularData(SimulationElement& sim_element) const sim_element.setSpecular(std::make_unique<SpecularData>(std::move(coef_vector))); } +void MatrixFresnelMap::fillSpecularData(SpecularSimulationElement& sim_element) const +{ + const auto& kvec = sim_element.getKi(); + std::vector<MatrixRTCoefficients> coef_vector; + if (m_use_cache) + coef_vector = getCoefficientsFromCache(kvec, *mP_multilayer, m_hash_table_in); + else + coef_vector = calculateCoefficients(*mP_multilayer, kvec); + sim_element.setSpecular(std::make_unique<SpecularData>(std::move(coef_vector))); +} + const ILayerRTCoefficients* MatrixFresnelMap::getCoefficients(kvector_t kvec, size_t layer_index, const MultiLayer& multilayer, CoefficientHash& hash_table) const diff --git a/Core/Multilayer/MatrixFresnelMap.h b/Core/Multilayer/MatrixFresnelMap.h index 957c9bb279c064738e4decb66040372df5fccaaf..32ee7fc63262f5e5f68f1348e6625d063572e95e 100644 --- a/Core/Multilayer/MatrixFresnelMap.h +++ b/Core/Multilayer/MatrixFresnelMap.h @@ -45,6 +45,7 @@ public: //! Fills simulation element specular data void fillSpecularData(SimulationElement& sim_element) const override; + void fillSpecularData(SpecularSimulationElement& sim_element) const override; typedef std::unordered_map<kvector_t, std::vector<MatrixRTCoefficients>, HashKVector> CoefficientHash; diff --git a/Core/Multilayer/ScalarFresnelMap.cpp b/Core/Multilayer/ScalarFresnelMap.cpp index c0fc86bebe7c1b30d08b5f3bc8f052cb054c95cb..f3e217cc44a7f53a66a3b664191caf0680dfd487 100644 --- a/Core/Multilayer/ScalarFresnelMap.cpp +++ b/Core/Multilayer/ScalarFresnelMap.cpp @@ -18,6 +18,7 @@ #include "SimulationElement.h" #include "SpecularData.h" #include "SpecularMatrix.h" +#include "SpecularSimulationElement.h" namespace { std::vector<ScalarRTCoefficients> calculateCoefficients(const MultiLayer& multilayer, @@ -53,6 +54,17 @@ void ScalarFresnelMap::fillSpecularData(SimulationElement& sim_element) const sim_element.setSpecular(std::make_unique<SpecularData>(std::move(coef_vector))); } +void ScalarFresnelMap::fillSpecularData(SpecularSimulationElement& sim_element) const +{ + const auto& kvec = sim_element.getKi(); + std::vector<ScalarRTCoefficients> coef_vector; + if (m_use_cache) + coef_vector = getCoefficientsFromCache(kvec); + else + coef_vector = calculateCoefficients(*mP_multilayer, kvec); + sim_element.setSpecular(std::make_unique<SpecularData>(std::move(coef_vector))); +} + const ScalarRTCoefficients* ScalarFresnelMap::getCoefficients( kvector_t kvec, size_t layer_index) const { diff --git a/Core/Multilayer/ScalarFresnelMap.h b/Core/Multilayer/ScalarFresnelMap.h index 74e7c58076d1b3648a61b0fff41028fd5da91e0f..bd0b7fcabcab81fb3642a6d1577b4943a8d0f987 100644 --- a/Core/Multilayer/ScalarFresnelMap.h +++ b/Core/Multilayer/ScalarFresnelMap.h @@ -45,6 +45,7 @@ public: //! Fills simulation element specular data void fillSpecularData(SimulationElement& sim_element) const override; + void fillSpecularData(SpecularSimulationElement& sim_element) const override; private: const ScalarRTCoefficients* getCoefficients(kvector_t kvec, size_t layer_index) const;