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

Fresnel maps now own the multilayer

parent c78bfdc2
No related branches found
No related tags found
No related merge requests found
......@@ -40,12 +40,11 @@ MainComputation::MainComputation(
const std::vector<SimulationElement>::iterator& begin_it,
const std::vector<SimulationElement>::iterator& end_it)
: mP_multi_layer(multi_layer.clone())
, mP_inverted_multilayer(multi_layer.cloneInvertB())
, m_sim_options(options)
, m_progress(&progress)
, m_begin_it(begin_it)
, m_end_it(end_it)
, mP_fresnel_map(createFresnelMap(mP_multi_layer.get(), mP_inverted_multilayer.get()))
, mP_fresnel_map(createFresnelMap(mP_multi_layer.get()))
{
bool polarized = mP_multi_layer->containsMagneticMaterial();
size_t nLayers = mP_multi_layer->numberOfLayers();
......@@ -98,13 +97,12 @@ void MainComputation::runProtected()
}
}
IFresnelMap* MainComputation::createFresnelMap(const MultiLayer* p_multilayer,
const MultiLayer* p_inverted_multilayer)
IFresnelMap* MainComputation::createFresnelMap(const MultiLayer* p_multilayer)
{
if (!p_multilayer->requiresMatrixRTCoefficients())
return new ScalarFresnelMap(p_multilayer);
return new ScalarFresnelMap(*p_multilayer);
else
return new MatrixFresnelMap(p_multilayer, p_inverted_multilayer);
return new MatrixFresnelMap(*p_multilayer);
}
void MainComputation::adjustFresnelMap()
......
......@@ -55,14 +55,12 @@ public:
private:
void runProtected();
static IFresnelMap* createFresnelMap(const MultiLayer* p_multilayer,
const MultiLayer* p_inverted_multilayer);
static IFresnelMap* createFresnelMap(const MultiLayer* p_multilayer);
// corrects used materials in the Fresnel map to the average materials
void adjustFresnelMap();
bool checkRegions(const std::vector<HomogeneousRegion>& regions) const;
std::unique_ptr<MultiLayer> mP_multi_layer;
std::unique_ptr<MultiLayer> mP_inverted_multilayer;
SimulationOptions m_sim_options;
ProgressHandler* m_progress;
//! these iterators define the span of detector bins this simulation will work on
......
......@@ -20,10 +20,9 @@
#include "SimulationElement.h"
#include "SpecularMagnetic.h"
MatrixFresnelMap::MatrixFresnelMap(const MultiLayer* p_multilayer,
const MultiLayer* p_inverted_multilayer)
: mp_multilayer(p_multilayer)
, mp_inverted_multilayer(p_inverted_multilayer)
MatrixFresnelMap::MatrixFresnelMap(const MultiLayer& multilayer)
: mP_multilayer(multilayer.clone())
, mP_inverted_multilayer(multilayer.cloneInvertB())
{}
MatrixFresnelMap::~MatrixFresnelMap()
......@@ -39,7 +38,7 @@ const ILayerRTCoefficients* MatrixFresnelMap::getOutCoefficients(
result = new MatrixRTCoefficients(it->second[layer_index]);
else {
std::vector<MatrixRTCoefficients> coeffs;
SpecularMagnetic::execute(*mp_inverted_multilayer, kvec, coeffs);
SpecularMagnetic::execute(*mP_inverted_multilayer, kvec, coeffs);
result = new MatrixRTCoefficients(coeffs[layer_index]);
m_hash_table_out[kvec] = std::move(coeffs);
}
......@@ -56,7 +55,7 @@ const ILayerRTCoefficients* MatrixFresnelMap::getInCoefficients(
result = new MatrixRTCoefficients(it->second[layer_index]);
else {
std::vector<MatrixRTCoefficients> coeffs;
SpecularMagnetic::execute(*mp_multilayer, kvec, coeffs);
SpecularMagnetic::execute(*mP_multilayer, kvec, coeffs);
result = new MatrixRTCoefficients(coeffs[layer_index]);
m_hash_table_in[kvec] = std::move(coeffs);
}
......
......@@ -18,6 +18,7 @@
#include "HashKVector.h"
#include "IFresnelMap.h"
#include <memory>
#include <unordered_map>
#include <vector>
......@@ -32,7 +33,7 @@ class SimulationElement;
class BA_CORE_API_ MatrixFresnelMap : public IFresnelMap
{
public:
MatrixFresnelMap(const MultiLayer* p_multilayer, const MultiLayer* p_inverted_multilayer);
MatrixFresnelMap(const MultiLayer& multilayer);
~MatrixFresnelMap() final;
//! Retrieves the amplitude coefficients for the given angles
......@@ -44,8 +45,8 @@ public:
const SimulationElement& sim_element, size_t layer_index) const final override;
private:
const MultiLayer* mp_multilayer;
const MultiLayer* mp_inverted_multilayer;
std::unique_ptr<MultiLayer> mP_multilayer;
std::unique_ptr<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>,
......
......@@ -19,8 +19,8 @@
#include "SimulationElement.h"
#include "SpecularMatrix.h"
ScalarFresnelMap::ScalarFresnelMap(const MultiLayer* multilayer)
: mp_multilayer(multilayer)
ScalarFresnelMap::ScalarFresnelMap(const MultiLayer& multilayer)
: mP_multilayer(multilayer.clone())
{}
ScalarFresnelMap::~ScalarFresnelMap()
......@@ -48,7 +48,7 @@ const ScalarRTCoefficients* ScalarFresnelMap::getCoefficients(
result = new ScalarRTCoefficients(it->second[layer_index]);
else {
std::vector<ScalarRTCoefficients> coeffs;
SpecularMatrix::execute(*mp_multilayer, kvec, coeffs);
SpecularMatrix::execute(*mP_multilayer, kvec, coeffs);
result = new ScalarRTCoefficients(coeffs[layer_index]);
m_hash_table[k2_theta] = std::move(coeffs);
}
......
......@@ -19,6 +19,7 @@
#include "Hash2Doubles.h"
#include "IFresnelMap.h"
#include "Vectors3D.h"
#include <memory>
#include <unordered_map>
#include <utility>
#include <vector>
......@@ -34,7 +35,7 @@ class SimulationElement;
class BA_CORE_API_ ScalarFresnelMap : public IFresnelMap
{
public:
ScalarFresnelMap(const MultiLayer* multilayer);
ScalarFresnelMap(const MultiLayer& multilayer);
~ScalarFresnelMap() final;
//! Retrieves the amplitude coefficients for the given angles
......@@ -46,7 +47,7 @@ public:
const SimulationElement& sim_element, size_t layer_index) const final override;
private:
const MultiLayer* mp_multilayer;
std::unique_ptr<MultiLayer> mP_multilayer;
const ScalarRTCoefficients* getCoefficients(kvector_t kvec, size_t layer_index) const;
mutable std::unordered_map<std::pair<double, double>, std::vector<ScalarRTCoefficients>,
Hash2Doubles> m_hash_table;
......
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