From cb190540466df6686fce172c469d5f64236cdb1f Mon Sep 17 00:00:00 2001 From: Randolf Beerwerth <r.beerwerth@fz-juelich.de> Date: Fri, 21 Aug 2020 13:35:33 +0200 Subject: [PATCH] Revamp typedefs for RT coefficients and delete copy constructor for ISpecularStrategy --- Core/Computation/SpecularComputationTerm.cpp | 2 +- Core/Computation/SpecularComputationTerm.h | 2 +- Core/Multilayer/ISpecularStrategy.h | 9 +++++++-- Core/Multilayer/MatrixFresnelMap.cpp | 4 ++-- Core/Multilayer/ScalarFresnelMap.cpp | 4 ++-- Core/Multilayer/SpecularMagneticStrategy.h | 5 +++++ Core/Multilayer/SpecularScalarStrategy.h | 4 ++++ 7 files changed, 22 insertions(+), 8 deletions(-) diff --git a/Core/Computation/SpecularComputationTerm.cpp b/Core/Computation/SpecularComputationTerm.cpp index a00596df5d1..2c5a6ed658c 100644 --- a/Core/Computation/SpecularComputationTerm.cpp +++ b/Core/Computation/SpecularComputationTerm.cpp @@ -69,7 +69,7 @@ void SpecularMatrixTerm::eval(SpecularSimulationElement& elem, } double SpecularMatrixTerm::intensity(const SpecularSimulationElement& elem, - ISpecularStrategy::single_coeff_t& coeff) const + const ISpecularStrategy::coefficient_pointer_type& coeff) const { const auto& polarization = elem.polarizationHandler().getPolarization(); const auto& analyzer = elem.polarizationHandler().getAnalyzerOperator(); diff --git a/Core/Computation/SpecularComputationTerm.h b/Core/Computation/SpecularComputationTerm.h index faefd62e774..d86ca1edfac 100644 --- a/Core/Computation/SpecularComputationTerm.h +++ b/Core/Computation/SpecularComputationTerm.h @@ -85,7 +85,7 @@ private: protected: void eval(SpecularSimulationElement& elem, const std::vector<Slice>& slices) const override; double intensity(const SpecularSimulationElement& elem, - ISpecularStrategy::single_coeff_t& coeff) const; + const ISpecularStrategy::coefficient_pointer_type& coeff) const; }; #endif // BORNAGAIN_CORE_COMPUTATION_SPECULARCOMPUTATIONTERM_H diff --git a/Core/Multilayer/ISpecularStrategy.h b/Core/Multilayer/ISpecularStrategy.h index c7300fb50fc..0fc7764b820 100644 --- a/Core/Multilayer/ISpecularStrategy.h +++ b/Core/Multilayer/ISpecularStrategy.h @@ -29,8 +29,13 @@ class BA_CORE_API_ ISpecularStrategy { public: virtual ~ISpecularStrategy() = default; - using single_coeff_t = std::unique_ptr<const ILayerRTCoefficients>; - using coeffs_t = std::vector<single_coeff_t>; + ISpecularStrategy() = default; + ISpecularStrategy& operator=(const ISpecularStrategy& other) = delete; + ISpecularStrategy(const ISpecularStrategy& other) = delete; + + using coefficient_type = ILayerRTCoefficients; + using coefficient_pointer_type = std::unique_ptr<const coefficient_type>; + using coeffs_t = std::vector<coefficient_pointer_type>; virtual coeffs_t Execute(const std::vector<Slice>& slices, const kvector_t& k) const = 0; diff --git a/Core/Multilayer/MatrixFresnelMap.cpp b/Core/Multilayer/MatrixFresnelMap.cpp index 3786a23740a..cc6bee7b4b2 100644 --- a/Core/Multilayer/MatrixFresnelMap.cpp +++ b/Core/Multilayer/MatrixFresnelMap.cpp @@ -61,10 +61,10 @@ MatrixFresnelMap::getCoefficients(const kvector_t& kvec, size_t layer_index, { if (!m_use_cache) { auto coeffs = m_Strategy->Execute(slices, kvec); - return ISpecularStrategy::single_coeff_t(coeffs[layer_index]->clone()); + return ISpecularStrategy::coefficient_pointer_type(coeffs[layer_index]->clone()); } const auto& coef_vector = getCoefficientsFromCache(kvec, slices, hash_table); - return ISpecularStrategy::single_coeff_t(coef_vector[layer_index]->clone()); + return ISpecularStrategy::coefficient_pointer_type(coef_vector[layer_index]->clone()); } const ISpecularStrategy::coeffs_t& diff --git a/Core/Multilayer/ScalarFresnelMap.cpp b/Core/Multilayer/ScalarFresnelMap.cpp index 8626644eb51..1beb426972d 100644 --- a/Core/Multilayer/ScalarFresnelMap.cpp +++ b/Core/Multilayer/ScalarFresnelMap.cpp @@ -44,10 +44,10 @@ ScalarFresnelMap::getCoefficients(const kvector_t& kvec, size_t layer_index) con { if (!m_use_cache) { auto coeffs = m_Strategy->Execute(m_slices, kvec); - return ISpecularStrategy::single_coeff_t(coeffs[layer_index]->clone()); + return ISpecularStrategy::coefficient_pointer_type(coeffs[layer_index]->clone()); } const auto& coef_vector = getCoefficientsFromCache(kvec); - return ISpecularStrategy::single_coeff_t(coef_vector[layer_index]->clone()); + return ISpecularStrategy::coefficient_pointer_type(coef_vector[layer_index]->clone()); } const ISpecularStrategy::coeffs_t& ScalarFresnelMap::getCoefficientsFromCache(kvector_t kvec) const diff --git a/Core/Multilayer/SpecularMagneticStrategy.h b/Core/Multilayer/SpecularMagneticStrategy.h index 3903b05119b..2ae617a4fe0 100644 --- a/Core/Multilayer/SpecularMagneticStrategy.h +++ b/Core/Multilayer/SpecularMagneticStrategy.h @@ -33,6 +33,10 @@ class Slice; class BA_CORE_API_ SpecularMagneticStrategy : public ISpecularStrategy { public: + using coefficient_type = MatrixRTCoefficients_v2; + using coefficient_pointer_type = std::unique_ptr<const coefficient_type>; + using coeffs_t = std::vector<coefficient_pointer_type>; + //! Computes refraction angle reflection/transmission coefficients //! for given sliced multilayer and wavevector k ISpecularStrategy::coeffs_t Execute(const std::vector<Slice>& slices, const kvector_t& k) const; @@ -42,6 +46,7 @@ public: ISpecularStrategy::coeffs_t Execute(const std::vector<Slice>& slices, const std::vector<complex_t>& kz) const; +private: static std::vector<MatrixRTCoefficients_v2> computeTR(const std::vector<Slice>& slices, const std::vector<complex_t>& kzs); diff --git a/Core/Multilayer/SpecularScalarStrategy.h b/Core/Multilayer/SpecularScalarStrategy.h index 02f2d7d66c7..aaa117d03d3 100644 --- a/Core/Multilayer/SpecularScalarStrategy.h +++ b/Core/Multilayer/SpecularScalarStrategy.h @@ -34,6 +34,10 @@ class Slice; class BA_CORE_API_ SpecularScalarStrategy : public ISpecularStrategy { public: + using coefficient_type = ScalarRTCoefficients; + using coefficient_pointer_type = std::unique_ptr<const coefficient_type>; + using coeffs_t = std::vector<coefficient_pointer_type>; + //! Computes refraction angles and transmission/reflection coefficients //! for given coherent wave propagation in a multilayer. virtual ISpecularStrategy::coeffs_t Execute(const std::vector<Slice>& slices, -- GitLab