diff --git a/Core/Multilayer/SpecularScalarNCStrategy.cpp b/Core/Multilayer/SpecularScalarNCStrategy.cpp new file mode 100644 index 0000000000000000000000000000000000000000..51e8ae3ed80d79d605ff84e203a900537b900d01 --- /dev/null +++ b/Core/Multilayer/SpecularScalarNCStrategy.cpp @@ -0,0 +1,48 @@ +// ************************************************************************** // +// +// BornAgain: simulate and fit scattering at grazing incidence +// +//! @file Core/Multilayer/SpecularMatrix.cpp +//! @brief Implements class SpecularMatrix. +//! +//! @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 "SpecularScalarNCStrategy.h" +#include "KzComputation.h" +#include "Layer.h" +#include "LayerRoughness.h" +#include "MathConstants.h" +#include "MathFunctions.h" +#include "Slice.h" +#include <Eigen/Dense> +#include <stdexcept> +#include <valarray> + + + +Eigen::Vector2cd SpecularScalarNCStrategy::transition(complex_t kzi, complex_t kzi1, double sigma, double thickness, + const Eigen::Vector2cd& t_r1) const +{ + complex_t roughness_diff = 1; + complex_t roughness_sum = 1; + if (sigma > 0.0) { + roughness_diff = exp( - (kzi1 - kzi) * (kzi1 - kzi) * sigma * sigma / 2. ); + roughness_sum = exp( - (kzi1 + kzi) * (kzi1 + kzi) * sigma * sigma / 2. ); + } + const complex_t phase_shift = exp_I(kzi * thickness); + const complex_t kz_ratio = kzi1 / kzi; + + const complex_t a00 = 0.5 * ( 1. + kz_ratio ) * roughness_diff; + const complex_t a01 = 0.5 * ( 1. - kz_ratio ) * roughness_sum; + + Eigen::Vector2cd result; + result << (a00 * t_r1(0) + a01 * t_r1(1)) / phase_shift, + (a01 * t_r1(0) + a00 * t_r1(1)) * phase_shift; + return result; +} + diff --git a/Core/Multilayer/SpecularScalarNCStrategy.h b/Core/Multilayer/SpecularScalarNCStrategy.h new file mode 100644 index 0000000000000000000000000000000000000000..24c5b6311edf5b9cb22719044809492ed449faa0 --- /dev/null +++ b/Core/Multilayer/SpecularScalarNCStrategy.h @@ -0,0 +1,38 @@ +// ************************************************************************** // +// +// BornAgain: simulate and fit scattering at grazing incidence +// +//! @file Core/Multilayer/SpecularMatrix.h +//! @brief Defines namespace SpecularMatrix. +//! +//! @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) +// +// ************************************************************************** // + +#ifndef SPECULARSCALARNCSTRATEGY_H +#define SPECULARSCALARNCSTRATEGY_H + +#include "SpecularScalarStrategy.h" + +class Slice; + +//! Implements method 'execute' to compute refraction angles and transmission/reflection +//! coefficients for coherent wave propagation in a multilayer. +//! @ingroup algorithms_internal + +class SpecularScalarNCStrategy : public SpecularScalarStrategy +{ +public: + + +private: + virtual Eigen::Vector2cd transition(complex_t kzi, complex_t kzi1, double sigma, double thickness, + const Eigen::Vector2cd& t_r1) const override; + + +}; + +#endif // SPECULARSCALARNCSTRATEGY_H diff --git a/Core/Multilayer/SpecularStrategyBuilder.cpp b/Core/Multilayer/SpecularStrategyBuilder.cpp index b937bd3c35048925b2d2d996345a7f2a12f3d55d..917571313597e47eb62bc111619b70251bf8dcc6 100644 --- a/Core/Multilayer/SpecularStrategyBuilder.cpp +++ b/Core/Multilayer/SpecularStrategyBuilder.cpp @@ -32,7 +32,7 @@ std::unique_ptr<ISpecularStrategy> SpecularStrategyBuilder::build(const MultiLay } else if (roughnessModel == "nc" || roughnessModel == "nevot-croce") { - throw std::runtime_error("Nevot-Croce not yet implemented"); + return std::make_unique<SpecularScalarNCStrategy>(); } else if (roughnessModel == "tanh") { return std::make_unique<SpecularScalarTanhStrategy>(); diff --git a/Core/Multilayer/SpecularStrategyBuilder.h b/Core/Multilayer/SpecularStrategyBuilder.h index 6f9b2faf6f5385eb3b291e2d30bb71829646ef07..7838c810ea55b5cdcf31f10ee7f49b82e6ef49fe 100644 --- a/Core/Multilayer/SpecularStrategyBuilder.h +++ b/Core/Multilayer/SpecularStrategyBuilder.h @@ -19,7 +19,7 @@ #include "MultiLayer.h" #include "MultiLayerUtils.h" #include "SpecularMagneticStrategy.h" -#include "SpecularScalarStrategy.h" +#include "SpecularScalarNCStrategy.h" #include "SpecularScalarTanhStrategy.h" class SpecularStrategyBuilder