RealTimeTransport 1.0.0
Real-time simulation of quantum transport processes
Loading...
Searching...
No Matches
DoubleDot.h
Go to the documentation of this file.
1//
2// This Source Code Form is subject to the terms of the Mozilla Public
3// License, v. 2.0. If a copy of the MPL was not distributed with this
4// file, You can obtain one at https://mozilla.org/MPL/2.0/.
5//
6
7///
8/// \file DoubleDot.h
9///
10/// \brief Implements a spinless double quantum dot.
11///
12
13#ifndef REAL_TIME_TRANSPORT_DOUBLE_DOT_H
14#define REAL_TIME_TRANSPORT_DOUBLE_DOT_H
15
16#include "../Model.h"
17
18#include <cereal/archives/binary.hpp>
19#include <cereal/archives/json.hpp>
20#include <cereal/archives/portable_binary.hpp>
21#include <cereal/types/polymorphic.hpp>
22
23#include <SciCore/Definitions.h>
24#include <SciCore/Serialization.h>
25
26namespace RealTimeTransport
27{
28
29///
30/// @ingroup Models
31///
32/// @brief Implements a spinless double quantum dot.
33///
34/// This class implements a spinless double quantum dot.
35/// The Hamiltonian is given by
36/// \f[
37/// H = \epsilon_1 n_1 + \epsilon_2 n_2 + \Omega d_1^\dagger d_2 + \Omega^* d_2^\dagger d_1 + U n_1 n_2.
38/// \f]
39/// The dots are coupled to the reservoirs via the tunneling Hamiltonian
40/// \f[
41/// H_T = \sum_{rl} \int d\omega \sqrt{\frac{\Gamma_{rl}}{2\pi}} (d^\dagger_l a_{rl}(\omega) + a^\dagger_{rl}(\omega) d_l).
42/// \f]
43/// All operators are represented in the basis \f$ \ket{00}, \ket{10}=d^\dagger_1 \ket{00}, \ket{01}=d^\dagger_2 \ket{00}, \ket{11} = d^\dagger_1 d^\dagger_2 \ket{00} \f$.
44///
45class REALTIMETRANSPORT_EXPORT DoubleDot final : public Model
46{
47 public:
48 /// @brief Default constructor.
49 DoubleDot() noexcept = default;
50
51 /// @brief Default move constructor.
52 DoubleDot(DoubleDot&& other) noexcept = default;
53
54 /// @brief Default copy constructor.
55 DoubleDot(const DoubleDot& other) = default;
56
57 /// @brief Default move assignment operator.
58 DoubleDot& operator=(DoubleDot&& other) noexcept = default;
59
60 /// @brief Default copy assignment operator.
61 DoubleDot& operator=(const DoubleDot& other) = default;
62
63 ///
64 /// @brief Constructs a new double dot object.
65 ///
66 /// @param epsilon1 Energy of dot 1
67 /// @param epsilon2 Energy of dot 2
68 /// @param U Coulomb interaction between the dots
69 /// @param Omega Hybridization between the dots
70 /// @param T Temperatures of the reservoirs
71 /// @param mu Chemical potentials of the reservoirs
72 /// @param Gamma1 Coupling \f$ \Gamma_{r1} \f$ between dot 1 and the reservoirs
73 /// @param Gamma2 Coupling \f$ \Gamma_{r2} \f$ between dot 2 and the reservoirs
74 ///
76 SciCore::Real epsilon1,
77 SciCore::Real epsilon2,
78 SciCore::Real U,
79 SciCore::Complex Omega,
80 const SciCore::RealVector& T,
81 const SciCore::RealVector& mu,
82 const SciCore::RealVector& Gamma1,
83 const SciCore::RealVector& Gamma2);
84
85 ///
86 /// @brief Returns the energy of dot 1.
87 ///
88 SciCore::Real epsilon1() const noexcept;
89
90 ///
91 /// @brief Returns the energy of dot 2.
92 ///
93 SciCore::Real epsilon2() const noexcept;
94
95 ///
96 /// @brief Returns the Coulomb interaction.
97 ///
98 SciCore::Real U() const noexcept;
99
100 ///
101 /// @brief Returns the coupling \f$ \Gamma_{r1} \f$ between dot 1 and the reservoirs.
102 ///
103 const SciCore::RealVector& Gamma1() const noexcept;
104
105 ///
106 /// @brief Returns the coupling \f$ \Gamma_{r2} \f$ between dot 2 and the reservoirs.
107 ///
108 const SciCore::RealVector& Gamma2() const noexcept;
109
110 ///
111 /// @brief The Hilbert space dimension is 4.
112 ///
113 int dimHilbertSpace() const noexcept override;
114
115 ///
116 /// @brief There are two single particle states.
117 ///
118 int numStates() const noexcept override;
119
120 ///
121 /// @brief Returns 1 (reservoirs are spinless).
122 ///
123 int numChannels() const noexcept override;
124
125 ///
126 /// @brief Returns the number of reservoirs the system is connected to.
127 ///
128 int numReservoirs() const override;
129
130 ///
131 /// @brief Returns the Hamiltonian.
132 ///
133 OperatorType H() const override;
134
135 ///
136 /// @brief Returns the annihilation operator of the dot \f$l=0, 1\f$.
137 ///
138 OperatorType d(int l) const override;
139
140 ///
141 /// @brief Returns the coupling coefficient in the tunneling Hamiltonian. l represents the dot index. nu is not used in this model.
142 ///
143 SciCore::Complex coupling(int r, int nu, int l) const override;
144
145 const SciCore::RealVector& temperatures() const noexcept override
146 {
147 return _temperatures;
148 }
149
150 const SciCore::RealVector& chemicalPotentials() const noexcept override
151 {
152 return _chemicalPotentials;
153 }
154
155 SupervectorType vectorize(const OperatorType& op) const override;
157 const std::vector<int>& blockDimensions() const noexcept override;
158
159 std::unique_ptr<Model> copy() const override;
160
161 bool isEqual(const Model& other) const override
162 {
163 const DoubleDot& rhs = dynamic_cast<const DoubleDot&>(other);
164 return (_epsilon1 == rhs._epsilon1) && (_epsilon2 == rhs._epsilon2) && (_u == rhs._u) &&
165 (_omega == rhs._omega) && (_temperatures == rhs._temperatures) &&
166 (_chemicalPotentials == rhs._chemicalPotentials) && (_gamma1 == rhs._gamma1) && (_gamma2 == rhs._gamma2);
167 }
168
169 void serialize(cereal::BinaryInputArchive& archive);
170 void serialize(cereal::BinaryOutputArchive& archive);
171 void serialize(cereal::PortableBinaryInputArchive& archive);
172 void serialize(cereal::PortableBinaryOutputArchive& archive);
173 void serialize(cereal::JSONInputArchive& archive);
174 void serialize(cereal::JSONOutputArchive& archive);
175
176 private:
177 SciCore::Real _epsilon1 = 0.0;
178 SciCore::Real _epsilon2 = 0.0;
179 SciCore::Real _u = 0.0;
180 SciCore::Complex _omega = 0.0;
181 SciCore::RealVector _temperatures;
182 SciCore::RealVector _chemicalPotentials;
183 SciCore::RealVector _gamma1;
184 SciCore::RealVector _gamma2;
185
186 static const std::vector<int> _blockDimensions;
187};
188
189} // namespace RealTimeTransport
190
191CEREAL_REGISTER_TYPE(RealTimeTransport::DoubleDot)
192CEREAL_REGISTER_POLYMORPHIC_RELATION(RealTimeTransport::Model, RealTimeTransport::DoubleDot)
193
194#endif // REAL_TIME_TRANSPORT_DOUBLE_DOT_H
#define REALTIMETRANSPORT_EXPORT
Definition RealTimeTransport_export.h:15
OperatorType operatorize(const SupervectorType &supervector) const override
Transforms a supervector back into operator form.
SupervectorType vectorize(const OperatorType &op) const override
Vectorizes an operator into its supervector form.
OperatorType d(int l) const override
Returns the annihilation operator of the dot .
DoubleDot(SciCore::Real epsilon1, SciCore::Real epsilon2, SciCore::Real U, SciCore::Complex Omega, const SciCore::RealVector &T, const SciCore::RealVector &mu, const SciCore::RealVector &Gamma1, const SciCore::RealVector &Gamma2)
Constructs a new double dot object.
DoubleDot(const DoubleDot &other)=default
Default copy constructor.
SciCore::Real epsilon1() const noexcept
Returns the energy of dot 1.
const std::vector< int > & blockDimensions() const noexcept override
The memory kernel and propagator are block diagonal. This function returns a reference to a vector co...
bool isEqual(const Model &other) const override
Returns true if other is the same as *this, otherwise false.
Definition DoubleDot.h:161
SciCore::Real U() const noexcept
Returns the Coulomb interaction.
int numReservoirs() const override
Returns the number of reservoirs the system is connected to.
OperatorType H() const override
Returns the Hamiltonian.
int numStates() const noexcept override
There are two single particle states.
const SciCore::RealVector & Gamma2() const noexcept
Returns the coupling between dot 2 and the reservoirs.
std::unique_ptr< Model > copy() const override
Returns a deep copy of the model.
const SciCore::RealVector & chemicalPotentials() const noexcept override
Returns the chemical potentials of the reservoirs the system is connected to.
Definition DoubleDot.h:150
DoubleDot & operator=(DoubleDot &&other) noexcept=default
Default move assignment operator.
int dimHilbertSpace() const noexcept override
The Hilbert space dimension is 4.
DoubleDot & operator=(const DoubleDot &other)=default
Default copy assignment operator.
SciCore::Complex coupling(int r, int nu, int l) const override
Returns the coupling coefficient in the tunneling Hamiltonian. l represents the dot index....
DoubleDot(DoubleDot &&other) noexcept=default
Default move constructor.
const SciCore::RealVector & temperatures() const noexcept override
Returns the temperatures of the reservoirs the system is connected to.
Definition DoubleDot.h:145
const SciCore::RealVector & Gamma1() const noexcept
Returns the coupling between dot 1 and the reservoirs.
SciCore::Real epsilon2() const noexcept
Returns the energy of dot 2.
int numChannels() const noexcept override
Returns 1 (reservoirs are spinless).
DoubleDot() noexcept=default
Default constructor.
Abstract class representing a model.
Definition Model.h:47