From 830a901a3c300a43fabde11b664a8dcb260d5335 Mon Sep 17 00:00:00 2001 From: Dmitry Yurov <d.yurov@fz-juelich.de> Date: Mon, 26 Mar 2018 13:24:38 +0200 Subject: [PATCH] Changes to IFresnelMap for easier access to Fresnel coefficients --- Core/Multilayer/IFresnelMap.h | 13 +++++++++++-- Core/Multilayer/MatrixFresnelMap.cpp | 19 ++++++++++--------- Core/Multilayer/MatrixFresnelMap.h | 7 +++---- Core/Multilayer/ScalarFresnelMap.cpp | 11 +++-------- Core/Multilayer/ScalarFresnelMap.h | 8 ++------ 5 files changed, 29 insertions(+), 29 deletions(-) diff --git a/Core/Multilayer/IFresnelMap.h b/Core/Multilayer/IFresnelMap.h index 95c932276b0..8ee7452a905 100644 --- a/Core/Multilayer/IFresnelMap.h +++ b/Core/Multilayer/IFresnelMap.h @@ -19,11 +19,14 @@ #include <cstddef> #include <memory> +template<class T> class BasicVector3D; class ILayerRTCoefficients; class MultiLayer; class SimulationElement; class SpecularSimulationElement; +typedef BasicVector3D<double> kvector_t; + //! Holds the necessary information to calculate the radiation wavefunction in every layer //! for different incoming (outgoing) angles of the beam in the top layer //! (these amplitudes correspond to the specular part of the wavefunction). @@ -40,8 +43,11 @@ public: const SimulationElement& sim_element, size_t layer_index) const =0; //! Retrieves the amplitude coefficients for an incoming wavevector. - virtual const ILayerRTCoefficients* getInCoefficients( - const SimulationElement& sim_element, size_t layer_index) const =0; + template <typename T> + const ILayerRTCoefficients* getInCoefficients(const T& sim_element, size_t layer_index) const + { + return getCoefficients(sim_element.getKi(), layer_index); + } //! Fills simulation element specular data virtual void fillSpecularData(SpecularSimulationElement& sim_element) const = 0; @@ -53,6 +59,9 @@ public: void disableCaching(); protected: + virtual const ILayerRTCoefficients* getCoefficients(const kvector_t& kvec, + size_t layer_index) const = 0; + bool m_use_cache; std::unique_ptr<MultiLayer> mP_multilayer; }; diff --git a/Core/Multilayer/MatrixFresnelMap.cpp b/Core/Multilayer/MatrixFresnelMap.cpp index 3faebf0bdbb..2ce25b00684 100644 --- a/Core/Multilayer/MatrixFresnelMap.cpp +++ b/Core/Multilayer/MatrixFresnelMap.cpp @@ -41,12 +41,6 @@ MatrixFresnelMap::getOutCoefficients(const SimulationElement& sim_element, size_ m_hash_table_out); } -const ILayerRTCoefficients* -MatrixFresnelMap::getInCoefficients(const SimulationElement& sim_element, size_t layer_index) const -{ - return getCoefficients(sim_element.getKi(), layer_index, *mP_multilayer, m_hash_table_in); -} - void MatrixFresnelMap::fillSpecularData(SpecularSimulationElement& sim_element) const { const auto& kvec = sim_element.getKi(); @@ -57,9 +51,16 @@ void MatrixFresnelMap::fillSpecularData(SpecularSimulationElement& sim_element) sim_element.setSpecular(SpecularData(calculateCoefficients(*mP_multilayer, kvec))); } -const ILayerRTCoefficients* MatrixFresnelMap::getCoefficients(kvector_t kvec, size_t layer_index, - const MultiLayer& multilayer, - CoefficientHash& hash_table) const +const ILayerRTCoefficients* MatrixFresnelMap::getCoefficients(const kvector_t& kvec, + size_t layer_index) const +{ + return getCoefficients(kvec, layer_index, *mP_multilayer, m_hash_table_in); +} + +const ILayerRTCoefficients* MatrixFresnelMap::getCoefficients(const kvector_t& kvec, + size_t layer_index, + const MultiLayer& multilayer, + CoefficientHash& hash_table) const { if (!m_use_cache) { auto coeffs = calculateCoefficients(multilayer, kvec); diff --git a/Core/Multilayer/MatrixFresnelMap.h b/Core/Multilayer/MatrixFresnelMap.h index b02c461588c..1ff262fd169 100644 --- a/Core/Multilayer/MatrixFresnelMap.h +++ b/Core/Multilayer/MatrixFresnelMap.h @@ -38,9 +38,6 @@ public: const ILayerRTCoefficients* getOutCoefficients(const SimulationElement& sim_element, size_t layer_index) const final override; - const ILayerRTCoefficients* getInCoefficients(const SimulationElement& sim_element, - size_t layer_index) const final override; - void setMultilayer(const MultiLayer& multilayer) final override; //! Fills simulation element specular data @@ -50,7 +47,9 @@ public: CoefficientHash; private: - const ILayerRTCoefficients* getCoefficients(kvector_t kvec, size_t layer_index, + const ILayerRTCoefficients* getCoefficients(const kvector_t& kvec, + size_t layer_index) const override; + const ILayerRTCoefficients* getCoefficients(const kvector_t& kvec, size_t layer_index, const MultiLayer& multilayer, CoefficientHash& hash_table) const; diff --git a/Core/Multilayer/ScalarFresnelMap.cpp b/Core/Multilayer/ScalarFresnelMap.cpp index fbc9c052a01..317d6d9a5f7 100644 --- a/Core/Multilayer/ScalarFresnelMap.cpp +++ b/Core/Multilayer/ScalarFresnelMap.cpp @@ -18,6 +18,7 @@ #include "SimulationElement.h" #include "SpecularMatrix.h" #include "SpecularSimulationElement.h" +#include "Vectors3D.h" namespace { std::vector<ScalarRTCoefficients> calculateCoefficients(const MultiLayer& multilayer, @@ -36,12 +37,6 @@ const ILayerRTCoefficients* ScalarFresnelMap::getOutCoefficients( return getCoefficients(-sim_element.getMeanKf(), layer_index); } -const ILayerRTCoefficients* ScalarFresnelMap::getInCoefficients( - const SimulationElement& sim_element, size_t layer_index) const -{ - return getCoefficients(sim_element.getKi(), layer_index); -} - void ScalarFresnelMap::fillSpecularData(SpecularSimulationElement& sim_element) const { const auto& kvec = sim_element.getKi(); @@ -51,8 +46,8 @@ void ScalarFresnelMap::fillSpecularData(SpecularSimulationElement& sim_element) sim_element.setSpecular(SpecularData(calculateCoefficients(*mP_multilayer, kvec))); } -const ScalarRTCoefficients* ScalarFresnelMap::getCoefficients( - kvector_t kvec, size_t layer_index) const +const ILayerRTCoefficients* ScalarFresnelMap::getCoefficients(const kvector_t& kvec, + size_t layer_index) const { if (!m_use_cache) { auto coeffs = calculateCoefficients(*mP_multilayer, kvec); diff --git a/Core/Multilayer/ScalarFresnelMap.h b/Core/Multilayer/ScalarFresnelMap.h index 7ebd52cc264..ab00c12d96c 100644 --- a/Core/Multilayer/ScalarFresnelMap.h +++ b/Core/Multilayer/ScalarFresnelMap.h @@ -17,8 +17,6 @@ #include "Hash2Doubles.h" #include "IFresnelMap.h" -#include "Vectors3D.h" -#include <memory> #include <unordered_map> #include <utility> #include <vector> @@ -40,14 +38,12 @@ public: const ILayerRTCoefficients* getOutCoefficients (const SimulationElement& sim_element, size_t layer_index) const final override; - const ILayerRTCoefficients* getInCoefficients(const SimulationElement& sim_element, - size_t layer_index) const final override; - //! Fills simulation element specular data void fillSpecularData(SpecularSimulationElement& sim_element) const override; private: - const ScalarRTCoefficients* getCoefficients(kvector_t kvec, size_t layer_index) const; + const ILayerRTCoefficients* getCoefficients(const kvector_t& kvec, + size_t layer_index) const override; const std::vector<ScalarRTCoefficients>& getCoefficientsFromCache(kvector_t kvec) const; mutable std::unordered_map<std::pair<double, double>, std::vector<ScalarRTCoefficients>, -- GitLab