Skip to content
Snippets Groups Projects
Commit 830a901a authored by Yurov, Dmitry's avatar Yurov, Dmitry
Browse files

Changes to IFresnelMap for easier access to Fresnel coefficients

parent 50e8436a
No related branches found
No related tags found
No related merge requests found
......@@ -19,11 +19,14 @@
#include <cstddef>
#include <memory>
template<class T> class BasicVector3D;
class ILayerRTCoefficients;
class MultiLayer;
class SimulationElement;
class SpecularSimulationElement;
typedef BasicVector3D<double> kvector_t;
//! Holds the necessary information to calculate the radiation wavefunction in every layer
//! for different incoming (outgoing) angles of the beam in the top layer
//! (these amplitudes correspond to the specular part of the wavefunction).
......@@ -40,8 +43,11 @@ public:
const SimulationElement& sim_element, size_t layer_index) const =0;
//! Retrieves the amplitude coefficients for an incoming wavevector.
virtual const ILayerRTCoefficients* getInCoefficients(
const SimulationElement& sim_element, size_t layer_index) const =0;
template <typename T>
const ILayerRTCoefficients* getInCoefficients(const T& sim_element, size_t layer_index) const
{
return getCoefficients(sim_element.getKi(), layer_index);
}
//! Fills simulation element specular data
virtual void fillSpecularData(SpecularSimulationElement& sim_element) const = 0;
......@@ -53,6 +59,9 @@ public:
void disableCaching();
protected:
virtual const ILayerRTCoefficients* getCoefficients(const kvector_t& kvec,
size_t layer_index) const = 0;
bool m_use_cache;
std::unique_ptr<MultiLayer> mP_multilayer;
};
......
......@@ -41,12 +41,6 @@ MatrixFresnelMap::getOutCoefficients(const SimulationElement& sim_element, size_
m_hash_table_out);
}
const ILayerRTCoefficients*
MatrixFresnelMap::getInCoefficients(const SimulationElement& sim_element, size_t layer_index) const
{
return getCoefficients(sim_element.getKi(), layer_index, *mP_multilayer, m_hash_table_in);
}
void MatrixFresnelMap::fillSpecularData(SpecularSimulationElement& sim_element) const
{
const auto& kvec = sim_element.getKi();
......@@ -57,9 +51,16 @@ void MatrixFresnelMap::fillSpecularData(SpecularSimulationElement& sim_element)
sim_element.setSpecular(SpecularData(calculateCoefficients(*mP_multilayer, kvec)));
}
const ILayerRTCoefficients* MatrixFresnelMap::getCoefficients(kvector_t kvec, size_t layer_index,
const MultiLayer& multilayer,
CoefficientHash& hash_table) const
const ILayerRTCoefficients* MatrixFresnelMap::getCoefficients(const kvector_t& kvec,
size_t layer_index) const
{
return getCoefficients(kvec, layer_index, *mP_multilayer, m_hash_table_in);
}
const ILayerRTCoefficients* MatrixFresnelMap::getCoefficients(const kvector_t& kvec,
size_t layer_index,
const MultiLayer& multilayer,
CoefficientHash& hash_table) const
{
if (!m_use_cache) {
auto coeffs = calculateCoefficients(multilayer, kvec);
......
......@@ -38,9 +38,6 @@ public:
const ILayerRTCoefficients* getOutCoefficients(const SimulationElement& sim_element,
size_t layer_index) const final override;
const ILayerRTCoefficients* getInCoefficients(const SimulationElement& sim_element,
size_t layer_index) const final override;
void setMultilayer(const MultiLayer& multilayer) final override;
//! Fills simulation element specular data
......@@ -50,7 +47,9 @@ public:
CoefficientHash;
private:
const ILayerRTCoefficients* getCoefficients(kvector_t kvec, size_t layer_index,
const ILayerRTCoefficients* getCoefficients(const kvector_t& kvec,
size_t layer_index) const override;
const ILayerRTCoefficients* getCoefficients(const kvector_t& kvec, size_t layer_index,
const MultiLayer& multilayer,
CoefficientHash& hash_table) const;
......
......@@ -18,6 +18,7 @@
#include "SimulationElement.h"
#include "SpecularMatrix.h"
#include "SpecularSimulationElement.h"
#include "Vectors3D.h"
namespace {
std::vector<ScalarRTCoefficients> calculateCoefficients(const MultiLayer& multilayer,
......@@ -36,12 +37,6 @@ const ILayerRTCoefficients* ScalarFresnelMap::getOutCoefficients(
return getCoefficients(-sim_element.getMeanKf(), layer_index);
}
const ILayerRTCoefficients* ScalarFresnelMap::getInCoefficients(
const SimulationElement& sim_element, size_t layer_index) const
{
return getCoefficients(sim_element.getKi(), layer_index);
}
void ScalarFresnelMap::fillSpecularData(SpecularSimulationElement& sim_element) const
{
const auto& kvec = sim_element.getKi();
......@@ -51,8 +46,8 @@ void ScalarFresnelMap::fillSpecularData(SpecularSimulationElement& sim_element)
sim_element.setSpecular(SpecularData(calculateCoefficients(*mP_multilayer, kvec)));
}
const ScalarRTCoefficients* ScalarFresnelMap::getCoefficients(
kvector_t kvec, size_t layer_index) const
const ILayerRTCoefficients* ScalarFresnelMap::getCoefficients(const kvector_t& kvec,
size_t layer_index) const
{
if (!m_use_cache) {
auto coeffs = calculateCoefficients(*mP_multilayer, kvec);
......
......@@ -17,8 +17,6 @@
#include "Hash2Doubles.h"
#include "IFresnelMap.h"
#include "Vectors3D.h"
#include <memory>
#include <unordered_map>
#include <utility>
#include <vector>
......@@ -40,14 +38,12 @@ public:
const ILayerRTCoefficients* getOutCoefficients (const SimulationElement& sim_element,
size_t layer_index) const final override;
const ILayerRTCoefficients* getInCoefficients(const SimulationElement& sim_element,
size_t layer_index) const final override;
//! Fills simulation element specular data
void fillSpecularData(SpecularSimulationElement& sim_element) const override;
private:
const ScalarRTCoefficients* getCoefficients(kvector_t kvec, size_t layer_index) const;
const ILayerRTCoefficients* getCoefficients(const kvector_t& kvec,
size_t layer_index) const override;
const std::vector<ScalarRTCoefficients>& getCoefficientsFromCache(kvector_t kvec) const;
mutable std::unordered_map<std::pair<double, double>, std::vector<ScalarRTCoefficients>,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment