28 #ifndef MODELS_CODED_U1_H
29 #define MODELS_CODED_U1_H
38 template<
class Matrix>
56 phys.
insert(std::make_pair(1, 1));
57 phys.
insert(std::make_pair(-1, 1));
59 op_t ident_op, splus_op, sminus_op, sz_op;
75 #define REGISTER(op, kind) op = tag_handler->register_op(op ## _op, kind);
86 for (
int p=0; p<lat.
size(); ++p) {
87 std::vector<int> neighs = lat.
forward(p);
88 for (
int n=0; n<neighs.size(); ++n) {
92 term.push_back( boost::make_tuple(p, sz) );
93 term.push_back( boost::make_tuple(neighs[n], sz) );
94 this->
terms_.push_back(term);
99 term.push_back( boost::make_tuple(p, splus) );
100 term.push_back( boost::make_tuple(neighs[n], sminus) );
101 this->
terms_.push_back(term);
106 term.push_back( boost::make_tuple(p, sminus) );
107 term.push_back( boost::make_tuple(neighs[n], splus) );
108 this->
terms_.push_back(term);
135 return static_cast<int>(parms[
"u1_total_charge"]);
140 return measurements_type();
147 else if (name ==
"sminus")
149 else if (name ==
"sz")
152 throw std::runtime_error(
"Operator not valid for this model.");
164 boost::shared_ptr<TagHandler<Matrix, U1> > tag_handler;
165 tag_type ident, splus, sminus, sz;
169 template<
class Matrix>
187 phys.
insert(std::make_pair(0, 1));
188 phys.
insert(std::make_pair(1, 1));
191 op_t create_op, destroy_op, count_op;
205 #define REGISTER(op, kind) op = tag_handler->register_op(op ## _op, kind);
216 for (
int p=0; p<lat.
size(); ++p) {
217 std::vector<int> neighs = lat.
forward(p);
218 for (
int n=0; n<neighs.size(); ++n) {
222 term.push_back( boost::make_tuple(p, create) );
223 term.push_back( boost::make_tuple(neighs[n], destroy) );
224 this->
terms_.push_back(term);
229 term.push_back( boost::make_tuple(p, destroy) );
230 term.push_back( boost::make_tuple(neighs[n], create) );
231 this->
terms_.push_back(term);
242 throw std::runtime_error(
"update() not yet implemented for this model.");
260 return static_cast<int>(parms[
"u1_total_charge"]);
265 return measurements_type();
272 else if (name ==
"bdag")
274 else if (name ==
"b")
277 throw std::runtime_error(
"Operator not valid for this model.");
290 boost::shared_ptr<TagHandler<Matrix, U1> > tag_handler;
291 tag_type ident, create, destroy, count;
295 template<
class Matrix>
309 typedef typename Matrix::value_type value_type;
316 int Nmax = model[
"Nmax"];
317 double t = model[
"t"];
318 double U = model[
"U"];
319 double V = model[
"V"];
322 op_t create_op, destroy_op, count_op, interaction_op;
324 phys.
insert(std::make_pair(0, 1));
327 for (
int n=1; n<=Nmax; ++n)
329 phys.
insert(std::make_pair(n, 1));
347 #define REGISTER(op, kind) op = tag_handler->register_op(op ## _op, kind);
359 for (
int p=0; p<lat.
size(); ++p) {
364 term.push_back( boost::make_tuple(p, interaction) );
365 this->
terms_.push_back(term);
368 std::vector<int> neighs = lat.
forward(p);
369 for (
int n=0; n<neighs.size(); ++n) {
374 term.push_back( boost::make_tuple(p, create) );
375 term.push_back( boost::make_tuple(neighs[n], destroy) );
376 this->
terms_.push_back(term);
381 term.push_back( boost::make_tuple(p, destroy) );
382 term.push_back( boost::make_tuple(neighs[n], create) );
383 this->
terms_.push_back(term);
389 term.push_back( boost::make_tuple(p, count) );
390 term.push_back( boost::make_tuple(neighs[n], count) );
391 this->
terms_.push_back(term);
401 throw std::runtime_error(
"update() not yet implemented for this model.");
419 return static_cast<int>(parms[
"u1_total_charge"]);
426 else if (name ==
"bdag")
428 else if (name ==
"b")
430 else if (name ==
"id")
432 else if (name ==
"fill")
435 throw std::runtime_error(
"Operator not valid for this model.");
446 typedef std::vector<block_matrix<Matrix, U1> > op_vec;
447 typedef std::vector<std::pair<op_vec, bool> > bond_element;
449 measurements_type meas;
451 if (model[
"MEASURE[Density]"]) {
452 std::string name =
"Density";
456 op_vec(1,tag_handler->get_op(count))) );
459 if (model[
"MEASURE[Local density]"]) {
460 std::string name =
"Local density";
464 op_vec(1,tag_handler->get_op(count))) );
467 if (model[
"MEASURE[Onebody density matrix]"]) {
468 std::string name =
"Onebody density matrix";
470 ops.push_back( std::make_pair(op_vec(1,tag_handler->get_op(create)),
false) );
471 ops.push_back( std::make_pair(op_vec(1,tag_handler->get_op(destroy)),
false) );
486 boost::shared_ptr<TagHandler<Matrix, U1> > tag_handler;
487 tag_type ident, create, destroy, count, interaction;
491 template<
class Matrix>
511 op_t create_op, destroy_op, sign_op, dens_op;
523 phys.
insert(std::make_pair(0, 1));
524 phys.
insert(std::make_pair(1, 1));
526 #define REGISTER(op, kind) op = tag_handler->register_op(op ## _op, kind);
537 for (
int p=0; p<lat.
size(); ++p) {
538 std::vector<int> neighs = lat.
forward(p);
539 for (
int n=0; n<neighs.size(); ++n) {
544 term.push_back( boost::make_tuple(p, create) );
545 term.push_back( boost::make_tuple(neighs[n], destroy) );
546 this->
terms_.push_back(term);
552 term.push_back( boost::make_tuple(p, destroy) );
553 term.push_back( boost::make_tuple(neighs[n], create) );
554 this->
terms_.push_back(term);
564 throw std::runtime_error(
"update() not yet implemented for this model.");
582 return static_cast<int>(parms[
"u1_total_charge"]);
589 else if (name ==
"cdag")
591 else if (name ==
"c")
594 throw std::runtime_error(
"Operator not valid for this model.");
605 typedef std::vector<block_matrix<Matrix, U1> > op_vec;
606 typedef std::vector<std::pair<op_vec, bool> > bond_element;
608 measurements_type meas;
613 op_vec(1,tag_handler->get_op(dens))) );
617 ops.push_back( std::make_pair(op_vec(1,tag_handler->get_op(dens)),
false) );
618 ops.push_back( std::make_pair(op_vec(1,tag_handler->get_op(dens)),
false) );
626 ops.push_back( std::make_pair(op_vec(1,tag_handler->get_op(create)),
true) );
627 ops.push_back( std::make_pair(op_vec(1,tag_handler->get_op(destroy)),
true) );
640 boost::shared_ptr<TagHandler<Matrix, U1> > tag_handler;
642 tag_type create, destroy, sign, dens;
tag_type filling_matrix_tag(size_t type) const
table_ptr operators_table() const
tag_type filling_matrix_tag(size_t type) const
boost::ptr_vector< measurement< Matrix, U1 > > measurements_type
U1::charge total_quantum_numbers(BaseParameters &parms) const
Index< U1 > const & phys_dim(size_t type) const
FreeFermions(const Lattice &lat, double t=1)
void update(BaseParameters const &p)
measurements_type measurements() const
tag_type filling_matrix_tag(size_t type) const
tag_type get_operator_tag(std::string const &name, size_t type) const
table_ptr operators_table() const
tag_type identity_matrix_tag(size_t type) const
definition of Model base class
Heisenberg(const Lattice &lat, double Jxy, double Jz)
#define REGISTER(op, kind)
size_type insert_block(Matrix const &, charge, charge)
boost::shared_ptr< table_type > table_ptr
void update(BaseParameters const &p)
table_type::tag_type tag_type
Index< U1 > const & phys_dim(size_t type) const
std::vector< term_descriptor > terms_type
virtual op_t const & identity_matrix(size_t type) const
table_ptr operators_table() const
block_matrix< Matrix, SymmGroup > sqrt(block_matrix< Matrix, SymmGroup > m)
tag_type get_operator_tag(std::string const &name, size_t type) const
BoseHubbard(const Lattice &lat_, BaseParameters &model_)
tag_type filling_matrix_tag(size_t type) const
HCB(const Lattice &lat, double t=1)
::term_descriptor< typename Matrix::value_type > term_descriptor
tag_type identity_matrix_tag(size_t type) const
tag_type get_operator_tag(std::string const &name, size_t type) const
U1::charge total_quantum_numbers(BaseParameters &parms) const
void update(BaseParameters const &p)
table_ptr operators_table() const
measurements_type measurements() const
measurements_type measurements() const
std::vector< pos_t > forward(pos_t site) const
Index< U1 > const & phys_dim(size_t type) const
std::size_t insert(std::pair< charge, std::size_t > const &x)
measurements_type measurements() const
U1::charge total_quantum_numbers(BaseParameters &parms) const
Index< U1 > const & phys_dim(size_t type) const
tag_type identity_matrix_tag(size_t type) const
tag_type identity_matrix_tag(size_t type) const
void update(BaseParameters const &p)
virtual op_t const & filling_matrix(size_t type) const
U1::charge total_quantum_numbers(BaseParameters &parms) const
tag_type get_operator_tag(std::string const &name, size_t type) const