VMPS++
Loading...
Searching...
No Matches
PeierlsHubbardSU2xU1.h
Go to the documentation of this file.
1#ifndef HUBBARDMODELSU2XU1_H_COMPLEX
2#define HUBBARDMODELSU2XU1_H_COMPLEX
3
4#include "symmetry/S1xS2.h"
5#include "symmetry/U1.h"
6#include "symmetry/SU2.h"
7#include "bases/FermionBase.h"
9//include "tensors/SiteOperatorQ.h"
10//include "tensors/SiteOperator.h"
11#include "Mpo.h"
12//include "DmrgExternal.h"
13//include "ParamHandler.h"
14#include "ParamReturner.h"
15#include "Geometry2D.h" // from TOOLS
16
17namespace VMPS
18{
19class PeierlsHubbardSU2xU1 : public Mpo<Sym::S1xS2<Sym::SU2<Sym::SpinSU2>,Sym::U1<Sym::ChargeU1> >,complex<double>>,
20 public HubbardObservables<Sym::S1xS2<Sym::SU2<Sym::SpinSU2>,Sym::U1<Sym::ChargeU1> >,complex<double>>,
21 public ParamReturner
22{
23public:
24
27 typedef Eigen::Matrix<complex<double>,Eigen::Dynamic,Eigen::Dynamic> MatrixType;
29
30//private:
31
32 typedef Eigen::Index Index;
34
35public:
36
38
39 PeierlsHubbardSU2xU1(Mpo<Symmetry,complex<double>> &Mpo_input, const vector<Param> &params)
40 :Mpo<Symmetry,complex<double>>(Mpo_input),
43 {
44 ParamHandler P(params,PeierlsHubbardSU2xU1::defaults);
45 size_t Lcell = P.size();
46 N_phys = 0;
47 for (size_t l=0; l<N_sites; ++l) N_phys += P.get<size_t>("Ly",l%Lcell);
48 this->precalc_TwoSiteData();
49 this->HERMITIAN = true;
50 this->HAMILTONIAN = true;
51 };
52
53 PeierlsHubbardSU2xU1 (const size_t &L, const vector<Param> &params, const BC &boundary=BC::OPEN, const DMRG::VERBOSITY::OPTION &VERB=DMRG::VERBOSITY::OPTION::ON_EXIT);
54
64 template<typename Symmetry_>
65 static void set_operators (const std::vector<FermionBase<Symmetry_> > &F, const ParamHandler &P,
66 PushType<SiteOperator<Symmetry_,complex<double>>,complex<double>>& pushlist, std::vector<std::vector<std::string>>& labellist,
67 const BC boundary=BC::OPEN);
68
69 static qarray<2> singlet (int N=0) {return qarray<2>{1,N};};
70 static constexpr MODEL_FAMILY FAMILY = HUBBARD;
71 static constexpr int spinfac = 1;
72
73 static const map<string,any> defaults;
74 static const map<string,any> sweep_defaults;
75};
76
77// V is standard next-nearest neighbour density interaction
78// Vz and Vxy are anisotropic isospin-isospin next-nearest neighbour interaction
79const map<string,any> PeierlsHubbardSU2xU1::defaults =
80{
81 {"t",1.+0.i}, {"tPrime",0.i}, {"tRung",1.+0.i}, {"tPrimePrime",0.i},
82 {"mu",0.}, {"t0",0.},
83 {"U",0.}, {"Uph",0.},
84 {"V",0.}, {"Vext",0.}, {"Vrung",0.},
85 {"Vz",0.}, {"Vzrung",0.}, {"Vxy",0.}, {"Vxyrung",0.},
86 {"J",0.}, {"Jperp",0.},
87 {"X",0.}, {"Xrung",0.},
88 {"REMOVE_DOUBLE",false}, {"REMOVE_EMPTY",false}, {"REMOVE_UP",false}, {"REMOVE_DN",false}, {"mfactor",1}, {"k",0},
89 {"maxPower",2ul}, {"CYLINDER",false}, {"Ly",1ul}
90};
91
92const map<string,any> PeierlsHubbardSU2xU1::sweep_defaults =
93{
94 {"max_alpha",100.}, {"min_alpha",1.}, {"lim_alpha",11ul}, {"eps_svd",1e-7},
95 {"Mincr_abs", 50ul}, {"Mincr_per", 2ul}, {"Mincr_rel", 1.1},
96 {"min_Nsv",0ul}, {"max_Nrich",-1},
97 {"max_halfsweeps",24ul}, {"min_halfsweeps",1ul},
98 {"Minit",2ul}, {"Qinit",2ul}, {"Mlimit",1000ul},
99 {"tol_eigval",1e-7}, {"tol_state",1e-6},
100 {"savePeriod",0ul}, {"CALC_S_ON_EXIT", true}, {"CONVTEST",DMRG::CONVTEST::VAR_2SITE}
101};
102
104PeierlsHubbardSU2xU1 (const size_t &L, const vector<Param> &params, const BC &boundary, const DMRG::VERBOSITY::OPTION &VERB)
105:Mpo<Symmetry,complex<double>> (L, qarray<Symmetry::Nq>({1,0}), "", PROP::HERMITIAN, PROP::NON_UNITARY, boundary, VERB),
108{
109 ParamHandler P(params,defaults);
110 size_t Lcell = P.size();
111
112 for (size_t l=0; l<N_sites; ++l)
113 {
114 N_phys += P.get<size_t>("Ly",l%Lcell);
115 setLocBasis(F[l].get_basis().qloc(),l);
116 }
117
118 this->set_name("Peierls-Hubbard");
119
120 PushType<SiteOperator<Symmetry,complex<double>>,complex<double>> pushlist;
121 std::vector<std::vector<std::string>> labellist;
122 set_operators(F, P, pushlist, labellist, boundary);
123
124 this->construct_from_pushlist(pushlist, labellist, Lcell);
125 this->finalize(PROP::COMPRESS, P.get<size_t>("maxPower"));
126
127 this->precalc_TwoSiteData();
128}
129
130template<typename Symmetry_>
132set_operators (const std::vector<FermionBase<Symmetry_> > &F, const ParamHandler &P, PushType<SiteOperator<Symmetry_,complex<double>>,complex<double>>& pushlist, std::vector<std::vector<std::string>>& labellist, const BC boundary)
133{
134 std::size_t Lcell = P.size();
135 std::size_t N_sites = F.size();
136 if(labellist.size() != N_sites) {labellist.resize(N_sites);}
137
138 for (std::size_t loc=0; loc<N_sites; ++loc)
139 {
140 size_t lp1 = (loc+1)%N_sites;
141 size_t lp2 = (loc+2)%N_sites;
142 size_t lp3 = (loc+3)%N_sites;
143
144 std::size_t orbitals = F[loc].orbitals();
145 std::size_t next_orbitals = F[lp1].orbitals();
146 std::size_t nextn_orbitals = F[lp2].orbitals();
147 std::size_t nnextn_orbitals = F[lp3].orbitals();
148
149 stringstream ss;
150 ss << "Ly=" << P.get<size_t>("Ly",loc%Lcell);
151 labellist[loc].push_back(ss.str());
152
153 auto push_full = [&N_sites, &loc, &F, &P, &pushlist, &labellist, &boundary] (string xxxFull, string label,
154 const vector<SiteOperatorQ<Symmetry_,MatrixType>> &first,
155 const vector<vector<SiteOperatorQ<Symmetry_,MatrixType>>> &last,
156 vector<complex<double>> factor,
157 vector<bool> CONJ,
158 bool FERMIONIC) -> void
159 {
160 ArrayXXcd Full = P.get<Eigen::ArrayXXcd>(xxxFull);
161 vector<vector<std::pair<size_t,complex<double>> > > R = Geometry2D::rangeFormat(Full);
162
163 if (static_cast<bool>(boundary)) {assert(R.size() == N_sites and "Use an (N_sites)x(N_sites) hopping matrix for open BC!");}
164 else {assert(R.size() >= 2*N_sites and "Use at least a (2*N_sites)x(N_sites) hopping matrix for infinite BC!");}
165
166 for (size_t j=0; j<first.size(); j++)
167 for (size_t h=0; h<R[loc].size(); ++h)
168 {
169 size_t range = R[loc][h].first;
170 complex<double> value = R[loc][h].second;
171
172 if (range != 0)
173 {
174 vector<SiteOperatorQ<Symmetry_,MatrixType> > ops(range+1);
175 ops[0] = first[j];
176 for (size_t i=1; i<range; ++i)
177 {
178 if (FERMIONIC) {ops[i] = F[(loc+i)%N_sites].sign().template cast<complex<double>>();}
179 else {ops[i] = F[(loc+i)%N_sites].Id().template cast<complex<double>>();}
180 }
181 ops[range] = last[j][(loc+range)%N_sites];
182 complex<double> total_value = factor[j] * value;
183 if (CONJ[j]) total_value = conj(total_value);
184 pushlist.push_back(std::make_tuple(loc, ops, total_value));
185 }
186 }
187
188 stringstream ss;
189 ss << label << "(" << Geometry2D::hoppingInfo(Full) << ")";
190 labellist[loc].push_back(ss.str());
191 };
192
193 if (P.HAS("tFull"))
194 {
195 SiteOperatorQ<Symmetry_,MatrixType> c_sign_local = (F[loc].c(0) * F[loc].sign()).template cast<complex<double>>();
196 SiteOperatorQ<Symmetry_,MatrixType> cdag_sign_local = (F[loc].cdag(0) * F[loc].sign()).template cast<complex<double>>();
197 vector<SiteOperatorQ<Symmetry_,MatrixType> > c_ranges(N_sites);
198 for (size_t i=0; i<N_sites; i++) {c_ranges[i] = F[i].c(0).template cast<complex<double>>();}
199 vector<SiteOperatorQ<Symmetry_,MatrixType> > cdag_ranges(N_sites);
200 for (size_t i=0; i<N_sites; i++) {cdag_ranges[i] = F[i].cdag(0).template cast<complex<double>>();}
201
202 vector<SiteOperatorQ<Symmetry_,MatrixType> > first {cdag_sign_local,c_sign_local};
203 vector<vector<SiteOperatorQ<Symmetry_,MatrixType> > > last {c_ranges,cdag_ranges};
204 push_full("tFull", "tᵢⱼ", first, last, {-std::sqrt(2.), -std::sqrt(2.)}, {false, true}, PROP::FERMIONIC);
205 }
206 if (P.HAS("Vzfull"))
207 {
208 vector<SiteOperatorQ<Symmetry_,MatrixType> > first {F[loc].Tz(0).template cast<complex<double>>()};
209 vector<SiteOperatorQ<Symmetry_,MatrixType> > Tz_ranges(N_sites); for (size_t i=0; i<N_sites; i++) {Tz_ranges[i] = F[i].Tz(0).template cast<complex<double>>();}
210 vector<vector<SiteOperatorQ<Symmetry_,MatrixType> > > last {Tz_ranges};
211 push_full("Vzfull", "Vzᵢⱼ", first, last, {1.}, {false}, PROP::BOSONIC);
212 }
213// if (P.HAS("Vxyfull"))
214// {
215// auto Gloc = static_cast<SUB_LATTICE>(static_cast<int>(pow(-1,loc)));
216// vector<SiteOperatorQ<Symmetry_,MatrixType> > first {F[loc].Tp(0,Gloc), F[loc].Tm(0,Gloc)};
217// vector<SiteOperatorQ<Symmetry_,MatrixType> > Tp_ranges(N_sites);
218// vector<SiteOperatorQ<Symmetry_,MatrixType> > Tm_ranges(N_sites);
219// for (size_t i=0; i<N_sites; i++)
220// {auto Gi = static_cast<SUB_LATTICE>(static_cast<int>(pow(-1,i))); Tp_ranges[i] = F[i].Tp(0,Gi); Tm_ranges[i] = F[i].Tm(0,Gi);}
221//
222// vector<vector<SiteOperatorQ<Symmetry_,MatrixType> > > last {Tm_ranges, Tp_ranges};
223// push_full("Vxyfull", "Vxyᵢⱼ", first, last, {0.5,0.5}, PROP::BOSONIC);
224// }
225// if (P.HAS("VextFull"))
226// {
227// vector<SiteOperatorQ<Symmetry_,MatrixType> > first {F[loc].n(0)};
228// vector<SiteOperatorQ<Symmetry_,MatrixType> > n_ranges(N_sites); for (size_t i=0; i<N_sites; i++) {n_ranges[i] = F[i].n(0);}
229// vector<vector<SiteOperatorQ<Symmetry_,MatrixType> > > last {n_ranges};
230// push_full("VextFull", "Vextᵢⱼ", first, last, {1.}, PROP::BOSONIC);
231// }
232// if (P.HAS("Jfull"))
233// {
234// vector<SiteOperatorQ<Symmetry_,MatrixType> > first {F[loc].Sdag(0)};
235// vector<SiteOperatorQ<Symmetry_,MatrixType> > S_ranges(N_sites); for (size_t i=0; i<N_sites; i++) {S_ranges[i] = F[i].S(0);}
236// vector<vector<SiteOperatorQ<Symmetry_,MatrixType> > > last {S_ranges};
237// push_full("Jfull", "Jᵢⱼ", first, last, {std::sqrt(3.)}, PROP::BOSONIC);
238// }
239// if (P.HAS("Xfull"))
240// {
241// SiteOperatorQ<Symmetry_,MatrixType> PsiLloc = ((F[loc].ns() * F[loc].c()) * F[loc].sign());
242// SiteOperatorQ<Symmetry_,MatrixType> PsiRloc = ((F[loc].c() * F[loc].sign()) * F[loc].ns());
243//
244// vector<SiteOperatorQ<Symmetry_,MatrixType> > PsiLran(N_sites); for(size_t i=0; i<N_sites; i++) {PsiLran[i] = (F[i].ns() * F[i].c());}
245// vector<SiteOperatorQ<Symmetry_,MatrixType> > PsiRran(N_sites); for(size_t i=0; i<N_sites; i++) {PsiRran[i] = (F[i].c() * F[i].ns());}
246//
247// SiteOperatorQ<Symmetry_,MatrixType> PsidagLloc = ((F[loc].cdag() * F[loc].sign()) * F[loc].ns());
248// SiteOperatorQ<Symmetry_,MatrixType> PsidagRloc = ((F[loc].ns() * F[loc].cdag()) * F[loc].sign());
249//
250// vector<SiteOperatorQ<Symmetry_,MatrixType> > PsidagLran(N_sites); for(size_t i=0; i<N_sites; i++) {PsidagLran[i] = (F[i].cdag() * F[i].ns());}
251// vector<SiteOperatorQ<Symmetry_,MatrixType> > PsidagRran(N_sites); for(size_t i=0; i<N_sites; i++) {PsidagRran[i] = (F[i].ns() * F[i].cdag());}
252//
253// vector<SiteOperatorQ<Symmetry_,MatrixType> > first {PsidagLloc,PsidagRloc,PsiLloc,PsiRloc};
254// vector<vector<SiteOperatorQ<Symmetry_,MatrixType> > > last {PsiRran,PsiLran,PsidagRran,PsidagLran};
255// push_full("Xfull", "Xᵢⱼ", first, last, {-std::sqrt(2.), -std::sqrt(2.), -std::sqrt(2.), -std::sqrt(2.)}, PROP::FERMIONIC);
256// }
257
258 // Local terms: U, t0, μ, t⟂, V⟂, J⟂
259 param1d U = P.fill_array1d<double>("U", "Uorb", orbitals, loc%Lcell);
260 param1d Uph = P.fill_array1d<double>("Uph", "Uphorb", orbitals, loc%Lcell);
261 param1d t0 = P.fill_array1d<double>("t0", "t0orb", orbitals, loc%Lcell);
262 param1d mu = P.fill_array1d<double>("mu", "muorb", orbitals, loc%Lcell);
263 param2d tperp = P.fill_array2d<complex<double>>("tRung", "t", "tPerp", orbitals, loc%Lcell, P.get<bool>("CYLINDER"));
264 param2d Vperp = P.fill_array2d<double>("VRung", "V", "VPerp", orbitals, loc%Lcell, P.get<bool>("CYLINDER"));
265 param2d Vzperp = P.fill_array2d<double>("VzRung", "Vz", "VzPerp", orbitals, loc%Lcell, P.get<bool>("CYLINDER"));
266 param2d Vxyperp = P.fill_array2d<double>("VxyRung", "Vxy", "VxyPerp", orbitals, loc%Lcell, P.get<bool>("CYLINDER"));
267 param2d Jperp = P.fill_array2d<double>("JRung", "J", "JPerp", orbitals, loc%Lcell, P.get<bool>("CYLINDER"));
268
269 labellist[loc].push_back(U.label);
270 labellist[loc].push_back(Uph.label);
271 labellist[loc].push_back(t0.label);
272 labellist[loc].push_back(mu.label);
273 labellist[loc].push_back(tperp.label);
274 labellist[loc].push_back(Vperp.label);
275 labellist[loc].push_back(Vzperp.label);
276 labellist[loc].push_back(Vxyperp.label);
277 labellist[loc].push_back(Jperp.label);
278
280 (
281 F[loc].template HubbardHamiltonian<complex<double>,Symmetry_>(U.a.cast<complex<double>>(),
282 Uph.a.cast<complex<double>>(),
283 (t0.a-mu.a).cast<complex<double>>(),
284 tperp.a,
285 Vperp.a.cast<complex<double>>(),
286 Vzperp.a.cast<complex<double>>(),
287 Vxyperp.a.cast<complex<double>>(),
288 Jperp.a.cast<complex<double>>())
289 );
290 pushlist.push_back(std::make_tuple(loc, Hloc, 1.+0.i));
291
292 // Nearest-neighbour terms: t, V, J
293 if (!P.HAS("tFull") and !P.HAS("Vzfull") and !P.HAS("Vxyfull") and !P.HAS("Jfull") and !P.HAS("Xfull"))
294 {
295 param2d tpara = P.fill_array2d<complex<double>>("t", "tPara", {orbitals, next_orbitals}, loc%Lcell);
296 param2d Vpara = P.fill_array2d<double>("V", "Vpara", {orbitals, next_orbitals}, loc%Lcell);
297// param2d Vzpara = P.fill_array2d<double>("Vz", "Vzpara", {orbitals, next_orbitals}, loc%Lcell);
298// param2d Vxypara = P.fill_array2d<double>("Vxy", "Vxypara", {orbitals, next_orbitals}, loc%Lcell);
299// param2d Jpara = P.fill_array2d<double>("J", "Jpara", {orbitals, next_orbitals}, loc%Lcell);
300// param2d Xpara = P.fill_array2d<double>("X", "Xpara", {orbitals, next_orbitals}, loc%Lcell);
301
302 labellist[loc].push_back(tpara.label);
303 labellist[loc].push_back(Vpara.label);
304// labellist[loc].push_back(Vzpara.label);
305// labellist[loc].push_back(Vxypara.label);
306// labellist[loc].push_back(Jpara.label);
307// labellist[loc].push_back(Xpara.label);
308
309 if (loc < N_sites-1 or !static_cast<bool>(boundary))
310 {
311 for (std::size_t alfa=0; alfa<orbitals; ++alfa)
312 for (std::size_t beta=0; beta<next_orbitals; ++beta)
313 {
314 SiteOperatorQ<Symmetry_,MatrixType> c_sign_local = (F[loc].c(alfa) * F[loc].sign()).template cast<complex<double>>();
315 SiteOperatorQ<Symmetry_,MatrixType> cdag_sign_local = (F[loc].cdag(alfa) * F[loc].sign()).template cast<complex<double>>();
316
317 SiteOperatorQ<Symmetry_,MatrixType> c_tight = F[lp1].c (beta).template cast<complex<double>>();
318 SiteOperatorQ<Symmetry_,MatrixType> cdag_tight = F[lp1].cdag(beta).template cast<complex<double>>();
319
320 SiteOperatorQ<Symmetry_,MatrixType> n_local = F[loc].n(alfa).template cast<complex<double>>();
321 SiteOperatorQ<Symmetry_,MatrixType> n_tight = F[lp1].n(beta).template cast<complex<double>>();
322//
323// SiteOperatorQ<Symmetry_,MatrixType> tz_local = F[loc].Tz(alfa);
324// SiteOperatorQ<Symmetry_,MatrixType> tz_tight = F[lp1].Tz(beta);
325//
326// auto Gloc = static_cast<SUB_LATTICE>(static_cast<int>(pow(-1,loc)));
327// auto Glp1 = static_cast<SUB_LATTICE>(static_cast<int>(pow(-1,lp1)));
328// SiteOperatorQ<Symmetry_,MatrixType> tp_local = F[loc].Tp(alfa,Gloc);
329// SiteOperatorQ<Symmetry_,MatrixType> tm_tight = F[lp1].Tm(beta,Glp1);
330//
331// SiteOperatorQ<Symmetry_,MatrixType> tm_local = F[loc].Tm(alfa,Gloc);
332// SiteOperatorQ<Symmetry_,MatrixType> tp_tight = F[lp1].Tp(beta,Glp1);
333//
334// SiteOperatorQ<Symmetry_,MatrixType> Sdag_local = F[loc].Sdag(alfa);
335// SiteOperatorQ<Symmetry_,MatrixType> S_tight = F[lp1].S (beta);
336//
337// SiteOperatorQ<Symmetry_,MatrixType> PsiLloc = ((F[loc].ns(alfa) * F[loc].c(alfa)) * F[loc].sign());
338// SiteOperatorQ<Symmetry_,MatrixType> PsiRloc = ((F[loc].c(alfa) * F[loc].sign()) * F[loc].ns(alfa));
339// SiteOperatorQ<Symmetry_,MatrixType> PsiLlp1 = (F[lp1].ns(beta) * F[lp1].c(beta));
340// SiteOperatorQ<Symmetry_,MatrixType> PsiRlp1 = (F[lp1].c(beta) * F[lp1].ns(beta));
341// SiteOperatorQ<Symmetry_,MatrixType> PsidagLloc = ((F[loc].cdag(alfa) * F[loc].sign()) * F[loc].ns(alfa));
342// SiteOperatorQ<Symmetry_,MatrixType> PsidagRloc = ((F[loc].ns(alfa) * F[loc].cdag(alfa)) * F[loc].sign());
343// SiteOperatorQ<Symmetry_,MatrixType> PsidagLlp1 = (F[lp1].cdag(beta) * F[lp1].ns(beta));
344// SiteOperatorQ<Symmetry_,MatrixType> PsidagRlp1 = (F[lp1].ns(beta) * F[lp1].cdag(beta));
345
346 //hopping
347 pushlist.push_back(std::make_tuple(loc,
348 Mpo<Symmetry_,complex<double>>::get_N_site_interaction(cdag_sign_local, c_tight), -std::sqrt(2.)*tpara(alfa,beta)));
349 pushlist.push_back(std::make_tuple(loc,
350 Mpo<Symmetry_,complex<double>>::get_N_site_interaction(c_sign_local, cdag_tight), -std::sqrt(2.)*tpara(alfa,beta)));
351
352// //density-density interaction
353 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,complex<double>>::get_N_site_interaction(n_local, n_tight), complex<double>(Vpara(alfa,beta),0.)));
354//
355// //isospin-isospin interaction
356// pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(tp_local, tm_tight), 0.5*Vxypara(alfa,beta)));
357// pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(tm_local, tp_tight), 0.5*Vxypara(alfa,beta)));
358// pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(tz_local, tz_tight), Vzpara (alfa,beta)));
359//
360// //spin-spin interaction
361// pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(Sdag_local, S_tight), std::sqrt(3.)*Jpara(alfa,beta)));
362//
363// //correlated hopping
364// pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(PsidagLloc, PsiRlp1), -std::sqrt(2.)*Xpara(alfa,beta)));
365// pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(PsidagRloc, PsiLlp1), -std::sqrt(2.)*Xpara(alfa,beta)));
366// pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(PsiLloc, PsidagRlp1), -std::sqrt(2.)*Xpara(alfa,beta)));
367// pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(PsiRloc, PsidagLlp1), -std::sqrt(2.)*Xpara(alfa,beta)));
368 }
369 }
370 }
371
372// // Next-nearest-neighbour terms: t'
373// if (!P.HAS("tFull"))
374// {
375// param2d tPrime = P.fill_array2d<double>("tPrime", "tPrime_array", {orbitals, nextn_orbitals}, loc%Lcell);
376// labellist[loc].push_back(tPrime.label);
377//
378// if (loc < N_sites-2 or !static_cast<bool>(boundary))
379// {
380// for (std::size_t alfa=0; alfa<orbitals; ++alfa)
381// for (std::size_t beta=0; beta<nextn_orbitals; ++beta)
382// {
383// SiteOperatorQ<Symmetry_,MatrixType> c_sign_local = (F[loc].c(alfa) * F[loc].sign());
384// SiteOperatorQ<Symmetry_,MatrixType> cdag_sign_local = (F[loc].cdag(alfa) * F[loc].sign());
385//
386// SiteOperatorQ<Symmetry_,MatrixType> sign_tight = F[lp1].sign();
387//
388// SiteOperatorQ<Symmetry_,MatrixType> c_nextn = F[lp2].c(beta);
389// SiteOperatorQ<Symmetry_,MatrixType> cdag_nextn = F[lp2].cdag(beta);
390//
391// pushlist.push_back(std::make_tuple(loc,
392// Mpo<Symmetry_,double>::get_N_site_interaction(cdag_sign_local, sign_tight, c_nextn),
393// -std::sqrt(2.)*tPrime(alfa,beta)));
394// pushlist.push_back(std::make_tuple(loc,
395// Mpo<Symmetry_,double>::get_N_site_interaction(c_sign_local, sign_tight, cdag_nextn),
396// -std::sqrt(2.)*tPrime(alfa,beta)));
397// }
398// }
399// }
400//
401// // Next-next-nearest-neighbour terms: t''
402// if (!P.HAS("tFull"))
403// {
404// param2d tPrimePrime = P.fill_array2d<double>("tPrimePrime", "tPrimePrime_array", {orbitals, nnextn_orbitals}, loc%Lcell);
405// labellist[loc].push_back(tPrimePrime.label);
406//
407// if (loc < N_sites-3 or !static_cast<bool>(boundary))
408// {
409// SiteOperatorQ<Symmetry_,MatrixType> sign_tight = F[lp1].sign();
410// SiteOperatorQ<Symmetry_,MatrixType> sign_nextn = F[lp2].sign();
411//
412// for (std::size_t alfa=0; alfa<orbitals; ++alfa)
413// for (std::size_t beta=0; beta<nnextn_orbitals; ++beta)
414// {
415// SiteOperatorQ<Symmetry_,MatrixType> c_sign_local = (F[loc].c(alfa) * F[loc].sign());
416// SiteOperatorQ<Symmetry_,MatrixType> cdag_sign_local = (F[loc].cdag(alfa) * F[loc].sign());
417//
418// SiteOperatorQ<Symmetry_,MatrixType> c_nnextn = F[lp3].c(beta);
419// SiteOperatorQ<Symmetry_,MatrixType> cdag_nnextn = F[lp3].cdag(beta);
420//
421// pushlist.push_back(std::make_tuple(loc,
422// Mpo<Symmetry_,double>::get_N_site_interaction(cdag_sign_local, sign_tight, sign_nextn, c_nnextn),
423// -std::sqrt(2.)*tPrimePrime(alfa,beta)));
424// pushlist.push_back(std::make_tuple(loc,
425// Mpo<Symmetry_,double>::get_N_site_interaction(c_sign_local, sign_tight, sign_nextn, cdag_nnextn),
426// -std::sqrt(2.)*tPrimePrime(alfa,beta)));
427// }
428// }
429// }
430 }
431}
432
433} // end namespace VMPS::models
434
435#endif
MODEL_FAMILY
Definition: DmrgTypedefs.h:96
@ HUBBARD
Definition: DmrgTypedefs.h:96
BC
Definition: DmrgTypedefs.h:161
std::enable_if< Dummy::IS_SPIN_SU2() and!Dummy::IS_CHARGE_SU2(), Mpo< Sym::S1xS2< Sym::SU2< Sym::SpinSU2 >, Sym::U1< Sym::ChargeU1 > >, complex< double > > >::type P(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
Mpo< Sym::S1xS2< Sym::SU2< Sym::SpinSU2 >, Sym::U1< Sym::ChargeU1 > >, complex< double > > Id() const
vector< FermionBase< Sym::S1xS2< Sym::SU2< Sym::SpinSU2 >, Sym::U1< Sym::ChargeU1 > > > > F
std::size_t N_phys
Definition: MpoTerms.h:400
std::size_t N_sites
Definition: MpoTerms.h:395
DMRG::VERBOSITY::OPTION VERB
Definition: MpoTerms.h:102
MpoTerms< Symmetry, OtherScalar > cast()
Definition: MpoTerms.h:3076
std::string label
Definition: MpoTerms.h:615
Definition: Mpo.h:40
static std::vector< T > get_N_site_interaction(T const &Op0, Operator const &... Ops)
Definition: Mpo.h:117
Definition: U1.h:25
static const map< string, any > defaults
Eigen::Matrix< complex< double >, Eigen::Dynamic, Eigen::Dynamic > MatrixType
static qarray< 2 > singlet(int N=0)
static void set_operators(const std::vector< FermionBase< Symmetry_ > > &F, const ParamHandler &P, PushType< SiteOperator< Symmetry_, complex< double > >, complex< double > > &pushlist, std::vector< std::vector< std::string > > &labellist, const BC boundary=BC::OPEN)
static constexpr MODEL_FAMILY FAMILY
Sym::S1xS2< Sym::SU2< Sym::SpinSU2 >, Sym::U1< Sym::ChargeU1 > > Symmetry
PeierlsHubbardSU2xU1(Mpo< Symmetry, complex< double > > &Mpo_input, const vector< Param > &params)
static const map< string, any > sweep_defaults
static constexpr int spinfac
#define MAKE_TYPEDEFS(MODEL)
Definition: macros.h:4
const bool COMPRESS
Definition: DmrgTypedefs.h:499
const bool NON_UNITARY
Definition: DmrgTypedefs.h:495
const bool FERMIONIC
Definition: DmrgTypedefs.h:496
const bool HERMITIAN
Definition: DmrgTypedefs.h:492
const bool BOSONIC
Definition: DmrgTypedefs.h:498
Definition: qarray.h:26