22constexpr double kPi = 3.141592653589793238462643383279502884;
27bool finite(
double x)
noexcept {
return std::isfinite(x); }
38 !finite(restMass) || restMass <= 0.0 ||
39 !finite(hbar) || hbar <= 0.0) {
43 const double c = baseConfig.lightSpeed;
44 const double cc = c * c;
46 const double rest = restMass * cc;
47 if (!(rest < e))
return out;
49 const double momentumSquared = (e * e - rest * rest) / cc;
50 if (!(momentumSquared > 0.0) || !finite(momentumSquared))
return out;
52 const double p = std::sqrt(momentumSquared);
54 const double theta = angleDegrees * kPi / 180.0;
64 if (!reference.
valid)
return out;
79 double minimumRestMass,
double maximumRestMass,
80 int samples,
double hbar)
noexcept
84 !finite(minimumRestMass) || !finite(maximumRestMass) ||
85 minimumRestMass <= 0.0 || maximumRestMass <= minimumRestMass ||
86 samples < 2 || samples > 2001 || !finite(hbar) || hbar <= 0.0) {
90 const double c = baseConfig.lightSpeed;
91 const double cc = c * c;
93 const double kinematicLimit = e / cc;
94 if (!(maximumRestMass < kinematicLimit))
return out;
105 out.
points.reserve(
static_cast<std::size_t
>(samples));
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);
112 if (point.valid) ++validCount;
113 out.
points.push_back(point);
118 out.
valid = validCount >= samples - 2 &&
119 out.
points.size() ==
static_cast<std::size_t
>(samples);
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
double interiorLongitudinalMomentumSquared
Data structure used by the Quantum Klein Mass Point2D component.
double interiorLongitudinalMomentumSquared
QuantumKleinBarrierRegime2D regime
Data record containing Quantum Klein Mass Scan2D Result.
double normalIncidenceRegimeThresholdMass
double kinematicMassLimit
double fixedIncidentEnergy
std::vector< QuantumKleinMassPoint2D > points
double incidenceAngleDegrees
Configuration values for Quantum Klein Tunneling2D Config.