VMPS++
Loading...
Searching...
No Matches
KondoU1xU1.h
Go to the documentation of this file.
1#ifndef STRAWBERRY_KONDOMODEL
2#define STRAWBERRY_KONDOMODEL
3
4//include "bases/FermionBase.h"
5//include "bases/SpinBase.h"
6#include "symmetry/S1xS2.h"
7#include "symmetry/U1.h"
8//include "Mpo.h"
9//include "ParamHandler.h" // from TOOLS
10#include "ParamReturner.h"
12
13namespace VMPS
14{
15
36class KondoU1xU1 : public Mpo<Sym::S1xS2<Sym::U1<Sym::SpinU1>,Sym::U1<Sym::ChargeU1> >,double>,
37 public KondoObservables<Sym::S1xS2<Sym::U1<Sym::SpinU1>,Sym::U1<Sym::ChargeU1> > >,
38 public ParamReturner
39
40{
41public:
44 static constexpr MODEL_FAMILY FAMILY = KONDO;
45
46private:
47 typedef typename Symmetry::qType qType;
48
49public:
50
52 KondoU1xU1 () : Mpo(){};
53 KondoU1xU1 (const size_t &L, const vector<Param> &params, const BC &boundary=BC::OPEN, const DMRG::VERBOSITY::OPTION &VERB=DMRG::VERBOSITY::OPTION::ON_EXIT);
55
56 static qarray<2> singlet (int N) {return qarray<2>{0,N};};
57 static qarray<2> polaron (int L, int N=0) {assert(N%2==0); return qarray<2>{L-N,N};};
58
68 template<typename Symmetry_>
69 static void set_operators (const std::vector<SpinBase<Symmetry_> > &B, const std::vector<FermionBase<Symmetry_> > &F, const ParamHandler &P,
70 PushType<SiteOperator<Symmetry_,double>,double>& pushlist, std::vector<std::vector<std::string>>& labellist, const BC boundary=BC::OPEN);
71
74 bool validate (qType qnum) const;
75
76 static const map<string,any> defaults;
77 static const map<string,any> sweep_defaults;
78};
79
80const map<string,any> KondoU1xU1::defaults =
81{
82 {"t",1.}, {"tPrime",0.}, {"tRung",0.},
83 {"Jxy",0.}, {"Jz",0.}, {"J",1.}, {"Jdir",0.},
84 {"U",0.}, {"Uph",0.}, {"V",0.}, {"Vrung",0.},
85 {"mu",0.}, {"t0",0.},
86 {"Bz",0.}, {"Bzsub",0.}, {"Kz",0.},
87 {"Inext",0.}, {"Iprev",0.}, {"I3next",0.}, {"I3prev",0.}, {"I3loc",0.},
88 {"D",2ul}, {"maxPower",2ul}, {"CYLINDER",false}, {"Ly",1ul}, {"LyF",1ul}
89};
90
91const map<string,any> VMPS::KondoU1xU1::sweep_defaults =
92{
93 {"max_alpha",100.}, {"min_alpha",1.}, {"lim_alpha",11ul}, {"eps_svd",1e-7},
94 {"Dincr_abs",5ul}, {"Dincr_per",2ul}, {"Dincr_rel",1.1},
95 {"min_Nsv",0ul}, {"max_Nrich",-1},
96 {"max_halfsweeps",20ul}, {"min_halfsweeps",6ul},
97 {"Dinit",5ul}, {"Qinit",18ul}, {"Dlimit",100ul},
98 {"tol_eigval",1e-7}, {"tol_state",1e-6},
99 {"savePeriod",0ul}, {"CALC_S_ON_EXIT",true}, {"CONVTEST",DMRG::CONVTEST::VAR_2SITE}
100};
101
103KondoU1xU1 (const size_t &L, const vector<Param> &params, const BC &boundary, const DMRG::VERBOSITY::OPTION &VERB)
104:Mpo<Symmetry> (L, qarray<Symmetry::Nq>({0,0}), "", PROP::HERMITIAN, PROP::NON_UNITARY, boundary, VERB),
107{
108 ParamHandler P(params,defaults);
109 size_t Lcell = P.size();
110
111 for (size_t l=0; l<N_sites; ++l)
112 {
113 N_phys += P.get<size_t>("LyF",l%Lcell);
114 setLocBasis((B[l].get_basis().combine(F[l].get_basis())).qloc(),l);
115 }
116
117 this->set_name("Kondo");
118
120 std::vector<std::vector<std::string>> labellist;
121 set_operators(B, F, P, pushlist, labellist, boundary);
122
123 this->construct_from_pushlist(pushlist, labellist, Lcell);
124 this->finalize(PROP::COMPRESS, P.get<size_t>("maxPower"));
125
126 this->precalc_TwoSiteData();
127}
128
130validate (qType qnum) const
131{
132 frac S_elec(qnum[1],2); //electrons have spin 1/2
133 frac Smax = S_elec;
134 //add local spins to Smax
135 for (size_t l=0; l<N_sites; ++l)
136 {
137 Smax += static_cast<int>(B[l].orbitals()) * frac(B[l].get_D()-1,2);
138 }
139
140 frac S_tot(qnum[0],2);
141 if (Smax.denominator() == S_tot.denominator() and S_tot<=Smax and qnum[1]<=2*static_cast<int>(this->N_phys) and qnum[1]>0) {return true;}
142 else {return false;}
143}
144
145template<typename Symmetry_>
147set_operators (const std::vector<SpinBase<Symmetry_> > &B, const std::vector<FermionBase<Symmetry_> > &F, const ParamHandler &P,
148 PushType<SiteOperator<Symmetry_,double>,double>& pushlist, std::vector<std::vector<std::string>>& labellist, const BC boundary)
149{
150 std::size_t Lcell = P.size();
151 std::size_t N_sites = B.size();
152 if(labellist.size() != N_sites) {labellist.resize(N_sites);}
153
154 for (std::size_t loc=0; loc<N_sites; ++loc)
155 {
156 size_t lm1 = (loc==0)? N_sites-1 : loc-1;
157 size_t lp1 = (loc+1)%N_sites;
158 size_t lp2 = (loc+2)%N_sites;
159
160 std::size_t Fprev_orbitals = F[lm1].orbitals();
161 std::size_t Forbitals = F[loc].orbitals();
162 std::size_t Fnext_orbitals = F[lp1].orbitals();
163 std::size_t Fnextn_orbitals = F[lp2].orbitals();
164
165 std::size_t Bprev_orbitals = B[lm1].orbitals();
166 std::size_t Borbitals = B[loc].orbitals();
167 std::size_t Bnext_orbitals = B[lp1].orbitals();
168 std::size_t Bnextn_orbitals = B[lp2].orbitals();
169
170 stringstream Slabel, LyLabel, LyFlabel;
171 Slabel << "S=" << print_frac_nice(frac(P.get<size_t>("D",loc%Lcell)-1,2));
172 LyLabel << "Ly=" << P.get<size_t>("Ly",loc%Lcell);
173 LyFlabel << "LyF=" << P.get<size_t>("LyF",loc%Lcell);
174 labellist[loc].push_back(Slabel.str());
175 labellist[loc].push_back(LyLabel.str());
176 labellist[loc].push_back(LyFlabel.str());
177
178 auto push_full = [&N_sites, &loc, &B, &F, &P, &pushlist, &labellist, &boundary] (string xxxFull, string label,
179 const vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > &first,
180 const vector<vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > > &last,
181 vector<double> factor, bool FERMIONIC) -> void
182 {
183 ArrayXXd Full = P.get<Eigen::ArrayXXd>(xxxFull);
184 vector<vector<std::pair<size_t,double> > > R = Geometry2D::rangeFormat(Full);
185
186 if (static_cast<bool>(boundary)) {assert(R.size() == N_sites and "Use an (N_sites)x(N_sites) hopping matrix for open BC!");}
187 else {assert(R.size() >= 2*N_sites and "Use at least a (2*N_sites)x(N_sites) hopping matrix for infinite BC!");}
188
189 for (size_t j=0; j<first.size(); j++)
190 for (size_t h=0; h<R[loc].size(); ++h)
191 {
192 size_t range = R[loc][h].first;
193 double value = R[loc][h].second;
194
195 if (range != 0)
196 {
197 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > ops(range+1);
198 ops[0] = first[j];
199 for (size_t i=1; i<range; ++i)
200 {
201 if (FERMIONIC) {ops[i] = kroneckerProduct(B[(loc+i)%N_sites].Id(), F[(loc+i)%N_sites].sign());}
202 else {ops[i] = kroneckerProduct(B[(loc+i)%N_sites].Id(), F[(loc+i)%N_sites].Id());}
203 }
204 ops[range] = last[j][(loc+range)%N_sites];
205 pushlist.push_back(std::make_tuple(loc, ops, factor[j] * value));
206 }
207 }
208
209 stringstream ss;
210 ss << label << "(" << Geometry2D::hoppingInfo(Full) << ")";
211 labellist[loc].push_back(ss.str());
212 };
213
214 if (P.HAS("tFull"))
215 {
216 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> cup_sign_local = kroneckerProduct(B[loc].Id(),F[loc].c(UP,0) * F[loc].sign());
217 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> cdn_sign_local = kroneckerProduct(B[loc].Id(),(F[loc].c(UP,0) * F[loc].sign()));
218 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> cdagup_sign_local = kroneckerProduct(B[loc].Id(),(F[loc].cdag(UP,0) * F[loc].sign()));
219 SiteOperatorQ<Symmetry_,Eigen::MatrixXd> cdagdn_sign_local = kroneckerProduct(B[loc].Id(),(F[loc].cdag(DN,0) * F[loc].sign()));
220 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > cup_ranges(N_sites); for (size_t i=0; i<N_sites; i++) {cup_ranges[i] = kroneckerProduct(B[loc].Id(),F[i].c(UP,0));}
221 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > cdn_ranges(N_sites); for (size_t i=0; i<N_sites; i++) {cdn_ranges[i] = kroneckerProduct(B[loc].Id(),F[i].c(DN,0));}
222 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > cdagup_ranges(N_sites); for (size_t i=0; i<N_sites; i++) {cdagup_ranges[i] = kroneckerProduct(B[loc].Id(),F[i].cdag(UP,0));}
223 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > cdagdn_ranges(N_sites); for (size_t i=0; i<N_sites; i++) {cdagdn_ranges[i] = kroneckerProduct(B[loc].Id(),F[i].cdag(DN,0));}
224
225 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > first {cdagup_sign_local,cdagdn_sign_local,cup_sign_local,cdn_sign_local};
226 vector<vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > > last {cup_ranges,cdn_ranges,cdagup_ranges,cdagdn_ranges};
227 push_full("tFull", "tᵢⱼ", first, last, {-1.,-1.,1.,1.}, PROP::FERMIONIC);
228 }
229
230 if (P.HAS("JdirxyFull"))
231 {
232 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > first {kroneckerProduct(B[loc].Sp(0),F[loc].Id()), kroneckerProduct(B[loc].Sm(0),F[loc].Id())};
233 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > Sp_ranges(N_sites);
234 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > Sm_ranges(N_sites);
235 for (size_t i=0; i<N_sites; i++) {Sp_ranges[i] = kroneckerProduct(B[i].Sp(0),F[loc].Id()); Sm_ranges[i] = kroneckerProduct(B[i].Sm(0),F[loc].Id());}
236
237 vector<vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > > last {Sm_ranges, Sp_ranges};
238 push_full("Jdirxyfull", "Jdirxyᵢⱼ", first, last, {0.5,0.5}, PROP::BOSONIC);
239 }
240
241 if (P.HAS("JdirzFull"))
242 {
243 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > first {kroneckerProduct(B[loc].Sz(0),F[loc].Id())};
244 vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > Sz_ranges(N_sites);
245 for (size_t i=0; i<N_sites; i++) {Sz_ranges[i] = kroneckerProduct(B[i].Sz(0),F[loc].Id());}
246
247 vector<vector<SiteOperatorQ<Symmetry_,Eigen::MatrixXd> > > last {Sz_ranges};
248 push_full("Jdirzfull", "Jdirzᵢⱼ", first, last, {1.0}, PROP::BOSONIC);
249 }
250 // local terms
251
252 // Kondo-J
253 param1d Jxy = P.fill_array1d<double>("Jxy", "Jorbxy", Forbitals, loc%Lcell);
254 labellist[loc].push_back(Jxy.label);
255
256 param1d Jz = P.fill_array1d<double>("Jz", "Jorbz", Forbitals, loc%Lcell);
257 labellist[loc].push_back(Jz.label);
258
259 param1d J = P.fill_array1d<double>("J", "Jorb", Forbitals, loc%Lcell);
260 labellist[loc].push_back(J.label);
261
262 // Hubbard-U
263 param1d U = P.fill_array1d<double>("U", "Uorb", Forbitals, loc%Lcell);
264 labellist[loc].push_back(U.label);
265
266 // Hubbard-Uph
267 param1d Uph = P.fill_array1d<double>("Uph", "Uphorb", Forbitals, loc%Lcell);
268 labellist[loc].push_back(Uph.label);
269
270 // t⟂
271 param2d tPerp = P.fill_array2d<double>("tRung", "t", "tPerp", Forbitals, loc%Lcell, P.get<bool>("CYLINDER"));
272 labellist[loc].push_back(tPerp.label);
273
274 // V⟂
275 param2d Vperp = P.fill_array2d<double>("Vrung", "V", "Vperp", Forbitals, loc%Lcell, P.get<bool>("CYLINDER"));
276 labellist[loc].push_back(Vperp.label);
277
278 // mu
279 param1d mu = P.fill_array1d<double>("mu", "muorb", Forbitals, loc%Lcell);
280 labellist[loc].push_back(mu.label);
281
282 // t0
283 param1d t0 = P.fill_array1d<double>("t0", "t0orb", Forbitals, loc%Lcell);
284 labellist[loc].push_back(t0.label);
285
286 // Kz anisotropy
287 param1d Kz = P.fill_array1d<double>("Kz", "Kzorb", Forbitals, loc%Lcell);
288 labellist[loc].push_back(Kz.label);
289
290 // Bz substrate
291 param1d Bzsub = P.fill_array1d<double>("Bzsub", "Bzsuborb", Forbitals, loc%Lcell);
292 labellist[loc].push_back(Bzsub.label);
293
294 // Bz impurities
295 param1d Bz = P.fill_array1d<double>("Bz", "Bzorb", Forbitals, loc%Lcell);
296 labellist[loc].push_back(Bz.label);
297
298 // I3loc
299 param1d I3loc = P.fill_array1d<double>("I3loc", "I3locOrb", Forbitals, loc%Lcell);
300 labellist[loc].push_back(I3loc.label);
301
302 ArrayXXd Jxyperp = B[loc].ZeroHopping();
303 ArrayXXd Jzperp = B[loc].ZeroHopping();
304 ArrayXd Bxorb = B[loc].ZeroField();
305 ArrayXd muorb = B[loc].ZeroField();
306 ArrayXd nuorb = B[loc].ZeroField();
307 ArrayXd Bxsuborb = F[loc].ZeroField();
308 ArrayXd Kxorb = B[loc].ZeroField();
309 ArrayXXd Dyperp = B[loc].ZeroHopping();
310 ArrayXXd Jperp = F[loc].ZeroHopping();
311 ArrayXXd Vxysubperp = F[loc].ZeroHopping();
312 ArrayXXd Vzsubperp = F[loc].ZeroHopping();
313 ArrayXXd C = F[loc].ZeroHopping();
314
315 if (Borbitals > 0 and Forbitals > 0)
316 {
317 auto Himp = kroneckerProduct(B[loc].HeisenbergHamiltonian(Jxyperp,Jzperp,Bz.a,muorb,nuorb,Kz.a), F[loc].Id());
318 auto Hsub = kroneckerProduct(B[loc].Id(), F[loc].template HubbardHamiltonian<double>(U.a,Uph.a,t0.a-mu.a,Bzsub.a,tPerp.a,Vperp.a,Vzsubperp,Vxysubperp,Jperp,Jperp,C));
319 auto Hloc = Himp + Hsub;
320
321 for (int alfa=0; alfa<Forbitals; ++alfa)
322 {
323 // Kondo Hamiltonian:
324 if (abs(Jxy(alfa)) > 0. or abs(J(alfa)) > 0.)
325 {
326 assert(Forbitals == Borbitals and "Can only do a Kondo ladder with the same amount of spins and fermionic orbitals in y-direction!");
327 Hloc += 0.5*(Jxy(alfa)+J(alfa)) * kroneckerProduct(B[loc].Scomp(SP,alfa), F[loc].Sm(alfa));
328 Hloc += 0.5*(Jxy(alfa)+J(alfa)) * kroneckerProduct(B[loc].Scomp(SM,alfa), F[loc].Sp(alfa));
329 }
330 if (abs(Jz(alfa)) > 0. or abs(J(alfa)))
331 {
332 assert(Forbitals == Borbitals and "Can only do a Kondo ladder with the same amount of spins and fermionic orbitals in y-direction!");
333 Hloc += (Jz(alfa)+J(alfa)) * kroneckerProduct(B[loc].Scomp(SZ,alfa), F[loc].Sz(alfa));
334 }
335 }
336
337 for (int alfa=0; alfa<Forbitals; ++alfa)
338 {
339 if (I3loc(alfa) != 0.)
340 {
341 assert(Forbitals == Borbitals and "Can only do a Kondo ladder with the same amount of spins and fermionic orbitals in y-direction!");
342 Hloc += I3loc(alfa) * kroneckerProduct(B[loc].Scomp(SZ,alfa), F[loc].Sz(alfa));
343 }
344 }
345
346 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(Hloc), 1.));
347 }
348
349 // NN terms
350
351 // t∥
352 param2d tPara = P.fill_array2d<double>("t", "tPara", {Forbitals, Fnext_orbitals}, loc%Lcell);
353 labellist[loc].push_back(tPara.label);
354
355 // V∥
356 param2d Vpara = P.fill_array2d<double>("V", "Vpara", {Forbitals, Fnext_orbitals}, loc%Lcell);
357 labellist[loc].push_back(Vpara.label);
358
359 // JdirPara∥
360 param2d JdirPara = P.fill_array2d<double>("Jdir", "JdirPara", {Borbitals, Bnext_orbitals}, loc%Lcell);
361 labellist[loc].push_back(JdirPara.label);
362
363 if (loc < N_sites-1 or !static_cast<bool>(boundary))
364 {
365 for (std::size_t alfa=0; alfa<Forbitals; ++alfa)
366 for (std::size_t beta=0; beta<Fnext_orbitals; ++beta)
367 {
368 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[loc].Id(), F[loc].cdag(UP,alfa) * F[loc].sign()),
369 kroneckerProduct(B[lp1].Id(), F[lp1].c(UP,beta))),
370 -tPara(alfa,beta)));
371 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[loc].Id(), F[loc].cdag(DN,alfa) * F[loc].sign()),
372 kroneckerProduct(B[lp1].Id(), F[lp1].c(DN,beta))),
373 -tPara(alfa,beta)));
374 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[loc].Id(), -1.*F[loc].c(UP,alfa) * F[loc].sign()),
375 kroneckerProduct(B[lp1].Id(), F[lp1].cdag(UP,beta))),
376 -tPara(alfa,beta)));
377 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[loc].Id(), -1.*F[loc].c(DN,alfa) * F[loc].sign()),
378 kroneckerProduct(B[lp1].Id(), F[lp1].cdag(DN,beta))),
379 -tPara(alfa,beta)));
380 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[loc].Id(), F[loc].n(alfa) * F[loc].sign()),
381 kroneckerProduct(B[lp1].Id(), F[lp1].n(beta))),
382 Vpara(alfa,beta)));
383 }
384
385 for (int alfa=0; alfa<Borbitals; ++alfa)
386 for (int beta=0; beta<Bnext_orbitals; ++beta)
387 {
388 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[loc].Sp(alfa), F[loc].Id()),
389 kroneckerProduct(B[lp1].Sm(beta), F[lp1].Id())),
390 0.5*JdirPara(alfa,beta)));
391 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[loc].Sm(alfa), F[loc].Id()),
392 kroneckerProduct(B[lp1].Sp(beta), F[lp1].Id())),
393 0.5*JdirPara(alfa,beta)));
394 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[loc].Sz(alfa), F[loc].Id()),
395 kroneckerProduct(B[lp1].Sz(beta), F[lp1].Id())),
396 JdirPara(alfa,beta)));
397 }
398 }
399
400 // NN spin exchange terms
401
402 param2d InextPara = P.fill_array2d<double>("Inext", "InextPara", {Borbitals, Fnext_orbitals}, loc%Lcell);
403 labellist[loc].push_back(InextPara.label);
404
405 if (loc < N_sites-1 or !static_cast<bool>(boundary))
406 {
407 for (std::size_t alfa=0; alfa<Borbitals; ++alfa)
408 for (std::size_t beta=0; beta<Fnext_orbitals; ++beta)
409 {
410 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[loc].Sp(alfa), F[loc].Id()),
411 kroneckerProduct(B[lp1].Id(), F[lp1].Sm(beta))),
412 0.5*InextPara(alfa,beta)));
413 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[loc].Sm(alfa), F[loc].Id()),
414 kroneckerProduct(B[lp1].Id(), F[lp1].Sp(beta))),
415 0.5*InextPara(alfa,beta)));
416 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[loc].Sz(alfa), F[loc].Id()),
417 kroneckerProduct(B[lp1].Id(), F[lp1].Sz(beta))),
418 InextPara(alfa,beta)));
419 }
420 }
421
422 param2d IprevPara = P.fill_array2d<double>("Iprev", "IprevPara", {Fprev_orbitals, Borbitals}, loc%Lcell);
423 labellist[loc].push_back(IprevPara.label);
424
425 if (lm1 < N_sites-1 or !static_cast<bool>(boundary))
426 {
427 for (std::size_t alfa=0; alfa<Fprev_orbitals; ++alfa)
428 for (std::size_t beta=0; beta<Borbitals; ++beta)
429 {
430 pushlist.push_back(std::make_tuple(lm1, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[lm1].Sp(alfa), F[lm1].Id()),
431 kroneckerProduct(B[loc].Id(), F[loc].Sm(beta))),
432 0.5*IprevPara(alfa,beta)));
433 pushlist.push_back(std::make_tuple(lm1, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[lm1].Sm(alfa), F[lm1].Id()),
434 kroneckerProduct(B[loc].Id(), F[loc].Sp(beta))),
435 0.5*IprevPara(alfa,beta)));
436 pushlist.push_back(std::make_tuple(lm1, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[lm1].Sz(alfa), F[lm1].Id()),
437 kroneckerProduct(B[loc].Id(), F[loc].Sz(beta))),
438 IprevPara(alfa,beta)));
439 }
440 }
441
442 // NN 3-orbital spin exchange terms
443
444 param2d I3nextPara = P.fill_array2d<double>("I3next", "I3nextPara", {Forbitals, Fnext_orbitals}, loc%Lcell);
445 labellist[loc].push_back(I3nextPara.label);
446
447 if (loc < N_sites-1 or !static_cast<bool>(boundary))
448 {
449 for (std::size_t alfa=0; alfa<Forbitals; ++alfa)
450 for (std::size_t beta=0; beta<Fnext_orbitals; ++beta)
451 {
452 assert(Borbitals == 1);
453 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[loc].Sm(0), F[loc].cdag(UP,alfa) * F[loc].sign()),
454 kroneckerProduct(B[lp1].Id(), F[lp1].c(DN,beta))),
455 0.5*I3nextPara(alfa,beta)));
456 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[loc].Sp(0), F[loc].cdag(DN,alfa) * F[loc].sign()),
457 kroneckerProduct(B[lp1].Id(), F[lp1].c(UP,beta))),
458 0.5*I3nextPara(alfa,beta)));
459 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[loc].Sm(0), -1.*F[loc].c(DN,alfa) * F[loc].sign()),
460 kroneckerProduct(B[lp1].Id(), F[lp1].cdag(UP,beta))),
461 0.5*I3nextPara(alfa,beta)));
462 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[loc].Sp(0), -1.*F[loc].c(UP,alfa) * F[loc].sign()),
463 kroneckerProduct(B[lp1].Id(), F[lp1].cdag(DN,beta))),
464 0.5*I3nextPara(alfa,beta)));
465 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[loc].Sz(0), F[loc].Id()),
466 kroneckerProduct(B[lp1].Id(), F[lp1].Sz(beta))),
467 I3nextPara(alfa,beta)));
468 }
469 }
470
471 param2d I3prevPara = P.fill_array2d<double>("I3prev", "I3prevPara", {Fprev_orbitals, Forbitals}, loc%Lcell);
472 labellist[loc].push_back(I3prevPara.label);
473
474 if (lm1 < N_sites-1 or !static_cast<bool>(boundary))
475 {
476 for (std::size_t alfa=0; alfa<Fprev_orbitals; ++alfa)
477 for (std::size_t beta=0; beta<Forbitals; ++beta)
478 {
479 assert(Borbitals == 1);
480 pushlist.push_back(std::make_tuple(lm1, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[lm1].Id(), F[lm1].cdag(UP,alfa) * F[lm1].sign()),
481 kroneckerProduct(B[loc].Sm(0), F[loc].c(DN,beta))),
482 0.5*I3nextPara(alfa,beta)));
483 pushlist.push_back(std::make_tuple(lm1, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[lm1].Id(), F[lm1].cdag(DN,alfa) * F[lm1].sign()),
484 kroneckerProduct(B[loc].Sp(0), F[loc].c(UP,beta))),
485 0.5*I3nextPara(alfa,beta)));
486 pushlist.push_back(std::make_tuple(lm1, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[lm1].Id(), -1.*F[lm1].c(DN,alfa) * F[lm1].sign()),
487 kroneckerProduct(B[lp1].Sm(0), F[lp1].cdag(UP,beta))),
488 0.5*I3nextPara(alfa,beta)));
489 pushlist.push_back(std::make_tuple(lm1, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[lm1].Id(), -1.*F[lm1].c(UP,alfa) * F[lm1].sign()),
490 kroneckerProduct(B[loc].Sp(0), F[loc].cdag(DN,beta))),
491 0.5*I3nextPara(alfa,beta)));
492 pushlist.push_back(std::make_tuple(lm1, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[lm1].Id(), F[lm1].Sz(alfa)),
493 kroneckerProduct(B[loc].Sz(0), F[loc].Id())),
494 I3nextPara(alfa,beta)));
495 }
496 }
497
498 // NNN terms
499
500 param2d tPrime = P.fill_array2d<double>("tPrime", "tPrime_array", {Forbitals, Fnextn_orbitals}, loc%Lcell);
501 labellist[loc].push_back(tPrime.label);
502
503 if (loc < N_sites-2 or !static_cast<bool>(boundary))
504 {
505 for (std::size_t alfa=0; alfa<Forbitals; ++alfa)
506 for (std::size_t beta=0; beta<Fnextn_orbitals; ++beta)
507 {
508 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[loc].Id(), F[loc].cdag(UP,alfa) * F[loc].sign()),
509 kroneckerProduct(B[lp1].Id(), F[lp1].sign()),
510 kroneckerProduct(B[lp2].Id(), F[lp2].c(UP,beta))),
511 -tPrime(alfa,beta)));
512 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[loc].Id(), F[loc].cdag(DN,alfa) * F[loc].sign()),
513 kroneckerProduct(B[lp1].Id(), F[lp1].sign()),
514 kroneckerProduct(B[lp2].Id(), F[lp2].c(DN,beta))),
515 -tPrime(alfa,beta)));
516 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[loc].Id(), -1.*F[loc].c(UP,alfa) * F[loc].sign()),
517 kroneckerProduct(B[lp1].Id(), F[lp1].sign()),
518 kroneckerProduct(B[lp2].Id(), F[lp2].cdag(UP,beta))),
519 -tPrime(alfa,beta)));
520 pushlist.push_back(std::make_tuple(loc, Mpo<Symmetry_,double>::get_N_site_interaction(kroneckerProduct(B[loc].Id(), -1.*F[loc].c(DN,alfa) * F[loc].sign()),
521 kroneckerProduct(B[lp1].Id(), F[lp1].sign()),
522 kroneckerProduct(B[lp2].Id(), F[lp2].cdag(DN,beta))),
523 -tPrime(alfa,beta)));
524 }
525 }
526 }
527}
528
529//template<typename Symmetry_>
530//HamiltonianTermsXd<Symmetry_> KondoU1xU1::
531//set_operators (const vector<SpinBase<Symmetry_> > &B, const vector<FermionBase<Symmetry_> > &F, const ParamHandler &P, size_t loc)
532//{
533// HamiltonianTermsXd<Symmetry_> Terms;
534//
535// frac S = frac(B[loc].get_D()-1,2);
536// stringstream Slabel;
537// Slabel << "S=" << print_frac_nice(S);
538// Terms.info.push_back(Slabel.str());
539//
540// auto save_label = [&Terms] (string label)
541// {
542// if (label!="") {Terms.info.push_back(label);}
543// };
544//
545// size_t lp1 = (loc+1)%F.size();
546//
547// // NN terms
548//
549// auto [t,tPara,tlabel] = P.fill_array2d<double>("t","tPara",{{F[loc].orbitals(),F[lp1].orbitals()}},loc);
550// save_label(tlabel);
551//
552// auto [V,Vpara,Vlabel] = P.fill_array2d<double>("V","Vpara",{{F[loc].orbitals(),F[lp1].orbitals()}},loc);
553// save_label(Vlabel);
554//
555// for (int i=0; i<F[loc].orbitals(); ++i)
556// for (int j=0; j<F[lp1].orbitals(); ++j)
557// {
558// if (tPara(i,j) != 0.)
559// {
560// Terms.tight.push_back(make_tuple(-tPara(i,j),
561// kroneckerProduct(B[loc].Id(), F[loc].cdag(UP,i) * F[loc].sign()),
562// kroneckerProduct(B[loc].Id(), F[loc].c(UP,i))
563// ));
564// Terms.tight.push_back(make_tuple(-tPara(i,j),
565// kroneckerProduct(B[loc].Id(), F[loc].cdag(DN,i) * F[loc].sign()),
566// kroneckerProduct(B[loc].Id(), F[loc].c(DN,i))
567// ));
568// Terms.tight.push_back(make_tuple(-tPara(i,j),
569// kroneckerProduct(B[loc].Id(), -1.*F[loc].c(UP,i) * F[loc].sign()),
570// kroneckerProduct(B[loc].Id(), F[loc].cdag(UP,i))
571// ));
572// Terms.tight.push_back(make_tuple(-tPara(i,j),
573// kroneckerProduct(B[loc].Id(), -1.*F[loc].c(DN,i) * F[loc].sign()),
574// kroneckerProduct(B[loc].Id(), F[loc].cdag(DN,i))
575// ));
576// }
577//
578// if (Vpara(i,j) != 0.)
579// {
580// if (Vpara(i,j) != 0.)
581// {
582// Terms.tight.push_back(make_tuple(Vpara(i,j),
583// kroneckerProduct(B[loc].Id(),F[loc].n(i)),
584// kroneckerProduct(B[loc].Id(),F[loc].n(i))
585// ));
586// }
587// }
588// }
589//
590// // NN spin exchange terms
591//
592// auto [Inext,InextPara,InextLabel] = P.fill_array2d<double>("Inext","InextPara",{{B[loc].orbitals(),F[lp1].orbitals()}},loc);
593// save_label(InextLabel);
594//
595// auto [I3next,I3nextPara,I3nextLabel] = P.fill_array2d<double>("I3next","I3nextPara",{{B[loc].orbitals(),F[lp1].orbitals()}},loc);
596// save_label(I3nextLabel);
597//
598// for (int i=0; i<B[loc].orbitals(); ++i)
599// for (int j=0; j<F[lp1].orbitals(); ++j)
600// {
601// if (InextPara(i,j) != 0.)
602// {
603// Terms.tight.push_back(make_tuple(0.5*InextPara(i,j),
604// kroneckerProduct(B[loc].Scomp(SP,i), F[loc].Id()),
605// kroneckerProduct(B[loc].Id(), F[loc].Sm(i))
606// ));
607// Terms.tight.push_back(make_tuple(0.5*InextPara(i,j),
608// kroneckerProduct(B[loc].Scomp(SM,i), F[loc].Id()),
609// kroneckerProduct(B[loc].Id(), F[loc].Sp(i))
610// ));
611// Terms.tight.push_back(make_tuple(InextPara(i,j),
612// kroneckerProduct(B[loc].Scomp(SZ,i), F[loc].Id()),
613// kroneckerProduct(B[loc].Id(), F[loc].Sz(i))
614// ));
615// }
616//
617// if (I3nextPara(i,j) != 0.)
618// {
619// Terms.tight.push_back(make_tuple(0.5*I3nextPara(i,j),
620// kroneckerProduct(B[loc].Scomp(SM,i), F[loc].cdag(UP,i) * F[loc].sign()),
621// kroneckerProduct(B[loc].Id(), F[loc].c(DN,i))
622// ));
623// Terms.tight.push_back(make_tuple(0.5*I3nextPara(i,j),
624// kroneckerProduct(B[loc].Scomp(SP,i), F[loc].cdag(DN,i) * F[loc].sign()),
625// kroneckerProduct(B[loc].Id(), F[loc].c(UP,i))
626// ));
627// Terms.tight.push_back(make_tuple(0.5*I3nextPara(i,j),
628// kroneckerProduct(B[loc].Scomp(SM,i), -1.*F[loc].c(DN,i) * F[loc].sign()),
629// kroneckerProduct(B[loc].Id(), F[loc].cdag(UP,i))
630// ));
631// Terms.tight.push_back(make_tuple(0.5*I3nextPara(i,j),
632// kroneckerProduct(B[loc].Scomp(SP,i), -1.*F[loc].c(UP,i) * F[loc].sign()),
633// kroneckerProduct(B[loc].Id(), F[loc].cdag(DN,i))
634// ));
635// Terms.tight.push_back(make_tuple(I3nextPara(i,j),
636// kroneckerProduct(B[loc].Scomp(SZ,i), F[loc].Id()),
637// kroneckerProduct(B[loc].Id(), F[loc].Sz(i))
638// ));
639// }
640// }
641//
642// auto [Iprev,IprevPara,IprevLabel] = P.fill_array2d<double>("Iprev","IprevPara",{{F[loc].orbitals(),B[lp1].orbitals()}},loc);
643// save_label(IprevLabel);
644//
645// auto [I3prev,I3prevPara,I3prevLabel] = P.fill_array2d<double>("I3prev","I3prevPara",{{B[loc].orbitals(),F[lp1].orbitals()}},loc);
646// save_label(I3prevLabel);
647//
648// for (int i=0; i<F[loc].orbitals(); ++i)
649// for (int j=0; j<B[lp1].orbitals(); ++j)
650// {
651// if (IprevPara(i,j) != 0.)
652// {
653// Terms.tight.push_back(make_tuple(0.5*IprevPara(i,j),
654// kroneckerProduct(B[loc].Id(), F[loc].Sm(i)),
655// kroneckerProduct(B[loc].Scomp(SP,i), F[loc].Id())
656// ));
657// Terms.tight.push_back(make_tuple(0.5*IprevPara(i,j),
658// kroneckerProduct(B[loc].Id(), F[loc].Sp(i)),
659// kroneckerProduct(B[loc].Scomp(SM,i), F[loc].Id())
660// ));
661// Terms.tight.push_back(make_tuple(IprevPara(i,j),
662// kroneckerProduct(B[loc].Id(), F[loc].Sz(i)),
663// kroneckerProduct(B[loc].Scomp(SZ,i), F[loc].Id())
664// ));
665// }
666//
667// if (I3prevPara(i,j) != 0.)
668// {
669// Terms.tight.push_back(make_tuple(0.5*I3prevPara(i,j),
670// kroneckerProduct(B[loc].Id(), F[loc].cdag(UP,i) * F[loc].sign()),
671// kroneckerProduct(B[loc].Scomp(SM,i), F[loc].c(DN,i))
672// ));
673// Terms.tight.push_back(make_tuple(0.5*I3prevPara(i,j),
674// kroneckerProduct(B[loc].Id(), F[loc].cdag(DN,i) * F[loc].sign()),
675// kroneckerProduct(B[loc].Scomp(SP,i), F[loc].c(UP,i))
676// ));
677// Terms.tight.push_back(make_tuple(0.5*I3prevPara(i,j),
678// kroneckerProduct(B[loc].Id(), -1.*F[loc].c(DN,i) * F[loc].sign()),
679// kroneckerProduct(B[loc].Scomp(SM,i), F[loc].cdag(UP,i))
680// ));
681// Terms.tight.push_back(make_tuple(0.5*I3prevPara(i,j),
682// kroneckerProduct(B[loc].Id(), -1.*F[loc].c(UP,i) * F[loc].sign()),
683// kroneckerProduct(B[loc].Scomp(SP,i), F[loc].cdag(DN,i))
684// ));
685// Terms.tight.push_back(make_tuple(I3prevPara(i,j),
686// kroneckerProduct(B[loc].Id(), F[loc].Sz(i)),
687// kroneckerProduct(B[loc].Scomp(SZ,i), F[loc].Id())
688// ));
689// }
690// }
691//
692// // NNN terms
693//
694// param0d tPrime = P.fill_array0d<double>("tPrime","tPrime",loc);
695// save_label(tPrime.label);
696//
697// if (tPrime.x!=0)
698// {
699// assert(F[loc].orbitals() <= 1 and "Cannot do a ladder with t' terms!");
700//
701// Terms.nextn.push_back(make_tuple(-tPrime.x,
702// kroneckerProduct(B[loc].Id(),F[loc].cdag(UP,0) * F[loc].sign()),
703// kroneckerProduct(B[loc].Id(),F[loc].c(UP,0)),
704// kroneckerProduct(B[loc].Id(),F[loc].sign())
705// ));
706// Terms.nextn.push_back(make_tuple(-tPrime.x,
707// kroneckerProduct(B[loc].Id(),F[loc].cdag(DN,0) * F[loc].sign()),
708// kroneckerProduct(B[loc].Id(),F[loc].c(DN,0)),
709// kroneckerProduct(B[loc].Id(),F[loc].sign())
710// ));
711// Terms.nextn.push_back(make_tuple(-tPrime.x,
712// kroneckerProduct(B[loc].Id(),-1.*F[loc].c(UP,0) * F[loc].sign()),
713// kroneckerProduct(B[loc].Id(),F[loc].cdag(UP,0)),
714// kroneckerProduct(B[loc].Id(),F[loc].sign())
715// ));
716// Terms.nextn.push_back(make_tuple(-tPrime.x,
717// kroneckerProduct(B[loc].Id(),-1.*F[loc].c(DN,0) * F[loc].sign()),
718// kroneckerProduct(B[loc].Id(),F[loc].cdag(DN,0)),
719// kroneckerProduct(B[loc].Id(),F[loc].sign())
720// ));
721// }
722//
723// // local terms
724//
725// // t⟂
726// auto [tRung,tPerp,tPerplabel] = P.fill_array2d<double>("tRung","t","tPerp",F[loc].orbitals(),loc,P.get<bool>("CYLINDER"));
727// save_label(tPerplabel);
728//
729// // V⟂
730// auto [Vrung,Vperp,Vperplabel] = P.fill_array2d<double>("Vrung","V","Vperp",F[loc].orbitals(),loc,P.get<bool>("CYLINDER"));
731// save_label(Vperplabel);
732//
733// // Hubbard U
734// auto [U,Uorb,Ulabel] = P.fill_array1d<double>("U","Uorb",F[loc].orbitals(),loc);
735// save_label(Ulabel);
736//
737// // mu
738// auto [mu,muorb,mulabel] = P.fill_array1d<double>("mu","muorb",F[loc].orbitals(),loc);
739// save_label(mulabel);
740//
741// // t0
742// auto [t0,t0orb,t0label] = P.fill_array1d<double>("t0","t0orb",F[loc].orbitals(),loc);
743// save_label(t0label);
744//
745// // Kz anisotropy
746// auto [Kz,Kzorb,Kzlabel] = P.fill_array1d<double>("Kz","Kzorb",F[loc].orbitals(),loc);
747// save_label(Kzlabel);
748//
749// // Bz substrate
750// auto [Bzsub,Bzsuborb,Bzsublabel] = P.fill_array1d<double>("Bzsub","Bzsuborb",F[loc].orbitals(),loc);
751// save_label(Bzsublabel);
752//
753// // Bz impurities
754// auto [Bz,Bzorb,Bzlabel] = P.fill_array1d<double>("Bz","Bzorb",F[loc].orbitals(),loc);
755// save_label(Bzlabel);
756//
757// ArrayXXd Jxyperp = B[loc].ZeroHopping();
758// ArrayXXd Jzperp = B[loc].ZeroHopping();
759// ArrayXd Bxorb = B[loc].ZeroField();
760// ArrayXd Bxsuborb = F[loc].ZeroField();
761// ArrayXd Kxorb = B[loc].ZeroField();
762// ArrayXXd Dyperp = B[loc].ZeroHopping();
763// ArrayXXd Jperp = F[loc].ZeroHopping();
764//
765// if (B[loc].orbitals() > 0 and F[loc].orbitals() > 0)
766// {
767// auto Himp = kroneckerProduct(B[loc].HeisenbergHamiltonian(Jxyperp,Jzperp,Bzorb,Bxorb,Kzorb,Kxorb,Dyperp), F[loc].Id());
768// auto Hsub = kroneckerProduct(B[loc].Id(), F[loc].template HubbardHamiltonian<double>(Uorb,t0orb-muorb,Bzsuborb,Bxsuborb,tPerp,Vperp,Jperp));
769// auto Hloc = Himp + Hsub;
770//
771// // Kondo-J
772// auto [J,Jorb,Jlabel] = P.fill_array1d<double>("J","Jorb",F[loc].orbitals(),loc);
773// save_label(Jlabel);
774//
775// for (int i=0; i<F[loc].orbitals(); ++i)
776// {
777// if (Jorb(i) != 0.)
778// {
779// Hloc += 0.5*Jorb(i) * kroneckerProduct(B[loc].Scomp(SP,i), F[loc].Sm(i));
780// Hloc += 0.5*Jorb(i) * kroneckerProduct(B[loc].Scomp(SM,i), F[loc].Sp(i));
781// Hloc += Jorb(i) * kroneckerProduct(B[loc].Scomp(SZ,i), F[loc].Sz(i));
782// }
783// }
784//
785// auto [I3loc,I3locOrb,I3locLabel] = P.fill_array1d<double>("I3loc","I3locOrb",F[loc].orbitals(),loc);
786// save_label(I3locLabel);
787//
788// for (int i=0; i<F[loc].orbitals(); ++i)
789// {
790// if (I3locOrb(i) != 0.)
791// {
792// Hloc += I3locOrb(i) * kroneckerProduct(B[loc].Scomp(SZ,i), F[loc].Sz(i));
793// }
794// }
795//
796// Terms.local.push_back(make_tuple(1.,Hloc));
797// }
798//
799// Terms.name = "Kondo";
800//
801// return Terms;
802//}
803
804} //end namespace VMPS
805
806#endif
boost::rational< int > frac
Definition: DmrgExternal.h:11
std::string print_frac_nice(frac r)
Definition: DmrgExternal.h:32
@ DN
Definition: DmrgTypedefs.h:38
@ UP
Definition: DmrgTypedefs.h:37
MODEL_FAMILY
Definition: DmrgTypedefs.h:96
@ KONDO
Definition: DmrgTypedefs.h:96
@ SZ
Definition: DmrgTypedefs.h:60
@ SP
Definition: DmrgTypedefs.h:60
@ SM
Definition: DmrgTypedefs.h:60
BC
Definition: DmrgTypedefs.h:161
@ B
Definition: DmrgTypedefs.h:130
SiteOperator< Symmetry, Scalar_ > kroneckerProduct(const SiteOperator< Symmetry, Scalar_ > &O1, const SiteOperator< Symmetry, Scalar_ > &O2)
Definition: SiteOperator.h:164
std::enable_if< Dummy::IS_SPIN_SU2(), Mpo< Sym::S1xS2< Sym::U1< Sym::SpinU1 >, Sym::U1< Sym::ChargeU1 > > > >::type cdag(size_t locx, size_t locy=0, double factor=std::sqrt(2.)) const
std::enable_if< Dummy::IS_SPIN_SU2(), Mpo< Sym::S1xS2< Sym::U1< Sym::SpinU1 >, Sym::U1< Sym::ChargeU1 > > > >::type c(size_t locx, size_t locy=0, double factor=1.) const
vector< SpinBase< Sym::S1xS2< Sym::U1< Sym::SpinU1 >, Sym::U1< Sym::ChargeU1 > > > > B
std::enable_if<!Dummy::IS_SPIN_SU2(), Mpo< Sym::S1xS2< Sym::U1< Sym::SpinU1 >, Sym::U1< Sym::ChargeU1 > > > >::type Sz(size_t locx, size_t locy=0) const
vector< FermionBase< Sym::S1xS2< Sym::U1< Sym::SpinU1 >, Sym::U1< Sym::ChargeU1 > > > > F
std::enable_if<!Dummy::IS_SPIN_SU2(), Mpo< Sym::S1xS2< Sym::U1< Sym::SpinU1 >, Sym::U1< Sym::ChargeU1 > > > >::type n(size_t locx, size_t locy=0) const
std::enable_if<!Dummy::IS_SPIN_SU2(), Mpo< Sym::S1xS2< Sym::U1< Sym::SpinU1 >, Sym::U1< Sym::ChargeU1 > > > >::type Scomp(SPINOP_LABEL Sa, size_t locx, size_t locy=0, double factor=1.) const
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
Definition: U1.h:25
Kondo Model.
Definition: KondoU1xU1.h:40
Sym::S1xS2< Sym::U1< Sym::SpinU1 >, Sym::U1< Sym::ChargeU1 > > Symmetry
Definition: KondoU1xU1.h:42
static const map< string, any > defaults
Definition: KondoU1xU1.h:76
Symmetry::qType qType
Definition: KondoU1xU1.h:47
static constexpr MODEL_FAMILY FAMILY
Definition: KondoU1xU1.h:44
static void set_operators(const std::vector< SpinBase< Symmetry_ > > &B, 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)
Definition: KondoU1xU1.h:147
static qarray< 2 > polaron(int L, int N=0)
Definition: KondoU1xU1.h:57
static const map< string, any > sweep_defaults
Definition: KondoU1xU1.h:77
static qarray< 2 > singlet(int N)
Definition: KondoU1xU1.h:56
bool validate(qType qnum) const
Definition: KondoU1xU1.h:130
#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