diff --git a/Core/Multilayer/MatrixFresnelMap.cpp b/Core/Multilayer/MatrixFresnelMap.cpp index 2b30c4716f316cecf50623466148bad015719754..76f8e12b1727299976a40650a8435a458c7f3961 100644 --- a/Core/Multilayer/MatrixFresnelMap.cpp +++ b/Core/Multilayer/MatrixFresnelMap.cpp @@ -21,23 +21,44 @@ #include "SpecularMagnetic.h" MatrixFresnelMap::MatrixFresnelMap(const MultiLayer* p_multilayer, - const MultiLayer* p_inverted_multilayer) + const MultiLayer* p_inverted_multilayer) : mp_multilayer(p_multilayer) , mp_inverted_multilayer(p_inverted_multilayer) {} +MatrixFresnelMap::~MatrixFresnelMap() +{} + const ILayerRTCoefficients* MatrixFresnelMap::getOutCoefficients( const SimulationElement& sim_element, size_t layer_index) const { - std::vector<MatrixRTCoefficients> coeffs; - SpecularMagnetic::execute(*mp_inverted_multilayer, -sim_element.getMeanKf(), coeffs); - return new MatrixRTCoefficients(coeffs[layer_index]); + MatrixRTCoefficients* result; + kvector_t kvec = -sim_element.getMeanKf(); + auto it = m_hash_table_out.find(kvec); + if (it != m_hash_table_out.end()) + result = new MatrixRTCoefficients(it->second[layer_index]); + else { + std::vector<MatrixRTCoefficients> coeffs; + SpecularMagnetic::execute(*mp_inverted_multilayer, kvec, coeffs); + result = new MatrixRTCoefficients(coeffs[layer_index]); + m_hash_table_out[kvec] = std::move(coeffs); + } + return result; } const ILayerRTCoefficients* MatrixFresnelMap::getInCoefficients( const SimulationElement& sim_element, size_t layer_index) const { - std::vector<MatrixRTCoefficients> coeffs; - SpecularMagnetic::execute(*mp_multilayer, sim_element.getKi(), coeffs); - return new MatrixRTCoefficients(coeffs[layer_index]); + MatrixRTCoefficients* result; + kvector_t kvec = sim_element.getKi(); + auto it = m_hash_table_in.find(kvec); + if (it != m_hash_table_in.end()) + result = new MatrixRTCoefficients(it->second[layer_index]); + else { + std::vector<MatrixRTCoefficients> coeffs; + SpecularMagnetic::execute(*mp_multilayer, kvec, coeffs); + result = new MatrixRTCoefficients(coeffs[layer_index]); + m_hash_table_in[kvec] = std::move(coeffs); + } + return result; } diff --git a/Core/Multilayer/MatrixFresnelMap.h b/Core/Multilayer/MatrixFresnelMap.h index c3c8189c26cafe8e673b5727aadce5969da2d83e..dada248147b26e4143a9dbb12c9022f5fbbb4b44 100644 --- a/Core/Multilayer/MatrixFresnelMap.h +++ b/Core/Multilayer/MatrixFresnelMap.h @@ -16,10 +16,13 @@ #ifndef MATRIXFRESNELMAP_H #define MATRIXFRESNELMAP_H +#include "HashKVector.h" #include "IFresnelMap.h" -#include <cstddef> +#include <unordered_map> +#include <vector> class ILayerRTCoefficients; +class MatrixRTCoefficients; class MultiLayer; class SimulationElement; @@ -30,7 +33,7 @@ class BA_CORE_API_ MatrixFresnelMap : public IFresnelMap { public: MatrixFresnelMap(const MultiLayer* p_multilayer, const MultiLayer* p_inverted_multilayer); - ~MatrixFresnelMap() final {} + ~MatrixFresnelMap() final; //! Retrieves the amplitude coefficients for the given angles const ILayerRTCoefficients* getOutCoefficients( @@ -43,6 +46,10 @@ public: private: const MultiLayer* mp_multilayer; const MultiLayer* mp_inverted_multilayer; + mutable std::unordered_map<kvector_t, std::vector<MatrixRTCoefficients>, + HashKVector> m_hash_table_out; + mutable std::unordered_map<kvector_t, std::vector<MatrixRTCoefficients>, + HashKVector> m_hash_table_in; }; #endif // MATRIXFRESNELMAP_H diff --git a/Core/Multilayer/ScalarFresnelMap.h b/Core/Multilayer/ScalarFresnelMap.h index fd3b7e1e2905a36413b730f66dc22d5c87eac3b4..db8619f4e476401f5a333e82c65cbf7008f4b0ab 100644 --- a/Core/Multilayer/ScalarFresnelMap.h +++ b/Core/Multilayer/ScalarFresnelMap.h @@ -21,8 +21,8 @@ #include <unordered_map> #include <vector> -class MultiLayer; class ILayerRTCoefficients; +class MultiLayer; class ScalarRTCoefficients; class SimulationElement;