TBTK
Need a break? Support the development by playing Polarity Puzzles
TimeEvolver.h
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 
17 
24 #ifndef COM_DAFER45_TBTK_TIME_EVOLVER
25 #define COM_DAFER45_TBTK_TIME_EVOLVER
26 
27 #include "TBTK/Solver/Diagonalizer.h"
28 #include "TBTK/Model.h"
29 #include "TBTK/UnitHandler.h"
30 
31 #include <complex>
32 #include <vector>
33 
34 namespace TBTK{
35 namespace Solver{
36 
38 class TimeEvolver : public Solver{
39 public:
41  TimeEvolver();
42 
44  virtual ~TimeEvolver();
45 
50  void run();
51 
53  void setCallback(bool (*callback)(TimeEvolver *timeEvolver));
54 
56  void setMaxSCIterations(int maxIterations);
57 
59  void setNumTimeSteps(int numTimeSteps);
60 
62  void setTimeStep(double dt);
63 
71  void setNumberOfParticles(int numberOfParticles);
72 
74  int getNumberOfParticles();
75 
78  void fixParticleNumber(bool particleNumberIsFixed);
79 
81  double getOccupancy(int state);
82 
85  Diagonalizer *getDiagonalizer();
86 
88  double getEigenValue(int state);
89 
94  const std::complex<double> getAmplitude(int state, const Index &index);
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:
143  Diagonalizer dSolver;
144 
146  double *eigenValues;
147 
149  std::complex<double> *eigenVectors;
150 
155  std::complex<double> **eigenVectorsMap;
156 
158  double* occupancy;
159 
161  int numberOfParticles;
162 
165  bool particleNumberIsFixed;
166 
168  DecayMode decayMode;
169 
171  DecayHandler *decayHandler;
172 
175  bool (*callback)(TimeEvolver *timeEvolver);
176 
178  int numTimeSteps;
179 
181  double dt;
182 
184  int currentTimeStep;
185 
189  static std::vector<TimeEvolver*> timeEvolvers;
190 
194  static std::vector<Diagonalizer*> dSolvers;
195 
201  class SelfConsistencyCallback :
202  public Diagonalizer::SelfConsistencyCallback
203  {
204  public:
205  virtual bool selfConsistencyCallback(Diagonalizer &diagonalizer);
206  };
207 // static bool selfConsistencyCallback(Diagonalizer &dSolver);
208  static SelfConsistencyCallback selfConsistencyCallback;
209 
212  void onDiagonalizationFinished();
213 
216  void sort();
217 
219  void updateOccupancy();
220 
222  void decayInstantly();
223 
225  void decayInterpolate();
226 
229  double orthogonalityError;
230 
233  int orthogonalityCheckInterval;
234 
236  void calculateOrthogonalityError();
237 };
238 
239 inline void TimeEvolver::setCallback(
240  bool (*callback)(TimeEvolver *timeEvolver)
241 ){
242  this->callback = callback;
243 }
244 
245 inline void TimeEvolver::setMaxSCIterations(int maxIterations){
246  dSolver.setMaxIterations(maxIterations);
247 }
248 
249 inline void TimeEvolver::setNumTimeSteps(int numTimeSteps){
250  this->numTimeSteps = numTimeSteps;
251 }
252 
253 inline void TimeEvolver::setTimeStep(double dt){
254  this->dt = dt;
255 }
256 
257 inline void TimeEvolver::setNumberOfParticles(int numberOfParticles){
258  this->numberOfParticles = numberOfParticles;
259 }
260 
261 inline int TimeEvolver::getNumberOfParticles(){
262  return numberOfParticles;
263 }
264 
265 inline void TimeEvolver::fixParticleNumber(bool particleNumberIsFixed){
266  this->particleNumberIsFixed = particleNumberIsFixed;
267 }
268 
269 inline Diagonalizer* TimeEvolver::getDiagonalizer(){
270  return &dSolver;
271 }
272 
273 inline double TimeEvolver::getEigenValue(int state){
274  return eigenValues[state];
275 }
276 
277 inline double TimeEvolver::getOccupancy(int state){
278  return occupancy[state];
279 }
280 
281 inline const std::complex<double> TimeEvolver::getAmplitude(
282  int state,
283  const Index &index
284 ){
285  return eigenVectorsMap[state][getModel().getBasisIndex(index)];
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 Solver
311 }; //End of namespace TBTK
312 
313 #endif
314 
Handles conversions between different units.
Container of Model related information.
Definition: Boolean.h:32