From 48fc9a6326adbf61b83d5ba9ca23eda10f58d36f Mon Sep 17 00:00:00 2001 From: Dmitry Yurov <d.yurov@fz-juelich.de> Date: Fri, 19 Jan 2018 13:50:54 +0100 Subject: [PATCH] fillSpecularData for SpecularSimulationElement (code doubling) --- Core/Multilayer/IFresnelMap.h | 2 ++ Core/Multilayer/MatrixFresnelMap.cpp | 12 ++++++++++++ Core/Multilayer/MatrixFresnelMap.h | 1 + Core/Multilayer/ScalarFresnelMap.cpp | 12 ++++++++++++ Core/Multilayer/ScalarFresnelMap.h | 1 + 5 files changed, 28 insertions(+) diff --git a/Core/Multilayer/IFresnelMap.h b/Core/Multilayer/IFresnelMap.h index b5f4a505615..46642dfe53c 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 d65a4cf3515..37fc2181bb8 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 957c9bb279c..32ee7fc6326 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 c0fc86bebe7..f3e217cc44a 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 74e7c58076d..bd0b7fcabca 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; -- GitLab