From 22e9bee8878fd04bee98d3f4629a07804fd511e2 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Mon, 12 Jul 2021 14:16:04 +0200
Subject: [PATCH] don't pass sample if only roughness is needed

---
 Core/Computation/SpecularComputation.cpp      | 5 +++--
 Core/Term/SpecularTerm.cpp                    | 8 ++++----
 Core/Term/SpecularTerm.h                      | 6 +++---
 GUI/Models/BeamAngleItems.cpp                 | 6 ++----
 GUI/Models/BeamWavelengthItem.cpp             | 6 ++----
 GUI/Models/TransformToDomain.cpp              | 3 +--
 Resample/Processed/ProcessedSample.cpp        | 9 ++++++---
 Resample/Processed/ProcessedSample.h          | 3 +++
 Resample/Specular/SpecularStrategyBuilder.cpp | 9 ++++-----
 Resample/Specular/SpecularStrategyBuilder.h   | 7 +++----
 auto/Wrap/doxygenCore.i                       | 4 ++--
 auto/Wrap/doxygenResample.i                   | 7 +++++--
 12 files changed, 38 insertions(+), 35 deletions(-)

diff --git a/Core/Computation/SpecularComputation.cpp b/Core/Computation/SpecularComputation.cpp
index ec6653d768d..209f5f850b0 100644
--- a/Core/Computation/SpecularComputation.cpp
+++ b/Core/Computation/SpecularComputation.cpp
@@ -17,6 +17,7 @@
 #include "Core/Element/SpecularElement.h"
 #include "Core/Term/SpecularTerm.h"
 #include "Resample/Processed/ProcessedSample.h"
+#include "Sample/Multilayer/MultiLayer.h"
 
 static_assert(std::is_copy_constructible<SpecularComputation>::value == false,
               "SpecularComputation should not be copy constructible");
@@ -31,8 +32,8 @@ SpecularComputation::SpecularComputation(const MultiLayer& multilayer,
     , m_begin_it(begin_it)
     , m_end_it(end_it)
     , m_term(m_re_sample->polarizing() || forcePolarized
-                 ? (ISpecularTerm*)new SpecularMatrixTerm(multilayer)
-                 : (ISpecularTerm*)new SpecularScalarTerm(multilayer))
+                 ? (ISpecularTerm*)new SpecularMatrixTerm(multilayer.roughnessModel())
+                 : (ISpecularTerm*)new SpecularScalarTerm(multilayer.roughnessModel()))
 {
 }
 
diff --git a/Core/Term/SpecularTerm.cpp b/Core/Term/SpecularTerm.cpp
index 904fb806de7..1ee0d7a0280 100644
--- a/Core/Term/SpecularTerm.cpp
+++ b/Core/Term/SpecularTerm.cpp
@@ -41,8 +41,8 @@ void ISpecularTerm::computeTerm(SpecularElement& ele, const SliceStack& slices)
 //  class SpecularScalarTerm
 //  ************************************************************************************************
 
-SpecularScalarTerm::SpecularScalarTerm(const MultiLayer& multilayer)
-    : ISpecularTerm(SampleUtils::SpecularStrategyBuilder::buildScalar(multilayer))
+SpecularScalarTerm::SpecularScalarTerm(const RoughnessModel& rm)
+    : ISpecularTerm(SampleUtils::SpecularStrategyBuilder::buildScalar(rm))
 {
 }
 
@@ -71,8 +71,8 @@ double matrix_intensity(const SpecularElement& ele, const Eigen::Matrix2cd& R)
 
 } // namespace
 
-SpecularMatrixTerm::SpecularMatrixTerm(const MultiLayer& multilayer)
-    : ISpecularTerm(SampleUtils::SpecularStrategyBuilder::buildMagnetic(multilayer))
+SpecularMatrixTerm::SpecularMatrixTerm(const RoughnessModel& rm)
+    : ISpecularTerm(SampleUtils::SpecularStrategyBuilder::buildMagnetic(rm))
 {
 }
 
diff --git a/Core/Term/SpecularTerm.h b/Core/Term/SpecularTerm.h
index 2418ee23c33..31b24bd3680 100644
--- a/Core/Term/SpecularTerm.h
+++ b/Core/Term/SpecularTerm.h
@@ -22,11 +22,11 @@
 
 #include "Core/Term/ITerm.h"
 #include "Resample/Specular/ISpecularStrategy.h"
+#include "Sample/Multilayer/RoughnessModels.h"
 #include <memory>
 #include <vector>
 
 class MatrixFlux_v2;
-class MultiLayer;
 class SpecularElement;
 class SliceStack;
 
@@ -52,7 +52,7 @@ protected:
 
 class SpecularScalarTerm : public ISpecularTerm {
 public:
-    SpecularScalarTerm(const MultiLayer& multilayer);
+    SpecularScalarTerm(const RoughnessModel& rm);
 
 private:
     void eval(SpecularElement& ele, const SliceStack& slices) const override;
@@ -63,7 +63,7 @@ private:
 
 class SpecularMatrixTerm : public ISpecularTerm {
 public:
-    SpecularMatrixTerm(const MultiLayer& multilayer);
+    SpecularMatrixTerm(const RoughnessModel& rm);
 
 private:
     void eval(SpecularElement& ele, const SliceStack& slices) const override;
diff --git a/GUI/Models/BeamAngleItems.cpp b/GUI/Models/BeamAngleItems.cpp
index d0757d78684..61ebcf07d94 100644
--- a/GUI/Models/BeamAngleItems.cpp
+++ b/GUI/Models/BeamAngleItems.cpp
@@ -21,8 +21,7 @@ BeamAzimuthalAngleItem::BeamAzimuthalAngleItem() : BeamDistributionItem(M_TYPE,
 {
     register_distribution_group("Distribution extended group");
 
-    SessionItem* valueItem =
-        dynamic_cast<SymmetricDistributionItem*>(distribution())->meanItem();
+    SessionItem* valueItem = dynamic_cast<SymmetricDistributionItem*>(distribution())->meanItem();
     valueItem->setLimits(RealLimits::limited(-90.0, 90.0));
     valueItem->setDecimals(3);
     valueItem->setValue(0.0);
@@ -50,8 +49,7 @@ BeamInclinationAngleItem::BeamInclinationAngleItem() : BeamDistributionItem(M_TY
 {
     register_distribution_group("Distribution extended group");
 
-    SessionItem* valueItem =
-        dynamic_cast<SymmetricDistributionItem*>(distribution())->meanItem();
+    SessionItem* valueItem = dynamic_cast<SymmetricDistributionItem*>(distribution())->meanItem();
     valueItem->setLimits(RealLimits::limited(0.0, 90.0));
     valueItem->setDecimals(3);
     valueItem->setValue(0.2);
diff --git a/GUI/Models/BeamWavelengthItem.cpp b/GUI/Models/BeamWavelengthItem.cpp
index 7ef30914f93..5a378d858c0 100644
--- a/GUI/Models/BeamWavelengthItem.cpp
+++ b/GUI/Models/BeamWavelengthItem.cpp
@@ -36,8 +36,7 @@ BeamWavelengthItem::BeamWavelengthItem(const QString& model_type, const QString&
 {
     register_distribution_group(distribution_group);
 
-    SessionItem* valueItem =
-        dynamic_cast<SymmetricDistributionItem*>(distribution())->meanItem();
+    SessionItem* valueItem = dynamic_cast<SymmetricDistributionItem*>(distribution())->meanItem();
     valueItem->setLimits(RealLimits::positive());
     valueItem->setDecimals(4);
     valueItem->setValue(default_wl);
@@ -57,8 +56,7 @@ SpecularBeamWavelengthItem::SpecularBeamWavelengthItem()
 
 void SpecularBeamWavelengthItem::setToRange(const RealLimits& limits)
 {
-    SessionItem* valueItem =
-        dynamic_cast<SymmetricDistributionItem*>(distribution())->meanItem();
+    SessionItem* valueItem = dynamic_cast<SymmetricDistributionItem*>(distribution())->meanItem();
     if (!limits.isInRange(wavelength())) {
         const double new_value =
             limits.isLimited() ? (limits.upperLimit() - limits.lowerLimit()) / 2. : default_wl;
diff --git a/GUI/Models/TransformToDomain.cpp b/GUI/Models/TransformToDomain.cpp
index 0f19688b296..7838b6dac73 100644
--- a/GUI/Models/TransformToDomain.cpp
+++ b/GUI/Models/TransformToDomain.cpp
@@ -232,8 +232,7 @@ std::unique_ptr<ScanResolution> createScanResolution(const SessionItem* item)
     if (!beam_item)
         return nullptr;
 
-    auto distr_item =
-        dynamic_cast<const SymmetricDistributionItem*>(beam_item->distribution());
+    auto distr_item = dynamic_cast<const SymmetricDistributionItem*>(beam_item->distribution());
     if (!distr_item)
         return nullptr;
 
diff --git a/Resample/Processed/ProcessedSample.cpp b/Resample/Processed/ProcessedSample.cpp
index ed770ef27cb..5bc38cb24e6 100644
--- a/Resample/Processed/ProcessedSample.cpp
+++ b/Resample/Processed/ProcessedSample.cpp
@@ -210,9 +210,11 @@ std::unique_ptr<IFresnelMap> fresnelify(const MultiLayer& sample, const SliceSta
 
     if (slices.containsMagneticMaterial())
         return std::make_unique<MatrixFresnelMap>(
-            fresnelStack, SampleUtils::SpecularStrategyBuilder::buildMagnetic(sample), useCache);
+            fresnelStack,
+            SampleUtils::SpecularStrategyBuilder::buildMagnetic(sample.roughnessModel()), useCache);
     return std::make_unique<ScalarFresnelMap>(
-        fresnelStack, SampleUtils::SpecularStrategyBuilder::buildScalar(sample), useCache);
+        fresnelStack, SampleUtils::SpecularStrategyBuilder::buildScalar(sample.roughnessModel()),
+        useCache);
 }
 
 } // namespace
@@ -224,7 +226,8 @@ std::unique_ptr<IFresnelMap> fresnelify(const MultiLayer& sample, const SliceSta
 
 ProcessedSample::ProcessedSample(const MultiLayer& sample, const SimulationOptions& options,
                                  bool forcePolarized)
-    : m_polarized{forcePolarized || sample.isMagnetic()}
+    : m_roughness_model(sample.roughnessModel())
+    , m_polarized{forcePolarized || sample.isMagnetic()}
     , m_crossCorrLength{sample.crossCorrLength()}
     , m_ext_field{sample.externalField()}
     , m_slices{slicify(sample, options).setBField(sample.externalField())}
diff --git a/Resample/Processed/ProcessedSample.h b/Resample/Processed/ProcessedSample.h
index b924e1f51b4..5119a60d667 100644
--- a/Resample/Processed/ProcessedSample.h
+++ b/Resample/Processed/ProcessedSample.h
@@ -22,6 +22,7 @@
 
 #include "Base/Vector/Vectors3D.h"
 #include "Resample/Slice/SliceStack.h"
+#include "Sample/Multilayer/RoughnessModels.h"
 #include <memory>
 #include <vector>
 
@@ -55,11 +56,13 @@ public:
     bool containsMagneticMaterial() const;
     bool polarizing() const; //!< Contains magnetic material, or nonzero magnetic field
     bool hasRoughness() const;
+    const RoughnessModel& roughnessModel() const { return m_roughness_model; }
 
     //! Fourier transform of the correlation function of roughnesses between the interfaces
     double crossCorrSpectralFun(const kvector_t kvec, size_t j, size_t k) const;
 
 private:
+    const RoughnessModel m_roughness_model;
     const bool m_polarized;
     const double m_crossCorrLength;
     const kvector_t m_ext_field;
diff --git a/Resample/Specular/SpecularStrategyBuilder.cpp b/Resample/Specular/SpecularStrategyBuilder.cpp
index 110a0dca0d6..7c95e0d42c9 100644
--- a/Resample/Specular/SpecularStrategyBuilder.cpp
+++ b/Resample/Specular/SpecularStrategyBuilder.cpp
@@ -17,12 +17,11 @@
 #include "Resample/Specular/SpecularMagneticTanhStrategy.h"
 #include "Resample/Specular/SpecularScalarNCStrategy.h"
 #include "Resample/Specular/SpecularScalarTanhStrategy.h"
-#include "Sample/Multilayer/MultiLayer.h"
 
 std::unique_ptr<SpecularScalarStrategy>
-SampleUtils::SpecularStrategyBuilder::buildScalar(const MultiLayer& sample)
+SampleUtils::SpecularStrategyBuilder::buildScalar(const RoughnessModel& rm)
 {
-    const RoughnessModel roughnessModel = sample.roughnessModel();
+    const RoughnessModel& roughnessModel = rm;
 
     if (roughnessModel == RoughnessModel::TANH || roughnessModel == RoughnessModel::DEFAULT)
         return std::make_unique<SpecularScalarTanhStrategy>();
@@ -34,9 +33,9 @@ SampleUtils::SpecularStrategyBuilder::buildScalar(const MultiLayer& sample)
 }
 
 std::unique_ptr<SpecularMagneticStrategy>
-SampleUtils::SpecularStrategyBuilder::buildMagnetic(const MultiLayer& sample)
+SampleUtils::SpecularStrategyBuilder::buildMagnetic(const RoughnessModel& rm)
 {
-    const RoughnessModel roughnessModel = sample.roughnessModel();
+    const RoughnessModel& roughnessModel = rm;
 
     if (roughnessModel == RoughnessModel::TANH || roughnessModel == RoughnessModel::DEFAULT)
         return std::make_unique<SpecularMagneticTanhStrategy>();
diff --git a/Resample/Specular/SpecularStrategyBuilder.h b/Resample/Specular/SpecularStrategyBuilder.h
index 12e151eeb25..4a90761bc34 100644
--- a/Resample/Specular/SpecularStrategyBuilder.h
+++ b/Resample/Specular/SpecularStrategyBuilder.h
@@ -22,14 +22,13 @@
 
 #include "Resample/Specular/SpecularMagneticStrategy.h"
 #include "Resample/Specular/SpecularScalarStrategy.h"
+#include "Sample/Multilayer/RoughnessModels.h"
 #include <memory>
 
-class MultiLayer;
-
 namespace SampleUtils::SpecularStrategyBuilder {
 
-std::unique_ptr<SpecularScalarStrategy> buildScalar(const MultiLayer& sample);
-std::unique_ptr<SpecularMagneticStrategy> buildMagnetic(const MultiLayer& sample);
+std::unique_ptr<SpecularScalarStrategy> buildScalar(const RoughnessModel& rm);
+std::unique_ptr<SpecularMagneticStrategy> buildMagnetic(const RoughnessModel& rm);
 
 } // namespace SampleUtils::SpecularStrategyBuilder
 
diff --git a/auto/Wrap/doxygenCore.i b/auto/Wrap/doxygenCore.i
index ba00c090486..6b2e2391671 100644
--- a/auto/Wrap/doxygenCore.i
+++ b/auto/Wrap/doxygenCore.i
@@ -2081,7 +2081,7 @@ Computes the specular scattering for a magnetic sample Used by  SpecularComputat
 C++ includes: SpecularTerm.h
 ";
 
-%feature("docstring")  SpecularMatrixTerm::SpecularMatrixTerm "SpecularMatrixTerm::SpecularMatrixTerm(const MultiLayer &multilayer)
+%feature("docstring")  SpecularMatrixTerm::SpecularMatrixTerm "SpecularMatrixTerm::SpecularMatrixTerm(const RoughnessModel &rm)
 ";
 
 
@@ -2093,7 +2093,7 @@ Computes the specular scattering for a scalar sample Used by  SpecularComputatio
 C++ includes: SpecularTerm.h
 ";
 
-%feature("docstring")  SpecularScalarTerm::SpecularScalarTerm "SpecularScalarTerm::SpecularScalarTerm(const MultiLayer &multilayer)
+%feature("docstring")  SpecularScalarTerm::SpecularScalarTerm "SpecularScalarTerm::SpecularScalarTerm(const RoughnessModel &rm)
 ";
 
 
diff --git a/auto/Wrap/doxygenResample.i b/auto/Wrap/doxygenResample.i
index 0b64dfda034..9ce92aff303 100644
--- a/auto/Wrap/doxygenResample.i
+++ b/auto/Wrap/doxygenResample.i
@@ -530,6 +530,9 @@ Contains magnetic material, or nonzero magnetic field.
 %feature("docstring")  ProcessedSample::hasRoughness "bool ProcessedSample::hasRoughness() const
 ";
 
+%feature("docstring")  ProcessedSample::roughnessModel "const RoughnessModel& ProcessedSample::roughnessModel() const
+";
+
 %feature("docstring")  ProcessedSample::crossCorrSpectralFun "double ProcessedSample::crossCorrSpectralFun(const kvector_t kvec, size_t j, size_t k) const
 
 Fourier transform of the correlation function of roughnesses between the interfaces. 
@@ -969,10 +972,10 @@ Calculate z-admixtures occupied by particles.
 
 
 // File: namespaceSampleUtils_1_1SpecularStrategyBuilder.xml
-%feature("docstring")  SampleUtils::SpecularStrategyBuilder::buildScalar "std::unique_ptr< SpecularScalarStrategy > SampleUtils::SpecularStrategyBuilder::buildScalar(const MultiLayer &sample)
+%feature("docstring")  SampleUtils::SpecularStrategyBuilder::buildScalar "std::unique_ptr< SpecularScalarStrategy > SampleUtils::SpecularStrategyBuilder::buildScalar(const RoughnessModel &rm)
 ";
 
-%feature("docstring")  SampleUtils::SpecularStrategyBuilder::buildMagnetic "std::unique_ptr< SpecularMagneticStrategy > SampleUtils::SpecularStrategyBuilder::buildMagnetic(const MultiLayer &sample)
+%feature("docstring")  SampleUtils::SpecularStrategyBuilder::buildMagnetic "std::unique_ptr< SpecularMagneticStrategy > SampleUtils::SpecularStrategyBuilder::buildMagnetic(const RoughnessModel &rm)
 ";
 
 
-- 
GitLab