1#ifndef VANILLA_GRANDHUBBARDMODEL
2#define VANILLA_GRANDHUBBARDMODEL
6#include "BetheAnsatzIntegrals.h"
39 size_t Lcell =
P.size();
41 for (
size_t l=0; l<
N_sites; ++l)
N_phys +=
P.get<
size_t>(
"Ly",l%Lcell);
53 template<
typename Symmetry_>
56 const BC boundary=BC::OPEN);
58 static const std::map<string,std::any>
defaults;
60 static refEnergy ref (
const vector<Param> ¶ms,
double L=numeric_limits<double>::infinity());
65 {
"t",1.}, {
"tPrime",0.}, {
"tRung",1.},
66 {
"mu",0.}, {
"t0",0.}, {
"Fp", 0.},
68 {
"V",0.}, {
"Vrung",0.},
69 {
"Vxy",0.}, {
"Vz",0.},
71 {
"J",0.}, {
"Jrung",0.},
73 {
"Delta",0.}, {
"DeltaUP",0.}, {
"DeltaDN",0.},
74 {
"X",0.}, {
"Xperp",0.},
75 {
"REMOVE_DOUBLE",
false}, {
"REMOVE_EMPTY",
false}, {
"REMOVE_UP",
false}, {
"REMOVE_DN",
false}, {
"mfactor",1}, {
"k",0},
76 {
"maxPower",2ul}, {
"CYLINDER",
false}, {
"Ly",1ul}
87 size_t Lcell =
P.size();
89 for (
size_t l=0; l<
N_sites; ++l)
91 N_phys +=
P.get<
size_t>(
"Ly",l%Lcell);
95 param1d U =
P.fill_array1d<
double>(
"U",
"Uorb",
F[0].orbitals(), 0);
96 if (isfinite(U.a.sum()))
100 else if (P.HAS_ANY_OF({
"J",
"J3site"}))
109 std::vector<std::vector<std::string>> labellist;
119template<
typename Symmetry_>
123 std::size_t Lcell =
P.size();
126 for(std::size_t loc=0; loc<
N_sites; ++loc)
128 std::size_t lp1 = (loc+1)%
N_sites;
129 std::size_t lp2 = (loc+2)%
N_sites;
131 std::size_t orbitals =
F[loc].orbitals();
132 std::size_t next_orbitals =
F[lp1].orbitals();
133 std::size_t nextn_orbitals =
F[lp2].orbitals();
135 param2d DeltaUPpara =
P.fill_array2d<
double>(
"DeltaUP",
"DeltaUPpara", {orbitals, next_orbitals}, loc%Lcell);
136 param2d DeltaDNpara =
P.fill_array2d<
double>(
"DeltaDN",
"DeltaDNpara", {orbitals, next_orbitals}, loc%Lcell);
138 labellist[loc].push_back(DeltaUPpara.label);
139 labellist[loc].push_back(DeltaDNpara.label);
141 if (loc <
N_sites-1 or !
static_cast<bool>(boundary))
143 for (std::size_t alfa=0; alfa<orbitals; ++alfa)
144 for (std::size_t beta=0; beta<next_orbitals; ++beta)
146 if (!
P.HAS(
"DeltaUPfull"))
148 if (DeltaUPpara(alfa,beta) != 0.)
154 if (!
P.HAS(
"DeltaDNfull"))
156 if (DeltaDNpara(alfa,beta) != 0.)
173 param1d Bx =
P.fill_array1d<
double>(
"Bx",
"Bxorb", orbitals, loc%Lcell);
174 labellist[loc].push_back(Bx.label);
176 param1d Fp =
P.fill_array1d<
double>(
"Fp",
"Fporb", orbitals, loc%Lcell);
177 labellist[loc].push_back(Fp.label);
179 auto H_Bx =
F[loc].template coupling_Bx<double>(Bx.a);
180 auto H_Fp =
F[loc].template coupling_singleFermion<double>(Fp.a);
182 pushlist.push_back(std::make_tuple(loc, Hloc, 1.));
187ref (
const vector<Param> ¶ms,
double L)
189 ParamHandler
P(params,{{
"t",1.},{
"U",0.},{
"n",1.},{
"Ly",1ul},{
"tRung",1.},{
"tPrime",0.},
190 {
"t0",0.},{
"V",0.},{
"Bz",0.},{
"Bx",0.},{
"J",0.},{
"J3site",0.}});
193 size_t Ly =
P.get<
size_t>(
"Ly");
194 double n =
P.get<
double>(
"n");
195 double U =
P.get<
double>(
"U");
196 double t =
P.get<
double>(
"t");
197 double tRung =
P.get<
double>(
"tRung");
200 if (isinf(L) and Ly == 1ul and
n == 1. and
P.ARE_ALL_ZERO<
double>({
"tPrime",
"t0",
"V",
"Bz",
"Bx",
"J",
"J3site"}))
202 out.value = BetheAnsatz::e0(U,t);
203 out.source =
"Elliott H. Lieb, F. Y. Wu, Absence of Mott Transition in an Exact Solution of the Short-Range, One-Band Model in One Dimension, Phys. Rev. Lett. 20, 1445 (1968)";
204 out.method =
"num. integration with gsl";
207 else if (Ly == 2ul and
n == 1. and
P.ARE_ALL_ZERO<
double>({
"U",
"tPrime",
"t0",
"V",
"Bz",
"Bx",
"J",
"J3site"}))
209 if (t/tRung <= 0.5) {out.value = -tRung;}
212 if (isinf(L)) {out.value = -tRung-2.*M_1_PI*tRung*(sqrt(pow(2.*t/tRung,2)-1.)-acos(0.5*tRung/t));}
214 out.source =
"Zheng Weihong, J. Oitmaa, C. J. Hamer, R. J. Bursill, Numerical studies of the two-leg Hubbard ladder, J. Phys.: Condens. Matter 13 (2001) 433–448";
215 out.method =
"analytical";
std::enable_if< Dummy::IS_SPIN_SU2(), Mpo< Sym::U0, double > >::type c(size_t locx, size_t locy=0, double factor=1.) const
std::enable_if< Dummy::IS_SPIN_SU2() and!Dummy::IS_CHARGE_SU2(), Mpo< Sym::U0, double > >::type P(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
std::enable_if<!Dummy::IS_SPIN_SU2(), Mpo< Sym::U0, double > >::type n(size_t locx, size_t locy=0) const
vector< FermionBase< Sym::U0 > > F
std::enable_if< Dummy::IS_SPIN_SU2(), Mpo< Sym::U0, double > >::type cdag(size_t locx, size_t locy=0, double factor=std::sqrt(2.)) const
void finalize(const bool COMPRESS=true, const std::size_t power=1, const double tolerance=::mynumeric_limits< double >::epsilon())
void setLocBasis(const std::vector< std::vector< qType > > &q)
DMRG::VERBOSITY::OPTION VERB
void set_name(const std::string &label_in)
static std::vector< T > get_N_site_interaction(T const &Op0, Operator const &... Ops)
void precalc_TwoSiteData(bool FORCE=false)
void construct_from_pushlist(const PushType< OperatorType, CouplScalar > &pushlist, const std::vector< std::vector< std::string > > &labellist, size_t Lcell)
static void set_operators(const std::vector< FermionBase< Symmetry_ > > &F, const ParamHandler &P, PushType< SiteOperator< Symmetry_, double >, double > &pushlist, std::vector< std::vector< std::string > > &labellist, const BC boundary=BC::OPEN)
Hubbard model without any symmetries. MPO representation of the Hubbard model corresponding to Hubbar...
static qarray< 0 > singlet(int N)
static void add_operators(const std::vector< FermionBase< Symmetry_ > > &F, const ParamHandler &P, PushType< SiteOperator< Symmetry_, double >, double > &pushlist, std::vector< std::vector< std::string > > &labellist, const BC boundary=BC::OPEN)
static refEnergy ref(const vector< Param > ¶ms, double L=numeric_limits< double >::infinity())
static constexpr MODEL_FAMILY FAMILY
static const std::map< string, std::any > defaults
static constexpr int spinfac
Hubbard(Mpo< Symmetry > &Mpo_input, const vector< Param > ¶ms)
#define MAKE_TYPEDEFS(MODEL)