25const double Pi = 3.1415926535897932384626433832795;
35 return spectrum.valid && stateA >= 0 && stateB >= 0 && stateA != stateB &&
36 stateA < static_cast<int>(spectrum.states.size()) &&
37 stateB < static_cast<int>(spectrum.states.size()) &&
38 spectrum.states[
static_cast<std::size_t
>(stateA)].amplitude.size() == spectrum.x.size() &&
39 spectrum.states[
static_cast<std::size_t
>(stateB)].amplitude.size() == spectrum.x.size();
52 if (!validPair(spectrum, stateA, stateB) || !(spectrum.dx > 0.0)) {
55 const BoundState1D &a = spectrum.states[
static_cast<std::size_t
>(stateA)];
56 const BoundState1D &b = spectrum.states[
static_cast<std::size_t
>(stateB)];
58 for (std::size_t i = 0u; i < spectrum.x.size(); ++i) {
59 sum +=
static_cast<double>(a.
amplitude[i]) * spectrum.x[i] *
60 static_cast<double>(b.
amplitude[i]) * spectrum.dx;
78 std::complex<double> &ca,
79 std::complex<double> &cb)
noexcept
81 if (!validPair(spectrum, stateA, stateB) || field.empty() ||
82 field.width() != spectrum.x.size()) {
85 const double yMeasure =
static_cast<double>(field.height()) *
static_cast<double>(field.dy());
86 if (!(yMeasure > 0.0)) {
89 const BoundState1D &a = spectrum.states[
static_cast<std::size_t
>(stateA)];
90 const BoundState1D &b = spectrum.states[
static_cast<std::size_t
>(stateB)];
91 const double yScale = 1.0 / std::sqrt(yMeasure);
92 const double cellArea =
static_cast<double>(field.dx()) *
static_cast<double>(field.dy());
93 ca = std::complex<double>(0.0, 0.0);
94 cb = std::complex<double>(0.0, 0.0);
95 for (std::size_t y = 0u; y < field.height(); ++y) {
96 for (std::size_t x = 0u; x < field.width(); ++x) {
98 const std::complex<double> psi(
static_cast<double>(value.real()),
99 static_cast<double>(value.imag()));
100 ca +=
static_cast<double>(a.
amplitude[x]) * yScale * psi * cellArea;
101 cb +=
static_cast<double>(b.
amplitude[x]) * yScale * psi * cellArea;
114 double hbar)
noexcept
117 if (!validPair(zeroBiasSpectrum, stateA, stateB) || !(hbar > 0.0) ||
119 !std::isfinite(sweep.startValue) || !std::isfinite(sweep.endValue) ||
120 !std::isfinite(sweep.startTime) || !std::isfinite(sweep.duration) ||
121 !(sweep.duration > 0.0) || sweep.startTime < 0.0 ||
122 sweep.startValue == sweep.endValue) {
128 result.
energyA = zeroBiasSpectrum.states[
static_cast<std::size_t
>(stateA)].energy;
129 result.
energyB = zeroBiasSpectrum.states[
static_cast<std::size_t
>(stateB)].energy;
141 const double u = -sweep.startValue / (sweep.endValue - sweep.startValue);
142 if (!(u >= 0.0 && u <= 1.0)) {
145 result.
crossingTime = sweep.startTime + u * sweep.duration;
153 zeroBiasSpectrum, stateA, stateB,
nullptr);
166 if (!theory.
valid || !std::isfinite(currentBias)) {
170 std::complex<double> ca;
171 std::complex<double> cb;
172 if (!projectStationaryPair(field, zeroBiasSpectrum,
180 const double invSqrt2 = 1.0 / std::sqrt(2.0);
181 const std::complex<double> cLeft =
182 (ca + theory.
leftSign * cb) * invSqrt2;
183 const std::complex<double> cRight =
184 (ca - theory.
leftSign * cb) * invSqrt2;
190 const double a = theory.
energyA;
191 const double d = theory.
energyB;
193 const double mean = 0.5 * (a + d);
194 const double halfDifference = 0.5 * (a - d);
195 const double radius = std::sqrt(halfDifference * halfDifference + g * g);
201 if (std::abs(g) > 1.0e-14) {
204 const double n = std::sqrt(v1 * v1 + v2 * v2);
214 const std::complex<double> cLower = v1 * ca + v2 * cb;
215 const std::complex<double> cUpper = -v2 * ca + v1 * cb;
Declares the boundstates1d physics/numerical component used by QPE experiments.
static double preferredLeftPhase(const BoundStateSpectrum1D &spectrum, int stateA, int stateB, double *leftProbability=nullptr)
Performs preferred left phase.
Owning Cartesian grid of complex scalar samples.
std::complex< float > Value
static LandauZenerProjection2D project(const ComplexField2D &field, const BoundStateSpectrum1D &zeroBiasSpectrum, const LandauZenerTheory2D &theory, double currentBias)
Performs project.
static LandauZenerTheory2D analyze(const BoundStateSpectrum1D &zeroBiasSpectrum, const LinearPotentialSweep2DConfig &sweep, int stateA=0, int stateB=1, double hbar=1.0) noexcept
Performs analyze.
Declares the coherenttunneling2d physics/numerical component used by QPE experiments.
Declares the complex scalar field container representing two-dimensional wave functions.
Declares the landauzener2d physics/numerical component used by QPE experiments.
bool projectStationaryPair(const ComplexField2D &field, const BoundStateSpectrum1D &spectrum, int stateA, int stateB, std::complex< double > &ca, std::complex< double > &cb) noexcept
Performs project stationary pair.
double matrixElementX(const BoundStateSpectrum1D &spectrum, int stateA, int stateB) noexcept
Performs matrix element x.
Data structure used by the Bound State1D component.
std::vector< float > amplitude
Data structure used by the Bound State Spectrum1D component.
Data structure used by the Landau Zener Projection2D component.
std::complex< double > amplitudeA
double upperAdiabaticPopulation
double lowerAdiabaticPopulation
double capturedPopulation
std::complex< double > amplitudeB
Data structure used by the Landau Zener Theory2D component.
double diabaticProbability
double parameterSweepRate
double couplingMatrixElementX
double diabaticDetuningRate
double adiabaticFollowingProbability
Configuration values for Linear Potential Sweep2D Config.
Declares the timedependentpotential2d physics/numerical component used by QPE experiments.