Program Listing for File IonizationData.hpp
↰ Return to documentation for file (src/elem/IonizationData.hpp)
#ifndef IONIZATIONDATA_HPP
#define IONIZATIONDATA_HPP
#include "ElemCommons.hpp"
#include "ElemData.hpp"
#include <array>
#include <cstddef>
#include <limits>
namespace elem
{
constexpr std::size_t maxIP = 20;
class IonizationData : public ElemData
{
public:
constexpr IonizationData(std::array<char, 2> symbol, unsigned int z,
std::array<double, maxIP> ionPot) noexcept
: ElemData(symbol, z), ionPot_(ionPot) {}
IonizationData(const IonizationData&) = default;
auto operator=(const IonizationData&) -> IonizationData& = default;
IonizationData(IonizationData&&) = default;
auto operator=(IonizationData&&) -> IonizationData& = default;
~IonizationData() = default;
[[nodiscard]] constexpr auto ionPot() const noexcept
-> const std::array<double, maxIP>& { return ionPot_; }
protected:
std::array<double, maxIP> ionPot_;
};
namespace detail
{
template<std::size_t N>
constexpr auto makeIonPot(const double (&vals)[N]) noexcept // NOLINT(cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays) -- C array ref is the only constexpr-compatible way to accept a braced-list of N values in C++17
-> std::array<double, maxIP>
{
constexpr double nan = std::numeric_limits<double>::quiet_NaN();
std::array<double, maxIP> arr{};
for (std::size_t i = 0; i < maxIP; ++i) {
arr[i] = (i < N) ? vals[i] : nan; // NOLINT(cppcoreguidelines-pro-bounds-constant-array-index) -- i is bounded by the loop condition
}
return arr;
}
constexpr auto makeEmptyIonPot() noexcept -> std::array<double, maxIP>
{
constexpr double nan = std::numeric_limits<double>::quiet_NaN();
std::array<double, maxIP> arr{};
for (std::size_t i = 0; i < maxIP; ++i) {
arr[i] = nan; // NOLINT(cppcoreguidelines-pro-bounds-constant-array-index) -- i is bounded by the loop condition
}
return arr;
}
} // namespace detail
inline constexpr std::array<IonizationData,
static_cast<std::size_t>(Symbols::nElem)> ionizationData = {
// Z=1-10
IonizationData({'H', '\0'}, 1U, detail::makeIonPot({13.59844})),
IonizationData({'H', 'e'}, 2U, detail::makeIonPot({24.58738, 54.41776})),
IonizationData({'L', 'i'}, 3U, detail::makeIonPot({5.39171, 75.64009, 122.45435})),
IonizationData({'B', 'e'}, 4U, detail::makeIonPot({9.32269, 18.21115, 153.89620, 217.71858})),
IonizationData({'B', '\0'}, 5U, detail::makeIonPot({8.29803, 25.15484, 37.93064, 259.37521, 340.22580})),
IonizationData({'C', '\0'}, 6U, detail::makeIonPot({11.26030, 24.38332, 47.8878, 64.4939, 392.087, 489.99334})),
IonizationData({'N', '\0'}, 7U, detail::makeIonPot({14.53414, 29.6013, 47.44924, 77.4735, 97.8902, 552.0718, 667.046})),
IonizationData({'O', '\0'}, 8U, detail::makeIonPot({13.61806, 35.11730, 54.9355, 77.41353, 113.8990, 138.1197, 739.29, 871.4101})),
IonizationData({'F', '\0'}, 9U, detail::makeIonPot({17.42282, 34.97082, 62.7084, 87.1398, 114.2428, 157.1651, 185.186, 953.9112, 1103.1176})),
IonizationData({'N', 'e'}, 10U, detail::makeIonPot({21.5646, 40.96328, 63.45, 97.12, 126.21, 157.93, 207.2759, 239.0989, 1195.8286, 1362.1995})),
// Z=11-20
IonizationData({'N', 'a'}, 11U, detail::makeIonPot({5.13908, 47.2864, 71.6200, 98.91, 138.40, 172.18, 208.50, 264.25, 299.864, 1465.121, 1648.702})),
IonizationData({'M', 'g'}, 12U, detail::makeIonPot({7.64624, 15.03528, 80.1437, 109.2655, 141.27, 186.76, 225.02, 265.96, 328.06, 367.50, 1761.805, 1962.6650})),
IonizationData({'A', 'l'}, 13U, detail::makeIonPot({5.98577, 18.82856, 28.44765, 119.992, 153.825, 190.49, 241.76, 284.66, 330.13, 398.75, 442.00, 2085.98, 2304.1410})),
IonizationData({'S', 'i'}, 14U, detail::makeIonPot({8.15169, 16.34585, 33.49302, 45.14181, 166.767, 205.27, 246.5, 303.54, 351.12, 401.37, 476.36, 523.42, 2437.63, 2673.182})),
IonizationData({'P', '\0'}, 15U, detail::makeIonPot({10.48669, 19.7694, 30.2027, 51.4439, 65.0251, 220.421, 263.57, 309.60, 372.13, 424.4, 479.46, 560.8, 611.74, 2816.91, 3069.842})),
IonizationData({'S', '\0'}, 16U, detail::makeIonPot({10.36001, 23.3379, 34.79, 47.222, 72.5945, 88.0530, 280.948, 328.75, 379.55, 447.5, 504.8, 564.44, 652.2, 707.01, 3223.78, 3494.1892})),
IonizationData({'C', 'l'}, 17U, detail::makeIonPot({12.96764, 23.814, 39.61, 53.4652, 67.8, 97.03, 114.1958, 348.28, 400.06, 455.63, 529.28, 591.99, 656.71, 749.76, 809.40, 3658.521, 3946.2960})),
IonizationData({'A', 'r'}, 18U, detail::makeIonPot({15.75962, 27.62967, 40.74, 59.81, 75.02, 91.009, 124.323, 143.460, 422.45, 478.69, 538.96, 618.26, 686.10, 755.74, 854.77, 918.03, 4120.8857, 4426.2296})),
IonizationData({'K', '\0'}, 19U, detail::makeIonPot({4.34066, 31.63, 45.806, 60.91, 82.66, 99.4, 117.56, 154.88, 175.8174, 503.8, 564.7, 629.4, 714.6, 786.6, 861.1, 968.0, 1033.4, 4610.8, 4934.046})),
IonizationData({'C', 'a'}, 20U, detail::makeIonPot({6.11316, 11.87172, 50.9131, 67.27, 84.50, 108.78, 127.2, 147.24, 188.54, 211.275, 591.9, 657.2, 726.6, 817.6, 894.5, 974.0, 1087.0, 1157.8, 5128.8, 5469.864})),
// Z=21-30
IonizationData({'S', 'c'}, 21U, detail::makeIonPot({6.5615, 12.79967, 24.75666, 73.4894, 91.65, 110.68, 138.0, 158.1, 180.03, 225.18, 249.798, 687.36, 756.7, 830.8, 927.5, 1009.0, 1094.0, 1213.0, 1287.97, 5674.8})),
IonizationData({'T', 'i'}, 22U, detail::makeIonPot({6.8281, 13.5755, 27.4917, 43.2672, 99.30, 119.53, 140.8, 170.4, 192.1, 215.92, 265.07, 291.500, 787.84, 863.1, 941.9, 1044.0, 1131.0, 1221.0, 1346.0, 1425.4})),
IonizationData({'V', '\0'}, 23U, detail::makeIonPot({6.7462, 14.66, 29.311, 46.709, 65.2817, 128.13, 150.6, 173.4, 205.8, 230.5, 255.7, 308.1, 336.277, 896.0, 976.0, 1060.0, 1168.0, 1260.0, 1355.0, 1486.0})),
IonizationData({'C', 'r'}, 24U, detail::makeIonPot({6.7665, 16.4857, 30.96, 49.16, 69.46, 90.6349, 160.18, 184.7, 209.3, 244.4, 270.8, 298.0, 354.8, 384.168, 1010.6, 1097.0, 1185.0, 1299.0, 1396.0, 1496.0})),
IonizationData({'M', 'n'}, 25U, detail::makeIonPot({7.43402, 15.63999, 33.668, 51.2, 72.4, 95.6, 119.203, 194.5, 221.8, 248.3, 286.0, 314.4, 343.6, 403.0, 435.163, 1134.7, 1224.0, 1317.0, 1437.0, 1539.0})),
IonizationData({'F', 'e'}, 26U, detail::makeIonPot({7.9024, 16.1878, 30.652, 54.8, 75.0, 99.1, 124.98, 151.06, 233.6, 262.1, 290.2, 330.8, 361.0, 392.2, 457.0, 489.256, 1266.0, 1358.0, 1456.0, 1582.0})),
IonizationData({'C', 'o'}, 27U, detail::makeIonPot({7.8810, 17.083, 33.50, 51.3, 79.5, 102.0, 128.9, 157.8, 186.13, 275.4, 305.0, 336.0, 379.0, 411.0, 444.0, 511.96, 546.58, 1397.2, 1504.6, 1603.0})),
IonizationData({'N', 'i'}, 28U, detail::makeIonPot({7.6398, 18.16884, 35.19, 54.9, 76.06, 108.0, 133.0, 162.0, 193.0, 224.6, 321.0, 352.0, 384.0, 430.0, 464.0, 499.0, 571.08, 607.06, 1541.0, 1648.0})),
IonizationData({'C', 'u'}, 29U, detail::makeIonPot({7.72638, 20.29240, 36.841, 57.38, 79.8, 103.0, 139.0, 166.0, 199.0, 232.0, 265.3, 369.0, 401.0, 435.0, 484.0, 520.0, 557.0, 633.0, 670.588, 1697.0})),
IonizationData({'Z', 'n'}, 30U, detail::makeIonPot({9.3942, 17.96440, 39.723, 59.4, 82.6, 108.0, 134.0, 174.0, 203.0, 238.0, 274.0, 310.8, 419.7, 454.0, 490.0, 542.0, 579.0, 619.0, 698.0, 738.0})),
// Z=31-36
IonizationData({'G', 'a'}, 31U, detail::makeIonPot({5.99930, 20.5142, 30.71, 64.0})),
IonizationData({'G', 'e'}, 32U, detail::makeIonPot({7.8994, 15.93462, 34.2241, 45.7131, 93.5})),
IonizationData({'A', 's'}, 33U, detail::makeIonPot({9.7886, 18.633, 28.351, 50.13, 62.63, 127.6})),
IonizationData({'S', 'e'}, 34U, detail::makeIonPot({9.75238, 21.19, 30.8204, 42.9450, 68.3, 81.7, 155.4})),
IonizationData({'B', 'r'}, 35U, detail::makeIonPot({11.81381, 21.8, 36.0, 47.3, 59.7, 88.6, 103.0, 192.8})),
IonizationData({'K', 'r'}, 36U, detail::makeIonPot({13.99961, 24.35985, 36.950, 52.5, 64.7, 78.5, 111.0, 125.802, 230.85, 268.2, 308.0, 350.0, 391.0, 447.0, 492.0, 541.0, 592.0, 641.0, 786.0, 833.0})),
// Z=37-48
IonizationData({'R', 'b'}, 37U, detail::makeIonPot({4.17713, 27.285, 40.0, 52.6, 71.0, 84.4, 99.2, 136.0, 150.0, 277.1})),
IonizationData({'S', 'r'}, 38U, detail::makeIonPot({5.6949, 11.03013, 42.89, 57.0, 71.6, 90.8, 106.0, 122.3, 162.0, 177.0, 324.1})),
IonizationData({'Y', '\0'}, 39U, detail::makeIonPot({6.2171, 12.24, 20.52, 60.597, 77.0, 93.0, 116.0, 129.0, 146.2, 191.0, 206.0, 374.0})),
IonizationData({'Z', 'r'}, 40U, detail::makeIonPot({6.63390, 13.13, 22.99, 34.34, 80.348})),
IonizationData({'N', 'b'}, 41U, detail::makeIonPot({6.75885, 14.32, 25.04, 38.3, 50.55, 102.057, 125.0})),
IonizationData({'M', 'o'}, 42U, detail::makeIonPot({7.09243, 16.16, 27.13, 46.4, 54.49, 68.8276, 125.664, 143.6, 164.12, 186.4, 209.3, 230.28, 279.1, 302.60, 544.0, 570.0, 636.0, 702.0, 767.0, 833.0})),
IonizationData({'T', 'c'}, 43U, detail::makeIonPot({7.28, 15.26, 29.54})),
IonizationData({'R', 'u'}, 44U, detail::makeIonPot({7.36050, 16.76, 28.47})),
IonizationData({'R', 'h'}, 45U, detail::makeIonPot({7.45890, 18.08, 31.06})),
IonizationData({'P', 'd'}, 46U, detail::makeIonPot({8.3369, 19.43, 32.93})),
IonizationData({'A', 'g'}, 47U, detail::makeIonPot({7.5762, 21.49, 34.83})),
IonizationData({'C', 'd'}, 48U, detail::makeIonPot({8.9938, 16.90832, 37.48})),
// Z=49-54
IonizationData({'I', 'n'}, 49U, detail::makeIonPot({5.78636, 18.8698, 28.03, 54.0})),
IonizationData({'S', 'n'}, 50U, detail::makeIonPot({7.3439, 14.63225, 30.50260, 40.73502, 72.28})),
IonizationData({'S', 'b'}, 51U, detail::makeIonPot({8.6084, 16.53051, 25.3, 44.2, 56.0, 108.0})),
IonizationData({'T', 'e'}, 52U, detail::makeIonPot({9.0096, 18.6, 27.96, 37.41, 58.75, 70.7, 137.0})),
IonizationData({'I', '\0'}, 53U, detail::makeIonPot({10.45126, 19.1313, 33.0})),
IonizationData({'X', 'e'}, 54U, detail::makeIonPot({12.1298, 21.20979, 32.1230})),
// Z=55-56
IonizationData({'C', 's'}, 55U, detail::makeIonPot({3.89390, 23.15745})),
IonizationData({'B', 'a'}, 56U, detail::makeIonPot({5.21170, 10.00390})),
// Z=57-71 (lanthanides)
IonizationData({'L', 'a'}, 57U, detail::makeIonPot({5.5769, 11.060, 19.1773, 49.95, 61.6})),
IonizationData({'C', 'e'}, 58U, detail::makeIonPot({5.5387, 10.85, 20.198, 36.758, 65.55, 77.6})),
IonizationData({'P', 'r'}, 59U, detail::makeIonPot({5.473, 10.55, 21.624, 38.98, 57.53})),
IonizationData({'N', 'd'}, 60U, detail::makeIonPot({5.5250, 10.73, 22.1, 40.41})),
IonizationData({'P', 'm'}, 61U, detail::makeIonPot({5.582, 10.90, 22.3, 41.1})),
IonizationData({'S', 'm'}, 62U, detail::makeIonPot({5.6436, 11.07, 23.4, 41.4})),
IonizationData({'E', 'u'}, 63U, detail::makeIonPot({5.6704, 11.241, 24.92, 42.7})),
IonizationData({'G', 'd'}, 64U, detail::makeIonPot({6.1501, 12.09, 20.63, 44.0})),
IonizationData({'T', 'b'}, 65U, detail::makeIonPot({5.8638, 11.52, 21.91, 39.79})),
IonizationData({'D', 'y'}, 66U, detail::makeIonPot({5.9389, 11.67, 22.8, 41.47})),
IonizationData({'H', 'o'}, 67U, detail::makeIonPot({6.0215, 11.80, 22.84, 42.5})),
IonizationData({'E', 'r'}, 68U, detail::makeIonPot({6.1077, 11.93, 22.74, 42.7})),
IonizationData({'T', 'm'}, 69U, detail::makeIonPot({6.18431, 12.05, 23.68, 42.7})),
IonizationData({'Y', 'b'}, 70U, detail::makeIonPot({6.25416, 12.1761, 25.05, 43.56})),
IonizationData({'L', 'u'}, 71U, detail::makeIonPot({5.4259, 13.9, 20.9594, 45.25, 66.8})),
// Z=72-80
IonizationData({'H', 'f'}, 72U, detail::makeIonPot({6.82507, 14.9, 23.3, 33.33})),
IonizationData({'T', 'a'}, 73U, detail::makeIonPot({7.5496})),
IonizationData({'W', '\0'}, 74U, detail::makeIonPot({7.8640})),
IonizationData({'R', 'e'}, 75U, detail::makeIonPot({7.8335})),
IonizationData({'O', 's'}, 76U, detail::makeIonPot({8.4382})),
IonizationData({'I', 'r'}, 77U, detail::makeIonPot({8.9670})),
IonizationData({'P', 't'}, 78U, detail::makeIonPot({8.9587, 18.563, 28.0})),
IonizationData({'A', 'u'}, 79U, detail::makeIonPot({9.2255, 20.5, 30.0})),
IonizationData({'H', 'g'}, 80U, detail::makeIonPot({10.43750, 18.756, 34.2})),
// Z=81-86
IonizationData({'T', 'l'}, 81U, detail::makeIonPot({6.1082, 20.428, 29.83})),
IonizationData({'P', 'b'}, 82U, detail::makeIonPot({7.41666, 15.0322, 31.9373, 42.32, 68.8})),
IonizationData({'B', 'i'}, 83U, detail::makeIonPot({7.2856, 16.69, 25.56, 45.3, 56.0, 88.3})),
IonizationData({'P', 'o'}, 84U, detail::makeIonPot({8.417})),
IonizationData({'A', 't'}, 85U, detail::makeEmptyIonPot()),
IonizationData({'R', 'n'}, 86U, detail::makeIonPot({10.74850})),
// Z=87-88
IonizationData({'F', 'r'}, 87U, detail::makeIonPot({4.0727})),
IonizationData({'R', 'a'}, 88U, detail::makeIonPot({5.2784, 10.14716})),
// Z=89-103 (actinides)
IonizationData({'A', 'c'}, 89U, detail::makeIonPot({5.17, 12.1})),
IonizationData({'T', 'h'}, 90U, detail::makeIonPot({6.3067, 11.5, 20.0, 28.8})),
IonizationData({'P', 'a'}, 91U, detail::makeIonPot({5.89})),
IonizationData({'U', '\0'}, 92U, detail::makeIonPot({6.19405, 14.72})),
IonizationData({'N', 'p'}, 93U, detail::makeIonPot({6.2657})),
IonizationData({'P', 'u'}, 94U, detail::makeIonPot({6.0262})),
IonizationData({'A', 'm'}, 95U, detail::makeIonPot({5.9738})),
IonizationData({'C', 'm'}, 96U, detail::makeIonPot({5.9915})),
IonizationData({'B', 'k'}, 97U, detail::makeIonPot({6.1979})),
IonizationData({'C', 'f'}, 98U, detail::makeIonPot({6.2817})),
IonizationData({'E', 's'}, 99U, detail::makeIonPot({6.42})),
IonizationData({'F', 'm'}, 100U, detail::makeIonPot({6.50})),
IonizationData({'M', 'd'}, 101U, detail::makeIonPot({6.58})),
IonizationData({'N', 'o'}, 102U, detail::makeIonPot({6.65})),
IonizationData({'L', 'r'}, 103U, detail::makeIonPot({4.9})),
// Z=104-118 (no CRC data available)
IonizationData({'R', 'f'}, 104U, detail::makeIonPot({6.0})),
IonizationData({'D', 'b'}, 105U, detail::makeEmptyIonPot()),
IonizationData({'S', 'g'}, 106U, detail::makeEmptyIonPot()),
IonizationData({'B', 'h'}, 107U, detail::makeEmptyIonPot()),
IonizationData({'H', 's'}, 108U, detail::makeEmptyIonPot()),
IonizationData({'M', 't'}, 109U, detail::makeEmptyIonPot()),
IonizationData({'D', 's'}, 110U, detail::makeEmptyIonPot()),
IonizationData({'R', 'g'}, 111U, detail::makeEmptyIonPot()),
IonizationData({'C', 'n'}, 112U, detail::makeEmptyIonPot()),
IonizationData({'N', 'h'}, 113U, detail::makeEmptyIonPot()),
IonizationData({'F', 'l'}, 114U, detail::makeEmptyIonPot()),
IonizationData({'M', 'c'}, 115U, detail::makeEmptyIonPot()),
IonizationData({'L', 'v'}, 116U, detail::makeEmptyIonPot()),
IonizationData({'T', 's'}, 117U, detail::makeEmptyIonPot()),
IonizationData({'O', 'g'}, 118U, detail::makeEmptyIonPot()),
};
} // namespace elem
#endif // IONIZATIONDATA_HPP