VMPS++
Loading...
Searching...
No Matches
HubbardSU2xU1.h
Go to the documentation of this file.
1#ifndef HUBBARDMODELSU2XU1_H_
2#define HUBBARDMODELSU2XU1_H_
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{
19
44class HubbardSU2xU1 : public Mpo<Sym::S1xS2<Sym::SU2<Sym::SpinSU2>,Sym::U1<Sym::ChargeU1> > ,double>,
45 public HubbardObservables<Sym::S1xS2<Sym::SU2<Sym::SpinSU2>,Sym::U1<Sym::ChargeU1> > >,
46 public ParamReturner
47{
48public:
49
52 typedef Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> MatrixType;
54
55//private:
56
57 typedef Eigen::Index Index;
59
60public:
61
64
65 HubbardSU2xU1(Mpo<Symmetry> &Mpo_input, const vector<Param> &params)
66 :Mpo<Symmetry>(Mpo_input),
69 {
70 ParamHandler P(params,HubbardSU2xU1::defaults);
71 size_t Lcell = P.size();
72 N_phys = 0;
73 for (size_t l=0; l<N_sites; ++l) N_phys += P.get<size_t>("Ly",l%Lcell);
74 this->precalc_TwoSiteData();
75 this->HERMITIAN = true;
76 this->HAMILTONIAN = true;
77 };
78
79 HubbardSU2xU1 (const size_t &L, const vector<Param> &params, const BC &boundary=BC::OPEN, const DMRG::VERBOSITY::OPTION &VERB=DMRG::VERBOSITY::OPTION::ON_EXIT);
81
91 template<typename Symmetry_>
92 static void set_operators (const std::vector<FermionBase<Symmetry_> > &F, const ParamHandler &P,
93 PushType<SiteOperator<Symmetry_,double>,double>& pushlist, std::vector<std::vector<std::string>>& labellist,
94 const BC boundary=BC::OPEN);
95
96 static qarray<2> singlet (int N=0, int L=0) {return qarray<2>{1,N};};
97 static constexpr MODEL_FAMILY FAMILY = HUBBARD;
98 static constexpr int spinfac = 1;
99
100 static const map<string,any> defaults;
101 static const map<string,any> sweep_defaults;
102};
103
104// V is standard next-nearest neighbour density interaction
105// Vz and Vxy are anisotropic isospin-isospin next-nearest neighbour interaction
106const map<string,any> HubbardSU2xU1::defaults =
107{
108 {"t",1.}, {"tPrime",0.}, {"tRung",1.}, {"tPrimePrime",0.},
109 {"mu",0.}, {"t0",0.},
110 {"U",0.}, {"Uph",0.},
111 {"V",0.}, {"Vext",0.}, {"Vrung",0.},
112 {"Vz",0.}, {"Vzrung",0.}, {"Vxy",0.}, {"Vxyrung",0.},
113 {"J",0.}, {"Jperp",0.},
114 {"X",0.}, {"Xrung",0.},
115 {"REMOVE_DOUBLE",false}, {"REMOVE_EMPTY",false}, {"REMOVE_UP",false}, {"REMOVE_DN",false}, {"mfactor",1}, {"k",0},
116 {"maxPower",2ul}, {"CYLINDER",false}, {"Ly",1ul}
117};
118
119const map<string,any> HubbardSU2xU1::sweep_defaults =
120{
121 {"max_alpha",100.}, {"min_alpha",1.}, {"lim_alpha",21ul}, {"eps_svd",1e-7},
122 {"Mincr_abs", 50ul}, {"Mincr_per", 4ul}, {"Mincr_rel", 1.1},
123 {"min_Nsv",0ul}, {"max_Nrich",-1},
124 {"max_halfsweeps",24ul}, {"min_halfsweeps",1ul},
125 {"Minit",2ul}, {"Qinit",2ul}, {"Mlimit",1000ul},
126 {"tol_eigval",1e-7}, {"tol_state",1e-6},
127 {"savePeriod",0ul}, {"CALC_S_ON_EXIT", true}, {"CONVTEST", DMRG::CONVTEST::VAR_2SITE}
128};
129
131HubbardSU2xU1 (const size_t &L, const vector<Param> &params, const BC &boundary, const DMRG::VERBOSITY::OPTION &VERB)
132:Mpo<Symmetry> (L, qarray<Symmetry::Nq>({1,0}), "", PROP::HERMITIAN, PROP::NON_UNITARY, boundary, VERB),
135{
136 ParamHandler P(params,defaults);
137 size_t Lcell = P.size();
138
139 for (size_t l=0; l<N_sites; ++l)
140 {
141 N_phys += P.get<size_t>("Ly",l%Lcell);
142 setLocBasis(F[l].get_basis().qloc(),l);
143 }
144
145 param1d U = P.fill_array1d<double>("U", "Uorb", F[0].orbitals(), 0);
146 if (isfinite(U.a.sum()))
147 {
148 this->set_name("Hubbard");
149 }
150 else
151 {
152 this->set_name("U=∞-Hubbard");
153 }
154
156 std::vector<std::vector<std::string>> labellist;
157 set_operators(F, P, pushlist, labellist, boundary);
158
159 this->construct_from_pushlist(pushlist, labellist, Lcell);
160 this->finalize(PROP::COMPRESS, P.get<size_t>("maxPower"));
161
162 this->precalc_TwoSiteData();
163}
164
165template<typename Symmetry_>
167set_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)
168{
169 std::size_t Lcell = P.size();
170 std::size_t N_sites = F.size();
171 if(labellist.size() != N_sites) {labellist.resize(N_sites);}
172
173 for (std::size_t loc=0; loc<N_sites; ++loc)
174 {
175 size_t lp1 = (loc+1)%N_sites;
176 size_t lp2 = (loc+2)%N_sites;
177 size_t lp3 = (loc+3)%N_sites;
178
179 std::size_t orbitals = F[loc].orbitals();
180 std::size_t next_orbitals = F[lp1].orbitals();
181 std::size_t nextn_orbitals = F[lp2].orbitals();
182 std::size_t nnextn_orbitals = F[lp3].orbitals();
183
184 stringstream ss;
185 ss << "Ly=" << P.get<size_t>("Ly",loc%Lcell);
186 labellist[loc].push_back(ss.str());
187
188 auto push_full = [&N_sites, &loc, &F, &P, &pushlist, &labellist, &boundary] (string xxxFull, string label,
189 const vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > &first,
190 const vector<vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > > &last,
191 vector<double> factor, bool FERMIONIC) -> void
192 {
193 ArrayXXd Full = P.get<Eigen::ArrayXXd>(xxxFull);
194 vector<vector<std::pair<size_t,double> > > R = Geometry2D::rangeFormat(Full);
195
196 if (static_cast<bool>(boundary)) {assert(R.size() == N_sites and "Use an (N_sites)x(N_sites) hopping matrix for open BC!");}
197 else {assert(R.size() >= 2*N_sites and "Use at least a (2*N_sites)x(N_sites) hopping matrix for infinite BC!");}
198
199 for (size_t j=0; j<first.size(); j++)
200 for (size_t h=0; h<R[loc].size(); ++h)
201 {
202 size_t range = R[loc][h].first;
203 double value = R[loc][h].second;
204
205 if (range != 0)
206 {
207 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > ops(range+1);
208 ops[0] = first[j];
209 for (size_t i=1; i<range; ++i)
210 {
211 if (FERMIONIC) {ops[i] = F[(loc+i)%N_sites].sign();}
212 else {ops[i] = F[(loc+i)%N_sites].Id();}
213 }
214 ops[range] = last[j][(loc+range)%N_sites];
215 pushlist.push_back(std::make_tuple(loc, ops, factor[j] * value));
216 }
217 }
218
219 stringstream ss;
220 ss << label << "(" << Geometry2D::hoppingInfo(Full) << ")";
221 labellist[loc].push_back(ss.str());
222 };
223
224 if (P.HAS("tFull"))
225 {
226 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> c_sign_local = (F[loc].c(0) * F[loc].sign());
227 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> cdag_sign_local = (F[loc].cdag(0) * F[loc].sign());
228 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > c_ranges(N_sites); for (size_t i=0; i<N_sites; i++) {c_ranges[i] = F[i].c(0);}
229 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > cdag_ranges(N_sites); for (size_t i=0; i<N_sites; i++) {cdag_ranges[i] = F[i].cdag(0);}
230
231 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > first {cdag_sign_local,c_sign_local};
232 vector<vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > > last {c_ranges,cdag_ranges};
233 push_full("tFull", "tᵢⱼ", first, last, {-std::sqrt(2.), -std::sqrt(2.)}, PROP::FERMIONIC);
234 }
235 if (P.HAS("tFullA"))
236 {
237 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> c_sign_local = (F[loc].c(1) * F[loc].sign_local(1));
238 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> cdag_sign_local = (F[loc].cdag(1) * F[loc].sign_local(1));
239 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > c_ranges(N_sites); for (size_t i=0; i<N_sites; i++) {c_ranges[i] = F[i].c(1);}
240 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > cdag_ranges(N_sites); for (size_t i=0; i<N_sites; i++) {cdag_ranges[i] = F[i].cdag(1);}
241
242 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > first {cdag_sign_local,c_sign_local};
243 vector<vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > > last {c_ranges,cdag_ranges};
244 push_full("tFullA", "tAᵢⱼ", first, last, {-std::sqrt(2.), -std::sqrt(2.)}, PROP::FERMIONIC);
245 }
246 if (P.HAS("Vzfull"))
247 {
248 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > first {F[loc].Tz(0)};
249 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > Tz_ranges(N_sites); for (size_t i=0; i<N_sites; i++) {Tz_ranges[i] = F[i].Tz(0);}
250 vector<vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > > last {Tz_ranges};
251 push_full("Vzfull", "Vzᵢⱼ", first, last, {1.}, PROP::BOSONIC);
252 }
253 if (P.HAS("Vxyfull"))
254 {
255 auto Gloc = static_cast<SUB_LATTICE>(static_cast<int>(pow(-1,loc)));
256 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > first {F[loc].Tp(0,Gloc), F[loc].Tm(0,Gloc)};
257 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > Tp_ranges(N_sites);
258 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > Tm_ranges(N_sites);
259 for (size_t i=0; i<N_sites; i++)
260 {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);}
261
262 vector<vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > > last {Tm_ranges, Tp_ranges};
263 push_full("Vxyfull", "Vxyᵢⱼ", first, last, {0.5,0.5}, PROP::BOSONIC);
264 }
265 if (P.HAS("VextFull"))
266 {
267 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > first {F[loc].n(0)};
268 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > n_ranges(N_sites); for (size_t i=0; i<N_sites; i++) {n_ranges[i] = F[i].n(0);}
269 vector<vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > > last {n_ranges};
270 push_full("VextFull", "Vextᵢⱼ", first, last, {1.}, PROP::BOSONIC);
271 }
272 if (P.HAS("Jfull"))
273 {
274 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > first {F[loc].Sdag(0)};
275 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > S_ranges(N_sites); for (size_t i=0; i<N_sites; i++) {S_ranges[i] = F[i].S(0);}
276 vector<vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > > last {S_ranges};
277 push_full("Jfull", "Jᵢⱼ", first, last, {std::sqrt(3.)}, PROP::BOSONIC);
278 }
279 if (P.HAS("Xfull"))
280 {
281 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> PsiLloc = ((F[loc].ns() * F[loc].c()) * F[loc].sign());
282 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> PsiRloc = ((F[loc].c() * F[loc].sign()) * F[loc].ns());
283
284 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > PsiLran(N_sites); for(size_t i=0; i<N_sites; i++) {PsiLran[i] = (F[i].ns() * F[i].c());}
285 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > PsiRran(N_sites); for(size_t i=0; i<N_sites; i++) {PsiRran[i] = (F[i].c() * F[i].ns());}
286
287 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> PsidagLloc = ((F[loc].cdag() * F[loc].sign()) * F[loc].ns());
288 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> PsidagRloc = ((F[loc].ns() * F[loc].cdag()) * F[loc].sign());
289
290 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > PsidagLran(N_sites); for(size_t i=0; i<N_sites; i++) {PsidagLran[i] = (F[i].cdag() * F[i].ns());}
291 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > PsidagRran(N_sites); for(size_t i=0; i<N_sites; i++) {PsidagRran[i] = (F[i].ns() * F[i].cdag());}
292
293 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > first {PsidagLloc,PsidagRloc,PsiLloc,PsiRloc};
294 vector<vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > > last {PsiRran,PsiLran,PsidagRran,PsidagLran};
295 push_full("Xfull", "Xᵢⱼ", first, last, {-std::sqrt(2.), -std::sqrt(2.), -std::sqrt(2.), -std::sqrt(2.)}, PROP::FERMIONIC);
296 }
297 if (P.HAS("Bfull"))
298 {
299 ArrayXXd Bfull = P.get<Eigen::ArrayXXd>("Bfull");
300 vector<vector<std::pair<size_t,double> > > R = Geometry2D::rangeFormat(Bfull);
301
302 if (static_cast<bool>(boundary)) {assert(R.size() == N_sites and "Use an (N_sites)x(N_sites) hopping matrix for open BC!");}
303 else {assert(R.size() >= 2*N_sites and "Use at least a (2*N_sites)x(N_sites) hopping matrix for infinite BC!");}
304
305 for (size_t h=0; h<R[loc].size(); ++h)
306 {
307 size_t range = R[loc][h].first;
308 double value = R[loc][h].second;
309 cout << "range=" << range << ", value=" << value << endl;
310
311 if (range != 0)
312 {
313 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > ops(range+2);
314 ops[0] = F[loc].cdag(0) * F[loc].sign();
315// if (range>=2)
316 {
317 ops[1] = F[loc+1].cdag(0);
318 for (size_t i=2; i<=range-1; ++i)
319 {
320 ops[i] = F[(loc+i)%N_sites].Id();
321 }
322 ops[range] = F[(loc+range)%N_sites].c(0) * F[(loc+range)%N_sites].sign();
323 ops[range+1] = F[(loc+range+1)%N_sites].c(0);
324 pushlist.push_back(std::make_tuple(loc, ops, -value));
325 }
326 }
327 }
328
329 for (size_t h=0; h<R[loc].size(); ++h)
330 {
331 size_t range = R[loc][h].first;
332 double value = R[loc][h].second;
333
334 if (range != 0)
335 {
336 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > ops(range+2);
337 ops[0] = F[loc].c(0) * F[loc].sign();
338// if (range>=2)
339 {
340 ops[1] = F[loc+1].c(0);
341 for (size_t i=2; i<=range-1; ++i)
342 {
343 ops[i] = F[(loc+i)%N_sites].Id();
344 }
345 ops[range] = F[(loc+range)%N_sites].cdag(0) * F[(loc+range)%N_sites].sign();
346 ops[range+1] = F[(loc+range+1)%N_sites].cdag(0);
347 pushlist.push_back(std::make_tuple(loc, ops, -value));
348 }
349 }
350 }
351 }
352
353 // Local terms: U, t0, μ, t⟂, V⟂, J⟂
354
355 param1d U = P.fill_array1d<double>("U", "Uorb", orbitals, loc%Lcell);
356 param1d Uph = P.fill_array1d<double>("Uph", "Uphorb", orbitals, loc%Lcell);
357 param1d t0 = P.fill_array1d<double>("t0", "t0orb", orbitals, loc%Lcell);
358 param1d mu = P.fill_array1d<double>("mu", "muorb", orbitals, loc%Lcell);
359 param2d tperp = P.fill_array2d<double>("tRung", "t", "tPerp", orbitals, loc%Lcell, P.get<bool>("CYLINDER"));
360 param2d Vperp = P.fill_array2d<double>("VRung", "V", "VPerp", orbitals, loc%Lcell, P.get<bool>("CYLINDER"));
361 param2d Vzperp = P.fill_array2d<double>("VzRung", "Vz", "VzPerp", orbitals, loc%Lcell, P.get<bool>("CYLINDER"));
362 param2d Vxyperp = P.fill_array2d<double>("VxyRung", "Vxy", "VxyPerp", orbitals, loc%Lcell, P.get<bool>("CYLINDER"));
363 param2d Jperp = P.fill_array2d<double>("JRung", "J", "JPerp", orbitals, loc%Lcell, P.get<bool>("CYLINDER"));
364
365 labellist[loc].push_back(U.label);
366 labellist[loc].push_back(Uph.label);
367 labellist[loc].push_back(t0.label);
368 labellist[loc].push_back(mu.label);
369 labellist[loc].push_back(tperp.label);
370 labellist[loc].push_back(Vperp.label);
371 labellist[loc].push_back(Vzperp.label);
372 labellist[loc].push_back(Vxyperp.label);
373 labellist[loc].push_back(Jperp.label);
374
376 (
377 F[loc].template HubbardHamiltonian<double>(U.a, Uph.a, t0.a-mu.a, tperp.a, Vperp.a, Vzperp.a, Vxyperp.a, Jperp.a)
378 );
379 pushlist.push_back(std::make_tuple(loc, Hloc, 1.));
380
381 // Nearest-neighbour terms: t, V, J
382
383 if (!P.HAS("tFull") and !P.HAS("Vzfull") and !P.HAS("Vxyfull") and !P.HAS("Jfull") and !P.HAS("Xfull"))
384 {
385 param2d tpara = P.fill_array2d<double>("t", "tPara", {orbitals, next_orbitals}, loc%Lcell);
386 param2d Vpara = P.fill_array2d<double>("V", "Vpara", {orbitals, next_orbitals}, loc%Lcell);
387 param2d Vzpara = P.fill_array2d<double>("Vz", "Vzpara", {orbitals, next_orbitals}, loc%Lcell);
388 param2d Vxypara = P.fill_array2d<double>("Vxy", "Vxypara", {orbitals, next_orbitals}, loc%Lcell);
389 param2d Jpara = P.fill_array2d<double>("J", "Jpara", {orbitals, next_orbitals}, loc%Lcell);
390 param2d Xpara = P.fill_array2d<double>("X", "Xpara", {orbitals, next_orbitals}, loc%Lcell);
391
392 labellist[loc].push_back(tpara.label);
393 labellist[loc].push_back(Vpara.label);
394 labellist[loc].push_back(Vzpara.label);
395 labellist[loc].push_back(Vxypara.label);
396 labellist[loc].push_back(Jpara.label);
397 labellist[loc].push_back(Xpara.label);
398
399 if (loc < N_sites-1 or !static_cast<bool>(boundary))
400 {
401 for (std::size_t alfa=0; alfa<orbitals; ++alfa)
402 for (std::size_t beta=0; beta<next_orbitals; ++beta)
403 {
404 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> c_sign_local = (F[loc].c(alfa) * F[loc].sign());
405 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> cdag_sign_local = (F[loc].cdag(alfa) * F[loc].sign());
406
407 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> c_tight = F[lp1].c (beta);
408 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> cdag_tight = F[lp1].cdag(beta);
409
410 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> n_local = F[loc].n(alfa);
411 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> n_tight = F[lp1].n(beta);
412
413 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> tz_local = F[loc].Tz(alfa);
414 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> tz_tight = F[lp1].Tz(beta);
415
416 auto Gloc = static_cast<SUB_LATTICE>(static_cast<int>(pow(-1,loc)));
417 auto Glp1 = static_cast<SUB_LATTICE>(static_cast<int>(pow(-1,lp1)));
418 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> tp_local = F[loc].Tp(alfa,Gloc);
419 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> tm_tight = F[lp1].Tm(beta,Glp1);
420
421 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> tm_local = F[loc].Tm(alfa,Gloc);
422 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> tp_tight = F[lp1].Tp(beta,Glp1);
423
424 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> Sdag_local = F[loc].Sdag(alfa);
425 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> S_tight = F[lp1].S (beta);
426
427 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> PsiLloc = ((F[loc].ns(alfa) * F[loc].c(alfa)) * F[loc].sign());
428 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> PsiRloc = ((F[loc].c(alfa) * F[loc].sign()) * F[loc].ns(alfa));
429 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> PsiLlp1 = (F[lp1].ns(beta) * F[lp1].c(beta));
430 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> PsiRlp1 = (F[lp1].c(beta) * F[lp1].ns(beta));
431 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> PsidagLloc = ((F[loc].cdag(alfa) * F[loc].sign()) * F[loc].ns(alfa));
432 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> PsidagRloc = ((F[loc].ns(alfa) * F[loc].cdag(alfa)) * F[loc].sign());
433 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> PsidagLlp1 = (F[lp1].cdag(beta) * F[lp1].ns(beta));
434 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> PsidagRlp1 = (F[lp1].ns(beta) * F[lp1].cdag(beta));
435
436 //hopping
437 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(cdag_sign_local, c_tight), -std::sqrt(2.)*tpara(alfa,beta)));
438 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(c_sign_local, cdag_tight), -std::sqrt(2.)*tpara(alfa,beta)));
439
440 //density-density interaction
441 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(n_local, n_tight), Vpara(alfa,beta)));
442
443 //isospin-isopsin interaction
444 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(tp_local, tm_tight), 0.5*Vxypara(alfa,beta)));
445 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(tm_local, tp_tight), 0.5*Vxypara(alfa,beta)));
446 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(tz_local, tz_tight), Vzpara (alfa,beta)));
447
448 //spin-spin interaction
449 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(Sdag_local, S_tight), std::sqrt(3.)*Jpara(alfa,beta)));
450
451 //correlated hopping
452 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(PsidagLloc, PsiRlp1), -std::sqrt(2.)*Xpara(alfa,beta)));
453 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(PsidagRloc, PsiLlp1), -std::sqrt(2.)*Xpara(alfa,beta)));
454 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(PsiLloc, PsidagRlp1), -std::sqrt(2.)*Xpara(alfa,beta)));
455 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(PsiRloc, PsidagLlp1), -std::sqrt(2.)*Xpara(alfa,beta)));
456 }
457 }
458 }
459
460 // Next-nearest-neighbour terms: t'
461 if (!P.HAS("tFull"))
462 {
463 param2d tPrime = P.fill_array2d<double>("tPrime", "tPrime_array", {orbitals, nextn_orbitals}, loc%Lcell);
464 labellist[loc].push_back(tPrime.label);
465
466 if (loc < N_sites-2 or !static_cast<bool>(boundary))
467 {
468 for (std::size_t alfa=0; alfa<orbitals; ++alfa)
469 for (std::size_t beta=0; beta<nextn_orbitals; ++beta)
470 {
471 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> c_sign_local = (F[loc].c(alfa) * F[loc].sign());
472 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> cdag_sign_local = (F[loc].cdag(alfa) * F[loc].sign());
473
474 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> sign_tight = F[lp1].sign();
475
476 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> c_nextn = F[lp2].c(beta);
477 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> cdag_nextn = F[lp2].cdag(beta);
478
479 pushlist.push_back(std::make_tuple(loc,
480 Mpo<Symmetry_,double>::get_N_site_interaction(cdag_sign_local, sign_tight, c_nextn),
481 -std::sqrt(2.)*tPrime(alfa,beta)));
482 pushlist.push_back(std::make_tuple(loc,
483 Mpo<Symmetry_,double>::get_N_site_interaction(c_sign_local, sign_tight, cdag_nextn),
484 -std::sqrt(2.)*tPrime(alfa,beta)));
485 }
486 }
487 }
488
489 // Next-next-nearest-neighbour terms: t''
490 if (!P.HAS("tFull"))
491 {
492 param2d tPrimePrime = P.fill_array2d<double>("tPrimePrime", "tPrimePrime_array", {orbitals, nnextn_orbitals}, loc%Lcell);
493 labellist[loc].push_back(tPrimePrime.label);
494
495 if (loc < N_sites-3 or !static_cast<bool>(boundary))
496 {
497 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> sign_tight = F[lp1].sign();
498 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> sign_nextn = F[lp2].sign();
499
500 for (std::size_t alfa=0; alfa<orbitals; ++alfa)
501 for (std::size_t beta=0; beta<nnextn_orbitals; ++beta)
502 {
503 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> c_sign_local = (F[loc].c(alfa) * F[loc].sign());
504 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> cdag_sign_local = (F[loc].cdag(alfa) * F[loc].sign());
505
506 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> c_nnextn = F[lp3].c(beta);
507 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> cdag_nnextn = F[lp3].cdag(beta);
508
509 pushlist.push_back(std::make_tuple(loc,
510 Mpo<Symmetry_,double>::get_N_site_interaction(cdag_sign_local, sign_tight, sign_nextn, c_nnextn),
511 -std::sqrt(2.)*tPrimePrime(alfa,beta)));
512 pushlist.push_back(std::make_tuple(loc,
513 Mpo<Symmetry_,double>::get_N_site_interaction(c_sign_local, sign_tight, sign_nextn, cdag_nnextn),
514 -std::sqrt(2.)*tPrimePrime(alfa,beta)));
515 }
516 }
517 }
518 }
519}
520
521} // end namespace VMPS::models
522
523#endif
MODEL_FAMILY
Definition: DmrgTypedefs.h:96
@ HUBBARD
Definition: DmrgTypedefs.h:96
BC
Definition: DmrgTypedefs.h:161
SUB_LATTICE
Definition: DmrgTypedefs.h:130
std::enable_if< Dummy::IS_SPIN_SU2(), Mpo< Sym::S1xS2< Sym::SU2< Sym::SpinSU2 >, Sym::U1< Sym::ChargeU1 > >, 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::S1xS2< Sym::SU2< Sym::SpinSU2 >, Sym::U1< Sym::ChargeU1 > >, 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 > >, double > ns(size_t locx, size_t locy=0) const
Mpo< Sym::S1xS2< Sym::SU2< Sym::SpinSU2 >, Sym::U1< Sym::ChargeU1 > >, double > Id() const
vector< FermionBase< Sym::S1xS2< Sym::SU2< Sym::SpinSU2 >, Sym::U1< Sym::ChargeU1 > > > > F
std::enable_if< Dummy::IS_SPIN_SU2(), Mpo< Sym::S1xS2< Sym::SU2< Sym::SpinSU2 >, Sym::U1< Sym::ChargeU1 > >, double > >::type cdag(size_t locx, size_t locy=0, double factor=std::sqrt(2.)) const
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
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
void precalc_TwoSiteData(bool FORCE=false)
bool HAMILTONIAN
Definition: Mpo.h:160
bool HERMITIAN
Definition: Mpo.h:159
Definition: U1.h:25
Hubbard Model.
Definition: HubbardSU2xU1.h:47
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixType
Definition: HubbardSU2xU1.h:52
HubbardSU2xU1(Mpo< Symmetry > &Mpo_input, const vector< Param > &params)
Definition: HubbardSU2xU1.h:65
static constexpr int spinfac
Definition: HubbardSU2xU1.h:98
Sym::S1xS2< Sym::SU2< Sym::SpinSU2 >, Sym::U1< Sym::ChargeU1 > > Symmetry
Definition: HubbardSU2xU1.h:50
static const map< string, any > defaults
static const map< string, any > sweep_defaults
static qarray< 2 > singlet(int N=0, int L=0)
Definition: HubbardSU2xU1.h:96
Eigen::Index Index
Definition: HubbardSU2xU1.h:57
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)
static constexpr MODEL_FAMILY FAMILY
Definition: HubbardSU2xU1.h:97
#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
void finalize(bool PRINT_STATS=false)
Definition: functions.h:127
Definition: qarray.h:26