From d6152fb480e89464a21528f395dac0924ef8392f Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Thu, 8 Jul 2021 17:32:42 +0200
Subject: [PATCH] merge setFlux and computeFF

---
 Resample/FFCompute/ComputeBA.cpp      |  4 +++-
 Resample/FFCompute/ComputeBA.h        |  4 +++-
 Resample/FFCompute/ComputeBAPol.cpp   |  4 +++-
 Resample/FFCompute/ComputeBAPol.h     |  4 +++-
 Resample/FFCompute/ComputeDWBA.cpp    | 28 ++++++++++-----------------
 Resample/FFCompute/ComputeDWBA.h      |  7 +++----
 Resample/FFCompute/ComputeDWBAPol.cpp |  4 +++-
 Resample/FFCompute/ComputeDWBAPol.h   |  4 +++-
 Resample/FFCompute/IComputeFF.cpp     |  3 +--
 Resample/FFCompute/IComputeFF.h       |  4 +++-
 10 files changed, 35 insertions(+), 31 deletions(-)

diff --git a/Resample/FFCompute/ComputeBA.cpp b/Resample/FFCompute/ComputeBA.cpp
index 182396945fd..d52c177c3c7 100644
--- a/Resample/FFCompute/ComputeBA.cpp
+++ b/Resample/FFCompute/ComputeBA.cpp
@@ -25,7 +25,9 @@ ComputeBA* ComputeBA::clone() const
     return new ComputeBA(*m_ff, m_iLayer);
 }
 
-complex_t ComputeBA::computeFF(const WavevectorInfo& wavevectors) const
+complex_t ComputeBA::computeFF(const WavevectorInfo& wavevectors,
+                        const std::unique_ptr<const IFlux>&,
+                        const std::unique_ptr<const IFlux>&) const
 {
     return m_ff->theFF(wavevectors);
 }
diff --git a/Resample/FFCompute/ComputeBA.h b/Resample/FFCompute/ComputeBA.h
index 27ffcbbe2a2..a74cc5ffc10 100644
--- a/Resample/FFCompute/ComputeBA.h
+++ b/Resample/FFCompute/ComputeBA.h
@@ -35,7 +35,9 @@ public:
     ComputeBA* clone() const override;
 
     //! Calculates and returns a form factor calculation in BA
-    complex_t computeFF(const WavevectorInfo& wavevectors) const override;
+    complex_t computeFF(const WavevectorInfo& wavevectors,
+                        const std::unique_ptr<const IFlux>& inFlux,
+                        const std::unique_ptr<const IFlux>& outFlux) const override;
 };
 
 #endif // BORNAGAIN_RESAMPLE_FFCOMPUTE_COMPUTEBA_H
diff --git a/Resample/FFCompute/ComputeBAPol.cpp b/Resample/FFCompute/ComputeBAPol.cpp
index 44c6fe2f054..1e3184e9df1 100644
--- a/Resample/FFCompute/ComputeBAPol.cpp
+++ b/Resample/FFCompute/ComputeBAPol.cpp
@@ -25,7 +25,9 @@ ComputeBAPol* ComputeBAPol::clone() const
     return new ComputeBAPol(*m_ff, m_iLayer);
 }
 
-complex_t ComputeBAPol::computeFF(const WavevectorInfo&) const
+complex_t ComputeBAPol::computeFF(const WavevectorInfo&,
+                        const std::unique_ptr<const IFlux>&,
+                        const std::unique_ptr<const IFlux>&) const
 {
     throw std::runtime_error("ComputeBAPol::evaluate: "
                              "should never be called for matrix interactions");
diff --git a/Resample/FFCompute/ComputeBAPol.h b/Resample/FFCompute/ComputeBAPol.h
index 408e3009c97..d77f2dfd917 100644
--- a/Resample/FFCompute/ComputeBAPol.h
+++ b/Resample/FFCompute/ComputeBAPol.h
@@ -36,7 +36,9 @@ public:
     ComputeBAPol* clone() const override;
 
     //! Throws not-implemented exception
-    complex_t computeFF(const WavevectorInfo& wavevectors) const override;
+    complex_t computeFF(const WavevectorInfo& wavevectors,
+                        const std::unique_ptr<const IFlux>& inFlux,
+                        const std::unique_ptr<const IFlux>& outFlux) const override;
 
     //! Calculates and returns a polarized form factor calculation in BA
     Eigen::Matrix2cd computePolFF(const WavevectorInfo& wavevectors) const override;
diff --git a/Resample/FFCompute/ComputeDWBA.cpp b/Resample/FFCompute/ComputeDWBA.cpp
index f62687126cd..4567a0b2b2d 100644
--- a/Resample/FFCompute/ComputeDWBA.cpp
+++ b/Resample/FFCompute/ComputeDWBA.cpp
@@ -23,24 +23,22 @@ ComputeDWBA::~ComputeDWBA() = default;
 
 ComputeDWBA* ComputeDWBA::clone() const
 {
-    ComputeDWBA* result = new ComputeDWBA(*m_ff, m_iLayer);
-    auto in_coefs = std::unique_ptr<const IFlux>(m_inFlux ? m_inFlux->clone() : nullptr);
-    auto out_coefs = std::unique_ptr<const IFlux>(m_outFlux ? m_outFlux->clone() : nullptr);
-    result->setFlux(std::move(in_coefs), std::move(out_coefs));
-    return result;
+    return new ComputeDWBA(*m_ff, m_iLayer);
 }
 
-complex_t ComputeDWBA::computeFF(const WavevectorInfo& wavevectors) const
+complex_t ComputeDWBA::computeFF(const WavevectorInfo& wavevectors,
+                        const std::unique_ptr<const IFlux>& inFlux,
+                        const std::unique_ptr<const IFlux>& outFlux) const
 {
     // Retrieve the two different incoming wavevectors in the layer
     cvector_t k_i_T = wavevectors.getKi();
-    k_i_T.setZ(-m_inFlux->getScalarKz());
+    k_i_T.setZ(-inFlux->getScalarKz());
     cvector_t k_i_R = k_i_T;
     k_i_R.setZ(-k_i_T.z());
 
     // Retrieve the two different outgoing wavevector bins in the layer
     cvector_t k_f_T = wavevectors.getKf();
-    k_f_T.setZ(m_outFlux->getScalarKz());
+    k_f_T.setZ(outFlux->getScalarKz());
     cvector_t k_f_R = k_f_T;
     k_f_R.setZ(-k_f_T.z());
 
@@ -52,10 +50,10 @@ complex_t ComputeDWBA::computeFF(const WavevectorInfo& wavevectors) const
     WavevectorInfo k_RR(k_i_R, k_f_R, wavelength);
 
     // Get the four R,T coefficients
-    complex_t T_in = m_inFlux->getScalarT();
-    complex_t R_in = m_inFlux->getScalarR();
-    complex_t T_out = m_outFlux->getScalarT();
-    complex_t R_out = m_outFlux->getScalarR();
+    complex_t T_in = inFlux->getScalarT();
+    complex_t R_in = inFlux->getScalarR();
+    complex_t T_out = outFlux->getScalarT();
+    complex_t R_out = outFlux->getScalarR();
 
     // The four different scattering contributions; S stands for scattering
     // off the particle, R for reflection off the layer interface
@@ -66,9 +64,3 @@ complex_t ComputeDWBA::computeFF(const WavevectorInfo& wavevectors) const
 
     return term_S + term_RS + term_SR + term_RSR;
 }
-
-void ComputeDWBA::setFlux(std::unique_ptr<const IFlux> inFlux, std::unique_ptr<const IFlux> outFlux)
-{
-    m_inFlux = std::move(inFlux);
-    m_outFlux = std::move(outFlux);
-}
diff --git a/Resample/FFCompute/ComputeDWBA.h b/Resample/FFCompute/ComputeDWBA.h
index 108ae3b0c26..73936d9ad2d 100644
--- a/Resample/FFCompute/ComputeDWBA.h
+++ b/Resample/FFCompute/ComputeDWBA.h
@@ -37,10 +37,9 @@ public:
     ComputeDWBA* clone() const override;
 
     //! Returns the coherent sum of the four DWBA terms for scalar scattering.
-    complex_t computeFF(const WavevectorInfo& wavevectors) const override;
-
-    void setFlux(std::unique_ptr<const IFlux> inFlux,
-                 std::unique_ptr<const IFlux> outFlux) override;
+    complex_t computeFF(const WavevectorInfo& wavevectors,
+                        const std::unique_ptr<const IFlux>& inFlux,
+                        const std::unique_ptr<const IFlux>& outFlux) const override;
 
     friend class TestPolarizedDWBATerms;
 
diff --git a/Resample/FFCompute/ComputeDWBAPol.cpp b/Resample/FFCompute/ComputeDWBAPol.cpp
index d0be17ca072..bacc851fc1f 100644
--- a/Resample/FFCompute/ComputeDWBAPol.cpp
+++ b/Resample/FFCompute/ComputeDWBAPol.cpp
@@ -43,7 +43,9 @@ ComputeDWBAPol* ComputeDWBAPol::clone() const
     return result;
 }
 
-complex_t ComputeDWBAPol::computeFF(const WavevectorInfo&) const
+complex_t ComputeDWBAPol::computeFF(const WavevectorInfo&,
+                        const std::unique_ptr<const IFlux>&,
+                        const std::unique_ptr<const IFlux>&) const
 {
     throw std::runtime_error("Bug: forbidden call of ComputeDWBAPol::evaluate");
 }
diff --git a/Resample/FFCompute/ComputeDWBAPol.h b/Resample/FFCompute/ComputeDWBAPol.h
index eeb05f46aa4..20144d2a0b7 100644
--- a/Resample/FFCompute/ComputeDWBAPol.h
+++ b/Resample/FFCompute/ComputeDWBAPol.h
@@ -37,7 +37,9 @@ public:
     ComputeDWBAPol* clone() const override;
 
     //! Throws not-implemented exception.
-    complex_t computeFF(const WavevectorInfo& wavevectors) const override;
+    complex_t computeFF(const WavevectorInfo& wavevectors,
+                        const std::unique_ptr<const IFlux>& inFlux,
+                        const std::unique_ptr<const IFlux>& outFlux) const override;
 
     //! Returns the coherent sum of the four DWBA terms for polarized scattering.
     Eigen::Matrix2cd computePolFF(const WavevectorInfo& wavevectors) const override;
diff --git a/Resample/FFCompute/IComputeFF.cpp b/Resample/FFCompute/IComputeFF.cpp
index e7301f36ddc..818317ab77e 100644
--- a/Resample/FFCompute/IComputeFF.cpp
+++ b/Resample/FFCompute/IComputeFF.cpp
@@ -60,8 +60,7 @@ complex_t IComputeFF::coherentFF(const SimulationElement& ele)
     ASSERT(fresnel_map);
     auto inFlux = fresnel_map->getInFlux(ele.getKi(), m_iLayer);
     auto outFlux = fresnel_map->getOutFlux(ele.getMeanKf(), m_iLayer);
-    setFlux(std::move(inFlux), std::move(outFlux));
-    return computeFF({ele});
+    return computeFF({ele}, inFlux, outFlux);
 }
 
 Eigen::Matrix2cd IComputeFF::coherentPolFF(const SimulationElement& ele)
diff --git a/Resample/FFCompute/IComputeFF.h b/Resample/FFCompute/IComputeFF.h
index 6d0cfffd2ca..c8e7e4e963c 100644
--- a/Resample/FFCompute/IComputeFF.h
+++ b/Resample/FFCompute/IComputeFF.h
@@ -48,7 +48,9 @@ public:
     virtual double radialExtension() const;
     virtual double bottomZ(const IRotation& rotation) const;
     virtual double topZ(const IRotation& rotation) const;
-    virtual complex_t computeFF(const WavevectorInfo& wavevectors) const = 0;
+    virtual complex_t computeFF(const WavevectorInfo& wavevectors,
+                                const std::unique_ptr<const IFlux>& inFlux,
+                                const std::unique_ptr<const IFlux>& outFlux) const = 0;
     //! Returns scattering amplitude for matrix interactions
     virtual Eigen::Matrix2cd computePolFF(const WavevectorInfo& wavevectors) const;
     //! Sets reflection/transmission info
-- 
GitLab