Skip to content
Snippets Groups Projects
Commit e38041c1 authored by Wuttke, Joachim's avatar Wuttke, Joachim
Browse files

SSCApprox_Strategy: iff member variable of correct type

parent e577ed8a
No related branches found
No related tags found
No related merge requests found
......@@ -40,8 +40,8 @@ processedInterferenceFunction(const ProcessedLayout& layout, const SimulationOpt
if (radial_para && radial_para->kappa() > 0.0) {
double kappa = radial_para->kappa();
return std::make_unique<SSCApproximationStrategy>(weighted_formfactors, iff, sim_params,
polarized, kappa);
return std::make_unique<SSCApproximationStrategy>(weighted_formfactors, radial_para,
sim_params, polarized, kappa);
}
return std::make_unique<DecouplingApproximationStrategy>(weighted_formfactors, iff, sim_params,
polarized);
......
......@@ -18,12 +18,15 @@
#include "Base/Utils/MathFunctions.h"
#include "Param/Base/RealParameter.h"
#include "Sample/Aggregate/IInterferenceFunction.h"
#include "Sample/Aggregate/InterferenceFunctionNone.h"
#include "Sample/Fresnel/FormFactorCoherentSum.h"
DecouplingApproximationStrategy::DecouplingApproximationStrategy(
const std::vector<FormFactorCoherentSum>& weighted_formfactors,
const IInterferenceFunction* iff, SimulationOptions sim_params, bool polarized)
: IInterferenceFunctionStrategy(weighted_formfactors, iff, sim_params, polarized)
: IInterferenceFunctionStrategy(weighted_formfactors, sim_params, polarized)
, m_iff(iff ? iff->clone() : new InterferenceFunctionNone())
{
}
......
......@@ -27,12 +27,14 @@ class DecouplingApproximationStrategy final : public IInterferenceFunctionStrate
{
public:
DecouplingApproximationStrategy(const std::vector<FormFactorCoherentSum>& weighted_formfactors,
const IInterferenceFunction* p_iff,
SimulationOptions sim_params, bool polarized);
const IInterferenceFunction* iff, SimulationOptions sim_params,
bool polarized);
private:
double scalarCalculation(const SimulationElement& sim_element) const override;
double polarizedCalculation(const SimulationElement& sim_element) const override;
std::unique_ptr<IInterferenceFunction> m_iff;
};
#endif // BORNAGAIN_SAMPLE_INTERFERENCE_DECOUPLINGAPPROXIMATIONSTRATEGY_H
......@@ -17,14 +17,12 @@
#include "Base/Types/Exceptions.h"
#include "Base/Utils/Assert.h"
#include "Base/Utils/IntegratorMCMiser.h"
#include "Sample/Aggregate/InterferenceFunctionNone.h"
#include "Sample/Fresnel/FormFactorCoherentSum.h"
IInterferenceFunctionStrategy::IInterferenceFunctionStrategy(
const std::vector<FormFactorCoherentSum>& weighted_formfactors,
const IInterferenceFunction* p_iff, const SimulationOptions& sim_params, bool polarized)
const SimulationOptions& sim_params, bool polarized)
: m_weighted_formfactors(weighted_formfactors)
, m_iff(p_iff ? p_iff->clone() : new InterferenceFunctionNone())
, m_options(sim_params)
, m_polarized(polarized)
, m_integrator(
......
......@@ -42,7 +42,6 @@ class IInterferenceFunctionStrategy
{
public:
IInterferenceFunctionStrategy(const std::vector<FormFactorCoherentSum>& weighted_formfactors,
const IInterferenceFunction* p_iff,
const SimulationOptions& sim_params, bool polarized);
virtual ~IInterferenceFunctionStrategy();
......@@ -51,7 +50,6 @@ public:
protected:
std::vector<FormFactorCoherentSum> m_weighted_formfactors;
std::unique_ptr<IInterferenceFunction> m_iff;
const SimulationOptions m_options;
private:
......
......@@ -18,37 +18,12 @@
#include "Sample/Aggregate/InterferenceFunctionRadialParaCrystal.h"
#include "Sample/Fresnel/FormFactorCoherentSum.h"
complex_t SSCApproximationStrategy::getCharacteristicSizeCoupling(
double qp, const std::vector<FormFactorCoherentSum>& ff_wrappers) const
{
complex_t result = 0;
for (const auto& ffw : ff_wrappers)
result +=
ffw.relativeAbundance() * calculatePositionOffsetPhase(2.0 * qp, ffw.radialExtension());
return result;
}
complex_t
SSCApproximationStrategy::getCharacteristicDistribution(double qp,
const IInterferenceFunction* p_iff) const
{
const InterferenceFunctionRadialParaCrystal* p_iff_radial =
dynamic_cast<const InterferenceFunctionRadialParaCrystal*>(p_iff);
if (!p_iff_radial)
throw Exceptions::ClassInitializationException("Wrong interference function for SSCA");
return p_iff_radial->FTPDF(qp);
}
complex_t SSCApproximationStrategy::calculatePositionOffsetPhase(double qp,
double radial_extension) const
{
return exp_I(m_kappa * qp * (radial_extension - m_mean_radius));
}
SSCApproximationStrategy::SSCApproximationStrategy(
const std::vector<FormFactorCoherentSum>& weighted_formfactors,
const IInterferenceFunction* p_iff, SimulationOptions sim_params, bool polarized, double kappa)
: IInterferenceFunctionStrategy(weighted_formfactors, p_iff, sim_params, polarized)
const InterferenceFunctionRadialParaCrystal* iff, SimulationOptions sim_params, bool polarized,
double kappa)
: IInterferenceFunctionStrategy(weighted_formfactors, sim_params, polarized)
, m_iff(iff->clone())
, m_kappa(kappa)
{
m_mean_radius = 0.0;
......@@ -76,7 +51,7 @@ double SSCApproximationStrategy::scalarCalculation(const SimulationElement& sim_
}
const complex_t mean_ff_norm = ff_orig * ff_conj;
const complex_t p2kappa = getCharacteristicSizeCoupling(qp, m_weighted_formfactors);
const complex_t omega = getCharacteristicDistribution(qp, m_iff.get());
const complex_t omega = m_iff->FTPDF(qp);
const double iff = 2.0 * (mean_ff_norm * omega / (1.0 - p2kappa * omega)).real();
const double dw_factor = m_iff->DWfactor(sim_element.meanQ());
return diffuse_intensity + dw_factor * iff;
......@@ -101,7 +76,7 @@ double SSCApproximationStrategy::polarizedCalculation(const SimulationElement& s
ff_conj += prefac * ff.adjoint();
}
const complex_t p2kappa = getCharacteristicSizeCoupling(qp, m_weighted_formfactors);
const complex_t omega = getCharacteristicDistribution(qp, m_iff.get());
const complex_t omega = m_iff->FTPDF(qp);
const Eigen::Matrix2cd interference_matrix =
(2.0 * omega / (1.0 - p2kappa * omega)) * polarization_handler.getAnalyzerOperator()
* ff_orig * polarization_handler.getPolarization() * ff_conj;
......@@ -112,3 +87,19 @@ double SSCApproximationStrategy::polarizedCalculation(const SimulationElement& s
const double dw_factor = m_iff->DWfactor(sim_element.meanQ());
return diffuse_trace + dw_factor * interference_trace;
}
complex_t SSCApproximationStrategy::getCharacteristicSizeCoupling(
double qp, const std::vector<FormFactorCoherentSum>& ff_wrappers) const
{
complex_t result = 0;
for (const auto& ffw : ff_wrappers)
result +=
ffw.relativeAbundance() * calculatePositionOffsetPhase(2.0 * qp, ffw.radialExtension());
return result;
}
complex_t SSCApproximationStrategy::calculatePositionOffsetPhase(double qp,
double radial_extension) const
{
return exp_I(m_kappa * qp * (radial_extension - m_mean_radius));
}
......@@ -18,6 +18,7 @@
#include "Sample/Interference/IInterferenceFunctionStrategy.h"
#include <Eigen/StdVector>
class InterferenceFunctionRadialParaCrystal;
class SimulationElement;
//! Strategy class to compute the total scattering from a particle layout
......@@ -28,8 +29,8 @@ class SSCApproximationStrategy final : public IInterferenceFunctionStrategy
{
public:
SSCApproximationStrategy(const std::vector<FormFactorCoherentSum>& weighted_formfactors,
const IInterferenceFunction* p_iff, SimulationOptions sim_params,
bool polarized, double kappa);
const InterferenceFunctionRadialParaCrystal* iff,
SimulationOptions sim_params, bool polarized, double kappa);
private:
double scalarCalculation(const SimulationElement& sim_element) const override;
......@@ -40,9 +41,9 @@ private:
complex_t
getCharacteristicSizeCoupling(double qp,
const std::vector<FormFactorCoherentSum>& ff_wrappers) const;
complex_t getCharacteristicDistribution(double qp, const IInterferenceFunction* p_iff) const;
complex_t calculatePositionOffsetPhase(double qp, double radial_extension) const;
std::unique_ptr<InterferenceFunctionRadialParaCrystal> m_iff;
double m_kappa;
double m_mean_radius;
};
......
......@@ -436,7 +436,7 @@ Strategy class to compute the total scattering from a particle layout in the dec
C++ includes: DecouplingApproximationStrategy.h
";
%feature("docstring") DecouplingApproximationStrategy::DecouplingApproximationStrategy "DecouplingApproximationStrategy::DecouplingApproximationStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *p_iff, SimulationOptions sim_params, bool polarized)
%feature("docstring") DecouplingApproximationStrategy::DecouplingApproximationStrategy "DecouplingApproximationStrategy::DecouplingApproximationStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *iff, SimulationOptions sim_params, bool polarized)
";
......@@ -3602,7 +3602,7 @@ Instantiation of child classes takes place in LayoutStrategyBuilder::createStrat
C++ includes: IInterferenceFunctionStrategy.h
";
%feature("docstring") IInterferenceFunctionStrategy::IInterferenceFunctionStrategy "IInterferenceFunctionStrategy::IInterferenceFunctionStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *p_iff, const SimulationOptions &sim_params, bool polarized)
%feature("docstring") IInterferenceFunctionStrategy::IInterferenceFunctionStrategy "IInterferenceFunctionStrategy::IInterferenceFunctionStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const SimulationOptions &sim_params, bool polarized)
";
%feature("docstring") IInterferenceFunctionStrategy::~IInterferenceFunctionStrategy "IInterferenceFunctionStrategy::~IInterferenceFunctionStrategy()
......@@ -7328,7 +7328,7 @@ Strategy class to compute the total scattering from a particle layout in the siz
C++ includes: SSCApproximationStrategy.h
";
%feature("docstring") SSCApproximationStrategy::SSCApproximationStrategy "SSCApproximationStrategy::SSCApproximationStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *p_iff, SimulationOptions sim_params, bool polarized, double kappa)
%feature("docstring") SSCApproximationStrategy::SSCApproximationStrategy "SSCApproximationStrategy::SSCApproximationStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const InterferenceFunctionRadialParaCrystal *iff, SimulationOptions sim_params, bool polarized, double kappa)
";
......
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