24 throw std::runtime_error(
"Error in normalizedSLD: passed material has wrong type");
33 return std::norm(val) < 1e-80 ?
complex_t(0.0, 1e-40) : val;
44 const size_t N = slices.size();
45 const double n_ref = slices[0].material().refractiveIndex(2 *
M_PI / k.
mag()).real();
46 const double k_base = k.
mag() * (k.
z() > 0.0 ? -1 : 1);
48 std::vector<complex_t> result(N);
50 complex_t rad = slices[0].scalarReducedPotential(k, n_ref);
51 result[0] = k_base * std::sqrt(
rad);
52 for (
size_t i = 1; i < N; ++i) {
54 result[i] = k_base * std::sqrt(
rad);
61 const size_t N = slices.size();
62 const double k_sign = kz > 0.0 ? -1 : 1;
65 std::vector<complex_t> result(N);
68 for (
size_t i = 1; i < N; ++i) {
70 result[i] = k_sign * std::sqrt(kz2);
78 const size_t N = slices.size();
79 const double kz = k.
z();
80 const double k_sign = kz > 0.0 ? -1 : 1;
81 const double k2 = k.
mag2();
82 const double kz2 = kz * kz;
83 const double wl = 2 *
M_PI / std::sqrt(k2);
84 const complex_t n2_ref = slices[0].material().refractiveIndex2(wl);
86 std::vector<complex_t> result(N);
88 for (
size_t i = 1; i < N; ++i) {
89 const complex_t n2_norm = slices[i].material().refractiveIndex2(wl) - n2_ref;
std::complex< double > complex_t
Declares functions in namespace KzComputation.
Defines some unit conversion factors and other constants in namespace Units.
double mag2() const
Returns magnitude squared of the vector.
double mag() const
Returns magnitude of the vector.
T z() const
Returns z-component in cartesian coordinate system.
A wrapper for underlying material implementation.
MATERIAL_TYPES typeID() const
Returns the type of underlying material implementation.
complex_t materialData() const
Returns underlying material data.
std::vector< complex_t > computeKzFromRefIndices(const std::vector< Slice > &slices, kvector_t k)
std::vector< complex_t > computeReducedKz(const std::vector< Slice > &slices, kvector_t k)
std::vector< complex_t > computeKzFromSLDs(const std::vector< Slice > &slices, double kz)
static constexpr double rad
static constexpr double angstrom
complex_t checkForUnderflow(complex_t val)
complex_t normalizedSLD(const Material &material)