diff --git a/Core/Multilayer/DecouplingApproximationStrategy.cpp b/Core/Multilayer/DecouplingApproximationStrategy.cpp index 32c1d6a2656818cca28e1beedabb2ee742e9737e..0edd1aa9227526d9bd3e561e9205733409a1093f 100644 --- a/Core/Multilayer/DecouplingApproximationStrategy.cpp +++ b/Core/Multilayer/DecouplingApproximationStrategy.cpp @@ -30,20 +30,18 @@ double DecouplingApproximationStrategy1::evaluateForList( { double intensity = 0.0; complex_t amplitude = complex_t(0.0, 0.0); - if (m_total_abundance <= 0.0) - return 0.0; for (size_t i = 0; i < m_formfactor_wrappers.size(); ++i) { complex_t ff = m_precomputed_ff1[i]; if (std::isnan(ff.real())) throw Exceptions::RuntimeErrorException( "DecouplingApproximationStrategy::evaluateForList() -> Error! Amplitude is NaN"); - double fraction = m_formfactor_wrappers[i]->m_abundance / m_total_abundance; + double fraction = m_formfactor_wrappers[i]->m_abundance; amplitude += fraction * ff; intensity += fraction * std::norm(ff); } double amplitude_norm = std::norm(amplitude); double itf_function = mP_iff->evaluate(sim_element.getMeanQ()); - return m_total_abundance * (intensity + amplitude_norm * (itf_function - 1.0)); + return intensity + amplitude_norm * (itf_function - 1.0); } //! Returns the total incoherent and coherent scattering intensity for given kf and @@ -57,15 +55,13 @@ double DecouplingApproximationStrategy2::evaluateForList( Eigen::Matrix2cd mean_intensity = Eigen::Matrix2cd::Zero(); Eigen::Matrix2cd mean_amplitude = Eigen::Matrix2cd::Zero(); - if (m_total_abundance <= 0.0) - return 0.0; for (size_t i = 0; i < m_formfactor_wrappers.size(); ++i) { Eigen::Matrix2cd ff = m_precomputed_ff2[i]; if (!ff.allFinite()) throw Exceptions::RuntimeErrorException( "DecouplingApproximationStrategy::evaluateForList() -> " "Error! Form factor contains NaN or infinite"); - double fraction = m_formfactor_wrappers[i]->m_abundance / m_total_abundance; + double fraction = m_formfactor_wrappers[i]->m_abundance; mean_amplitude += fraction * ff; mean_intensity += fraction * (ff * sim_element.getPolarization() * ff.adjoint()); } @@ -75,5 +71,5 @@ double DecouplingApproximationStrategy2::evaluateForList( double amplitude_trace = std::abs(amplitude_matrix.trace()); double intensity_trace = std::abs(intensity_matrix.trace()); double itf_function = mP_iff->evaluate(sim_element.getMeanQ()); - return m_total_abundance * (intensity_trace + amplitude_trace * (itf_function - 1.0)); + return intensity_trace + amplitude_trace * (itf_function - 1.0); } diff --git a/Core/Multilayer/IInterferenceFunctionStrategy.cpp b/Core/Multilayer/IInterferenceFunctionStrategy.cpp index b05f0b1912cb1c86cc82be4595acd30ac30bc0e1..348cebb4568cce1d22b050bda98a8c995d4e531c 100644 --- a/Core/Multilayer/IInterferenceFunctionStrategy.cpp +++ b/Core/Multilayer/IInterferenceFunctionStrategy.cpp @@ -50,10 +50,6 @@ void IInterferenceFunctionStrategy::init( m_formfactor_wrappers = weighted_formfactors; mP_iff.reset(iff.clone()); - m_total_abundance = 0; - for (const auto ffw: m_formfactor_wrappers) - m_total_abundance += ffw->m_abundance; - if (&specular_info != mP_specular_info.get()) mP_specular_info.reset(specular_info.clone()); diff --git a/Core/Multilayer/IInterferenceFunctionStrategy.h b/Core/Multilayer/IInterferenceFunctionStrategy.h index 330c0e1d5b005ec633e6666df86e29e0dcfb957a..26b6c81d73dcbb5df03e0ca5388c07f5906c55ec 100644 --- a/Core/Multilayer/IInterferenceFunctionStrategy.h +++ b/Core/Multilayer/IInterferenceFunctionStrategy.h @@ -68,7 +68,6 @@ protected: //! Evaluates the intensity for given list of evaluated form factors virtual double evaluateForList(const SimulationElement& sim_element) const =0; - double m_total_abundance; //!< cached sum of particle abundances, computed by init() SafePointerVector<FormFactorWrapper> m_formfactor_wrappers; std::unique_ptr<IInterferenceFunction> mP_iff; SimulationOptions m_options; diff --git a/Core/Multilayer/SSCApproximationStrategy.cpp b/Core/Multilayer/SSCApproximationStrategy.cpp index 55e0d49191385821f0c581b4ab420f0deca44acb..f33df0220d6b060bfb97552ca7840d25c60901b3 100644 --- a/Core/Multilayer/SSCApproximationStrategy.cpp +++ b/Core/Multilayer/SSCApproximationStrategy.cpp @@ -36,8 +36,6 @@ void SSCApproximationStrategy::strategy_specific_post_init() m_mean_radius = 0.0; for (const auto ffw: m_formfactor_wrappers) m_mean_radius += ffw->m_abundance * ffw->mp_ff->getRadialExtension(); - if (m_total_abundance > 0.0) - m_mean_radius /= m_total_abundance; } complex_t SSCApproximationStrategy::getCharacteristicDistribution(double qp) const @@ -56,7 +54,7 @@ complex_t SSCApproximationStrategy::getCharacteristicSizeCoupling(double qp, dou for (size_t i = 0; i < n_frs; ++i) result += m_formfactor_wrappers[i]->m_abundance * calculatePositionOffsetPhase(qp, kappa, i); - return result / m_total_abundance; + return result; } complex_t SSCApproximationStrategy::calculatePositionOffsetPhase( @@ -77,18 +75,16 @@ double SSCApproximationStrategy1::evaluateForList(const SimulationElement& sim_e { double qp = sim_element.getMeanQ().magxy(); double diffuse_intensity = 0.0; - if (m_total_abundance <= 0.0) - return 0.0; for (size_t i = 0; i < m_formfactor_wrappers.size(); ++i) { complex_t ff = m_precomputed_ff1[i]; - double fraction = m_formfactor_wrappers[i]->m_abundance / m_total_abundance; + double fraction = m_formfactor_wrappers[i]->m_abundance; diffuse_intensity += fraction * std::norm(ff); } complex_t mean_ff_norm = getMeanFormfactorNorm(qp); complex_t p2kappa = getCharacteristicSizeCoupling(qp, 2.0 * m_kappa); complex_t omega = getCharacteristicDistribution(qp); double interference_intensity = 2.0 * (mean_ff_norm * omega / (1.0 - p2kappa * omega)).real(); - return m_total_abundance * (diffuse_intensity + interference_intensity); + return diffuse_intensity + interference_intensity; } complex_t SSCApproximationStrategy1::getMeanFormfactorNorm(double qp) const @@ -100,7 +96,7 @@ complex_t SSCApproximationStrategy1::getMeanFormfactorNorm(double qp) const ff_orig += prefac * m_precomputed_ff1[i]; ff_conj += prefac * std::conj(m_precomputed_ff1[i]); } - return ff_orig * ff_conj / m_total_abundance / m_total_abundance; + return ff_orig * ff_conj; } // ************************************************************************** // @@ -116,11 +112,9 @@ double SSCApproximationStrategy2::evaluateForList(const SimulationElement& sim_e { double qp = sim_element.getMeanQ().magxy(); Eigen::Matrix2cd diffuse_matrix = Eigen::Matrix2cd::Zero(); - if (m_total_abundance <= 0.0) - return 0.0; for (size_t i = 0; i < m_formfactor_wrappers.size(); ++i) { Eigen::Matrix2cd ff = m_precomputed_ff2[i]; - double fraction = m_formfactor_wrappers[i]->m_abundance / m_total_abundance; + double fraction = m_formfactor_wrappers[i]->m_abundance; diffuse_matrix += fraction * (ff * sim_element.getPolarization() * ff.adjoint()); } Eigen::Matrix2cd mff_orig, mff_conj; // original and conjugated mean formfactor @@ -134,7 +128,7 @@ double SSCApproximationStrategy2::evaluateForList(const SimulationElement& sim_e Eigen::Matrix2cd diffuse_matrix2 = sim_element.getAnalyzerOperator() * diffuse_matrix; double interference_trace = std::abs(interference_matrix.trace()); double diffuse_trace = std::abs(diffuse_matrix2.trace()); - return m_total_abundance * (diffuse_trace + interference_trace); + return diffuse_trace + interference_trace; } //! Computes ff_orig and ff_conj. @@ -149,6 +143,4 @@ void SSCApproximationStrategy2::getMeanFormfactors( ff_orig += prefac * m_precomputed_ff2[i]; ff_conj += prefac * m_precomputed_ff2[i].adjoint(); } - ff_orig /= m_total_abundance; - ff_conj /= m_total_abundance; } diff --git a/Tests/ReferenceData/PyPersist/ApproximationLMA.ref.int.gz b/Tests/ReferenceData/PyPersist/ApproximationLMA.ref.int.gz index af067b20a20d26cd3add5d20a69365c49b54a222..5de21995c63e044914e51951b66d1b49bf85a9ea 100644 Binary files a/Tests/ReferenceData/PyPersist/ApproximationLMA.ref.int.gz and b/Tests/ReferenceData/PyPersist/ApproximationLMA.ref.int.gz differ diff --git a/Tests/ReferenceData/StandardSuite/ApproximationLMA.int.gz b/Tests/ReferenceData/StandardSuite/ApproximationLMA.int.gz index 30ccbd772ac464f6ccc05ad1a7f460b5d24de70f..29377dd5b2219623d08fab9b6dcb2f59128b0c69 100644 Binary files a/Tests/ReferenceData/StandardSuite/ApproximationLMA.int.gz and b/Tests/ReferenceData/StandardSuite/ApproximationLMA.int.gz differ diff --git a/Tests/ReferenceData/StandardSuite/MultipleLayout.int.gz b/Tests/ReferenceData/StandardSuite/MultipleLayout.int.gz index 21bbb27ae3fdef27acfbcb5e592c27224aa54cb9..e55d7ccd6dfa6fb2f7cd6ff665ce64e97e578c07 100644 Binary files a/Tests/ReferenceData/StandardSuite/MultipleLayout.int.gz and b/Tests/ReferenceData/StandardSuite/MultipleLayout.int.gz differ