From 6d2002aaa5b3d1253f9bb9ef3c5e57fb30b42554 Mon Sep 17 00:00:00 2001 From: "Joachim Wuttke (o)" <j.wuttke@fz-juelich.de> Date: Mon, 2 Nov 2020 18:15:18 +0100 Subject: [PATCH] init_iff -> c'tor --- Core/Computation/ComputationStatus.h | 6 ++- Core/Computation/DWBAComputation.cpp | 2 +- .../Computation/ParticleLayoutComputation.cpp | 34 +++++++++------- Core/Computation/ParticleLayoutComputation.h | 4 +- Device/Unit/IUnitConverter.h | 4 +- .../DecouplingApproximationStrategy.cpp | 7 ++-- .../DecouplingApproximationStrategy.h | 4 +- .../IInterferenceFunctionStrategy.cpp | 19 +++------ .../IInterferenceFunctionStrategy.h | 11 ++---- .../Interference/SSCApproximationStrategy.cpp | 12 +++--- .../Interference/SSCApproximationStrategy.h | 5 ++- auto/Wrap/doxygenCore.i | 39 +++++++------------ auto/Wrap/doxygenSample.i | 11 ++---- 13 files changed, 71 insertions(+), 87 deletions(-) diff --git a/Core/Computation/ComputationStatus.h b/Core/Computation/ComputationStatus.h index b92a5eb533c..fa2e3423281 100644 --- a/Core/Computation/ComputationStatus.h +++ b/Core/Computation/ComputationStatus.h @@ -30,7 +30,11 @@ public: void setRunning() { m_status = RUNNING; } void setCompleted() { m_status = COMPLETED; } - void setFailed(const std::string& message) { m_error_message = message; m_status = FAILED; } + void setFailed(const std::string& message) + { + m_error_message = message; + m_status = FAILED; + } private: enum ESimulationStatus { IDLE, RUNNING, COMPLETED, FAILED }; diff --git a/Core/Computation/DWBAComputation.cpp b/Core/Computation/DWBAComputation.cpp index a7e4c1e40ce..ae638a405be 100644 --- a/Core/Computation/DWBAComputation.cpp +++ b/Core/Computation/DWBAComputation.cpp @@ -38,7 +38,7 @@ DWBAComputation::DWBAComputation(const MultiLayer& multilayer, const SimulationO bool polarized = m_processed_sample->containsMagneticMaterial(); for (const ProcessedLayout& layout : m_processed_sample->layouts()) { m_single_computation.addLayoutComputation( - new ParticleLayoutComputation(&layout, m_sim_options, polarized)); + new ParticleLayoutComputation(layout, m_sim_options, polarized)); } // scattering from rough surfaces in DWBA if (m_processed_sample->hasRoughness()) diff --git a/Core/Computation/ParticleLayoutComputation.cpp b/Core/Computation/ParticleLayoutComputation.cpp index b47d612fbcb..91d52810cfd 100644 --- a/Core/Computation/ParticleLayoutComputation.cpp +++ b/Core/Computation/ParticleLayoutComputation.cpp @@ -21,40 +21,44 @@ #include "Sample/Interference/IInterferenceFunctionStrategy.h" #include "Sample/Interference/SSCApproximationStrategy.h" -namespace { +namespace +{ -std::unique_ptr<IInterferenceFunctionStrategy> processedInterferenceFunction( - const ProcessedLayout* layout, const SimulationOptions& sim_params, bool polarized) +std::unique_ptr<IInterferenceFunctionStrategy> +processedInterferenceFunction(const ProcessedLayout& layout, const SimulationOptions& sim_params, + bool polarized) { - const IInterferenceFunction* p_iff = layout->interferenceFunction(); - if (p_iff && layout->numberOfSlices() > 1 && !p_iff->supportsMultilayer()) + const IInterferenceFunction* p_iff = layout.interferenceFunction(); + if (p_iff && layout.numberOfSlices() > 1 && !p_iff->supportsMultilayer()) throw std::runtime_error("LayoutStrategyBuilder::checkInterferenceFunction: " "interference function does not support multiple layers"); auto p_radial_para = dynamic_cast<const InterferenceFunctionRadialParaCrystal*>(p_iff); + const std::vector<FormFactorCoherentSum>& weighted_formfactors = layout.formFactorList(); + std::unique_ptr<IInterferenceFunctionStrategy> result; if (p_radial_para && p_radial_para->kappa() > 0.0) { double kappa = p_radial_para->kappa(); - result = std::make_unique<SSCApproximationStrategy>(sim_params, kappa, polarized); + result = std::make_unique<SSCApproximationStrategy>(weighted_formfactors, p_iff, sim_params, + polarized, kappa); } else { - result = std::make_unique<DecouplingApproximationStrategy>(sim_params, polarized); + result = std::make_unique<DecouplingApproximationStrategy>(weighted_formfactors, p_iff, + sim_params, polarized); } if (!result) throw Exceptions::ClassInitializationException("Could not create appropriate result"); - result->init(layout->formFactorList(), p_iff); return result; } } // namespace -ParticleLayoutComputation::ParticleLayoutComputation(const ProcessedLayout* layout, +ParticleLayoutComputation::ParticleLayoutComputation(const ProcessedLayout& layout, const SimulationOptions& options, bool polarized) - : m_layout(layout) - , m_region_map(layout->regionMap()) - , m_interference_function_strategy(processedInterferenceFunction(layout, options, polarized)) + : m_layout(layout), m_region_map(layout.regionMap()), + m_interference_function_strategy(processedInterferenceFunction(layout, options, polarized)) { } @@ -63,12 +67,12 @@ ParticleLayoutComputation::~ParticleLayoutComputation() = default; void ParticleLayoutComputation::compute(SimulationElement& elem) const { const double alpha_f = elem.getAlphaMean(); - const size_t n_layers = m_layout->numberOfSlices(); + const size_t n_layers = m_layout.numberOfSlices(); if (n_layers > 1 && alpha_f < 0) return; // zero for transmission with multilayers (n>1) # TODO: support transmission GISAS - elem.addIntensity(m_interference_function_strategy->evaluate(elem) * - m_layout->surfaceDensity()); + elem.addIntensity(m_interference_function_strategy->evaluate(elem) + * m_layout.surfaceDensity()); } void ParticleLayoutComputation::mergeRegionMap( diff --git a/Core/Computation/ParticleLayoutComputation.h b/Core/Computation/ParticleLayoutComputation.h index c7114bde059..5c98591d429 100644 --- a/Core/Computation/ParticleLayoutComputation.h +++ b/Core/Computation/ParticleLayoutComputation.h @@ -32,7 +32,7 @@ class SimulationOptions; class ParticleLayoutComputation final { public: - ParticleLayoutComputation(const ProcessedLayout* p_layout, const SimulationOptions& options, + ParticleLayoutComputation(const ProcessedLayout& layout, const SimulationOptions& options, bool polarized); ~ParticleLayoutComputation(); @@ -42,7 +42,7 @@ public: void mergeRegionMap(std::map<size_t, std::vector<HomogeneousRegion>>& region_map) const; private: - const ProcessedLayout* m_layout; + const ProcessedLayout& m_layout; const std::map<size_t, std::vector<HomogeneousRegion>> m_region_map; std::unique_ptr<const IInterferenceFunctionStrategy> m_interference_function_strategy; }; diff --git a/Device/Unit/IUnitConverter.h b/Device/Unit/IUnitConverter.h index e16f1fe5c05..29ddc1f61ab 100644 --- a/Device/Unit/IUnitConverter.h +++ b/Device/Unit/IUnitConverter.h @@ -36,8 +36,8 @@ public: const std::map<Axes::Units, const char*> axisUnitLabel = { {Axes::Units::DEFAULT, "undefined"}, {Axes::Units::NBINS, "bin"}, {Axes::Units::RADIANS, "rad"}, - {Axes::Units::DEGREES, "deg"}, {Axes::Units::MM, "mm"}, {Axes::Units::QSPACE, "1/nm"}, - {Axes::Units::QXQY, "1/nm"}, {Axes::Units::RQ4, "nm^-4?"}}; + {Axes::Units::DEGREES, "deg"}, {Axes::Units::MM, "mm"}, {Axes::Units::QSPACE, "1/nm"}, + {Axes::Units::QXQY, "1/nm"}, {Axes::Units::RQ4, "nm^-4?"}}; //! Interface to provide axis translations to different units for simulation output //! @ingroup simulation_internal diff --git a/Sample/Interference/DecouplingApproximationStrategy.cpp b/Sample/Interference/DecouplingApproximationStrategy.cpp index 8b9b7ea07d6..9af74b45a1a 100644 --- a/Sample/Interference/DecouplingApproximationStrategy.cpp +++ b/Sample/Interference/DecouplingApproximationStrategy.cpp @@ -24,9 +24,10 @@ using InterferenceFunctionUtils::PrecomputePolarizedFormFactors; using InterferenceFunctionUtils::PrecomputeScalarFormFactors; -DecouplingApproximationStrategy::DecouplingApproximationStrategy(SimulationOptions sim_params, - bool polarized) - : IInterferenceFunctionStrategy(sim_params, polarized) +DecouplingApproximationStrategy::DecouplingApproximationStrategy( + const std::vector<FormFactorCoherentSum>& weighted_formfactors, + const IInterferenceFunction* p_iff, SimulationOptions sim_params, bool polarized) + : IInterferenceFunctionStrategy(weighted_formfactors, p_iff, sim_params, polarized) { } diff --git a/Sample/Interference/DecouplingApproximationStrategy.h b/Sample/Interference/DecouplingApproximationStrategy.h index fc731275655..4bb91db9aee 100644 --- a/Sample/Interference/DecouplingApproximationStrategy.h +++ b/Sample/Interference/DecouplingApproximationStrategy.h @@ -26,7 +26,9 @@ class SimulationElement; class DecouplingApproximationStrategy final : public IInterferenceFunctionStrategy { public: - DecouplingApproximationStrategy(SimulationOptions sim_params, bool polarized); + DecouplingApproximationStrategy(const std::vector<FormFactorCoherentSum>& weighted_formfactors, + const IInterferenceFunction* p_iff, + SimulationOptions sim_params, bool polarized); private: double scalarCalculation(const SimulationElement& sim_element) const override; diff --git a/Sample/Interference/IInterferenceFunctionStrategy.cpp b/Sample/Interference/IInterferenceFunctionStrategy.cpp index cb4a6a9ddfa..89cc44c9af0 100644 --- a/Sample/Interference/IInterferenceFunctionStrategy.cpp +++ b/Sample/Interference/IInterferenceFunctionStrategy.cpp @@ -19,19 +19,12 @@ #include "Sample/Aggregate/InterferenceFunctionNone.h" #include "Sample/Fresnel/FormFactorCoherentSum.h" -IInterferenceFunctionStrategy::IInterferenceFunctionStrategy(const SimulationOptions& sim_params, - bool polarized) +IInterferenceFunctionStrategy::IInterferenceFunctionStrategy( + const std::vector<FormFactorCoherentSum>& weighted_formfactors, + const IInterferenceFunction* p_iff, const SimulationOptions& sim_params, bool polarized) : m_iff(nullptr), m_options(sim_params), m_polarized(polarized), m_integrator( make_integrator_miser(this, &IInterferenceFunctionStrategy::evaluate_for_fixed_angles, 2)) -{ -} - -IInterferenceFunctionStrategy::~IInterferenceFunctionStrategy() = default; - -void IInterferenceFunctionStrategy::init( - const std::vector<FormFactorCoherentSum>& weighted_formfactors, - const IInterferenceFunction* p_iff) { if (weighted_formfactors.empty()) throw Exceptions::ClassInitializationException( @@ -41,10 +34,10 @@ void IInterferenceFunctionStrategy::init( m_iff.reset(p_iff->clone()); else m_iff.reset(new InterferenceFunctionNone()); - - strategy_specific_post_init(); } +IInterferenceFunctionStrategy::~IInterferenceFunctionStrategy() = default; + double IInterferenceFunctionStrategy::evaluate(const SimulationElement& sim_element) const { if (m_options.isIntegrate() && (sim_element.getSolidAngle() > 0.0)) @@ -82,5 +75,3 @@ double IInterferenceFunctionStrategy::evaluate_for_fixed_angles(double* fraction SimulationElement sim_element = pars->pointElement(par0, par1); return pars->getIntegrationFactor(par0, par1) * evaluateSinglePoint(sim_element); } - -void IInterferenceFunctionStrategy::strategy_specific_post_init() {} diff --git a/Sample/Interference/IInterferenceFunctionStrategy.h b/Sample/Interference/IInterferenceFunctionStrategy.h index ba0a541a81c..842d41a8014 100644 --- a/Sample/Interference/IInterferenceFunctionStrategy.h +++ b/Sample/Interference/IInterferenceFunctionStrategy.h @@ -41,26 +41,23 @@ class SimulationElement; class IInterferenceFunctionStrategy { public: - IInterferenceFunctionStrategy(const SimulationOptions& sim_params, bool polarized); + IInterferenceFunctionStrategy(const std::vector<FormFactorCoherentSum>& weighted_formfactors, + const IInterferenceFunction* p_iff, + const SimulationOptions& sim_params, bool polarized); virtual ~IInterferenceFunctionStrategy(); - //! Initializes the object with form factors and an interference function - void init(const std::vector<FormFactorCoherentSum>& weighted_formfactors, - const IInterferenceFunction* p_iff); - //! Calculates the intensity for scalar particles/interactions double evaluate(const SimulationElement& sim_element) const; protected: std::vector<FormFactorCoherentSum> m_formfactor_wrappers; std::unique_ptr<IInterferenceFunction> m_iff; - SimulationOptions m_options; + const SimulationOptions m_options; private: double evaluateSinglePoint(const SimulationElement& sim_element) const; double MCIntegratedEvaluate(const SimulationElement& sim_element) const; double evaluate_for_fixed_angles(double* fractions, size_t dim, void* params) const; - virtual void strategy_specific_post_init(); //! Evaluates the intensity in the scalar case virtual double scalarCalculation(const SimulationElement& sim_element) const = 0; //! Evaluates the intensity in the polarized case diff --git a/Sample/Interference/SSCApproximationStrategy.cpp b/Sample/Interference/SSCApproximationStrategy.cpp index 6040bbfff23..c30565cf5b7 100644 --- a/Sample/Interference/SSCApproximationStrategy.cpp +++ b/Sample/Interference/SSCApproximationStrategy.cpp @@ -20,13 +20,11 @@ using InterferenceFunctionUtils::PrecomputePolarizedFormFactors; using InterferenceFunctionUtils::PrecomputeScalarFormFactors; -SSCApproximationStrategy::SSCApproximationStrategy(SimulationOptions sim_params, double kappa, - bool polarized) - : IInterferenceFunctionStrategy(sim_params, polarized), m_helper(kappa) -{ -} - -void SSCApproximationStrategy::strategy_specific_post_init() +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), + m_helper(kappa) { m_helper.init(m_formfactor_wrappers); } diff --git a/Sample/Interference/SSCApproximationStrategy.h b/Sample/Interference/SSCApproximationStrategy.h index a40fca106e1..0d4df12d676 100644 --- a/Sample/Interference/SSCApproximationStrategy.h +++ b/Sample/Interference/SSCApproximationStrategy.h @@ -26,10 +26,11 @@ class SimulationElement; class SSCApproximationStrategy final : public IInterferenceFunctionStrategy { public: - SSCApproximationStrategy(SimulationOptions sim_params, double kappa, bool polarized); + SSCApproximationStrategy(const std::vector<FormFactorCoherentSum>& weighted_formfactors, + const IInterferenceFunction* p_iff, SimulationOptions sim_params, + bool polarized, double kappa); private: - void strategy_specific_post_init() override; double scalarCalculation(const SimulationElement& sim_element) const override; double polarizedCalculation(const SimulationElement& sim_element) const override; SSCAHelper m_helper; diff --git a/auto/Wrap/doxygenCore.i b/auto/Wrap/doxygenCore.i index a4115d39bc1..5cbdf2f4163 100644 --- a/auto/Wrap/doxygenCore.i +++ b/auto/Wrap/doxygenCore.i @@ -1241,7 +1241,7 @@ Computes the scattering contribution from one particle layout. Used by DWBAComp C++ includes: ParticleLayoutComputation.h "; -%feature("docstring") ParticleLayoutComputation::ParticleLayoutComputation "ParticleLayoutComputation::ParticleLayoutComputation(const ProcessedLayout *p_layout, const SimulationOptions &options, bool polarized) +%feature("docstring") ParticleLayoutComputation::ParticleLayoutComputation "ParticleLayoutComputation::ParticleLayoutComputation(const ProcessedLayout &layout, const SimulationOptions &options, bool polarized) "; %feature("docstring") ParticleLayoutComputation::~ParticleLayoutComputation "ParticleLayoutComputation::~ParticleLayoutComputation() @@ -2483,7 +2483,10 @@ Returns default units to convert to. "; -// File: namespace_0d100.xml +// File: namespace_0d23.xml + + +// File: namespace_0d27.xml // File: namespace_0d29.xml @@ -2492,43 +2495,43 @@ Returns default units to convert to. // File: namespace_0d31.xml -// File: namespace_0d33.xml +// File: namespace_0d35.xml -// File: namespace_0d37.xml +// File: namespace_0d39.xml -// File: namespace_0d41.xml +// File: namespace_0d43.xml -// File: namespace_0d45.xml +// File: namespace_0d51.xml -// File: namespace_0d53.xml +// File: namespace_0d56.xml -// File: namespace_0d58.xml +// File: namespace_0d65.xml // File: namespace_0d67.xml -// File: namespace_0d69.xml +// File: namespace_0d71.xml // File: namespace_0d73.xml -// File: namespace_0d75.xml +// File: namespace_0d80.xml // File: namespace_0d82.xml -// File: namespace_0d84.xml +// File: namespace_0d90.xml -// File: namespace_0d92.xml +// File: namespace_0d96.xml // File: namespace_0d98.xml @@ -2867,18 +2870,6 @@ Helper factory function to use in GISASSimulation. Depending on the type of det // File: IComputation_8h.xml -// File: LayoutStrategyBuilder_8cpp.xml -%feature("docstring") processedIInterferenceFunctionStrategy "IInterferenceFunctionStrategy* processedIInterferenceFunctionStrategy(const ProcessedLayout *layout, const SimulationOptions &sim_params, bool polarized) -"; - - -// File: LayoutStrategyBuilder_8h.xml -%feature("docstring") processedInterferenceFunction "IInterferenceFunctionStrategy* processedInterferenceFunction(const ProcessedLayout *layout, const SimulationOptions &sim_params, bool polarized) - -Provides a IInterferenceFunctionStrategy for a ParticleLayoutComputation. -"; - - // File: MultiLayerFuncs_8cpp.xml %feature("docstring") MaterialProfile "std::vector<complex_t> MaterialProfile(const MultiLayer &multilayer, int n_points, double z_min, double z_max) diff --git a/auto/Wrap/doxygenSample.i b/auto/Wrap/doxygenSample.i index c58b712e4cb..d05ebb308f1 100644 --- a/auto/Wrap/doxygenSample.i +++ b/auto/Wrap/doxygenSample.i @@ -437,7 +437,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(SimulationOptions sim_params, bool polarized) +%feature("docstring") DecouplingApproximationStrategy::DecouplingApproximationStrategy "DecouplingApproximationStrategy::DecouplingApproximationStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *p_iff, SimulationOptions sim_params, bool polarized) "; @@ -3627,17 +3627,12 @@ Instantiation of child classes takes place in LayoutStrategyBuilder::createStrat C++ includes: IInterferenceFunctionStrategy.h "; -%feature("docstring") IInterferenceFunctionStrategy::IInterferenceFunctionStrategy "IInterferenceFunctionStrategy::IInterferenceFunctionStrategy(const SimulationOptions &sim_params, bool polarized) +%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() "; -%feature("docstring") IInterferenceFunctionStrategy::init "void IInterferenceFunctionStrategy::init(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *p_iff) - -Initializes the object with form factors and an interference function. -"; - %feature("docstring") IInterferenceFunctionStrategy::evaluate "double IInterferenceFunctionStrategy::evaluate(const SimulationElement &sim_element) const Calculates the intensity for scalar particles/interactions. @@ -7574,7 +7569,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(SimulationOptions sim_params, double kappa, bool polarized) +%feature("docstring") SSCApproximationStrategy::SSCApproximationStrategy "SSCApproximationStrategy::SSCApproximationStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *p_iff, SimulationOptions sim_params, bool polarized, double kappa) "; -- GitLab