From 84de185a7004d6fce01aadfec665f5ceae0f7031 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (o)" <j.wuttke@fz-juelich.de>
Date: Fri, 13 Jan 2023 19:07:17 +0100
Subject: [PATCH] initialize m_cache in ISimulation

---
 Sim/Simulation/DepthprobeSimulation.cpp | 7 +++++--
 Sim/Simulation/DepthprobeSimulation.h   | 2 ++
 Sim/Simulation/ISimulation.cpp          | 1 +
 Sim/Simulation/ISimulation.h            | 5 ++++-
 Sim/Simulation/OffspecSimulation.h      | 6 +++++-
 Sim/Simulation/ScatteringSimulation.cpp | 2 --
 Sim/Simulation/ScatteringSimulation.h   | 5 +++++
 Sim/Simulation/SpecularSimulation.cpp   | 2 --
 Sim/Simulation/SpecularSimulation.h     | 5 +++++
 9 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/Sim/Simulation/DepthprobeSimulation.cpp b/Sim/Simulation/DepthprobeSimulation.cpp
index 47831935378..f211c361722 100644
--- a/Sim/Simulation/DepthprobeSimulation.cpp
+++ b/Sim/Simulation/DepthprobeSimulation.cpp
@@ -136,8 +136,6 @@ void DepthprobeSimulation::initElementVector()
         m_depth_eles.emplace_back(wavelength, -result_angle, zAxis(),
                                   alpha_limits.isInRange(result_angle));
     }
-
-    m_cache.resize(m_depth_eles.size() * zAxis()->size(), 0.);
 }
 
 std::unique_ptr<IComputation>
@@ -201,6 +199,11 @@ size_t DepthprobeSimulation::numberOfElements() const
     return alphaAxis()->size();
 }
 
+size_t DepthprobeSimulation::nOutChannels() const
+{
+    return numberOfElements() * zAxis()->size();
+}
+
 SimulationResult DepthprobeSimulation::packResult()
 {
     const std::vector<const IAxis*> axes{alphaAxis()->clone(), zAxis()->clone()};
diff --git a/Sim/Simulation/DepthprobeSimulation.h b/Sim/Simulation/DepthprobeSimulation.h
index 5bf6adf4da4..26269d7e398 100644
--- a/Sim/Simulation/DepthprobeSimulation.h
+++ b/Sim/Simulation/DepthprobeSimulation.h
@@ -86,6 +86,8 @@ private:
     //! Returns the number of elements this simulation needs to calculate
     size_t numberOfElements() const override;
 
+    size_t nOutChannels() const override;
+
     SimulationResult packResult() override;
 
     //! Checks the distribution validity for simulation.
diff --git a/Sim/Simulation/ISimulation.cpp b/Sim/Simulation/ISimulation.cpp
index 1809d28eb0f..72491a6709f 100644
--- a/Sim/Simulation/ISimulation.cpp
+++ b/Sim/Simulation/ISimulation.cpp
@@ -130,6 +130,7 @@ SimulationResult ISimulation::simulate()
     gsl_set_error_handler_off();
 
     prepareSimulation();
+    m_cache = std::vector<double>(nOutChannels(), 0.);
 
     const ReSample re_sample = ReSample::make(*m_sample, options(), force_polarized());
 
diff --git a/Sim/Simulation/ISimulation.h b/Sim/Simulation/ISimulation.h
index f731c8bae10..eada5e6032f 100644
--- a/Sim/Simulation/ISimulation.h
+++ b/Sim/Simulation/ISimulation.h
@@ -118,9 +118,12 @@ private:
     //! Force polarized computation even in absence of sample magnetization or external fields
     virtual bool force_polarized() const = 0;
 
-    //! Gets the number of elements this simulation needs to calculate.
+    //! Returns the number of elements this simulation needs to calculate.
     virtual size_t numberOfElements() const = 0;
 
+    //! Returns the number of output channels to be computed. Determines size of m_cache.
+    virtual size_t nOutChannels() const = 0;
+
     //! Returns simulation result, based on intensity held in elements vector.
     virtual SimulationResult packResult() = 0;
 
diff --git a/Sim/Simulation/OffspecSimulation.h b/Sim/Simulation/OffspecSimulation.h
index 33440508ad2..ca62a55f02f 100644
--- a/Sim/Simulation/OffspecSimulation.h
+++ b/Sim/Simulation/OffspecSimulation.h
@@ -87,9 +87,13 @@ private:
     //... Overridden getters:
     bool force_polarized() const override;
 
-    //! Returns the number of elements this simulation needs to calculate
     size_t numberOfElements() const override;
 
+    size_t nOutChannels() const override
+    {
+        return numberOfElements();
+    }
+
     SimulationResult packResult() override;
 
     //! Checks the distribution validity for simulation.
diff --git a/Sim/Simulation/ScatteringSimulation.cpp b/Sim/Simulation/ScatteringSimulation.cpp
index 36b62d0635c..3638908277c 100644
--- a/Sim/Simulation/ScatteringSimulation.cpp
+++ b/Sim/Simulation/ScatteringSimulation.cpp
@@ -117,8 +117,6 @@ void ScatteringSimulation::prepareSimulation()
 void ScatteringSimulation::initElementVector()
 {
     m_eles = generateElements(beam());
-
-    m_cache.resize(m_eles.size(), 0.0);
 }
 
 std::unique_ptr<IComputation>
diff --git a/Sim/Simulation/ScatteringSimulation.h b/Sim/Simulation/ScatteringSimulation.h
index 23405ddbf06..bcdb4cb74c1 100644
--- a/Sim/Simulation/ScatteringSimulation.h
+++ b/Sim/Simulation/ScatteringSimulation.h
@@ -94,6 +94,11 @@ private:
     //! Returns the number of elements this simulation needs to calculate
     size_t numberOfElements() const override;
 
+    size_t nOutChannels() const override
+    {
+        return numberOfElements();
+    }
+
     SimulationResult packResult() override;
 
     //... Local function:
diff --git a/Sim/Simulation/SpecularSimulation.cpp b/Sim/Simulation/SpecularSimulation.cpp
index 20476b86648..28202b1eaeb 100644
--- a/Sim/Simulation/SpecularSimulation.cpp
+++ b/Sim/Simulation/SpecularSimulation.cpp
@@ -48,8 +48,6 @@ const ICoordSystem* SpecularSimulation::simCoordSystem() const
 void SpecularSimulation::initElementVector()
 {
     m_eles = m_scan->generateElements();
-
-    m_cache.resize(m_eles.size(), 0);
 }
 
 std::unique_ptr<IComputation> SpecularSimulation::createComputation(const ReSample& re_sample,
diff --git a/Sim/Simulation/SpecularSimulation.h b/Sim/Simulation/SpecularSimulation.h
index bb375cd2b91..328ae45c657 100644
--- a/Sim/Simulation/SpecularSimulation.h
+++ b/Sim/Simulation/SpecularSimulation.h
@@ -64,6 +64,11 @@ private:
     //! Returns the number of elements this simulation needs to calculate
     size_t numberOfElements() const override;
 
+    size_t nOutChannels() const override
+    {
+        return numberOfElements();
+    }
+
     SimulationResult packResult() override;
 
     //! Checks the distribution validity for simulation.
-- 
GitLab