1#ifndef STRAWBERRY_TRANSVERSEKONDOMODEL
2#define STRAWBERRY_TRANSVERSEKONDOMODEL
51 template<
typename Symmetry_>
54 const BC boundary=BC::OPEN);
60 static const std::map<string,std::any>
defaults;
65 {
"t",1.}, {
"tPrime",0.}, {
"tRung",0.},
66 {
"J",1.}, {
"Jdir",0.},
67 {
"Jxy",0.}, {
"Jz",0.},
69 {
"V",0.}, {
"Vrung",0.},
71 {
"Bz",0.}, {
"Bx",0.}, {
"Bzsub",0.}, {
"Bxsub",0.}, {
"Kz",0.}, {
"Kx",0.},
72 {
"Inext",0.}, {
"Iprev",0.}, {
"I3next",0.}, {
"I3prev",0.}, {
"I3loc",0.},
73 {
"D",2ul}, {
"maxPower",2ul}, {
"CYLINDER",
false}, {
"Ly",1ul}, {
"LyF",1ul}
82 ParamHandler P(params,defaults);
84 size_t Lcell = P.size();
86 for (
size_t l=0; l<N_sites; ++l)
88 N_phys += P.get<
size_t>(
"Ly",l%Lcell);
89 setLocBasis((
B[l].get_basis().combine(F[l].get_basis())).qloc(),l);
92 this->set_name(
"Transverse-field Kondo");
95 std::vector<std::vector<std::string>> labellist;
97 add_operators(
B, F, P, pushlist, labellist, boundary);
99 this->construct_from_pushlist(pushlist, labellist, Lcell);
102 this->precalc_TwoSiteData();
108 if (qnum[0]<=2*
static_cast<int>(this->
N_phys) and qnum[0]>0) {
return true;}
112template<
typename Symmetry_>
117 std::size_t Lcell = P.size();
121 for (std::size_t loc=0; loc<
N_sites; ++loc)
124 param1d Bxsub = P.fill_array1d<
double>(
"Bxsub",
"Bxsuborb",
F[loc].orbitals(), loc%Lcell);
125 labellist[loc].push_back(Bxsub.label);
128 param1d Bx = P.fill_array1d<
double>(
"Bx",
"Bxorb",
B[loc].orbitals(), loc%Lcell);
129 labellist[loc].push_back(Bx.label);
132 param1d Kx = P.fill_array1d<
double>(
"Kx",
"Kxorb",
B[loc].orbitals(), loc%Lcell);
133 labellist[loc].push_back(Kx.label);
135 ArrayXXd Jxyperp =
B[loc].ZeroHopping();
136 ArrayXXd Jzperp =
B[loc].ZeroHopping();
137 ArrayXd Bzorb =
B[loc].ZeroField();
138 ArrayXd muorb =
B[loc].ZeroField();
139 ArrayXd nuorb =
B[loc].ZeroField();
140 ArrayXd Kzorb =
B[loc].ZeroField();
141 ArrayXXd Dyperp =
B[loc].ZeroHopping();
143 ArrayXd Uorb =
F[loc].ZeroField();
144 ArrayXd Uphorb =
F[loc].ZeroField();
145 ArrayXd Eorb =
F[loc].ZeroField();
146 ArrayXd Bzsuborb =
F[loc].ZeroField();
147 ArrayXXd tPerp =
F[loc].ZeroHopping();
148 ArrayXXd Vperp =
F[loc].ZeroHopping();
149 ArrayXXd Jperp =
F[loc].ZeroHopping();
151 auto Himp =
kroneckerProduct(
B[loc].HeisenbergHamiltonian(Jxyperp,Jzperp,Bzorb,Bx.a,muorb,nuorb,Kzorb,Kx.a,Dyperp),
F[loc].Id());
152 auto Hsub =
kroneckerProduct(
B[loc].Id(),
F[loc].
template coupling_Bx<double>(Bxsub.a));
SiteOperator< Symmetry, Scalar_ > kroneckerProduct(const SiteOperator< Symmetry, Scalar_ > &O1, const SiteOperator< Symmetry, Scalar_ > &O2)
vector< SpinBase< Sym::U1< Sym::ChargeU1 > > > B
vector< FermionBase< Sym::U1< Sym::ChargeU1 > > > F
DMRG::VERBOSITY::OPTION VERB
Sym::U1< Sym::ChargeU1 > Symmetry
static constexpr MODEL_FAMILY FAMILY
bool validate(qType qnum) const
static qarray< 1 > singlet(int N)
static const std::map< string, std::any > defaults
static void add_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)
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)
#define MAKE_TYPEDEFS(MODEL)