TBTK
TimeEvolver.h
Go to the documentation of this file.
1 /* Copyright 2016 Kristofer Björnson
2  *
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
24 #ifndef COM_DAFER45_TBTK_TIME_EVOLVER
25 #define COM_DAFER45_TBTK_TIME_EVOLVER
26 
27 #include "Model.h"
28 #include "DiagonalizationSolver.h"
29 #include "UnitHandler.h"
30 #include <vector>
31 #include <complex>
32 
33 namespace TBTK{
34 
36 public:
38  TimeEvolver(TBTK::Model *model);
39 
41  ~TimeEvolver();
42 
47  void run();
48 
50  void setCallback(bool (*callback)(TimeEvolver *timeEvolver));
51 
53  void setMaxSCIterations(int maxIterations);
54 
56  void setNumTimeSteps(int numTimeSteps);
57 
59  void setTimeStep(double dt);
60 
68  void setNumberOfParticles(int numberOfParticles);
69 
72 
75  void fixParticleNumber(bool particleNumberIsFixed);
76 
78  double getOccupancy(int state);
79 
83 
85  double getEigenValue(int state);
86 
91  const std::complex<double> getAmplitude(int state, const Index &index);
92 
94  Model* getModel();
95 
109  enum class DecayMode{None, Instantly, Interpolate, Custom};
110 
112  void setDecayMode(DecayMode decayMode);
113 
114  class DecayHandler{
115  public:
116  virtual void decay(
117  TimeEvolver *timeEvolver,
118  double *occupancy,
119  double *eigenValues,
120  std::complex<double> **eigenVectorsMap
121  ) = 0;
122  private:
123  };
124 
126  void setDecayHandler(DecayHandler *decayHandler);
127 
130  int getCurrentTimeStep();
131 
135  void setOrthogonalityCheckInterval(int orthogonalityCheckInterval);
136 
138  double getOrthogonalityError();
139 private:
141  Model *model;
142 
146  DiagonalizationSolver dSolver;
147 
149  double *eigenValues;
150 
152  std::complex<double> *eigenVectors;
153 
158  std::complex<double> **eigenVectorsMap;
159 
161  double* occupancy;
162 
164  int numberOfParticles;
165 
168  bool particleNumberIsFixed;
169 
171  DecayMode decayMode;
172 
174  DecayHandler *decayHandler;
175 
178  bool (*callback)(TimeEvolver *timeEvolver);
179 
181  int numTimeSteps;
182 
184  double dt;
185 
187  int currentTimeStep;
188 
192  static std::vector<TimeEvolver*> timeEvolvers;
193 
197  static std::vector<DiagonalizationSolver*> dSolvers;
198 
204  static bool scCallback(DiagonalizationSolver *dSolver);
205 
208  void onDiagonalizationFinished();
209 
212  void sort();
213 
215  void updateOccupancy();
216 
218  void decayInstantly();
219 
221  void decayInterpolate();
222 
225  double orthogonalityError;
226 
229  int orthogonalityCheckInterval;
230 
232  void calculateOrthogonalityError();
233 };
234 
236  bool (*callback)(TimeEvolver *timeEvolver)
237 ){
238  this->callback = callback;
239 }
240 
241 inline void TimeEvolver::setMaxSCIterations(int maxIterations){
242  dSolver.setMaxIterations(maxIterations);
243 }
244 
245 inline void TimeEvolver::setNumTimeSteps(int numTimeSteps){
246  this->numTimeSteps = numTimeSteps;
247 }
248 
249 inline void TimeEvolver::setTimeStep(double dt){
250  this->dt = dt;
251 }
252 
253 inline void TimeEvolver::setNumberOfParticles(int numberOfParticles){
254  this->numberOfParticles = numberOfParticles;
255 }
256 
258  return numberOfParticles;
259 }
260 
261 inline void TimeEvolver::fixParticleNumber(bool particleNumberIsFixed){
262  this->particleNumberIsFixed = particleNumberIsFixed;
263 }
264 
266  return &dSolver;
267 }
268 
269 inline double TimeEvolver::getEigenValue(int state){
270  return eigenValues[state];
271 }
272 
273 inline double TimeEvolver::getOccupancy(int state){
274  return occupancy[state];
275 }
276 
277 inline const std::complex<double> TimeEvolver::getAmplitude(
278  int state,
279  const Index &index
280 ){
281  return eigenVectorsMap[state][model->getBasisIndex(index)];
282 }
283 
284 inline Model* TimeEvolver::getModel(){
285  return model;
286 }
287 
288 inline void TimeEvolver::setDecayMode(DecayMode decayMode){
289  this->decayMode = decayMode;
290 }
291 
292 inline void TimeEvolver::setDecayHandler(DecayHandler *decayHandler){
293  this->decayHandler = decayHandler;
294 }
295 
296 inline int TimeEvolver::getCurrentTimeStep(){
297  return currentTimeStep;
298 }
299 
300 inline void TimeEvolver::setOrthogonalityCheckInterval(
301  int orthogonalityCheckInterval
302 ){
303  this->orthogonalityCheckInterval = orthogonalityCheckInterval;
304 }
305 
306 inline double TimeEvolver::getOrthogonalityError(){
307  return orthogonalityError;
308 }
309 
310 }; //End of namespace TBTK
311 
312 #endif
void setTimeStep(double dt)
Definition: TimeEvolver.h:249
Handles conversions between different units.
double getEigenValue(int state)
Definition: TimeEvolver.h:269
void fixParticleNumber(bool particleNumberIsFixed)
Definition: TimeEvolver.h:261
Model Hamiltonian.
Definition: DiagonalizationSolver.h:36
int getNumberOfParticles()
Definition: TimeEvolver.h:257
Definition: TimeEvolver.h:35
TimeEvolver(TBTK::Model *model)
Definition: TimeEvolver.cpp:39
Solves a Model using diagonalization.
void setNumberOfParticles(int numberOfParticles)
Definition: TimeEvolver.h:253
void setMaxSCIterations(int maxIterations)
Definition: TimeEvolver.h:241
Definition: Index.h:44
Definition: AbstractOperator.h:26
~TimeEvolver()
Definition: TimeEvolver.cpp:59
void setNumTimeSteps(int numTimeSteps)
Definition: TimeEvolver.h:245
DiagonalizationSolver * getDiagonalizationSolver()
Definition: TimeEvolver.h:265
double getOccupancy(int state)
Definition: TimeEvolver.h:273
void run()
Definition: TimeEvolver.cpp:81
void setCallback(bool(*callback)(TimeEvolver *timeEvolver))
Definition: TimeEvolver.h:235
Definition: Model.h:40