21 complex_t normalizedSLD(
const Material& material)
23 if (material.
typeID() != MATERIAL_TYPES::MaterialBySLD)
24 throw std::runtime_error(
"Error in normalizedSLD: passed material has wrong type");
26 complex_t sld = std::conj(material.
materialData()) / (Units::angstrom * Units::angstrom);
31 complex_t checkForUnderflow(complex_t val)
33 return std::norm(val) < 1e-80 ? complex_t(0.0, 1e-40) : val;
41 std::vector<complex_t> KzComputation::computeReducedKz(
const std::vector<Slice>& slices,
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) {
53 rad = checkForUnderflow(slices[i].scalarReducedPotential(k, n_ref));
54 result[i] = k_base * std::sqrt(rad);
59 std::vector<complex_t> KzComputation::computeKzFromSLDs(
const std::vector<Slice>& slices,
double kz)
61 const size_t N = slices.size();
62 const double k_sign = kz > 0.0 ? -1 : 1;
63 complex_t kz2_base = kz * kz + normalizedSLD(slices[0].material());
65 std::vector<complex_t> result(N);
68 for (
size_t i = 1; i < N; ++i) {
69 complex_t kz2 = checkForUnderflow(kz2_base - normalizedSLD(slices[i].material()));
70 result[i] = k_sign * std::sqrt(kz2);
75 std::vector<complex_t> KzComputation::computeKzFromRefIndices(
const std::vector<Slice>& slices,
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;
90 result[i] = k_sign * std::sqrt(checkForUnderflow(k2 * n2_norm + kz2));
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.