Quantum Phenomena Explorer 7.9.8
Interactive quantum-phenomena Explorer Tutor — source documentation
Loading...
Searching...
No Matches
quantumkleinmassscan2d.cpp
Go to the documentation of this file.
1/**
2 * @file quantumkleinmassscan2d.cpp
3 * @brief Implements the quantumkleinmassscan2d physics/numerical component used by QPE experiments.
4 * @ingroup qpe_quantum
5 *
6 * Source: @c core/quantum/quantumkleinmassscan2d.cpp. This file is part of Quantum Phenomena Explorer (QPE),
7 * maintained by Officina Turini. See LICENSE_IT.txt / LICENSE.txt for the
8 * QPE freeware source-available terms and THIRD_PARTY_NOTICES.txt for
9 * third-party components.
10 */
11
13
15
16#include <algorithm>
17#include <cmath>
18
19namespace qpe {
20namespace {
21
22constexpr double kPi = 3.141592653589793238462643383279502884;
23/**
24 * @brief Performs finite.
25 * @param x X coordinate/value.
26 */
27bool finite(double x) noexcept { return std::isfinite(x); }
28
29} // namespace
30
32 const QuantumKleinTunneling2DConfig &baseConfig, double restMass, double hbar) noexcept
33{
35 out.restMass = restMass;
36
37 if (!QuantumKleinTunneling2D::validateConfig(baseConfig, nullptr) ||
38 !finite(restMass) || restMass <= 0.0 ||
39 !finite(hbar) || hbar <= 0.0) {
40 return out;
41 }
42
43 const double c = baseConfig.lightSpeed;
44 const double cc = c * c;
45 const double e = QuantumKleinTunneling2D::incidentEnergy(baseConfig);
46 const double rest = restMass * cc;
47 if (!(rest < e)) return out;
48
49 const double momentumSquared = (e * e - rest * rest) / cc;
50 if (!(momentumSquared > 0.0) || !finite(momentumSquared)) return out;
51
52 const double p = std::sqrt(momentumSquared);
53 const double angleDegrees = QuantumKleinTunneling2D::incidenceAngleDegrees(baseConfig);
54 const double theta = angleDegrees * kPi / 180.0;
55
56 QuantumKleinTunneling2DConfig cMass = baseConfig;
57 cMass.restMass = restMass;
58 cMass.momentumX = p * std::cos(theta);
59 cMass.momentumY = p * std::sin(theta);
60 if (!QuantumKleinTunneling2D::validateConfig(cMass, nullptr)) return out;
61
62 const QuantumKleinAnglePoint2D reference =
63 QuantumKleinAngleScan2D::evaluate(cMass, std::abs(angleDegrees), hbar);
64 if (!reference.valid) return out;
65
66 out.restEnergy = rest;
67 out.gapEnergy = 2.0 * rest;
68 out.momentumMagnitude = p;
69 out.transmission = reference.transmission;
70 out.reflection = reference.reflection;
72 out.regime = reference.regime;
73 out.valid = true;
74 return out;
75}
76
78 const QuantumKleinTunneling2DConfig &baseConfig,
79 double minimumRestMass, double maximumRestMass,
80 int samples, double hbar) noexcept
81{
83 if (!QuantumKleinTunneling2D::validateConfig(baseConfig, nullptr) ||
84 !finite(minimumRestMass) || !finite(maximumRestMass) ||
85 minimumRestMass <= 0.0 || maximumRestMass <= minimumRestMass ||
86 samples < 2 || samples > 2001 || !finite(hbar) || hbar <= 0.0) {
87 return out;
88 }
89
90 const double c = baseConfig.lightSpeed;
91 const double cc = c * c;
92 const double e = QuantumKleinTunneling2D::incidentEnergy(baseConfig);
93 const double kinematicLimit = e / cc;
94 if (!(maximumRestMass < kinematicLimit)) return out;
95
96 out.hbar = hbar;
97 out.fixedIncidentEnergy = e;
99 out.barrierHeight = baseConfig.barrierHeight;
100 out.barrierWidth = baseConfig.barrierWidth;
101 out.minimumRestMass = minimumRestMass;
102 out.maximumRestMass = maximumRestMass;
103 out.kinematicMassLimit = kinematicLimit;
104 out.normalIncidenceRegimeThresholdMass = std::abs(baseConfig.barrierHeight - e) / cc;
105 out.points.reserve(static_cast<std::size_t>(samples));
106
107 int validCount = 0;
108 for (int i = 0; i < samples; ++i) {
109 const double f = static_cast<double>(i) / static_cast<double>(samples - 1);
110 const double mass = minimumRestMass + f * (maximumRestMass - minimumRestMass);
111 const QuantumKleinMassPoint2D point = evaluate(baseConfig, mass, hbar);
112 if (point.valid) ++validCount;
113 out.points.push_back(point);
114 }
115
116 // A singular matching point can occur exactly at the propagation/evanescent
117 // boundary. One or two isolated misses must not invalidate the whole scan.
118 out.valid = validCount >= samples - 2 &&
119 out.points.size() == static_cast<std::size_t>(samples);
120 return out;
121}
122
123} // namespace qpe
static QuantumKleinAnglePoint2D evaluate(const QuantumKleinTunneling2DConfig &baseConfig, double angleDegrees, double hbar=1.0) noexcept
Performs evaluate.
static QuantumKleinMassScan2DResult scan(const QuantumKleinTunneling2DConfig &baseConfig, double minimumRestMass=0.005, double maximumRestMass=1.4, int samples=181, double hbar=1.0) noexcept
Performs scan.
static QuantumKleinMassPoint2D evaluate(const QuantumKleinTunneling2DConfig &baseConfig, double restMass, double hbar=1.0) noexcept
Performs evaluate.
static double incidentEnergy(const QuantumKleinTunneling2DConfig &config) noexcept
Performs incident energy.
static bool validateConfig(const QuantumKleinTunneling2DConfig &config, std::string *reason=nullptr) noexcept
Validates config.
static double incidenceAngleDegrees(const QuantumKleinTunneling2DConfig &config) noexcept
Performs incidence angle degrees.
Declares the quantumkleinanglescan2d physics/numerical component used by QPE experiments.
Declares the quantumkleinmassscan2d physics/numerical component used by QPE experiments.
Data structure used by the Quantum Klein Angle Point2D component.
QuantumKleinBarrierRegime2D regime
Data structure used by the Quantum Klein Mass Point2D component.
QuantumKleinBarrierRegime2D regime
Data record containing Quantum Klein Mass Scan2D Result.
std::vector< QuantumKleinMassPoint2D > points
Configuration values for Quantum Klein Tunneling2D Config.