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