diff --git a/Core/Computation/DWBAComputation.cpp b/Core/Computation/DWBAComputation.cpp index ac38916a9420654d78e190334970045a4ead673c..5680edfeb473833a66afcdbf1c71bc560f1efb0a 100644 --- a/Core/Computation/DWBAComputation.cpp +++ b/Core/Computation/DWBAComputation.cpp @@ -14,14 +14,31 @@ #include "Core/Computation/DWBAComputation.h" #include "Base/Pixel/DiffuseElement.h" +#include "Base/Progress/DelayedProgressCounter.h" #include "Base/Progress/ProgressHandler.h" -#include "Core/Term/DWBATerm.h" +#include "Core/Contrib/GISASSpecularContribution.h" +#include "Core/Contrib/ParticleLayoutContribution.h" +#include "Core/Contrib/RoughMultiLayerContribution.h" +#include "Resample/Options/SimulationOptions.h" +#include "Resample/Processed/ProcessedLayout.h" #include "Resample/Processed/ProcessedSample.h" -static_assert(std::is_copy_constructible<DWBAComputation>::value == false, - "DWBAComputation should not be copy constructable"); -static_assert(std::is_copy_assignable<DWBAComputation>::value == false, - "DWBAComputation should not be copy assignable"); +namespace { + +std::vector<std::unique_ptr<const ParticleLayoutContribution>> +makeLayoutComputation(const std::vector<ProcessedLayout>& layouts, const SimulationOptions& options, + bool polarized) +{ + std::vector<std::unique_ptr<const ParticleLayoutContribution>> result; + + for (const ProcessedLayout& layout : layouts) + result.emplace_back(new ParticleLayoutContribution(layout, options, polarized)); + + return result; +} + +} // namespace + DWBAComputation::DWBAComputation(std::unique_ptr<const ProcessedSample>&& re_sample, const SimulationOptions& options, ProgressHandler& progress, @@ -30,7 +47,14 @@ DWBAComputation::DWBAComputation(std::unique_ptr<const ProcessedSample>&& re_sam : IComputation(std::move(re_sample), options, progress) , m_begin_it(begin_it) , m_end_it(end_it) - , m_term(std::make_unique<DWBATerm>(*m_re_sample, options)) + , m_fresnel_map(m_re_sample->fresnelMap()) + , m_specular_contrib(options.includeSpecular() ? new GISASSpecularContribution() : nullptr) + , m_roughness_contrib(m_re_sample->hasRoughness() + ? new RoughMultiLayerContribution(*m_re_sample) + : nullptr) + , m_layout_contribs( + makeLayoutComputation(m_re_sample->layouts(), options, + m_re_sample->containsMagneticMaterial())) { } @@ -43,12 +67,22 @@ DWBAComputation::~DWBAComputation() = default; // This allows them to be added and normalized together to the beam afterwards void DWBAComputation::runProtected() { - if (!m_progress->alive()) - return; - m_term->setProgressHandler(m_progress); for (auto it = m_begin_it; it != m_end_it; ++it) { if (!m_progress->alive()) break; - m_term->computeTerm(*it); + DiffuseElement& ele = *it; + + ele.setFresnelMap(m_fresnel_map); + + for (auto& contrib : m_layout_contribs) + contrib->compute(ele); + + if (m_roughness_contrib) + m_roughness_contrib->compute(ele); + + if (m_specular_contrib) + m_specular_contrib->compute(ele); + + stepProgress(); } } diff --git a/Core/Computation/DWBAComputation.h b/Core/Computation/DWBAComputation.h index b5fc4f55d5ef7991e6df2528c0f70c159a673459..bd8580a60859e5720988cf47d2bd430ed97ef0a5 100644 --- a/Core/Computation/DWBAComputation.h +++ b/Core/Computation/DWBAComputation.h @@ -24,8 +24,13 @@ #include <memory> #include <vector> -class DWBATerm; class DiffuseElement; +class GISASSpecularContribution; +class IFresnelMap; +class ParticleLayoutContribution; +class ProcessedSample; +class RoughMultiLayerContribution; +class SimulationOptions; //! Provides function that performs a single-threaded DWBA computation //! for a range of DiffuseElement%s. @@ -49,7 +54,10 @@ private: void runProtected() override; std::vector<DiffuseElement>::iterator m_begin_it, m_end_it; - const std::unique_ptr<DWBATerm> m_term; + const IFresnelMap* const m_fresnel_map; + const std::unique_ptr<const GISASSpecularContribution> m_specular_contrib; + const std::unique_ptr<const RoughMultiLayerContribution> m_roughness_contrib; + const std::vector<std::unique_ptr<const ParticleLayoutContribution>> m_layout_contribs; }; #endif // BORNAGAIN_CORE_COMPUTATION_DWBACOMPUTATION_H diff --git a/Core/Computation/DepthProbeComputation.cpp b/Core/Computation/DepthProbeComputation.cpp index e081847dfa27b8ebd8eb6c42688202bb5a52b546..485b6de88e4712b241c5e4afc2d91742652a56ac 100644 --- a/Core/Computation/DepthProbeComputation.cpp +++ b/Core/Computation/DepthProbeComputation.cpp @@ -13,16 +13,13 @@ // ************************************************************************************************ #include "Core/Computation/DepthProbeComputation.h" +#include "Base/Axis/IAxis.h" #include "Base/Progress/ProgressHandler.h" #include "Core/Element/DepthProbeElement.h" -#include "Core/Term/DepthProbeTerm.h" +#include "Resample/Flux/IFlux.h" +#include "Resample/Fresnel/IFresnelMap.h" #include "Resample/Processed/ProcessedSample.h" -static_assert(std::is_copy_constructible<DepthProbeComputation>::value == false, - "DepthProbeComputation should not be copy constructible"); -static_assert(std::is_copy_assignable<DepthProbeComputation>::value == false, - "DepthProbeComputation should not be copy assignable"); - DepthProbeComputation::DepthProbeComputation(std::unique_ptr<const ProcessedSample>&& re_sample, const SimulationOptions& options, ProgressHandler& progress, @@ -31,7 +28,6 @@ DepthProbeComputation::DepthProbeComputation(std::unique_ptr<const ProcessedSamp : IComputation(std::move(re_sample), options, progress) , m_begin_it(begin_it) , m_end_it(end_it) - , m_term(std::make_unique<DepthProbeTerm>(*m_re_sample)) { } @@ -39,9 +35,43 @@ DepthProbeComputation::~DepthProbeComputation() = default; void DepthProbeComputation::runProtected() { - if (!m_progress->alive()) - return; - m_term->setProgressHandler(m_progress); - for (auto it = m_begin_it; it != m_end_it; ++it) - m_term->computeTerm(*it); + for (auto it = m_begin_it; it != m_end_it; ++it) { + DepthProbeElement& ele = *it; + if (!ele.isCalculated()) + continue; + + const IAxis& z_positions = *ele.getZPositions(); + const size_t n_z = z_positions.size(); + const size_t n_layers = m_re_sample->numberOfSlices(); + size_t start_z_ind = n_z; + std::valarray<double> intensities(0.0, n_z); + + double z_layer_bottom(0.0); + double z_layer_top(0.0); + for (size_t i_layer = 0; i_layer < n_layers && start_z_ind != 0; ++i_layer) { + z_layer_bottom = m_re_sample->sliceBottomZ(i_layer); + z_layer_top = i_layer ? m_re_sample->sliceTopZ(i_layer) : 0; + + // get R & T coefficients for current layer + const auto flux = m_re_sample->fresnelMap()->getInFlux(ele.getKi(), i_layer); + const complex_t R = flux->getScalarR(); + const complex_t T = flux->getScalarT(); + const complex_t kz_out = flux->getScalarKz(); + const complex_t kz_in = -kz_out; + + // Compute intensity for z's of the layer + size_t ip1_z = start_z_ind; + for (; ip1_z > 0; --ip1_z) { + const size_t i_z = ip1_z - 1; + if (i_layer + 1 != n_layers && z_positions[i_z] <= z_layer_bottom) + break; + const double z = z_positions[i_z] - z_layer_top; + intensities[i_z] = std::norm(R * exp_I(kz_out * z) + T * exp_I(kz_in * z)); + } + start_z_ind = ip1_z; + } + ele.setIntensities(std::move(intensities)); + + stepProgress(); + } } diff --git a/Core/Computation/DepthProbeComputation.h b/Core/Computation/DepthProbeComputation.h index 253606a491e39cf5ba97fd434280c9d2b856ba7c..8a234494c5b8e875ed27139a546e7e2b07ba3600 100644 --- a/Core/Computation/DepthProbeComputation.h +++ b/Core/Computation/DepthProbeComputation.h @@ -23,7 +23,6 @@ #include "Core/Computation/IComputation.h" class DepthProbeElement; -class DepthProbeTerm; class ProcessedSample; //! Performs a single-threaded depth probe computation with given sample. @@ -43,7 +42,6 @@ private: void runProtected() override; DepthProbeElementIter m_begin_it, m_end_it; - std::unique_ptr<DepthProbeTerm> m_term; }; #endif // BORNAGAIN_CORE_COMPUTATION_DEPTHPROBECOMPUTATION_H diff --git a/Core/Computation/IComputation.cpp b/Core/Computation/IComputation.cpp index f29004c982dfc2587eb8ce3752e24bc9b9b7efe0..76f093650ce11be222ff78f34675382e6ba4af61 100644 --- a/Core/Computation/IComputation.cpp +++ b/Core/Computation/IComputation.cpp @@ -13,6 +13,7 @@ // ************************************************************************************************ #include "Core/Computation/IComputation.h" +#include "Base/Progress/DelayedProgressCounter.h" #include "Base/Progress/ProgressHandler.h" #include "Resample/Processed/ProcessedSample.h" @@ -24,11 +25,27 @@ IComputation::IComputation(std::unique_ptr<const ProcessedSample>&& re_sample, IComputation::~IComputation() = default; +void IComputation::setProgressHandler(ProgressHandler* progress) const +{ + m_progress_counter = std::make_unique<DelayedProgressCounter>(progress, 100); +} + +void IComputation::stepProgress() const +{ + if (m_progress_counter) + m_progress_counter->stepProgress(); +} + void IComputation::run() noexcept { m_status.setRunning(); try { - runProtected(); + if (!m_progress->alive()) + return; + setProgressHandler(m_progress); + + runProtected(); // <--- here the main work is done + m_status.setCompleted(); } catch (const std::exception& ex) { m_status.setFailed(ex.what()); diff --git a/Core/Computation/IComputation.h b/Core/Computation/IComputation.h index 28fdecffc2ef25a1588a1fbad879877cdcd551ec..84e04a4a8128200d6b9adb13f72d27b17efc5223 100644 --- a/Core/Computation/IComputation.h +++ b/Core/Computation/IComputation.h @@ -24,6 +24,7 @@ #include <memory> #include <vector> +class DelayedProgressCounter; class MultiLayer; class ProcessedSample; class ProgressHandler; @@ -47,6 +48,9 @@ public: std::string errorMessage() const { return m_status.errorMessage(); } protected: + void setProgressHandler(ProgressHandler* progress) const; + void stepProgress() const; + const std::unique_ptr<const ProcessedSample> m_re_sample; const SimulationOptions& m_options; ProgressHandler* m_progress; @@ -55,6 +59,8 @@ protected: private: //! Runs computation. May throw. To be called from run(), which catches exceptions. virtual void runProtected() = 0; + + mutable std::unique_ptr<DelayedProgressCounter> m_progress_counter; }; #endif // BORNAGAIN_CORE_COMPUTATION_ICOMPUTATION_H diff --git a/Core/Computation/SpecularComputation.cpp b/Core/Computation/SpecularComputation.cpp index a9a8f5bc64d43e8e8763be0905d485d9fd6d75c5..7804e0ddfe89d00512fa113d9aa1a823456698f3 100644 --- a/Core/Computation/SpecularComputation.cpp +++ b/Core/Computation/SpecularComputation.cpp @@ -15,14 +15,25 @@ #include "Core/Computation/SpecularComputation.h" #include "Base/Progress/ProgressHandler.h" #include "Core/Element/SpecularElement.h" -#include "Core/Term/SpecularTerm.h" +#include "Resample/Flux/IFlux.h" #include "Resample/Processed/ProcessedSample.h" +#include "Resample/Specular/ISpecularStrategy.h" +#include "Resample/Specular/SpecularStrategyBuilder.h" #include "Sample/Multilayer/MultiLayer.h" -static_assert(std::is_copy_constructible<SpecularComputation>::value == false, - "SpecularComputation should not be copy constructible"); -static_assert(std::is_copy_assignable<SpecularComputation>::value == false, - "SpecularComputation should not be copy assignable"); +namespace { + +std::unique_ptr<ISpecularStrategy>sample2strategy(const ProcessedSample& re_sample) +{ + if (re_sample.polarizing()) + return SampleUtils::SpecularStrategyBuilder::buildMagnetic( + re_sample.sample().roughnessModel()); + return SampleUtils::SpecularStrategyBuilder::buildScalar( + re_sample.sample().roughnessModel()); +} + +} // namespace + SpecularComputation::SpecularComputation(std::unique_ptr<const ProcessedSample>&& re_sample, const SimulationOptions& options, @@ -31,9 +42,7 @@ SpecularComputation::SpecularComputation(std::unique_ptr<const ProcessedSample>& : IComputation(std::move(re_sample), options, progress) , m_begin_it(begin_it) , m_end_it(end_it) - , m_term(m_re_sample->polarizing() - ? (ISpecularTerm*)new SpecularMatrixTerm(m_re_sample->sample().roughnessModel()) - : (ISpecularTerm*)new SpecularScalarTerm(m_re_sample->sample().roughnessModel())) + , m_strategy(sample2strategy(*m_re_sample)) { } @@ -41,11 +50,29 @@ SpecularComputation::~SpecularComputation() = default; void SpecularComputation::runProtected() { - if (!m_progress->alive()) - return; - - m_term->setProgressHandler(m_progress); auto& slices = m_re_sample->averageSlices(); - for (auto it = m_begin_it; it != m_end_it; ++it) - m_term->computeTerm(*it, slices); + for (auto it = m_begin_it; it != m_end_it; ++it) { + SpecularElement& ele = *it; + if (!ele.isCalculated()) + continue; + if (m_re_sample->polarizing()) { + const auto R = + std::get<Eigen::Matrix2cd>( + m_strategy->computeTopLayerR(slices, ele.produceKz(slices))); + + const auto& polarization = ele.polarizationHandler().getPolarization(); + const auto& analyzer = ele.polarizationHandler().getAnalyzerOperator(); + + const complex_t trace = (polarization * R.adjoint() * analyzer * R).trace(); + + ele.setIntensity(std::abs(trace)); + + } else { + const auto R = std::get<complex_t>( + m_strategy->computeTopLayerR(slices, ele.produceKz(slices))); + ele.setIntensity(std::norm(R)); + } + + stepProgress(); + } } diff --git a/Core/Computation/SpecularComputation.h b/Core/Computation/SpecularComputation.h index 7abb64dd4bee08235545f766dbdb591daf741d1a..32089000c0d304d8bfa7ea9ed8a36976a6e34328 100644 --- a/Core/Computation/SpecularComputation.h +++ b/Core/Computation/SpecularComputation.h @@ -21,8 +21,9 @@ #define BORNAGAIN_CORE_COMPUTATION_SPECULARCOMPUTATION_H #include "Core/Computation/IComputation.h" +#include <memory> -class ISpecularTerm; +class ISpecularStrategy; class SpecularElement; //! Performs a single-threaded specular computation with given sample. @@ -43,7 +44,7 @@ private: //! these iterators define the span of detector bins this simulation will work on const SpecularElementIter m_begin_it, m_end_it; - const std::unique_ptr<ISpecularTerm> m_term; + const std::unique_ptr<ISpecularStrategy> m_strategy; }; #endif // BORNAGAIN_CORE_COMPUTATION_SPECULARCOMPUTATION_H diff --git a/Core/Term/GISASSpecularContribution.cpp b/Core/Contrib/GISASSpecularContribution.cpp similarity index 92% rename from Core/Term/GISASSpecularContribution.cpp rename to Core/Contrib/GISASSpecularContribution.cpp index 037a1e761572f4587f21d7ffb0de9f934ff826b3..86c3e77ab7ab4b81fc3dba5acfc4f9890f4d9d24 100644 --- a/Core/Term/GISASSpecularContribution.cpp +++ b/Core/Contrib/GISASSpecularContribution.cpp @@ -2,7 +2,7 @@ // // BornAgain: simulate and fit reflection and scattering // -//! @file Core/Term/GISASSpecularContribution.cpp +//! @file Core/Contrib/GISASSpecularContribution.cpp //! @brief Implements class GISASSpecularContribution. //! //! @homepage http://www.bornagainproject.org @@ -12,7 +12,7 @@ // // ************************************************************************************************ -#include "Core/Term/GISASSpecularContribution.h" +#include "Core/Contrib/GISASSpecularContribution.h" #include "Base/Pixel/DiffuseElement.h" #include "Base/Utils/Assert.h" #include "Resample/Flux/IFlux.h" diff --git a/Core/Term/GISASSpecularContribution.h b/Core/Contrib/GISASSpecularContribution.h similarity index 79% rename from Core/Term/GISASSpecularContribution.h rename to Core/Contrib/GISASSpecularContribution.h index 4208a0338777003c2f1bc06fb3e8128198f80b6c..2b10d708f26af02683705115a9e9d562170c5c63 100644 --- a/Core/Term/GISASSpecularContribution.h +++ b/Core/Contrib/GISASSpecularContribution.h @@ -2,7 +2,7 @@ // // BornAgain: simulate and fit reflection and scattering // -//! @file Core/Term/GISASSpecularContribution.h +//! @file Core/Contrib/GISASSpecularContribution.h //! @brief Defines class GISASSpecularContribution. //! //! @homepage http://www.bornagainproject.org @@ -17,8 +17,8 @@ #endif #ifndef USER_API -#ifndef BORNAGAIN_CORE_TERM_GISASSPECULARCONTRIBUTION_H -#define BORNAGAIN_CORE_TERM_GISASSPECULARCONTRIBUTION_H +#ifndef BORNAGAIN_CORE_CONTRIB_GISASSPECULARCONTRIBUTION_H +#define BORNAGAIN_CORE_CONTRIB_GISASSPECULARCONTRIBUTION_H class IFresnelMap; class DiffuseElement; @@ -32,5 +32,5 @@ public: void compute(DiffuseElement& ele) const; }; -#endif // BORNAGAIN_CORE_TERM_GISASSPECULARCONTRIBUTION_H +#endif // BORNAGAIN_CORE_CONTRIB_GISASSPECULARCONTRIBUTION_H #endif // USER_API diff --git a/Core/Term/ParticleLayoutContribution.cpp b/Core/Contrib/ParticleLayoutContribution.cpp similarity index 95% rename from Core/Term/ParticleLayoutContribution.cpp rename to Core/Contrib/ParticleLayoutContribution.cpp index d04602a16b975555e92515db7f0be713e9f82400..aa7dee75dab457b3186cf42a2db04ac8338831f4 100644 --- a/Core/Term/ParticleLayoutContribution.cpp +++ b/Core/Contrib/ParticleLayoutContribution.cpp @@ -2,7 +2,7 @@ // // BornAgain: simulate and fit reflection and scattering // -//! @file Core/Term/ParticleLayoutContribution.cpp +//! @file Core/Contrib/ParticleLayoutContribution.cpp //! @brief Implements class ParticleLayoutContribution. //! //! @homepage http://www.bornagainproject.org @@ -12,7 +12,7 @@ // // ************************************************************************************************ -#include "Core/Term/ParticleLayoutContribution.h" +#include "Core/Contrib/ParticleLayoutContribution.h" #include "Base/Pixel/DiffuseElement.h" #include "Resample/Interparticle/DecouplingApproximationStrategy.h" #include "Resample/Interparticle/SSCAStrategy.h" diff --git a/Core/Term/ParticleLayoutContribution.h b/Core/Contrib/ParticleLayoutContribution.h similarity index 84% rename from Core/Term/ParticleLayoutContribution.h rename to Core/Contrib/ParticleLayoutContribution.h index 39b3cafc7e824c7c2e59fc20b7d24e76dc7a50f0..3132ad1e0f6f773e2cf2954d1f70d8c94cb8e0d1 100644 --- a/Core/Term/ParticleLayoutContribution.h +++ b/Core/Contrib/ParticleLayoutContribution.h @@ -2,7 +2,7 @@ // // BornAgain: simulate and fit reflection and scattering // -//! @file Core/Term/ParticleLayoutContribution.h +//! @file Core/Contrib/ParticleLayoutContribution.h //! @brief Defines class ParticleLayoutContribution. //! //! @homepage http://www.bornagainproject.org @@ -17,8 +17,8 @@ #endif #ifndef USER_API -#ifndef BORNAGAIN_CORE_TERM_PARTICLELAYOUTCONTRIBUTION_H -#define BORNAGAIN_CORE_TERM_PARTICLELAYOUTCONTRIBUTION_H +#ifndef BORNAGAIN_CORE_CONTRIB_PARTICLELAYOUTCONTRIBUTION_H +#define BORNAGAIN_CORE_CONTRIB_PARTICLELAYOUTCONTRIBUTION_H #include <memory> @@ -43,5 +43,5 @@ private: const std::unique_ptr<const IInterparticleStrategy> m_interparticle_strategy; }; -#endif // BORNAGAIN_CORE_TERM_PARTICLELAYOUTCONTRIBUTION_H +#endif // BORNAGAIN_CORE_CONTRIB_PARTICLELAYOUTCONTRIBUTION_H #endif // USER_API diff --git a/Core/Term/RoughMultiLayerContribution.cpp b/Core/Contrib/RoughMultiLayerContribution.cpp similarity index 98% rename from Core/Term/RoughMultiLayerContribution.cpp rename to Core/Contrib/RoughMultiLayerContribution.cpp index 2873d1d775f70101f068c87d55b35c58beca967d..2cede55ee054b178a73fc3a9157ea16982503cb1 100644 --- a/Core/Term/RoughMultiLayerContribution.cpp +++ b/Core/Contrib/RoughMultiLayerContribution.cpp @@ -2,7 +2,7 @@ // // BornAgain: simulate and fit reflection and scattering // -//! @file Core/Term/RoughMultiLayerContribution.cpp +//! @file Core/Contrib/RoughMultiLayerContribution.cpp //! @brief Implements class RoughMultiLayerContribution. //! //! @homepage http://www.bornagainproject.org @@ -12,7 +12,7 @@ // // ************************************************************************************************ -#include "Core/Term/RoughMultiLayerContribution.h" +#include "Core/Contrib/RoughMultiLayerContribution.h" #include "Base/Math/Constants.h" #include "Base/Pixel/DiffuseElement.h" #include "Resample/Flux/IFlux.h" diff --git a/Core/Term/RoughMultiLayerContribution.h b/Core/Contrib/RoughMultiLayerContribution.h similarity index 83% rename from Core/Term/RoughMultiLayerContribution.h rename to Core/Contrib/RoughMultiLayerContribution.h index 952c014d8236d447e55a2aad234e05b27be6b12c..a26edb13807eb78b0ecffac6a959f12295bd7544 100644 --- a/Core/Term/RoughMultiLayerContribution.h +++ b/Core/Contrib/RoughMultiLayerContribution.h @@ -2,7 +2,7 @@ // // BornAgain: simulate and fit reflection and scattering // -//! @file Core/Term/RoughMultiLayerContribution.h +//! @file Core/Contrib/RoughMultiLayerContribution.h //! @brief Defines class RoughMultiLayerContribution. //! //! @homepage http://www.bornagainproject.org @@ -17,8 +17,8 @@ #endif #ifndef USER_API -#ifndef BORNAGAIN_CORE_TERM_ROUGHMULTILAYERCONTRIBUTION_H -#define BORNAGAIN_CORE_TERM_ROUGHMULTILAYERCONTRIBUTION_H +#ifndef BORNAGAIN_CORE_CONTRIB_ROUGHMULTILAYERCONTRIBUTION_H +#define BORNAGAIN_CORE_CONTRIB_ROUGHMULTILAYERCONTRIBUTION_H #include "Base/Types/Complex.h" @@ -41,5 +41,5 @@ private: complex_t get_sum8terms(size_t ilayer, const DiffuseElement& sim_element) const; }; -#endif // BORNAGAIN_CORE_TERM_ROUGHMULTILAYERCONTRIBUTION_H +#endif // BORNAGAIN_CORE_CONTRIB_ROUGHMULTILAYERCONTRIBUTION_H #endif // USER_API diff --git a/Core/Term/DWBATerm.cpp b/Core/Term/DWBATerm.cpp deleted file mode 100644 index 46ce3b14bae00b92fd5778aaedc23e8ed4c06fd4..0000000000000000000000000000000000000000 --- a/Core/Term/DWBATerm.cpp +++ /dev/null @@ -1,68 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit reflection and scattering -// -//! @file Core/Term/DWBATerm.cpp -//! @brief Implements class DWBATerm. -//! -//! @homepage http://www.bornagainproject.org -//! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2018 -//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS) -// -// ************************************************************************************************ - -#include "Core/Term/DWBATerm.h" -#include "Base/Pixel/DiffuseElement.h" -#include "Base/Progress/DelayedProgressCounter.h" -#include "Core/Term/GISASSpecularContribution.h" -#include "Core/Term/ParticleLayoutContribution.h" -#include "Core/Term/RoughMultiLayerContribution.h" -#include "Resample/Options/SimulationOptions.h" -#include "Resample/Processed/ProcessedLayout.h" -#include "Resample/Processed/ProcessedSample.h" - -namespace { - -std::vector<std::unique_ptr<const ParticleLayoutContribution>> -makeLayoutComputation(const std::vector<ProcessedLayout>& layouts, const SimulationOptions& options, - bool polarized) -{ - std::vector<std::unique_ptr<const ParticleLayoutContribution>> result; - - for (const ProcessedLayout& layout : layouts) - result.emplace_back(new ParticleLayoutContribution(layout, options, polarized)); - - return result; -} - -} // namespace - - -DWBATerm::DWBATerm(const ProcessedSample& re_sample, const SimulationOptions& options) - : m_fresnel_map(re_sample.fresnelMap()) - , m_specular_contrib(options.includeSpecular() ? new GISASSpecularContribution() : nullptr) - , m_roughness_contrib(re_sample.hasRoughness() ? new RoughMultiLayerContribution(re_sample) - : nullptr) - , m_layout_contribs( - makeLayoutComputation(re_sample.layouts(), options, re_sample.containsMagneticMaterial())) -{ -} - -DWBATerm::~DWBATerm() = default; - -void DWBATerm::computeTerm(DiffuseElement& ele) const -{ - ele.setFresnelMap(m_fresnel_map); - - for (auto& contrib : m_layout_contribs) - contrib->compute(ele); - - if (m_roughness_contrib) - m_roughness_contrib->compute(ele); - - if (m_specular_contrib) - m_specular_contrib->compute(ele); - - stepProgress(); -} diff --git a/Core/Term/DWBATerm.h b/Core/Term/DWBATerm.h deleted file mode 100644 index f60806730f798bcb427a5e27c6ff9bd47931053b..0000000000000000000000000000000000000000 --- a/Core/Term/DWBATerm.h +++ /dev/null @@ -1,54 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit reflection and scattering -// -//! @file Core/Term/DWBATerm.h -//! @brief Defines class DWBATerm. -//! -//! @homepage http://www.bornagainproject.org -//! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2018 -//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS) -// -// ************************************************************************************************ - -#ifdef SWIG -#error no need to expose this header to Swig -#endif - -#ifndef USER_API -#ifndef BORNAGAIN_CORE_TERM_DWBATERM_H -#define BORNAGAIN_CORE_TERM_DWBATERM_H - -#include "Core/Term/ITerm.h" -#include <memory> -#include <vector> - -class GISASSpecularContribution; -class IFresnelMap; -class ParticleLayoutContribution; -class ProcessedSample; -class RoughMultiLayerContribution; -class DiffuseElement; -class SimulationOptions; - -//! Infrastructure for computing the scattering into given detector bin. -//! -//! Called by DWBASimulation for each detector bin. - -class DWBATerm : public ITerm { -public: - DWBATerm(const ProcessedSample&, const SimulationOptions&); - ~DWBATerm(); - - void computeTerm(DiffuseElement& ele) const; - -private: - const IFresnelMap* const m_fresnel_map; - const std::unique_ptr<const GISASSpecularContribution> m_specular_contrib; - const std::unique_ptr<const RoughMultiLayerContribution> m_roughness_contrib; - const std::vector<std::unique_ptr<const ParticleLayoutContribution>> m_layout_contribs; -}; - -#endif // BORNAGAIN_CORE_TERM_DWBATERM_H -#endif // USER_API diff --git a/Core/Term/DepthProbeTerm.cpp b/Core/Term/DepthProbeTerm.cpp deleted file mode 100644 index a64629425c5e61169bf21faaf152cdd0e2e8feda..0000000000000000000000000000000000000000 --- a/Core/Term/DepthProbeTerm.cpp +++ /dev/null @@ -1,62 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit reflection and scattering -// -//! @file Core/Term/DepthProbeTerm.cpp -//! @brief Implements functor DepthProbeTerm. -//! -//! @homepage http://www.bornagainproject.org -//! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2018 -//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS) -// -// ************************************************************************************************ - -#include "Core/Term/DepthProbeTerm.h" -#include "Base/Axis/IAxis.h" -#include "Core/Element/DepthProbeElement.h" -#include "Resample/Flux/IFlux.h" -#include "Resample/Fresnel/IFresnelMap.h" -#include "Resample/Processed/ProcessedSample.h" - -DepthProbeTerm::DepthProbeTerm(const ProcessedSample& re_sample) : m_re_sample{re_sample} {} - -DepthProbeTerm::~DepthProbeTerm() = default; - -void DepthProbeTerm::computeTerm(DepthProbeElement& ele) const -{ - if (ele.isCalculated()) { - const IAxis& z_positions = *ele.getZPositions(); - const size_t n_z = z_positions.size(); - const size_t n_layers = m_re_sample.numberOfSlices(); - size_t start_z_ind = n_z; - std::valarray<double> intensities(0.0, n_z); - - double z_layer_bottom(0.0); - double z_layer_top(0.0); - for (size_t i_layer = 0; i_layer < n_layers && start_z_ind != 0; ++i_layer) { - z_layer_bottom = m_re_sample.sliceBottomZ(i_layer); - z_layer_top = i_layer ? m_re_sample.sliceTopZ(i_layer) : 0; - - // get R & T coefficients for current layer - const auto flux = m_re_sample.fresnelMap()->getInFlux(ele.getKi(), i_layer); - const complex_t R = flux->getScalarR(); - const complex_t T = flux->getScalarT(); - const complex_t kz_out = flux->getScalarKz(); - const complex_t kz_in = -kz_out; - - // Compute intensity for z's of the layer - size_t ip1_z = start_z_ind; - for (; ip1_z > 0; --ip1_z) { - const size_t i_z = ip1_z - 1; - if (i_layer + 1 != n_layers && z_positions[i_z] <= z_layer_bottom) - break; - const double z = z_positions[i_z] - z_layer_top; - intensities[i_z] = std::norm(R * exp_I(kz_out * z) + T * exp_I(kz_in * z)); - } - start_z_ind = ip1_z; - } - ele.setIntensities(std::move(intensities)); - } - stepProgress(); -} diff --git a/Core/Term/DepthProbeTerm.h b/Core/Term/DepthProbeTerm.h deleted file mode 100644 index 4cf93344241119ef82d9a3f9576cdcc2333f5614..0000000000000000000000000000000000000000 --- a/Core/Term/DepthProbeTerm.h +++ /dev/null @@ -1,41 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit reflection and scattering -// -//! @file Core/Term/DepthProbeTerm.h -//! @brief Defines functor DepthProbeTerm. -//! -//! @homepage http://www.bornagainproject.org -//! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2018 -//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS) -// -// ************************************************************************************************ - -#ifdef SWIG -#error no need to expose this header to Swig -#endif - -#ifndef USER_API -#ifndef BORNAGAIN_CORE_TERM_DEPTHPROBETERM_H -#define BORNAGAIN_CORE_TERM_DEPTHPROBETERM_H - -#include "Core/Term/ITerm.h" -#include <memory> - -class ProcessedSample; -class DepthProbeElement; - -class DepthProbeTerm : public ITerm { -public: - DepthProbeTerm(const ProcessedSample& re_sample); - ~DepthProbeTerm(); - - void computeTerm(DepthProbeElement& ele) const; - -private: - const ProcessedSample& m_re_sample; -}; - -#endif // BORNAGAIN_CORE_TERM_DEPTHPROBETERM_H -#endif // USER_API diff --git a/Core/Term/ITerm.cpp b/Core/Term/ITerm.cpp deleted file mode 100644 index f4eff9c619e26b078d3166831e4633a198b12396..0000000000000000000000000000000000000000 --- a/Core/Term/ITerm.cpp +++ /dev/null @@ -1,31 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit reflection and scattering -// -//! @file Core/Term/ITerm.cpp -//! @brief Defines class ITerm. -//! -//! @homepage http://www.bornagainproject.org -//! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2018 -//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS) -// -// ************************************************************************************************ - -#include "Core/Term/ITerm.h" -#include "Base/Progress/DelayedProgressCounter.h" - -ITerm::ITerm() = default; - -ITerm::~ITerm() = default; - -void ITerm::setProgressHandler(ProgressHandler* progress) const -{ - m_progress_counter = std::make_unique<DelayedProgressCounter>(progress, 100); -} - -void ITerm::stepProgress() const -{ - if (m_progress_counter) - m_progress_counter->stepProgress(); -} diff --git a/Core/Term/ITerm.h b/Core/Term/ITerm.h deleted file mode 100644 index 0473cefe3269fed7f696fcffc43c07f6f3e26456..0000000000000000000000000000000000000000 --- a/Core/Term/ITerm.h +++ /dev/null @@ -1,49 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit reflection and scattering -// -//! @file Core/Term/ITerm.h -//! @brief Defines class ITerm. -//! -//! @homepage http://www.bornagainproject.org -//! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2018 -//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS) -// -// ************************************************************************************************ - -#ifdef SWIG -#error no need to expose this header to Swig -#endif - -#ifndef USER_API -#ifndef BORNAGAIN_CORE_TERM_ITERM_H -#define BORNAGAIN_CORE_TERM_ITERM_H - -#include <memory> - -class DelayedProgressCounter; -// class IFresnelMap; -class ProgressHandler; - -//! Infrastructure for computing the scattering into given detector bin. -//! -//! Called by DWBASimulation for each detector bin. - -class ITerm { -public: - void setProgressHandler(ProgressHandler* progress) const; - -protected: - ITerm(); - ITerm(const ITerm&) = delete; - virtual ~ITerm(); - - void stepProgress() const; - -private: - mutable std::unique_ptr<DelayedProgressCounter> m_progress_counter; -}; - -#endif // BORNAGAIN_CORE_TERM_ITERM_H -#endif // USER_API diff --git a/Core/Term/SpecularTerm.cpp b/Core/Term/SpecularTerm.cpp deleted file mode 100644 index bb5f83a912060d820aa688ead38263d2f7b52722..0000000000000000000000000000000000000000 --- a/Core/Term/SpecularTerm.cpp +++ /dev/null @@ -1,75 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit reflection and scattering -// -//! @file Core/Term/SpecularTerm.cpp -//! @brief Implements functor SpecularTerm. -//! -//! @homepage http://www.bornagainproject.org -//! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2018 -//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS) -// -// ************************************************************************************************ - -#include "Core/Term/SpecularTerm.h" -#include "Base/Progress/DelayedProgressCounter.h" -#include "Core/Element/SpecularElement.h" -#include "Resample/Flux/IFlux.h" -#include "Resample/Specular/SpecularStrategyBuilder.h" - -// ************************************************************************************************ -// class SpecularTerm -// ************************************************************************************************ - -ISpecularTerm::ISpecularTerm(std::unique_ptr<ISpecularStrategy> strategy) - : m_strategy(std::move(strategy)) -{ -} - -void ISpecularTerm::computeTerm(SpecularElement& ele, const SliceStack& slices) const -{ - if (!ele.isCalculated()) - return; - - eval(ele, slices); - - stepProgress(); -} - -// ************************************************************************************************ -// class SpecularScalarTerm -// ************************************************************************************************ - -SpecularScalarTerm::SpecularScalarTerm(const RoughnessModel& rm) - : ISpecularTerm(SampleUtils::SpecularStrategyBuilder::buildScalar(rm)) -{ -} - -void SpecularScalarTerm::eval(SpecularElement& ele, const SliceStack& slices) const -{ - const auto R = std::get<complex_t>(m_strategy->computeTopLayerR(slices, ele.produceKz(slices))); - ele.setIntensity(std::norm(R)); -} - -// ************************************************************************************************ -// class SpecularMatrixTerm -// ************************************************************************************************ - -SpecularMatrixTerm::SpecularMatrixTerm(const RoughnessModel& rm) - : ISpecularTerm(SampleUtils::SpecularStrategyBuilder::buildMagnetic(rm)) -{ -} - -void SpecularMatrixTerm::eval(SpecularElement& ele, const SliceStack& slices) const -{ - const auto R = - std::get<Eigen::Matrix2cd>(m_strategy->computeTopLayerR(slices, ele.produceKz(slices))); - - const auto& polarization = ele.polarizationHandler().getPolarization(); - const auto& analyzer = ele.polarizationHandler().getAnalyzerOperator(); - - const complex_t trace = (polarization * R.adjoint() * analyzer * R).trace(); - - ele.setIntensity(std::abs(trace)); -} diff --git a/Core/Term/SpecularTerm.h b/Core/Term/SpecularTerm.h deleted file mode 100644 index 31b24bd368014039ed48e41f713a88f812bc94a1..0000000000000000000000000000000000000000 --- a/Core/Term/SpecularTerm.h +++ /dev/null @@ -1,73 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit reflection and scattering -// -//! @file Core/Term/SpecularTerm.h -//! @brief Defines classes SpecularTerm, SpecularScalarTerm, SpecularMatrixTerm -//! -//! @homepage http://www.bornagainproject.org -//! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2018 -//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS) -// -// ************************************************************************************************ - -#ifdef SWIG -#error no need to expose this header to Swig -#endif - -#ifndef USER_API -#ifndef BORNAGAIN_CORE_TERM_SPECULARTERM_H -#define BORNAGAIN_CORE_TERM_SPECULARTERM_H - -#include "Core/Term/ITerm.h" -#include "Resample/Specular/ISpecularStrategy.h" -#include "Sample/Multilayer/RoughnessModels.h" -#include <memory> -#include <vector> - -class MatrixFlux_v2; -class SpecularElement; -class SliceStack; - -//! Computes the specular scattering. -//! Used by SpecularComputation. -//! -//! Abstract base class of SpecularScalarTerm, SpecularMatrixTerm - -class ISpecularTerm : public ITerm { -public: - ISpecularTerm(std::unique_ptr<ISpecularStrategy> strategy); - - void computeTerm(SpecularElement& ele, const SliceStack& slices) const; - -protected: - virtual void eval(SpecularElement& ele, const SliceStack& slices) const = 0; - - const std::unique_ptr<ISpecularStrategy> m_strategy; -}; - -//! Computes the specular scattering for a scalar sample -//! Used by SpecularComputation. - -class SpecularScalarTerm : public ISpecularTerm { -public: - SpecularScalarTerm(const RoughnessModel& rm); - -private: - void eval(SpecularElement& ele, const SliceStack& slices) const override; -}; - -//! Computes the specular scattering for a magnetic sample -//! Used by SpecularComputation. - -class SpecularMatrixTerm : public ISpecularTerm { -public: - SpecularMatrixTerm(const RoughnessModel& rm); - -private: - void eval(SpecularElement& ele, const SliceStack& slices) const override; -}; - -#endif // BORNAGAIN_CORE_TERM_SPECULARTERM_H -#endif // USER_API diff --git a/Resample/Specular/SpecularStrategyBuilder.cpp b/Resample/Specular/SpecularStrategyBuilder.cpp index 7c95e0d42c9bd16abb8f8259a0fa20854128ca93..fcbf51f8707a2c4fdd6b35cac0ed1f5474e29bf5 100644 --- a/Resample/Specular/SpecularStrategyBuilder.cpp +++ b/Resample/Specular/SpecularStrategyBuilder.cpp @@ -13,6 +13,7 @@ // ************************************************************************************************ #include "Resample/Specular/SpecularStrategyBuilder.h" +#include "Base/Utils/Assert.h" #include "Resample/Specular/SpecularMagneticNCStrategy.h" #include "Resample/Specular/SpecularMagneticTanhStrategy.h" #include "Resample/Specular/SpecularScalarNCStrategy.h" @@ -21,27 +22,23 @@ std::unique_ptr<SpecularScalarStrategy> SampleUtils::SpecularStrategyBuilder::buildScalar(const RoughnessModel& rm) { - const RoughnessModel& roughnessModel = rm; - - if (roughnessModel == RoughnessModel::TANH || roughnessModel == RoughnessModel::DEFAULT) + if (rm == RoughnessModel::TANH || rm == RoughnessModel::DEFAULT) return std::make_unique<SpecularScalarTanhStrategy>(); - if (roughnessModel == RoughnessModel::NEVOT_CROCE) + if (rm == RoughnessModel::NEVOT_CROCE) return std::make_unique<SpecularScalarNCStrategy>(); - throw std::logic_error("Invalid roughness model"); + ASSERT(0); } std::unique_ptr<SpecularMagneticStrategy> SampleUtils::SpecularStrategyBuilder::buildMagnetic(const RoughnessModel& rm) { - const RoughnessModel& roughnessModel = rm; - - if (roughnessModel == RoughnessModel::TANH || roughnessModel == RoughnessModel::DEFAULT) + if (rm == RoughnessModel::TANH || rm == RoughnessModel::DEFAULT) return std::make_unique<SpecularMagneticTanhStrategy>(); - if (roughnessModel == RoughnessModel::NEVOT_CROCE) + if (rm == RoughnessModel::NEVOT_CROCE) return std::make_unique<SpecularMagneticNCStrategy>(); - throw std::logic_error("Invalid roughness model"); + ASSERT(0); } diff --git a/auto/Wrap/doxygenCore.i b/auto/Wrap/doxygenCore.i index c0804674be535094a3e2060c9206d07eac3f97f9..26c150391726c2e5a5293e4a2b5b865b640561e5 100644 --- a/auto/Wrap/doxygenCore.i +++ b/auto/Wrap/doxygenCore.i @@ -393,25 +393,12 @@ Returns the total number of the intensity values in the simulation result. "; -// File: classDepthProbeTerm.xml -%feature("docstring") DepthProbeTerm ""; - -%feature("docstring") DepthProbeTerm::DepthProbeTerm "DepthProbeTerm::DepthProbeTerm(const ProcessedSample &re_sample) -"; - -%feature("docstring") DepthProbeTerm::~DepthProbeTerm "DepthProbeTerm::~DepthProbeTerm() -"; - -%feature("docstring") DepthProbeTerm::computeTerm "void DepthProbeTerm::computeTerm(DepthProbeElement &ele) const -"; - - // File: classDWBAComputation.xml %feature("docstring") DWBAComputation " Provides function that performs a single-threaded DWBA computation for a range of DiffuseElements. -Handles progress counter and interrupts, runs loop over DiffuseElements, delegates all further work to DWBATerm. +Handles progress counter and interrupts, runs loop over DiffuseElements, delegates all further work to DWBATerm. Controlled by the multi-threading machinery in ISimulation::runSingleSimulation(). @@ -425,26 +412,6 @@ C++ includes: DWBAComputation.h "; -// File: classDWBATerm.xml -%feature("docstring") DWBATerm " - -Infrastructure for computing the scattering into given detector bin. - -Called by DWBASimulation for each detector bin. - -C++ includes: DWBATerm.h -"; - -%feature("docstring") DWBATerm::DWBATerm "DWBATerm::DWBATerm(const ProcessedSample &, const SimulationOptions &) -"; - -%feature("docstring") DWBATerm::~DWBATerm "DWBATerm::~DWBATerm() -"; - -%feature("docstring") DWBATerm::computeTerm "void DWBATerm::computeTerm(DiffuseElement &ele) const -"; - - // File: classFitObjective.xml %feature("docstring") FitObjective " @@ -1224,23 +1191,6 @@ Returns intensity vector corresponding to convolution of given simulation elemen "; -// File: classISpecularTerm.xml -%feature("docstring") ISpecularTerm " - -Computes the specular scattering. Used by SpecularComputation. - -Abstract base class of SpecularScalarTerm, SpecularMatrixTerm - -C++ includes: SpecularTerm.h -"; - -%feature("docstring") ISpecularTerm::ISpecularTerm "ISpecularTerm::ISpecularTerm(std::unique_ptr< ISpecularStrategy > strategy) -"; - -%feature("docstring") ISpecularTerm::computeTerm "void ISpecularTerm::computeTerm(SpecularElement &ele, const SliceStack &slices) const -"; - - // File: classIterationInfo.xml %feature("docstring") IterationInfo " @@ -1272,20 +1222,6 @@ Returns map of fit parameter names and its current values. "; -// File: classITerm.xml -%feature("docstring") ITerm " - -Infrastructure for computing the scattering into given detector bin. - -Called by DWBASimulation for each detector bin. - -C++ includes: ITerm.h -"; - -%feature("docstring") ITerm::setProgressHandler "void ITerm::setProgressHandler(ProgressHandler *progress) const -"; - - // File: classIVarianceFunction.xml %feature("docstring") IVarianceFunction " @@ -2073,30 +2009,6 @@ Returns kz values for Abeles computation of reflection/transition coefficients. "; -// File: classSpecularMatrixTerm.xml -%feature("docstring") SpecularMatrixTerm " - -Computes the specular scattering for a magnetic sample Used by SpecularComputation. - -C++ includes: SpecularTerm.h -"; - -%feature("docstring") SpecularMatrixTerm::SpecularMatrixTerm "SpecularMatrixTerm::SpecularMatrixTerm(const RoughnessModel &rm) -"; - - -// File: classSpecularScalarTerm.xml -%feature("docstring") SpecularScalarTerm " - -Computes the specular scattering for a scalar sample Used by SpecularComputation. - -C++ includes: SpecularTerm.h -"; - -%feature("docstring") SpecularScalarTerm::SpecularScalarTerm "SpecularScalarTerm::SpecularScalarTerm(const RoughnessModel &rm) -"; - - // File: classSpecularSimulation.xml %feature("docstring") SpecularSimulation " @@ -2189,46 +2101,49 @@ C++ includes: VarianceFunctions.h "; -// File: namespace_0d21.xml +// File: namespace_0d13.xml -// File: namespace_0d34.xml +// File: namespace_0d17.xml -// File: namespace_0d36.xml +// File: namespace_0d19.xml -// File: namespace_0d41.xml +// File: namespace_0d27.xml -// File: namespace_0d48.xml +// File: namespace_0d40.xml -// File: namespace_0d50.xml +// File: namespace_0d42.xml + + +// File: namespace_0d47.xml // File: namespace_0d54.xml -// File: namespace_0d64.xml +// File: namespace_0d56.xml -// File: namespace_0d69.xml +// File: namespace_0d60.xml -// File: namespace_0d74.xml +// File: namespace_0d70.xml -// File: namespace_0d82.xml +// File: namespace_0d75.xml -// File: namespace_0d86.xml +// File: namespace_0d80.xml -// File: namespace_0d92.xml +// File: namespace_0d88.xml -// File: namespace_0d94.xml +// File: namespace_0d9.xml // File: namespacemumufit.xml @@ -2562,6 +2477,24 @@ GISAS simulation with an extra long wavelength. // File: SpecularComputation_8h.xml +// File: GISASSpecularContribution_8cpp.xml + + +// File: GISASSpecularContribution_8h.xml + + +// File: ParticleLayoutContribution_8cpp.xml + + +// File: ParticleLayoutContribution_8h.xml + + +// File: RoughMultiLayerContribution_8cpp.xml + + +// File: RoughMultiLayerContribution_8h.xml + + // File: DepthProbeElement_8cpp.xml @@ -2769,54 +2702,15 @@ GISAS simulation with an extra long wavelength. // File: SpecularSimulation_8h.xml -// File: DepthProbeTerm_8cpp.xml - - -// File: DepthProbeTerm_8h.xml - - -// File: DWBATerm_8cpp.xml - - -// File: DWBATerm_8h.xml - - -// File: GISASSpecularContribution_8cpp.xml - - -// File: GISASSpecularContribution_8h.xml - - -// File: ITerm_8cpp.xml - - -// File: ITerm_8h.xml - - -// File: ParticleLayoutContribution_8cpp.xml - - -// File: ParticleLayoutContribution_8h.xml - - -// File: RoughMultiLayerContribution_8cpp.xml - - -// File: RoughMultiLayerContribution_8h.xml - - -// File: SpecularTerm_8cpp.xml - - -// File: SpecularTerm_8h.xml - - // File: dir_6ecf29fa58e9675bf8930c35e73daa86.xml // File: dir_7de90f35ae2a2c7b4fa95823d333cc96.xml +// File: dir_cca0c631914022590087d818ecb26afc.xml + + // File: dir_c6310732a22f63c0c2fc5595561e68f1.xml @@ -2840,6 +2734,3 @@ GISAS simulation with an extra long wavelength. // File: dir_d7a24665a95cfc15308ebd7b07b5ebd6.xml - -// File: dir_52128420a621ebf8ad4a4626c50b78b3.xml -