Skip to content
Snippets Groups Projects
Commit 76f09c9f authored by Van Herck, Walter's avatar Van Herck, Walter
Browse files

Refactor: ScalarFresnelMap now maintains a cache (hash map) of calculated Fresnel coefficients

parent dfacab67
No related branches found
No related tags found
No related merge requests found
...@@ -92,7 +92,7 @@ void MainComputation::runProtected() ...@@ -92,7 +92,7 @@ void MainComputation::runProtected()
} }
IFresnelMap* MainComputation::createFresnelMap(const MultiLayer* p_multilayer, IFresnelMap* MainComputation::createFresnelMap(const MultiLayer* p_multilayer,
const MultiLayer* p_inverted_multilayer) const MultiLayer* p_inverted_multilayer)
{ {
if (!p_multilayer->requiresMatrixRTCoefficients()) if (!p_multilayer->requiresMatrixRTCoefficients())
return new ScalarFresnelMap(p_multilayer); return new ScalarFresnelMap(p_multilayer);
......
...@@ -55,7 +55,7 @@ public: ...@@ -55,7 +55,7 @@ public:
private: private:
void runProtected(); void runProtected();
static IFresnelMap* createFresnelMap(const MultiLayer* p_multilayer, static IFresnelMap* createFresnelMap(const MultiLayer* p_multilayer,
const MultiLayer* p_inverted_multilayer); const MultiLayer* p_inverted_multilayer);
std::unique_ptr<MultiLayer> mP_multi_layer; std::unique_ptr<MultiLayer> mP_multi_layer;
std::unique_ptr<MultiLayer> mP_inverted_multilayer; std::unique_ptr<MultiLayer> mP_inverted_multilayer;
......
// ************************************************************************** //
//
// BornAgain: simulate and fit scattering at grazing incidence
//
//! @file Core/Computation/HashKVector.cpp
//! @brief Implements class HashKVector.
//!
//! @homepage http://www.bornagainproject.org
//! @license GNU General Public License v3 or higher (see COPYING)
//! @copyright Forschungszentrum Jülich GmbH 2017
//! @authors Scientific Computing Group at MLZ Garching
//! @authors J. Burle, J. M. Fisher, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
//
// ************************************************************************** //
#include "HashKVector.h"
// Simple exclusive or of the std::hash<double> of its components
size_t HashKVector::operator()(kvector_t kvec) const noexcept
{
return m_double_hash(kvec.x()) ^ m_double_hash(kvec.y()) ^ m_double_hash(kvec.z());
}
// ************************************************************************** //
//
// BornAgain: simulate and fit scattering at grazing incidence
//
//! @file Core/Computation/HashKVector.h
//! @brief Defines class HashKVector.
//!
//! @homepage http://www.bornagainproject.org
//! @license GNU General Public License v3 or higher (see COPYING)
//! @copyright Forschungszentrum Jülich GmbH 2017
//! @authors Scientific Computing Group at MLZ Garching
//! @authors J. Burle, J. M. Fisher, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
//
// ************************************************************************** //
#ifndef HASHKVECTOR_H
#define HASHKVECTOR_H
#include "Vectors3D.h"
#include <functional>
class HashKVector
{
public:
HashKVector() {}
~HashKVector() {}
size_t operator()(kvector_t kvec) const noexcept;
private:
std::hash<double> m_double_hash;
};
#endif // HASHKVECTOR_H
...@@ -23,6 +23,9 @@ ScalarFresnelMap::ScalarFresnelMap(const MultiLayer* multilayer) ...@@ -23,6 +23,9 @@ ScalarFresnelMap::ScalarFresnelMap(const MultiLayer* multilayer)
: mp_multilayer(multilayer) : mp_multilayer(multilayer)
{} {}
ScalarFresnelMap::~ScalarFresnelMap()
{}
const ILayerRTCoefficients* ScalarFresnelMap::getOutCoefficients( const ILayerRTCoefficients* ScalarFresnelMap::getOutCoefficients(
const SimulationElement& sim_element, size_t layer_index) const const SimulationElement& sim_element, size_t layer_index) const
{ {
...@@ -38,7 +41,15 @@ const ILayerRTCoefficients* ScalarFresnelMap::getInCoefficients( ...@@ -38,7 +41,15 @@ const ILayerRTCoefficients* ScalarFresnelMap::getInCoefficients(
const ScalarRTCoefficients* ScalarFresnelMap::getCoefficients( const ScalarRTCoefficients* ScalarFresnelMap::getCoefficients(
kvector_t kvec, size_t layer_index) const kvector_t kvec, size_t layer_index) const
{ {
SpecularMatrix::MultiLayerCoeff_t coeffs; ScalarRTCoefficients* result;
SpecularMatrix::execute(*mp_multilayer, kvec, coeffs); auto it = m_hash_table.find(kvec);
return new ScalarRTCoefficients(coeffs[layer_index]); if (it != m_hash_table.end())
result = new ScalarRTCoefficients(it->second[layer_index]);
else {
std::vector<ScalarRTCoefficients> coeffs;
SpecularMatrix::execute(*mp_multilayer, kvec, coeffs);
result = new ScalarRTCoefficients(coeffs[layer_index]);
m_hash_table[kvec] = std::move(coeffs);
}
return result;
} }
...@@ -16,8 +16,10 @@ ...@@ -16,8 +16,10 @@
#ifndef SCALARFRESNELMAP_H #ifndef SCALARFRESNELMAP_H
#define SCALARFRESNELMAP_H #define SCALARFRESNELMAP_H
#include "HashKVector.h"
#include "IFresnelMap.h" #include "IFresnelMap.h"
#include "Vectors3D.h" #include <unordered_map>
#include <vector>
class MultiLayer; class MultiLayer;
class ILayerRTCoefficients; class ILayerRTCoefficients;
...@@ -31,7 +33,7 @@ class BA_CORE_API_ ScalarFresnelMap : public IFresnelMap ...@@ -31,7 +33,7 @@ class BA_CORE_API_ ScalarFresnelMap : public IFresnelMap
{ {
public: public:
ScalarFresnelMap(const MultiLayer* multilayer); ScalarFresnelMap(const MultiLayer* multilayer);
~ScalarFresnelMap() final {} ~ScalarFresnelMap() final;
//! Retrieves the amplitude coefficients for the given angles //! Retrieves the amplitude coefficients for the given angles
const ILayerRTCoefficients* getOutCoefficients ( const ILayerRTCoefficients* getOutCoefficients (
...@@ -44,6 +46,8 @@ public: ...@@ -44,6 +46,8 @@ public:
private: private:
const MultiLayer* mp_multilayer; const MultiLayer* mp_multilayer;
const ScalarRTCoefficients* getCoefficients(kvector_t kvec, size_t layer_index) const; const ScalarRTCoefficients* getCoefficients(kvector_t kvec, size_t layer_index) const;
mutable std::unordered_map<kvector_t, std::vector<ScalarRTCoefficients>,
HashKVector> m_hash_table;
}; };
#endif // SCALARFRESNELMAP_H #endif // SCALARFRESNELMAP_H
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment