1/* Copyright (C) 2024 Robin Schaefer <rschaefe@bu.edu>
2*
3* This file is part of DanceQ.
4*
5* DanceQ is free software: you can redistribute it and/or modify it under the terms
6* of the GNU General Public License as published by the Free Software Foundation,
7* either version 3 of the License, or (at your option) any later version.
8*
9* DanceQ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
10* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11* See the GNU General Public License for more details.
12*
13* You should have received a copy of the GNU General Public License along with DanceQ.
14* If not, see <https://www.gnu.org/licenses/>.
15*
16*
17 * Full documentation can be found at https://DanceQ.gitlab.io/DanceQ
18 *
19*/
20/* Definition of classes */
21#pragma once
22
23/* Debugging option from 0 (no debugging) to 10 (maximal debugging) */
24#ifndef dbug_level
25#define dbug_level 0
26#endif
27
28/* Maximal number of sites */
29#ifdef MaxSites
30const static size_t MaxSites_ = MaxSites;
31#undef MaxSites
32#else
33const static size_t MaxSites_ = 64;
34#endif
35
36/* Local Hilbert space dimension */
37#ifdef Q
38const static size_t Q_ = Q;
39#undef Q
40#else
41const static size_t Q_ = 2;
42#endif
43
44/* ScalarType for computation */
45#include <complex>
46#ifdef ScalarType
47using ScalarType_=ScalarType;
48#undef ScalarType
49#else
50using ScalarType_=std::complex<double>;
51#endif
52
53/* Including the Operator class */
54#include "Operator.h"
55
56
57namespace danceq{
58
59 /* There is a hierarchy classes: */
60 /* State class -> Container class -> BasisU1 class -> Basis Iterator */
61
62 /* Definition of the State class */
63 using State=danceq::internal::State<MaxSites_,Q_,uint64_t>;
64 /* Definition of the Container class */
65 /* There are three equivalent options */
66 using Container=danceq::internal::ContainerTable<State>;
67 //using Container=danceq::internal::ContainerDict<State>;
68 //using Container=danceq::internal::ContainerFly<State>;
69
70 /* Definition of the BasisU1 class using a specific container */
71 using Basis=danceq::internal::BasisU1<Container>;
72
73 /* Definition of the Basis Iterator */
74 using BasisIterator=danceq::internal::BasisIterator<Basis>;
75
76 /* Definition of the Hamiltonian class from the BasisU1 class */
77 using Hamiltonian_U1=danceq::internal::Operator<Basis,ScalarType_,danceq::Hamiltonian>;
78
79 /* Definition of the Hamiltonian class from the State class */
80 using Hamiltonian_NoU1=danceq::internal::Operator<State,ScalarType_,danceq::Hamiltonian>;
81
82 /* Definition of the Lindbladian class from the BasisU1 class */
83 using Lindbladian_U1=danceq::internal::Operator<Basis,ScalarType_,danceq::Lindbladian>;
84
85 /* Definition of the Lindbladian class from the State class */
86 using Lindbladian_NoU1=danceq::internal::Operator<State,ScalarType_,danceq::Lindbladian>;
87
88 /* Definition of the ShellMatrix class from the Operator class */
89 using SellMatrix_Hamiltonian_NoU1=danceq::internal::ShellMatrix<Hamiltonian_NoU1>;
90
91 /* Definition of the ShellMatrix class from the Operator class */
92 using SellMatrix_Lindbladian_U1=danceq::internal::ShellMatrix<Lindbladian_U1>;
93
94 /* Definition of the ShellMatrix class from the Operator class */
95 using SellMatrix_Lindbladian_NoU1=danceq::internal::ShellMatrix<Lindbladian_NoU1>;
96
97 /* Definition of the ShellMatrix class from the Operator class */
98 using SellMatrix_Hamiltonian_U1=danceq::internal::ShellMatrix<Hamiltonian_U1>;
99
100 /* Definition of the Vector class */
101 using Vector=danceq::internal::Vector<ScalarType_>;
102
103 /* Definition of the SparseMatrix class */
104 using SparseMatrix=danceq::internal::SparseMatrix<ScalarType_>;
105};