1#ifndef KONDOOBSERVABLES
2#define KONDOOBSERVABLES
7#include "ParamHandler.h"
10template<
typename Symmetry>
20 KondoObservables (
const size_t &L,
const vector<Param> ¶ms,
const map<string,any> &defaults);
24 template<
class Dummy = Symmetry>
25 typename std::enable_if<Dummy::IS_SPIN_SU2(),
Mpo<Symmetry> >::type
c (
size_t locx,
size_t locy=0,
double factor=1.)
const;
27 template<SPIN_INDEX sigma,
class Dummy = Symmetry>
28 typename std::enable_if<!Dummy::IS_SPIN_SU2(),
Mpo<Symmetry> >::type
c (
size_t locx,
size_t locy=0,
double factor=1.)
const;
30 template<
class Dummy = Symmetry>
31 typename std::enable_if<Dummy::IS_SPIN_SU2(),
Mpo<Symmetry>>::type
cdag (
size_t locx,
size_t locy=0,
double factor=std::sqrt(2.))
const;
33 template<SPIN_INDEX sigma,
class Dummy = Symmetry>
34 typename std::enable_if<!Dummy::IS_SPIN_SU2(),
Mpo<Symmetry> >::type
cdag (
size_t locx,
size_t locy=0,
double factor=1.)
const;
38 template<
class Dummy = Symmetry>
39 typename std::enable_if<!Dummy::IS_CHARGE_SU2(),
Mpo<Symmetry> >::type
cc (
size_t locx,
size_t locy=0)
const;
40 template<
class Dummy = Symmetry>
41 typename std::enable_if<!Dummy::IS_CHARGE_SU2(),
Mpo<Symmetry> >::type
cdagcdag (
size_t locx,
size_t locy=0)
const;
43 template<
typename Dummy = Symmetry>
44 typename std::conditional<Dummy::IS_SPIN_SU2(),
Mpo<Symmetry>, vector<Mpo<Symmetry> > >::type
cdagc (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0)
const;
46 template<SPIN_INDEX sigma,
typename Dummy = Symmetry>
47 typename std::enable_if<!Dummy::IS_SPIN_SU2(),
Mpo<Symmetry> >::type
cdagc (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0)
const;
52 template<SPIN_INDEX sigma1, SPIN_INDEX sigma2,
typename Dummy = Symmetry>
53 typename std::enable_if<Dummy::ABELIAN,Mpo<Symmetry> >::type
cdagcdag (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0)
const;
55 template<SPIN_INDEX sigma1, SPIN_INDEX sigma2,
typename Dummy = Symmetry>
56 typename std::enable_if<Dummy::ABELIAN,Mpo<Symmetry> >::type
cc (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0)
const;
58 template<
typename Dummy = Symmetry>
59 typename std::conditional<Dummy::IS_SPIN_SU2(),
Mpo<Symmetry>, vector<Mpo<Symmetry> > >::type
60 cc3 (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0)
const;
61 template<
typename Dummy = Symmetry>
62 typename std::conditional<Dummy::IS_SPIN_SU2(),
Mpo<Symmetry>, vector<Mpo<Symmetry> > >::type
63 cdagcdag3 (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0)
const;
66 template<
class Dummy = Symmetry>
67 typename std::enable_if<!Dummy::IS_CHARGE_SU2(),
Mpo<Symmetry> >::type
d (
size_t locx,
size_t locy=0)
const;
68 template<
class Dummy = Symmetry>
74 template<
class Dummy = Symmetry>
75 typename std::enable_if<!Dummy::IS_CHARGE_SU2(),
Mpo<Symmetry> >::type
s (
size_t locx,
size_t locy=0)
const;
77 template<SPIN_INDEX sigma,
typename Dummy = Symmetry>
78 typename std::enable_if<!Dummy::IS_SPIN_SU2(),
Mpo<Symmetry> >::type
n (
size_t locx,
size_t locy=0)
const;
82 template<SPIN_INDEX sigma1, SPIN_INDEX sigma2,
typename Dummy = Symmetry>
83 typename std::enable_if<!Dummy::IS_SPIN_SU2(),
Mpo<Symmetry> >::type
nn (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0)
const;
85 Mpo<Symmetry> nn (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0)
const;
87 template<
typename Dummy = Symmetry>
88 typename std::enable_if<!Dummy::IS_CHARGE_SU2(),
Mpo<Symmetry> >::type
hh (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0)
const;
92 template<
typename Dummy = Symmetry>
93 typename std::enable_if<Dummy::IS_CHARGE_SU2(),
Mpo<Symmetry> >::type
T (
size_t locx,
size_t locy=0,
double factor=1.)
const;
94 template<
typename Dummy = Symmetry>
95 typename std::enable_if<Dummy::IS_CHARGE_SU2(),
Mpo<Symmetry> >::type
Tdag (
size_t locx,
size_t locy=0,
double factor=std::sqrt(3.))
const;
96 template<
typename Dummy = Symmetry>
97 typename std::enable_if<!Dummy::IS_CHARGE_SU2(),
Mpo<Symmetry> >::type
Tp (
size_t locx,
size_t locy=0)
const;
98 template<
typename Dummy = Symmetry>
99 typename std::enable_if<!Dummy::IS_CHARGE_SU2(),
Mpo<Symmetry> >::type
Tm (
size_t locx,
size_t locy=0)
const;
100 template<
typename Dummy = Symmetry>
101 typename std::enable_if<Dummy::NO_CHARGE_SYM(),
Mpo<Symmetry> >::type
Tx (
size_t locx,
size_t locy=0)
const;
102 template<
typename Dummy = Symmetry>
103 typename std::enable_if<Dummy::NO_CHARGE_SYM(),
Mpo<Symmetry> >::type
iTy (
size_t locx,
size_t locy=0)
const;
104 template<
typename Dummy = Symmetry>
105 typename std::enable_if<!Dummy::IS_CHARGE_SU2(),
Mpo<Symmetry> >::type
Tz (
size_t locx,
size_t locy=0)
const;
106 template<
typename Dummy = Symmetry>
107 typename std::enable_if<!Dummy::IS_CHARGE_SU2(),
Mpo<Symmetry> >::type
TpTm (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0,
double fac=1.)
const;
108 template<
typename Dummy = Symmetry>
109 typename std::enable_if<!Dummy::IS_CHARGE_SU2(),
Mpo<Symmetry> >::type
TmTp (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0,
double fac=1.)
const;
110 template<
typename Dummy = Symmetry>
111 typename std::enable_if<!Dummy::IS_CHARGE_SU2(),
Mpo<Symmetry> >::type
TzTz (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0)
const;
112 template<
typename Dummy = Symmetry>
113 typename std::conditional<Dummy::IS_CHARGE_SU2(),
Mpo<Symmetry>, vector<Mpo<Symmetry> > >::type
TdagT (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0)
const;
117 template<
typename Dummy = Symmetry>
118 typename std::enable_if<Dummy::IS_SPIN_SU2(),
Mpo<Symmetry> >::type
Simp (
size_t locx,
size_t locy=0,
double factor=1.)
const;
119 template<
typename Dummy = Symmetry>
120 typename std::enable_if<Dummy::IS_SPIN_SU2(),
Mpo<Symmetry> >::type
Ssub (
size_t locx,
size_t locy=0,
double factor=1.)
const;
121 template<
typename Dummy = Symmetry>
122 typename std::enable_if<Dummy::IS_SPIN_SU2(),
Mpo<Symmetry> >::type
Simpdag (
size_t locx,
size_t locy=0,
double factor=std::sqrt(3.))
const;
123 template<
typename Dummy = Symmetry>
125 template<
typename Dummy = Symmetry>
128 template<
typename Dummy = Symmetry>
129 typename std::enable_if<Dummy::IS_SPIN_SU2(),
Mpo<Symmetry> >::type
S (
size_t locx,
size_t locy=0,
double factor=1.)
const
130 {
return Simp(locx,locy,factor);};
132 template<
typename Dummy = Symmetry>
134 {
return Simp(
SZ,locx,locy,factor);}
136 template<
typename Dummy = Symmetry>
137 typename std::enable_if<!Dummy::IS_SPIN_SU2(),
Mpo<Symmetry> >::type
Sz (
size_t locx,
size_t locy=0)
const {
return Simp(
SZ,locx,locy,1.);}
138 template<
typename Dummy = Symmetry>
140 template<
typename Dummy = Symmetry>
142 template<
typename Dummy = Symmetry>
144 template<
typename Dummy = Symmetry>
145 typename std::conditional<Dummy::IS_SPIN_SU2(),
Mpo<Symmetry>, vector<Mpo<Symmetry> > >::type
SimpSimp (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0)
const;
146 template<
typename Dummy = Symmetry>
147 typename std::conditional<Dummy::IS_SPIN_SU2(),
Mpo<Symmetry>, vector<Mpo<Symmetry> > >::type
SsubSsub (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0)
const;
148 template<
typename Dummy = Symmetry>
149 typename std::conditional<Dummy::IS_SPIN_SU2(),
Mpo<Symmetry>, vector<Mpo<Symmetry> > >::type
SimpSsub (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0)
const;
150 template<
typename Dummy = Symmetry>
151 typename std::conditional<Dummy::IS_SPIN_SU2(),
Mpo<Symmetry>, vector<Mpo<Symmetry> > >::type
SdagS (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0)
const {
return SimpSimp(locx1,locx2,locy1,locy2);}
152 template<
typename Dummy = Symmetry>
153 typename std::conditional<Dummy::IS_SPIN_SU2(),
Mpo<Symmetry>, vector<Mpo<Symmetry> > >::type
SimpdagSimp (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0)
const {
return SimpSimp(locx1,locx2,locy1,locy2);}
154 template<
typename Dummy = Symmetry>
155 typename std::conditional<Dummy::IS_SPIN_SU2(),
Mpo<Symmetry>, vector<Mpo<Symmetry> > >::type
SsubdagSsub (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0)
const {
return SsubSsub(locx1,locx2,locy1,locy2);}
156 template<
typename Dummy = Symmetry>
157 typename std::conditional<Dummy::IS_SPIN_SU2(),
Mpo<Symmetry>, vector<Mpo<Symmetry> > >::type
SimpdagSsub (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0)
const {
return SimpSsub(locx1,locx2,locy1,locy2);}
162 template<
typename Dummy = Symmetry>
163 typename std::enable_if<!Dummy::IS_SPIN_SU2(),
Mpo<Symmetry> >::type
Stringz (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0)
const;
164 template<
typename Dummy = Symmetry>
165 typename std::enable_if<!Dummy::IS_SPIN_SU2(),
Mpo<Symmetry> >::type
StringzDimer (
size_t locx1,
size_t locx2,
size_t locy1=0,
size_t locy2=0)
const;
167 template<
typename Dummy = Symmetry>
169 template<
typename Dummy = Symmetry>
171 template<
typename Dummy = Symmetry>
173 template<
typename Dummy = Symmetry>
175 template<
typename Dummy = Symmetry>
176 typename std::enable_if<Dummy::IS_SPIN_SU2() and !Dummy::IS_CHARGE_SU2(),
Mpo<Symmetry,complex<
double> > >::type
c_ky (vector<complex<
double> > phases,
double factor=1.) const;
177 template<typename Dummy = Symmetry>
178 typename
std::enable_if<Dummy::IS_SPIN_SU2() and !Dummy::IS_CHARGE_SU2(),
Mpo<Symmetry,complex<
double> > >::type
cdag_ky (vector<complex<
double> > phases,
double factor=sqrt(2.)) const;
198 bool FERMIONIC=false,
bool HERMITIAN=false) const;
201 double factor,
bool FERMIONIC,
bool HERMITIAN) const;
203 Mpo<Symmetry,complex<
double> >
213template<typename Symmetry>
220template<
typename Symmetry>
222KondoObservables (
const size_t &L,
const vector<Param> ¶ms,
const map<string,any> &defaults)
224 ParamHandler P(params,defaults);
225 size_t Lcell = P.size();
226 B.resize(L);
F.resize(L);
228 for (
size_t l=0; l<L; ++l)
230 B[l] =
SpinBase<Symmetry> (P.get<
size_t>(
"Ly",l%Lcell), P.get<
size_t>(
"D",l%Lcell), P.get<
int>(
"mfactor",l%Lcell));
232 P.get<
bool>(
"REMOVE_DOUBLE",l%Lcell),
233 P.get<
bool>(
"REMOVE_EMPTY",l%Lcell),
234 P.get<
bool>(
"REMOVE_UP",l%Lcell),
235 P.get<
bool>(
"REMOVE_DN",l%Lcell),
236 P.get<
int>(
"mfactor",l%Lcell),
237 P.get<
int>(
"k",l%Lcell));
241 if (P.HAS(
"G")) {
G = P.get<vector<SUB_LATTICE> >(
"G");}
245 for (
int l=1; l<L; l+=1) G[l] = static_cast<SUB_LATTICE>(-1*
G[l-1]);
251template<
typename Symmetry>
255 assert(locx<
F.size() and locy<
F[locx].dim());
258 ss << Op.
label() <<
"(" << locx <<
"," << locy;
259 if (factor != 1.) ss <<
",factor=" << factor;
263 for (
size_t l=0; l<
F.size(); ++l) {Mout.
setLocBasis(
B[l].get_basis().combine(
F[l].get_basis()).qloc(),l);}
271 else if (SUBSYS ==
IMP)
273 assert(!FERMIONIC and
"Impurity cannot be fermionic!");
279 vector<SiteOperator<Symmetry,double> > Signs(locx);
280 for (
size_t l=0; l<locx; ++l) {Signs[l] =
kroneckerProduct(
B[l].Id(),
F[l].sign()).template plain<double>();}
282 Mout.
setLocal(locx, (factor * OpExt).
template plain<double>(), Signs);
286 Mout.
setLocal(locx, (factor * OpExt).
template plain<double>());
291template<
typename Symmetry>
295 double factor,
bool FERMIONIC,
bool HERMITIAN)
const
297 assert(locx1<
F.size() and locx2<
F.size() and locy1<
F[locx1].dim() and locy2<
F[locx2].dim());
299 ss << Op1.
label() <<
"(" << locx1 <<
"," << locy1 <<
")"
300 << Op2.
label() <<
"(" << locx2 <<
"," << locy2 <<
")";
303 for (
size_t l=0; l<
F.size(); ++l) {Mout.
setLocBasis(
B[l].get_basis().combine(
F[l].get_basis()).qloc(),l);}
313 else if (SUBSYS ==
IMP)
318 else if (SUBSYS ==
IMPSUB)
330 else if (locx1<locx2)
332 Mout.
setLocal({locx1, locx2}, {(factor * (Op1Ext *
kroneckerProduct(
B[locx1].Id(),
F[locx1].sign()))).template plain<double>(),
333 Op2Ext.template plain<double>()},
336 else if (locx1>locx2)
338 Mout.
setLocal({locx2, locx1}, {(factor * (Op2Ext *
kroneckerProduct(
B[locx2].Id(),
F[locx2].sign()))).template plain<double>(),
339 -Symmetry::spinorFactor() * Op1Ext.template plain<double>()},
348 Mout.
setLocal(locx1, product.template plain<double>());
352 Mout.
setLocal({locx1, locx2}, {(factor*Op1Ext).
template plain<double>(), Op2Ext.template plain<double>()});
358template<
typename Symmetry>
361 double factor,
bool HERMITIAN,
const vector<complex<double> > &phases)
const
364 ss << name <<
"_ky(";
365 for (
int l=0; l<phases.size(); ++l)
368 if (l!=phases.size()-1) {ss <<
",";}
374 for (
size_t l=0; l<
F.size(); ++l) {Mout.
setLocBasis(
B[l].get_basis().combine(
F[l].get_basis()).qloc(),l);}
376 vector<complex<double> > phases_x_factor = phases;
377 for (
int l=0; l<phases.size(); ++l)
379 phases_x_factor[l] = phases[l] * factor;
382 vector<SiteOperator<Symmetry,complex<double> > > OpsPlain(Ops.size());
383 for (
int l=0; l<OpsPlain.size(); ++l)
387 OpsPlain[l] =
kroneckerProduct(
B[l].Id(),Ops[l]).template plain<double>().template cast<complex<double> >();
389 else if (SUBSYS ==
IMP)
391 OpsPlain[l] =
kroneckerProduct(Ops[l],
F[l].Id()).template plain<double>().template cast<complex<double> >();
399template<
typename Symmetry>
404 ss <<
"JordanWignerStringFull";
409 for (
size_t l=0; l<
F.size(); ++l) {Mout.
setLocBasis(
B[l].get_basis().combine(
F[l].get_basis()).qloc(),l);}
419template<
typename Symmetry>
420template<
typename Dummy>
422c (
size_t locx,
size_t locy,
double factor)
const
424 if constexpr(Dummy::IS_CHARGE_SU2())
426 auto Gxy =
static_cast<SUB_LATTICE>(
static_cast<int>(pow(-1,locx+locy)));
435template<
typename Symmetry>
436template<SPIN_INDEX sigma,
typename Dummy>
438c (
size_t locx,
size_t locy,
double factor)
const
440 if constexpr(Dummy::IS_CHARGE_SU2())
442 auto Gxy =
static_cast<SUB_LATTICE>(
static_cast<int>(pow(-1,locx+locy)));
467template<
typename Symmetry>
468template<
typename Dummy>
470cdag (
size_t locx,
size_t locy,
double factor)
const
472 if constexpr(Dummy::IS_CHARGE_SU2())
474 auto Gxy =
static_cast<SUB_LATTICE>(
static_cast<int>(pow(-1,locx+locy)));
483template<
typename Symmetry>
484template<SPIN_INDEX sigma,
typename Dummy>
486cdag (
size_t locx,
size_t locy,
double factor)
const
488 if constexpr(Dummy::IS_CHARGE_SU2())
490 auto Gxy =
static_cast<SUB_LATTICE>(
static_cast<int>(pow(-1,locx+locy)));
499template<
typename Symmetry>
502cc (
size_t locx,
size_t locy)
const
507template<
typename Symmetry>
510cdagcdag (
size_t locx,
size_t locy)
const
515template<
typename Symmetry>
516template<
typename Dummy>
518cdagc (
size_t locx1,
size_t locx2,
size_t locy1,
size_t locy2)
const
520 if constexpr (Dummy::IS_SPIN_SU2() and !Dummy::IS_CHARGE_SU2())
522 return make_corr(
SUB,locx1, locx2, locy1, locy2,
F[locx1].
cdag(locy1),
F[locx2].
c(locy2), Symmetry::qvacuum(), sqrt(2.),
PROP::FERMIONIC,
PROP::NON_HERMITIAN);
524 else if constexpr (Dummy::IS_SPIN_SU2() and Dummy::IS_CHARGE_SU2())
526 auto Gx1y1 =
static_cast<SUB_LATTICE>(
static_cast<int>(pow(-1,locx1+locy1)));
527 auto Gx2y2 =
static_cast<SUB_LATTICE>(
static_cast<int>(pow(-1,locx2+locy2)));
528 return make_corr(
SUB,locx1, locx2, locy1, locy2,
F[locx1].
cdag(Gx1y1,locy1),
F[locx2].
c(Gx2y2,locy2), Symmetry::qvacuum(), sqrt(2.)*sqrt(2.),
PROP::FERMIONIC,
PROP::NON_HERMITIAN);
532 vector<Mpo<Symmetry> > out(2);
533 out[0] = cdagc<UP>(locx1,locx2,locy1,locy2);
534 out[1] = cdagc<DN>(locx1,locx2,locy1,locy2);
539template<
typename Symmetry>
540template<SPIN_INDEX sigma,
typename Dummy>
542cdagc (
size_t locx1,
size_t locx2,
size_t locy1,
size_t locy2)
const
544 if constexpr (Dummy::ABELIAN)
546 return make_corr(
SUB,locx1, locx2, locy1, locy2,
F[locx1].
cdag(sigma,locy1),
F[locx2].
c(sigma,locy2), Symmetry::qvacuum(), 1.,
PROP::FERMIONIC,
PROP::NON_HERMITIAN);
550 auto Gx1y1 =
static_cast<SUB_LATTICE>(
static_cast<int>(pow(-1,locx1+locy1)));
551 auto Gx2y2 =
static_cast<SUB_LATTICE>(
static_cast<int>(pow(-1,locx2+locy2)));
552 return make_corr(
SUB,locx1, locx2, locy1, locy2,
F[locx1].
cdag(sigma,Gx1y1,locy1),
F[locx2].
c(sigma,Gx2y2,locy2), Symmetry::qvacuum(), 1.,
PROP::FERMIONIC,
PROP::NON_HERMITIAN);
556template<
typename Symmetry>
557template<SPIN_INDEX sigma1, SPIN_INDEX sigma2,
typename Dummy>
559cc (
size_t locx1,
size_t locx2,
size_t locy1,
size_t locy2)
const
561 return make_corr(
SUB,locx1, locx2, locy1, locy2,
F[locx1].
c(sigma1,locy1),
F[locx2].
c(sigma2,locy2), Symmetry::qvacuum(), 1.,
PROP::FERMIONIC,
PROP::NON_HERMITIAN);
564template<
typename Symmetry>
565template<SPIN_INDEX sigma1, SPIN_INDEX sigma2,
typename Dummy>
567cdagcdag (
size_t locx1,
size_t locx2,
size_t locy1,
size_t locy2)
const
569 return make_corr(
SUB,locx1, locx2, locy1, locy2,
F[locx1].
cdag(sigma1,locy1),
F[locx2].
cdag(sigma2,locy2), Symmetry::qvacuum(), 1.,
PROP::FERMIONIC,
PROP::NON_HERMITIAN);
572template<
typename Symmetry>
573template<
typename Dummy>
575cc3 (
size_t locx1,
size_t locx2,
size_t locy1,
size_t locy2)
const
577 if constexpr (Dummy::IS_SPIN_SU2())
580 auto Qtots = Symmetry::reduceSilent(
F[locx1].
c(locy1).Q(),
F[locx2].
c(locy2).Q());
581 typename Symmetry::qType Qtot;
582 for (
const auto Q : Qtots) {
if (Q[0] == 3) {Qtot = Q;}}
583 return make_corr(
SUB,locx1, locx2, locy1, locy2,
F[locx1].
c(locy1),
F[locx2].
c(locy2), Qtot, sqrt(2.),
PROP::FERMIONIC,
PROP::NON_HERMITIAN);
587 static_assert(!Dummy::IS_CHARGE_SU2(),
"cc with a spin-triplet coupling cannot be computed for a charge SU2 symmetry. Use U1 charge symmetry instead.");
588 vector<Mpo<Symmetry> > out(2);
589 out[0] = cc<UP,DN>(locx1,locx2,locy1,locy2);
590 out[1] = cc<DN,UP>(locx1,locx2,locy1,locy2);
595template<
typename Symmetry>
596template<
typename Dummy>
598cdagcdag3 (
size_t locx1,
size_t locx2,
size_t locy1,
size_t locy2)
const
600 if constexpr (Dummy::IS_SPIN_SU2())
603 auto Qtots = Symmetry::reduceSilent(
F[locx1].
cdag(locy1).Q(),
F[locx2].
cdag(locy2).Q());
604 typename Symmetry::qType Qtot;
605 for (
const auto Q : Qtots) {
if (Q[0] == 3) {Qtot = Q;}}
606 return make_corr(
SUB,locx1, locx2, locy1, locy2,
F[locx1].
cdag(locy1),
F[locx2].
cdag(locy2), Qtot, sqrt(2.),
PROP::FERMIONIC,
PROP::NON_HERMITIAN);
610 static_assert(!Dummy::IS_CHARGE_SU2(),
"cc with a spin-triplet coupling cannot be computed for a charge SU2 symmetry. Use U1 charge symmetry instead.");
611 vector<Mpo<Symmetry> > out(2);
612 out[0] = cdagcdag<UP,DN>(locx1,locx2,locy1,locy2);
613 out[1] = cdagcdag<DN,UP>(locx1,locx2,locy1,locy2);
618template<
typename Symmetry>
619template<
typename Dummy>
621Stringz (
size_t locx1,
size_t locx2,
size_t locy1,
size_t locy2)
const
623 assert(locx1<
F.size() and locx2<
F.size());
625 ss <<
"Sz" <<
"(" << locx1 <<
"," << locy1 <<
"," <<
")"
626 <<
"Sz" <<
"(" << locx2 <<
"," << locy2 <<
"," <<
")";
632 for (
size_t l=0; l<
F.size(); ++l) {Mout.
setLocBasis(
B[l].get_basis().combine(
F[l].get_basis()).qloc(),l);}
638 else if (locx1<locx2)
643 else if (locx1>locx2)
652template<
typename Symmetry>
653template<
typename Dummy>
655StringzDimer (
size_t locx1,
size_t locx2,
size_t locy1,
size_t locy2)
const
657 assert(locx1<
F.size() and locx2<
F.size());
659 ss <<
"Sz" <<
"(" << locx1 <<
"," << locy1 <<
"," <<
")"
660 <<
"Sz" <<
"(" << locx2 <<
"," << locy2 <<
"," <<
")";
666 for (
size_t l=0; l<
F.size(); ++l) {Mout.
setLocBasis(
B[l].get_basis().combine(
F[l].get_basis()).qloc(),l);}
673 else if (locx1<locx2)
675 Mout.
setLocal({locx1,locx2}, {-pow(-4,(locx2-(locx1-1)-2)/2)*Sz1,Sz2},
kroneckerProduct(
B[locx1].Id(),
F[0].
Sz()).template plain<double>());
677 else if (locx1>locx2)
687template<
typename Symmetry>
690d (
size_t locx,
size_t locy)
const
695template<
typename Symmetry>
700 for (
size_t l=0; l<
F.size(); ++l) {assert(
F[l].orbitals()==1);}
705 for (
size_t l=0; l<
F.size(); ++l) {Mout.
setLocBasis(
B[l].get_basis().combine(
F[l].get_basis()).qloc(),l);}
711template<
typename Symmetry>
714s (
size_t locx,
size_t locy)
const
719template<
typename Symmetry>
720template<SPIN_INDEX sigma,
typename Dummy>
722n (
size_t locx,
size_t locy)
const
727template<
typename Symmetry>
729n (
size_t locx,
size_t locy)
const
734template<
typename Symmetry>
735template<
typename Dummy>
737T (
size_t locx,
size_t locy,
double factor)
const
742template<
typename Symmetry>
743template<
typename Dummy>
745Tdag (
size_t locx,
size_t locy,
double factor)
const
750template<
typename Symmetry>
751template<
typename Dummy>
753Tz (
size_t locx,
size_t locy)
const
758template<
typename Symmetry>
759template<
typename Dummy>
761Tx (
size_t locx,
size_t locy)
const
763 auto G =
static_cast<SUB_LATTICE>(
static_cast<int>(pow(-1,locx+locy)));
767template<
typename Symmetry>
768template<
typename Dummy>
770iTy (
size_t locx,
size_t locy)
const
772 auto G =
static_cast<SUB_LATTICE>(
static_cast<int>(pow(-1,locx+locy)));
776template<
typename Symmetry>
777template<
typename Dummy>
779Tm (
size_t locx,
size_t locy)
const
781 auto G =
static_cast<SUB_LATTICE>(
static_cast<int>(pow(-1,locx+locy)));
785template<
typename Symmetry>
786template<
typename Dummy>
788Tp (
size_t locx,
size_t locy)
const
790 auto G =
static_cast<SUB_LATTICE>(
static_cast<int>(pow(-1,locx+locy)));
794template<
typename Symmetry>
795template<
typename Dummy>
797TpTm (
size_t locx1,
size_t locx2,
size_t locy1,
size_t locy2,
double fac)
const
799 auto G1 =
static_cast<SUB_LATTICE>(
static_cast<int>(pow(-1,locx1+locy1)));
800 auto G2 =
static_cast<SUB_LATTICE>(
static_cast<int>(pow(-1,locx2+locy2)));
801 return make_corr(
SUB,locx1,locx2,locy1,locy2, fac*
F[locx1].
Tp(locy1,G1),
F[locx2].
Tm(locy2,G2), Symmetry::qvacuum(), 1.,
PROP::NON_FERMIONIC,
PROP::NON_HERMITIAN);
804template<
typename Symmetry>
805template<
typename Dummy>
807TmTp (
size_t locx1,
size_t locx2,
size_t locy1,
size_t locy2,
double fac)
const
809 auto G1 =
static_cast<SUB_LATTICE>(
static_cast<int>(pow(-1,locx1+locy1)));
810 auto G2 =
static_cast<SUB_LATTICE>(
static_cast<int>(pow(-1,locx2+locy2)));
811 return make_corr(
SUB,locx1,locx2,locy1,locy2, fac*
F[locx1].
Tm(locy1,G1),
F[locx2].
Tp(locy2,G2), Symmetry::qvacuum(), 1.,
PROP::NON_FERMIONIC,
PROP::NON_HERMITIAN);
814template<
typename Symmetry>
815template<
typename Dummy>
817TzTz (
size_t locx1,
size_t locx2,
size_t locy1,
size_t locy2)
const
819 return make_corr(
SUB,locx1,locx2,locy1,locy2,
F[locx1].
Tz(locy1),
F[locx2].
Tz(locy2), Symmetry::qvacuum(), 1.,
PROP::NON_FERMIONIC,
PROP::HERMITIAN);
822template<
typename Symmetry>
823template<
typename Dummy>
825TdagT (
size_t locx1,
size_t locx2,
size_t locy1,
size_t locy2)
const
827 if constexpr (Symmetry::IS_CHARGE_SU2())
829 return make_corr(
SUB,locx1, locx2, locy1, locy2,
F[locx1].
Tdag(locy1),
F[locx2].
T(locy2), Symmetry::qvacuum(), sqrt(3.),
PROP::BOSONIC,
PROP::HERMITIAN);
834 vector<Mpo<Symmetry> > out(3);
835 out[0] =
TzTz(
SUB,locx1,locx2,locy1,locy2);
836 out[1] =
TpTm(
SUB,locx1,locx2,locy1,locy2,0.5);
837 out[2] =
TmTp(
SUB,locx1,locx2,locy1,locy2,0.5);
842template<
typename Symmetry>
844ns (
size_t locx,
size_t locy)
const
849template<
typename Symmetry>
851nh (
size_t locx,
size_t locy)
const
856template<
typename Symmetry>
858nssq (
size_t locx,
size_t locy)
const
863template<
typename Symmetry>
865nhsq (
size_t locx,
size_t locy)
const
870template<
typename Symmetry>
871template<SPIN_INDEX sigma1, SPIN_INDEX sigma2,
typename Dummy>
873nn (
size_t locx1,
size_t locx2,
size_t locy1,
size_t locy2)
const
875 return make_corr (
SUB,locx1, locx2, locy1, locy2,
F[locx1].
n(sigma1,locy1),
F[locx2].
n(sigma2,locy2), Symmetry::qvacuum(), 1.,
PROP::NON_FERMIONIC,
PROP::HERMITIAN);
878template<
typename Symmetry>
880nn (
size_t locx1,
size_t locx2,
size_t locy1,
size_t locy2)
const
882 return make_corr (
SUB,locx1, locx2, locy1, locy2,
F[locx1].
n(locy1),
F[locx2].
n(locy2), Symmetry::qvacuum(), 1.,
PROP::NON_FERMIONIC,
PROP::HERMITIAN);
885template<
typename Symmetry>
886template<
typename Dummy>
888hh (
size_t locx1,
size_t locx2,
size_t locy1,
size_t locy2)
const
891 F[locx1].
d(locy1)-
F[locx1].
n(locy1)+
F[locx1].Id(),
892 F[locx2].
d(locy2)-
F[locx2].
n(locy2)+
F[locx2].Id(),
896template<
typename Symmetry>
897template<
typename Dummy>
901 bool HERMITIAN = (Sa==
SX or Sa==
SZ)?
true:
false;
905template<
typename Symmetry>
906template<
typename Dummy>
910 bool HERMITIAN = (Sa==
SX or Sa==
SZ)?
true:
false;
939template<
typename Symmetry>
940template<
typename Dummy>
944 return make_corr(
IMP,locx1,locx2,locy1,locy2,
B[locx1].
Scomp(Sa1,locy1),
B[locx2].
Scomp(Sa2,locy2),
getQ_ScompScomp(Sa1,Sa2), fac,
PROP::NON_FERMIONIC,
PROP::HERMITIAN);
947template<
typename Symmetry>
948template<
typename Dummy>
952 return make_corr(
IMP,locx1,locx2,locy1,locy2,
F[locx1].
Scomp(Sa1,locy1),
F[locx2].
Scomp(Sa2,locy2),
getQ_ScompScomp(Sa1,Sa2), fac,
PROP::NON_FERMIONIC,
PROP::HERMITIAN);
955template<
typename Symmetry>
956template<
typename Dummy>
960 return make_corr(
IMPSUB,locx1,locx2,locy1,locy2,
B[locx1].
Scomp(Sa1,locy1),
F[locx2].
Scomp(Sa2,locy2),
getQ_ScompScomp(Sa1,Sa2), fac,
PROP::NON_FERMIONIC,
PROP::HERMITIAN);
963template<
typename Symmetry>
964template<
typename Dummy>
966Simp (
size_t locx,
size_t locy,
double factor)
const
971template<
typename Symmetry>
972template<
typename Dummy>
974Ssub (
size_t locx,
size_t locy,
double factor)
const
979template<
typename Symmetry>
980template<
typename Dummy>
982Simpdag (
size_t locx,
size_t locy,
double factor)
const
987template<
typename Symmetry>
988template<
typename Dummy>
990SimpSimp (
size_t locx1,
size_t locx2,
size_t locy1,
size_t locy2)
const
992 if constexpr (Symmetry::IS_SPIN_SU2())
994 return make_corr(
IMP,locx1, locx2, locy1, locy2,
B[locx1].Sdag(locy1),
B[locx2].
S(locy2), Symmetry::qvacuum(), sqrt(3.),
PROP::BOSONIC,
PROP::HERMITIAN);
999 vector<Mpo<Symmetry> > out(3);
1007template<
typename Symmetry>
1008template<
typename Dummy>
1010SsubSsub (
size_t locx1,
size_t locx2,
size_t locy1,
size_t locy2)
const
1012 if constexpr (Symmetry::IS_SPIN_SU2())
1014 return make_corr(
SUB,locx1, locx2, locy1, locy2,
F[locx1].Sdag(locy1),
F[locx2].
S(locy2), Symmetry::qvacuum(), sqrt(3.),
PROP::BOSONIC,
PROP::HERMITIAN);
1019 vector<Mpo<Symmetry> > out(3);
1027template<
typename Symmetry>
1028template<
typename Dummy>
1030SimpSsub (
size_t locx1,
size_t locx2,
size_t locy1,
size_t locy2)
const
1032 if constexpr (Symmetry::IS_SPIN_SU2())
1034 return make_corr(
IMPSUB,locx1, locx2, locy1, locy2,
B[locx1].Sdag(locy1),
F[locx2].
S(locy2), Symmetry::qvacuum(), sqrt(3.),
PROP::BOSONIC,
PROP::HERMITIAN);
1039 vector<Mpo<Symmetry> > out(3);
1047template<
typename Symmetry>
1048template<
typename Dummy>
1050Simp_ky (vector<complex<double> > phases)
const
1052 vector<OperatorType> Ops(
F.size());
1053 for (
size_t l=0; l<
F.size(); ++l)
1060template<
typename Symmetry>
1061template<
typename Dummy>
1063Simpdag_ky (vector<complex<double> > phases,
double factor)
const
1065 vector<OperatorType> Ops(
F.size());
1066 for (
size_t l=0; l<
F.size(); ++l)
1068 Ops[l] =
F[l].Sdag(0);
1073template<
typename Symmetry>
1074template<
typename Dummy>
1076T_ky (vector<complex<double> > phases)
const
1078 vector<OperatorType> Ops(
F.size());
1079 for (
size_t l=0; l<
F.size(); ++l)
1086template<
typename Symmetry>
1087template<
typename Dummy>
1089Tdag_ky (vector<complex<double> > phases,
double factor)
const
1091 vector<OperatorType> Ops(
F.size());
1092 for (
size_t l=0; l<
F.size(); ++l)
1094 Ops[l] =
F[l].Tdag(0);
1099template<
typename Symmetry>
1100template<
typename Dummy>
1101typename std::enable_if<Dummy::IS_SPIN_SU2() and !Dummy::IS_CHARGE_SU2(),
Mpo<Symmetry,complex<
double> > >::type
KondoObservables<Symmetry>::
1102c_ky (vector<complex<
double> > phases,
double factor)
const
1104 vector<OperatorType> Ops(
F.size());
1105 for (
size_t l=0; l<
F.size(); ++l)
1112template<
typename Symmetry>
1113template<
typename Dummy>
1114typename std::enable_if<Dummy::IS_SPIN_SU2() and !Dummy::IS_CHARGE_SU2(),
Mpo<Symmetry,complex<
double> > >::type
KondoObservables<Symmetry>::
1115cdag_ky (vector<complex<
double> > phases,
double factor)
const
1117 vector<OperatorType> Ops(
F.size());
1118 for (
size_t l=0; l<
F.size(); ++l)
1120 Ops[l] =
F[l].cdag(0);
1125template<
typename Symmetry>
1128 typename Symmetry::qType out;
1131 if (!Symmetry::IS_SPIN_SU2() and !Symmetry::IS_SPIN_U1())
1133 out = Symmetry::qvacuum();
1137 if ( (Sa1 ==
SZ and Sa2 ==
SZ) or (Sa1 ==
SP and Sa2 ==
SM) or (Sa1 ==
SM and Sa2 ==
SP) or (Sa1 ==
SX or Sa1 ==
iSY) )
1139 out = Symmetry::qvacuum();
1143 lout <<
"Sa1=" << Sa1 <<
", Sa2=" << Sa2 << endl;
1144 assert(
false and
"Quantum number for the chosen ScompScomp is not computed. Add in KondoObservables::getQ_ScompScomp");
SiteOperator< Symmetry, Scalar_ > kroneckerProduct(const SiteOperator< Symmetry, Scalar_ > &O1, const SiteOperator< Symmetry, Scalar_ > &O2)
std::enable_if< Dummy::IS_SPIN_SU2(), Mpo< Symmetry > >::type cdag(size_t locx, size_t locy=0, double factor=std::sqrt(2.)) const
std::enable_if< Dummy::IS_SPIN_SU2(), Mpo< Symmetry > >::type c(size_t locx, size_t locy=0, double factor=1.) const
Mpo< Symmetry > ns(size_t locx, size_t locy=0) const
std::enable_if< Dummy::IS_SPIN_SU2() and!Dummy::IS_CHARGE_SU2(), Mpo< Symmetry, complex< double > > >::type cdag_ky(vector< complex< double > > phases, double factor=sqrt(2.)) const
std::conditional< Dummy::IS_SPIN_SU2(), Mpo< Symmetry >, vector< Mpo< Symmetry > > >::type cc3(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
std::enable_if<!Dummy::IS_SPIN_SU2(), Mpo< Symmetry > >::type SsubSsub(SPINOP_LABEL Sa1, SPINOP_LABEL Sa2, size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0, double fac=1.) const
std::conditional< Dummy::IS_CHARGE_SU2(), Mpo< Symmetry >, vector< Mpo< Symmetry > > >::type TdagT(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
Mpo< Symmetry, complex< double > > make_FourierYSum(KONDO_SUBSYSTEM SUBSYS, string name, const vector< OperatorType > &Ops, double factor, bool HERMITIAN, const vector< complex< double > > &phases) const
SiteOperatorQ< Symmetry, Eigen::MatrixXd > OperatorType
Mpo< Symmetry > nssq(size_t locx, size_t locy=0) const
std::enable_if<!Dummy::IS_CHARGE_SU2(), Mpo< Symmetry > >::type hh(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
Mpo< Symmetry > n(size_t locx, size_t locy=0) const
std::enable_if< Dummy::IS_SPIN_SU2() and!Dummy::IS_CHARGE_SU2(), Mpo< Symmetry, complex< double > > >::type c_ky(vector< complex< double > > phases, double factor=1.) const
std::enable_if< Dummy::ABELIAN, Mpo< Symmetry > >::type cdagcdag(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
std::enable_if<!Dummy::IS_SPIN_SU2(), Mpo< Symmetry > >::type Ssub(SPINOP_LABEL Sa, size_t locx, size_t locy=0, double factor=1.) const
std::enable_if<!Dummy::IS_CHARGE_SU2(), Mpo< Symmetry > >::type s(size_t locx, size_t locy=0) const
std::enable_if<!Dummy::IS_SPIN_SU2(), Mpo< Symmetry > >::type SimpSimp(SPINOP_LABEL Sa1, SPINOP_LABEL Sa2, size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0, double fac=1.) const
std::enable_if< Dummy::IS_SPIN_SU2(), Mpo< Symmetry > >::type S(size_t locx, size_t locy=0, double factor=1.) const
vector< SpinBase< Symmetry > > B
std::enable_if<!Dummy::IS_CHARGE_SU2(), Mpo< Symmetry > >::type Tm(size_t locx, size_t locy=0) const
std::enable_if< Dummy::IS_CHARGE_SU2(), Mpo< Symmetry > >::type Tdag(size_t locx, size_t locy=0, double factor=std::sqrt(3.)) const
Mpo< Symmetry > make_corr(KONDO_SUBSYSTEM SUBSYS, size_t locx1, size_t locx2, size_t locy1, size_t locy2, const OperatorType &Op1, const OperatorType &Op2, qarray< Symmetry::Nq > Qtot, double factor, bool FERMIONIC, bool HERMITIAN) const
KondoObservables(const size_t &L)
std::enable_if<!Dummy::IS_CHARGE_SU2(), Mpo< Symmetry > >::type cc(size_t locx, size_t locy=0) const
std::conditional< Dummy::IS_SPIN_SU2(), Mpo< Symmetry >, vector< Mpo< Symmetry > > >::type SimpdagSimp(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
std::conditional< Dummy::IS_SPIN_SU2(), Mpo< Symmetry >, vector< Mpo< Symmetry > > >::type cdagc(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
std::enable_if<!Dummy::IS_CHARGE_SU2(), Mpo< Symmetry > >::type TpTm(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0, double fac=1.) const
std::conditional< Dummy::IS_SPIN_SU2(), Mpo< Symmetry >, vector< Mpo< Symmetry > > >::type cdagcdag3(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
std::enable_if<!Dummy::IS_SPIN_SU2(), Mpo< Symmetry > >::type Stringz(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
std::enable_if<!Dummy::IS_CHARGE_SU2(), Mpo< Symmetry > >::type d(size_t locx, size_t locy=0) const
std::enable_if<!Dummy::IS_CHARGE_SU2(), Mpo< Symmetry > >::type dtot() const
std::enable_if<!Dummy::IS_SPIN_SU2(), Mpo< Symmetry > >::type Sz(size_t locx, size_t locy=0) const
std::enable_if<!Dummy::IS_CHARGE_SU2(), Mpo< Symmetry > >::type Tp(size_t locx, size_t locy=0) const
std::enable_if<!Dummy::IS_SPIN_SU2(), Mpo< Symmetry > >::type c(size_t locx, size_t locy=0, double factor=1.) const
std::conditional< Dummy::IS_SPIN_SU2(), Mpo< Symmetry >, vector< Mpo< Symmetry > > >::type SsubSsub(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
vector< FermionBase< Symmetry > > F
Mpo< Symmetry > nh(size_t locx, size_t locy=0) const
std::enable_if<!Dummy::IS_SPIN_SU2(), Mpo< Symmetry > >::type n(size_t locx, size_t locy=0) const
std::enable_if<!Dummy::IS_SPIN_SU2(), Mpo< Symmetry > >::type SimpSsub(SPINOP_LABEL Sa1, SPINOP_LABEL Sa2, size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0, double fac=1.) const
std::enable_if< Dummy::IS_CHARGE_SU2(), Mpo< Symmetry, complex< double > > >::type Tdag_ky(vector< complex< double > > phases, double factor=sqrt(3.)) const
std::enable_if<!Dummy::IS_CHARGE_SU2(), Mpo< Symmetry > >::type cdagcdag(size_t locx, size_t locy=0) const
std::enable_if<!Dummy::IS_SPIN_SU2(), Mpo< Symmetry > >::type Simp(SPINOP_LABEL Sa, size_t locx, size_t locy=0, double factor=1.) const
std::enable_if<!Dummy::IS_CHARGE_SU2(), Mpo< Symmetry > >::type TmTp(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0, double fac=1.) const
std::enable_if< Dummy::IS_SPIN_SU2(), Mpo< Symmetry > >::type Simpdag(size_t locx, size_t locy=0, double factor=std::sqrt(3.)) const
std::enable_if<!Dummy::IS_SPIN_SU2(), Mpo< Symmetry > >::type StringzDimer(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
std::enable_if< Dummy::NO_CHARGE_SYM(), Mpo< Symmetry > >::type iTy(size_t locx, size_t locy=0) const
std::enable_if<!Dummy::IS_CHARGE_SU2(), Mpo< Symmetry > >::type TzTz(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
KondoObservables(const size_t &L, const vector< Param > ¶ms, const map< string, any > &defaults)
Mpo< Symmetry > nn(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
std::enable_if<!Dummy::IS_CHARGE_SU2(), Mpo< Symmetry > >::type Tz(size_t locx, size_t locy=0) const
std::enable_if< Dummy::NO_CHARGE_SYM(), Mpo< Symmetry > >::type Tx(size_t locx, size_t locy=0) const
std::enable_if< Dummy::IS_SPIN_SU2(), Mpo< Symmetry > >::type Simp(size_t locx, size_t locy=0, double factor=1.) const
std::enable_if< Dummy::IS_CHARGE_SU2(), Mpo< Symmetry > >::type T(size_t locx, size_t locy=0, double factor=1.) const
std::conditional< Dummy::IS_SPIN_SU2(), Mpo< Symmetry >, vector< Mpo< Symmetry > > >::type SdagS(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
std::enable_if< Dummy::IS_SPIN_SU2(), Mpo< Symmetry > >::type Ssub(size_t locx, size_t locy=0, double factor=1.) const
std::enable_if< Dummy::IS_CHARGE_SU2(), Mpo< Symmetry, complex< double > > >::type T_ky(vector< complex< double > > phases) const
std::enable_if< Dummy::IS_SPIN_SU2(), Mpo< Symmetry, complex< double > > >::type Simpdag_ky(vector< complex< double > > phases, double factor=sqrt(3.)) const
std::conditional< Dummy::IS_SPIN_SU2(), Mpo< Symmetry >, vector< Mpo< Symmetry > > >::type SsubdagSsub(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
std::conditional< Dummy::IS_SPIN_SU2(), Mpo< Symmetry >, vector< Mpo< Symmetry > > >::type SimpSsub(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
std::enable_if< Dummy::ABELIAN, Mpo< Symmetry > >::type cc(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
Mpo< Symmetry > make_local(KONDO_SUBSYSTEM SUBSYS, size_t locx, size_t locy, const OperatorType &Op, double factor=1., bool FERMIONIC=false, bool HERMITIAN=false) const
not implemented
std::enable_if<!Dummy::IS_SPIN_SU2(), Mpo< Symmetry > >::type cdag(size_t locx, size_t locy=0, double factor=1.) const
std::enable_if<!Dummy::IS_SPIN_SU2(), Mpo< Symmetry > >::type cdagc(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
std::enable_if<!Dummy::IS_SPIN_SU2(), Mpo< Symmetry > >::type Scomp(SPINOP_LABEL Sa, size_t locx, size_t locy=0, double factor=1.) const
std::conditional< Dummy::IS_SPIN_SU2(), Mpo< Symmetry >, vector< Mpo< Symmetry > > >::type SimpdagSsub(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
std::enable_if< Dummy::IS_SPIN_SU2(), Mpo< Symmetry, complex< double > > >::type Simp_ky(vector< complex< double > > phases) const
Mpo< Symmetry > nhsq(size_t locx, size_t locy=0) const
std::enable_if<!Dummy::IS_SPIN_SU2(), Mpo< Symmetry > >::type nn(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
Symmetry::qType getQ_ScompScomp(SPINOP_LABEL Sa1, SPINOP_LABEL Sa2) const
Mpo< Symmetry > JordanWignerString() const
std::conditional< Dummy::IS_SPIN_SU2(), Mpo< Symmetry >, vector< Mpo< Symmetry > > >::type SimpSimp(size_t locx1, size_t locx2, size_t locy1=0, size_t locy2=0) const
void setLocBasis(const std::vector< std::vector< qType > > &q)
void setLocal(std::size_t loc, const OperatorType &op)
void setLocalSum(const OperatorType &op, Scalar(*f)(int)=localSumTrivial)
static SiteOperatorQ< Symmetry, MatrixType_ > prod(const SiteOperatorQ< Symmetry, MatrixType_ > &O1, const SiteOperatorQ< Symmetry, MatrixType_ > &O2, const qType &target)