47 if (!finiteNonNegative(energy) ||
48 !finiteNonNegative(barrierHeight) ||
49 !finiteNonNegative(barrierWidth) ||
50 !finitePositive(mass) ||
51 !finitePositive(hbar)) {
52 throw std::invalid_argument(
"SquareBarrier1D: invalid parameters");
63 if (barrierHeight == 0.0 || barrierWidth == 0.0) {
77 const double hbar2 = hbar * hbar;
78 double denominatorExtra = 0.0;
80 const double scale = std::max({1.0, std::abs(energy), std::abs(barrierHeight)});
81 const bool atTop = std::abs(energy - barrierHeight) <= 1.0e-12 * scale;
85 denominatorExtra = mass * barrierHeight * barrierWidth * barrierWidth /
87 }
else if (energy < barrierHeight) {
88 const double delta = barrierHeight - energy;
89 const double kappa = std::sqrt(2.0 * mass * delta) / hbar;
90 const double s = std::sinh(kappa * barrierWidth);
91 denominatorExtra = barrierHeight * barrierHeight * s * s /
92 (4.0 * energy * delta);
94 const double delta = energy - barrierHeight;
95 const double q = std::sqrt(2.0 * mass * delta) / hbar;
96 const double s = std::sin(q * barrierWidth);
97 denominatorExtra = barrierHeight * barrierHeight * s * s /
98 (4.0 * energy * delta);
101 const double t = 1.0 / (1.0 + denominatorExtra);