From 22e9bee8878fd04bee98d3f4629a07804fd511e2 Mon Sep 17 00:00:00 2001 From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de> Date: Mon, 12 Jul 2021 14:16:04 +0200 Subject: [PATCH] don't pass sample if only roughness is needed --- Core/Computation/SpecularComputation.cpp | 5 +++-- Core/Term/SpecularTerm.cpp | 8 ++++---- Core/Term/SpecularTerm.h | 6 +++--- GUI/Models/BeamAngleItems.cpp | 6 ++---- GUI/Models/BeamWavelengthItem.cpp | 6 ++---- GUI/Models/TransformToDomain.cpp | 3 +-- Resample/Processed/ProcessedSample.cpp | 9 ++++++--- Resample/Processed/ProcessedSample.h | 3 +++ Resample/Specular/SpecularStrategyBuilder.cpp | 9 ++++----- Resample/Specular/SpecularStrategyBuilder.h | 7 +++---- auto/Wrap/doxygenCore.i | 4 ++-- auto/Wrap/doxygenResample.i | 7 +++++-- 12 files changed, 38 insertions(+), 35 deletions(-) diff --git a/Core/Computation/SpecularComputation.cpp b/Core/Computation/SpecularComputation.cpp index ec6653d768d..209f5f850b0 100644 --- a/Core/Computation/SpecularComputation.cpp +++ b/Core/Computation/SpecularComputation.cpp @@ -17,6 +17,7 @@ #include "Core/Element/SpecularElement.h" #include "Core/Term/SpecularTerm.h" #include "Resample/Processed/ProcessedSample.h" +#include "Sample/Multilayer/MultiLayer.h" static_assert(std::is_copy_constructible<SpecularComputation>::value == false, "SpecularComputation should not be copy constructible"); @@ -31,8 +32,8 @@ SpecularComputation::SpecularComputation(const MultiLayer& multilayer, , m_begin_it(begin_it) , m_end_it(end_it) , m_term(m_re_sample->polarizing() || forcePolarized - ? (ISpecularTerm*)new SpecularMatrixTerm(multilayer) - : (ISpecularTerm*)new SpecularScalarTerm(multilayer)) + ? (ISpecularTerm*)new SpecularMatrixTerm(multilayer.roughnessModel()) + : (ISpecularTerm*)new SpecularScalarTerm(multilayer.roughnessModel())) { } diff --git a/Core/Term/SpecularTerm.cpp b/Core/Term/SpecularTerm.cpp index 904fb806de7..1ee0d7a0280 100644 --- a/Core/Term/SpecularTerm.cpp +++ b/Core/Term/SpecularTerm.cpp @@ -41,8 +41,8 @@ void ISpecularTerm::computeTerm(SpecularElement& ele, const SliceStack& slices) // class SpecularScalarTerm // ************************************************************************************************ -SpecularScalarTerm::SpecularScalarTerm(const MultiLayer& multilayer) - : ISpecularTerm(SampleUtils::SpecularStrategyBuilder::buildScalar(multilayer)) +SpecularScalarTerm::SpecularScalarTerm(const RoughnessModel& rm) + : ISpecularTerm(SampleUtils::SpecularStrategyBuilder::buildScalar(rm)) { } @@ -71,8 +71,8 @@ double matrix_intensity(const SpecularElement& ele, const Eigen::Matrix2cd& R) } // namespace -SpecularMatrixTerm::SpecularMatrixTerm(const MultiLayer& multilayer) - : ISpecularTerm(SampleUtils::SpecularStrategyBuilder::buildMagnetic(multilayer)) +SpecularMatrixTerm::SpecularMatrixTerm(const RoughnessModel& rm) + : ISpecularTerm(SampleUtils::SpecularStrategyBuilder::buildMagnetic(rm)) { } diff --git a/Core/Term/SpecularTerm.h b/Core/Term/SpecularTerm.h index 2418ee23c33..31b24bd3680 100644 --- a/Core/Term/SpecularTerm.h +++ b/Core/Term/SpecularTerm.h @@ -22,11 +22,11 @@ #include "Core/Term/ITerm.h" #include "Resample/Specular/ISpecularStrategy.h" +#include "Sample/Multilayer/RoughnessModels.h" #include <memory> #include <vector> class MatrixFlux_v2; -class MultiLayer; class SpecularElement; class SliceStack; @@ -52,7 +52,7 @@ protected: class SpecularScalarTerm : public ISpecularTerm { public: - SpecularScalarTerm(const MultiLayer& multilayer); + SpecularScalarTerm(const RoughnessModel& rm); private: void eval(SpecularElement& ele, const SliceStack& slices) const override; @@ -63,7 +63,7 @@ private: class SpecularMatrixTerm : public ISpecularTerm { public: - SpecularMatrixTerm(const MultiLayer& multilayer); + SpecularMatrixTerm(const RoughnessModel& rm); private: void eval(SpecularElement& ele, const SliceStack& slices) const override; diff --git a/GUI/Models/BeamAngleItems.cpp b/GUI/Models/BeamAngleItems.cpp index d0757d78684..61ebcf07d94 100644 --- a/GUI/Models/BeamAngleItems.cpp +++ b/GUI/Models/BeamAngleItems.cpp @@ -21,8 +21,7 @@ BeamAzimuthalAngleItem::BeamAzimuthalAngleItem() : BeamDistributionItem(M_TYPE, { register_distribution_group("Distribution extended group"); - SessionItem* valueItem = - dynamic_cast<SymmetricDistributionItem*>(distribution())->meanItem(); + SessionItem* valueItem = dynamic_cast<SymmetricDistributionItem*>(distribution())->meanItem(); valueItem->setLimits(RealLimits::limited(-90.0, 90.0)); valueItem->setDecimals(3); valueItem->setValue(0.0); @@ -50,8 +49,7 @@ BeamInclinationAngleItem::BeamInclinationAngleItem() : BeamDistributionItem(M_TY { register_distribution_group("Distribution extended group"); - SessionItem* valueItem = - dynamic_cast<SymmetricDistributionItem*>(distribution())->meanItem(); + SessionItem* valueItem = dynamic_cast<SymmetricDistributionItem*>(distribution())->meanItem(); valueItem->setLimits(RealLimits::limited(0.0, 90.0)); valueItem->setDecimals(3); valueItem->setValue(0.2); diff --git a/GUI/Models/BeamWavelengthItem.cpp b/GUI/Models/BeamWavelengthItem.cpp index 7ef30914f93..5a378d858c0 100644 --- a/GUI/Models/BeamWavelengthItem.cpp +++ b/GUI/Models/BeamWavelengthItem.cpp @@ -36,8 +36,7 @@ BeamWavelengthItem::BeamWavelengthItem(const QString& model_type, const QString& { register_distribution_group(distribution_group); - SessionItem* valueItem = - dynamic_cast<SymmetricDistributionItem*>(distribution())->meanItem(); + SessionItem* valueItem = dynamic_cast<SymmetricDistributionItem*>(distribution())->meanItem(); valueItem->setLimits(RealLimits::positive()); valueItem->setDecimals(4); valueItem->setValue(default_wl); @@ -57,8 +56,7 @@ SpecularBeamWavelengthItem::SpecularBeamWavelengthItem() void SpecularBeamWavelengthItem::setToRange(const RealLimits& limits) { - SessionItem* valueItem = - dynamic_cast<SymmetricDistributionItem*>(distribution())->meanItem(); + SessionItem* valueItem = dynamic_cast<SymmetricDistributionItem*>(distribution())->meanItem(); if (!limits.isInRange(wavelength())) { const double new_value = limits.isLimited() ? (limits.upperLimit() - limits.lowerLimit()) / 2. : default_wl; diff --git a/GUI/Models/TransformToDomain.cpp b/GUI/Models/TransformToDomain.cpp index 0f19688b296..7838b6dac73 100644 --- a/GUI/Models/TransformToDomain.cpp +++ b/GUI/Models/TransformToDomain.cpp @@ -232,8 +232,7 @@ std::unique_ptr<ScanResolution> createScanResolution(const SessionItem* item) if (!beam_item) return nullptr; - auto distr_item = - dynamic_cast<const SymmetricDistributionItem*>(beam_item->distribution()); + auto distr_item = dynamic_cast<const SymmetricDistributionItem*>(beam_item->distribution()); if (!distr_item) return nullptr; diff --git a/Resample/Processed/ProcessedSample.cpp b/Resample/Processed/ProcessedSample.cpp index ed770ef27cb..5bc38cb24e6 100644 --- a/Resample/Processed/ProcessedSample.cpp +++ b/Resample/Processed/ProcessedSample.cpp @@ -210,9 +210,11 @@ std::unique_ptr<IFresnelMap> fresnelify(const MultiLayer& sample, const SliceSta if (slices.containsMagneticMaterial()) return std::make_unique<MatrixFresnelMap>( - fresnelStack, SampleUtils::SpecularStrategyBuilder::buildMagnetic(sample), useCache); + fresnelStack, + SampleUtils::SpecularStrategyBuilder::buildMagnetic(sample.roughnessModel()), useCache); return std::make_unique<ScalarFresnelMap>( - fresnelStack, SampleUtils::SpecularStrategyBuilder::buildScalar(sample), useCache); + fresnelStack, SampleUtils::SpecularStrategyBuilder::buildScalar(sample.roughnessModel()), + useCache); } } // namespace @@ -224,7 +226,8 @@ std::unique_ptr<IFresnelMap> fresnelify(const MultiLayer& sample, const SliceSta ProcessedSample::ProcessedSample(const MultiLayer& sample, const SimulationOptions& options, bool forcePolarized) - : m_polarized{forcePolarized || sample.isMagnetic()} + : m_roughness_model(sample.roughnessModel()) + , m_polarized{forcePolarized || sample.isMagnetic()} , m_crossCorrLength{sample.crossCorrLength()} , m_ext_field{sample.externalField()} , m_slices{slicify(sample, options).setBField(sample.externalField())} diff --git a/Resample/Processed/ProcessedSample.h b/Resample/Processed/ProcessedSample.h index b924e1f51b4..5119a60d667 100644 --- a/Resample/Processed/ProcessedSample.h +++ b/Resample/Processed/ProcessedSample.h @@ -22,6 +22,7 @@ #include "Base/Vector/Vectors3D.h" #include "Resample/Slice/SliceStack.h" +#include "Sample/Multilayer/RoughnessModels.h" #include <memory> #include <vector> @@ -55,11 +56,13 @@ public: bool containsMagneticMaterial() const; bool polarizing() const; //!< Contains magnetic material, or nonzero magnetic field bool hasRoughness() const; + const RoughnessModel& roughnessModel() const { return m_roughness_model; } //! Fourier transform of the correlation function of roughnesses between the interfaces double crossCorrSpectralFun(const kvector_t kvec, size_t j, size_t k) const; private: + const RoughnessModel m_roughness_model; const bool m_polarized; const double m_crossCorrLength; const kvector_t m_ext_field; diff --git a/Resample/Specular/SpecularStrategyBuilder.cpp b/Resample/Specular/SpecularStrategyBuilder.cpp index 110a0dca0d6..7c95e0d42c9 100644 --- a/Resample/Specular/SpecularStrategyBuilder.cpp +++ b/Resample/Specular/SpecularStrategyBuilder.cpp @@ -17,12 +17,11 @@ #include "Resample/Specular/SpecularMagneticTanhStrategy.h" #include "Resample/Specular/SpecularScalarNCStrategy.h" #include "Resample/Specular/SpecularScalarTanhStrategy.h" -#include "Sample/Multilayer/MultiLayer.h" std::unique_ptr<SpecularScalarStrategy> -SampleUtils::SpecularStrategyBuilder::buildScalar(const MultiLayer& sample) +SampleUtils::SpecularStrategyBuilder::buildScalar(const RoughnessModel& rm) { - const RoughnessModel roughnessModel = sample.roughnessModel(); + const RoughnessModel& roughnessModel = rm; if (roughnessModel == RoughnessModel::TANH || roughnessModel == RoughnessModel::DEFAULT) return std::make_unique<SpecularScalarTanhStrategy>(); @@ -34,9 +33,9 @@ SampleUtils::SpecularStrategyBuilder::buildScalar(const MultiLayer& sample) } std::unique_ptr<SpecularMagneticStrategy> -SampleUtils::SpecularStrategyBuilder::buildMagnetic(const MultiLayer& sample) +SampleUtils::SpecularStrategyBuilder::buildMagnetic(const RoughnessModel& rm) { - const RoughnessModel roughnessModel = sample.roughnessModel(); + const RoughnessModel& roughnessModel = rm; if (roughnessModel == RoughnessModel::TANH || roughnessModel == RoughnessModel::DEFAULT) return std::make_unique<SpecularMagneticTanhStrategy>(); diff --git a/Resample/Specular/SpecularStrategyBuilder.h b/Resample/Specular/SpecularStrategyBuilder.h index 12e151eeb25..4a90761bc34 100644 --- a/Resample/Specular/SpecularStrategyBuilder.h +++ b/Resample/Specular/SpecularStrategyBuilder.h @@ -22,14 +22,13 @@ #include "Resample/Specular/SpecularMagneticStrategy.h" #include "Resample/Specular/SpecularScalarStrategy.h" +#include "Sample/Multilayer/RoughnessModels.h" #include <memory> -class MultiLayer; - namespace SampleUtils::SpecularStrategyBuilder { -std::unique_ptr<SpecularScalarStrategy> buildScalar(const MultiLayer& sample); -std::unique_ptr<SpecularMagneticStrategy> buildMagnetic(const MultiLayer& sample); +std::unique_ptr<SpecularScalarStrategy> buildScalar(const RoughnessModel& rm); +std::unique_ptr<SpecularMagneticStrategy> buildMagnetic(const RoughnessModel& rm); } // namespace SampleUtils::SpecularStrategyBuilder diff --git a/auto/Wrap/doxygenCore.i b/auto/Wrap/doxygenCore.i index ba00c090486..6b2e2391671 100644 --- a/auto/Wrap/doxygenCore.i +++ b/auto/Wrap/doxygenCore.i @@ -2081,7 +2081,7 @@ Computes the specular scattering for a magnetic sample Used by SpecularComputat C++ includes: SpecularTerm.h "; -%feature("docstring") SpecularMatrixTerm::SpecularMatrixTerm "SpecularMatrixTerm::SpecularMatrixTerm(const MultiLayer &multilayer) +%feature("docstring") SpecularMatrixTerm::SpecularMatrixTerm "SpecularMatrixTerm::SpecularMatrixTerm(const RoughnessModel &rm) "; @@ -2093,7 +2093,7 @@ Computes the specular scattering for a scalar sample Used by SpecularComputatio C++ includes: SpecularTerm.h "; -%feature("docstring") SpecularScalarTerm::SpecularScalarTerm "SpecularScalarTerm::SpecularScalarTerm(const MultiLayer &multilayer) +%feature("docstring") SpecularScalarTerm::SpecularScalarTerm "SpecularScalarTerm::SpecularScalarTerm(const RoughnessModel &rm) "; diff --git a/auto/Wrap/doxygenResample.i b/auto/Wrap/doxygenResample.i index 0b64dfda034..9ce92aff303 100644 --- a/auto/Wrap/doxygenResample.i +++ b/auto/Wrap/doxygenResample.i @@ -530,6 +530,9 @@ Contains magnetic material, or nonzero magnetic field. %feature("docstring") ProcessedSample::hasRoughness "bool ProcessedSample::hasRoughness() const "; +%feature("docstring") ProcessedSample::roughnessModel "const RoughnessModel& ProcessedSample::roughnessModel() const +"; + %feature("docstring") ProcessedSample::crossCorrSpectralFun "double ProcessedSample::crossCorrSpectralFun(const kvector_t kvec, size_t j, size_t k) const Fourier transform of the correlation function of roughnesses between the interfaces. @@ -969,10 +972,10 @@ Calculate z-admixtures occupied by particles. // File: namespaceSampleUtils_1_1SpecularStrategyBuilder.xml -%feature("docstring") SampleUtils::SpecularStrategyBuilder::buildScalar "std::unique_ptr< SpecularScalarStrategy > SampleUtils::SpecularStrategyBuilder::buildScalar(const MultiLayer &sample) +%feature("docstring") SampleUtils::SpecularStrategyBuilder::buildScalar "std::unique_ptr< SpecularScalarStrategy > SampleUtils::SpecularStrategyBuilder::buildScalar(const RoughnessModel &rm) "; -%feature("docstring") SampleUtils::SpecularStrategyBuilder::buildMagnetic "std::unique_ptr< SpecularMagneticStrategy > SampleUtils::SpecularStrategyBuilder::buildMagnetic(const MultiLayer &sample) +%feature("docstring") SampleUtils::SpecularStrategyBuilder::buildMagnetic "std::unique_ptr< SpecularMagneticStrategy > SampleUtils::SpecularStrategyBuilder::buildMagnetic(const RoughnessModel &rm) "; -- GitLab