code/src/DanceQ.h

code/src/DanceQ.h

  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};