diff --git a/Core/Computation/SpecularComputation.cpp b/Core/Computation/SpecularComputation.cpp index 8913655a1d62591c767a4088e51f1b1ae728a1cc..a4110873660e476bb672ad1dc3533ea1f684feb9 100644 --- a/Core/Computation/SpecularComputation.cpp +++ b/Core/Computation/SpecularComputation.cpp @@ -18,22 +18,8 @@ #include "Resample/Flux/IFlux.h" #include "Resample/Processed/ProcessedSample.h" #include "Resample/Specular/ISpecularStrategy.h" -#include "Resample/Specular/SpecularStrategyBuilder.h" #include "Sample/Multilayer/MultiLayer.h" -namespace { - -std::unique_ptr<ISpecularStrategy> sample2strategy(const ProcessedSample& re_sample) -{ - if (re_sample.polarizing()) - return SampleUtils::SpecularStrategyBuilder::buildMagnetic( - re_sample.sample().roughnessModel()); - return SampleUtils::SpecularStrategyBuilder::buildScalar(re_sample.sample().roughnessModel()); -} - -} // namespace - - SpecularComputation::SpecularComputation(const ProcessedSample& re_sample, const SimulationOptions& options, ProgressHandler& progress, SpecularElementIter begin_it, @@ -41,7 +27,6 @@ SpecularComputation::SpecularComputation(const ProcessedSample& re_sample, : IComputation(std::move(re_sample), options, progress) , m_begin_it(begin_it) , m_end_it(end_it) - , m_strategy(sample2strategy(m_re_sample)) { } @@ -49,14 +34,15 @@ SpecularComputation::~SpecularComputation() = default; void SpecularComputation::runProtected() { - auto& slices = m_re_sample.averageSlices(); + const SliceStack& slices = m_re_sample.averageSlices(); + const ISpecularStrategy* strategy = m_re_sample.getSpecularStrategy(); for (auto it = m_begin_it; it != m_end_it; ++it) { SpecularElement& ele = *it; if (!ele.isCalculated()) continue; if (m_re_sample.polarizing()) { const auto R = std::get<Eigen::Matrix2cd>( - m_strategy->computeTopLayerR(slices, ele.produceKz(slices))); + strategy->computeTopLayerR(slices, ele.produceKz(slices))); const auto& polarization = ele.polarizationHandler().getPolarization(); const auto& analyzer = ele.polarizationHandler().getAnalyzerOperator(); @@ -67,7 +53,7 @@ void SpecularComputation::runProtected() } else { const auto R = - std::get<complex_t>(m_strategy->computeTopLayerR(slices, ele.produceKz(slices))); + std::get<complex_t>(strategy->computeTopLayerR(slices, ele.produceKz(slices))); ele.setIntensity(std::norm(R)); } diff --git a/Core/Computation/SpecularComputation.h b/Core/Computation/SpecularComputation.h index d6fc5f51a3db8c74ebad1562e7a778040efde263..b0cb162cef0aed570b6a076e93073765a91eb878 100644 --- a/Core/Computation/SpecularComputation.h +++ b/Core/Computation/SpecularComputation.h @@ -44,7 +44,6 @@ private: //! these iterators define the span of detector bins this simulation will work on const SpecularElementIter m_begin_it, m_end_it; - const std::unique_ptr<ISpecularStrategy> m_strategy; }; #endif // BORNAGAIN_CORE_COMPUTATION_SPECULARCOMPUTATION_H diff --git a/Resample/Processed/ProcessedSample.cpp b/Resample/Processed/ProcessedSample.cpp index 2fb09e3db33fc0fad092d3f704f18bb06761f6a0..25a5d0e2e37f319c2c8972ebd31746f8d85a8097 100644 --- a/Resample/Processed/ProcessedSample.cpp +++ b/Resample/Processed/ProcessedSample.cpp @@ -285,6 +285,11 @@ const std::vector<ProcessedLayout>& ProcessedSample::layouts() const return m_layouts; } +const ISpecularStrategy* ProcessedSample::getSpecularStrategy() const +{ + return m_specular_strategy.get(); +} + const IFresnelMap* ProcessedSample::fresnelMap() const { return m_fresnel_map.get(); diff --git a/Resample/Processed/ProcessedSample.h b/Resample/Processed/ProcessedSample.h index ad5724ccf9df08516d9da8823c2e9bc8caf6b432..2ac626b39c5e22d76641c8b5e096dcc7990ef091 100644 --- a/Resample/Processed/ProcessedSample.h +++ b/Resample/Processed/ProcessedSample.h @@ -50,6 +50,7 @@ public: const SliceStack& averageSlices() const; const Slice& avgeSlice(size_t i) const; const std::vector<ProcessedLayout>& layouts() const; + const ISpecularStrategy* getSpecularStrategy() const; const IFresnelMap* fresnelMap() const; double sliceTopZ(size_t i) const; double sliceBottomZ(size_t i) const;