ALPS MPS Codes
Reference documentation.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Public Member Functions | List of all members
nearest_neighbors_evolver< Matrix, SymmGroup > Class Template Reference

#include <tevol_nn_sim.h>

Public Member Functions

 nearest_neighbors_evolver (DmrgParameters *parms_, MPS< Matrix, SymmGroup > *mps_, Lattice const &lattice_, Model< Matrix, SymmGroup > const &model_, int init_sweep=0)
 
void prepare_te_terms (unsigned sweep)
 
void operator() (unsigned sweep, unsigned nsteps)
 
results_collector const & iteration_results () const
 

Detailed Description

template<class Matrix, class SymmGroup>
class nearest_neighbors_evolver< Matrix, SymmGroup >

Definition at line 85 of file tevol_nn_sim.h.

Constructor & Destructor Documentation

template<class Matrix , class SymmGroup >
nearest_neighbors_evolver< Matrix, SymmGroup >::nearest_neighbors_evolver ( DmrgParameters parms_,
MPS< Matrix, SymmGroup > *  mps_,
Lattice const &  lattice_,
Model< Matrix, SymmGroup > const &  model_,
int  init_sweep = 0 
)
inline

Definition at line 87 of file tevol_nn_sim.h.

90  : parms(parms_)
91  , mps(mps_)
92  , lattice(lattice_) // shallow copy
93  , model(model_) // shallow copy
94  , L(lattice.size())
95  , trotter_order(parse_trotter_order((*parms)["te_order"]))
96  , block_terms(hamil_to_blocks(lattice, model))
97  {
98  maquis::cout << "Using nearest-neighbors time evolution." << std::endl;
99  maquis::cout << "Using " << trotter_order << std::endl;
100  maquis::cout << "Time evolution optimization is "
101  << (((*parms)["te_optim"]) ? "enabled" : "disabled")
102  << std::endl;
103 
104  /// alpha coeffiecients and set sequence of Uterms according to trotter order
105  switch (trotter_order){
106  case second_order:
107  {
108  gates_coeff.push_back(std::make_pair(0,0.5)); // 0-term
109  gates_coeff.push_back(std::make_pair(1,1.)); // 1-term
110 
111  Useq.push_back(0); // odd
112  Useq.push_back(1); // even
113  Useq.push_back(0); // odd
114 
115  if ((*parms)["te_optim"])
116  {
117  gates_coeff.push_back(std::make_pair(0,1.)); // 2-term
118 
119  Useq_bmeas.push_back(0); // odd
120  Useq_bmeas.push_back(1); // even
121  Useq_bmeas.push_back(2); // odd
122 
123  Useq_double.push_back(1); // even
124  Useq_double.push_back(2); // odd
125 
126  Useq_ameas.push_back(1); // even
127  Useq_ameas.push_back(0); // odd
128  }
129 
130  maquis::cout << "Sequence initialized with " << Useq.size() << " terms." << std::endl;
131  break;
132  }
133  case fourth_order:
134  {
135  double alpha_1=1./(4.0-pow(4.0,0.33333));
136  double alpha_3=1.-4.0*alpha_1;
137 
138  gates_coeff.push_back(std::make_pair(0,alpha_1*0.5)); // 0-term
139  gates_coeff.push_back(std::make_pair(1,alpha_1)); // 1-term
140  gates_coeff.push_back(std::make_pair(0,alpha_3*0.5)); // 2-term
141  gates_coeff.push_back(std::make_pair(1,alpha_3)); // 3-term
142 
143  Useq.push_back(0); // odd
144  Useq.push_back(1); // even
145  Useq.push_back(0); // odd
146  Useq.push_back(0); // odd
147  Useq.push_back(1); // even
148  Useq.push_back(0); // odd
149  Useq.push_back(2); // odd
150  Useq.push_back(3); // even
151  Useq.push_back(2); // odd
152  Useq.push_back(0); // odd
153  Useq.push_back(1); // even
154  Useq.push_back(0); // odd
155  Useq.push_back(0); // odd
156  Useq.push_back(1); // even
157  Useq.push_back(0); // odd
158 
159  if ((*parms)["te_optim"])
160  {
161  gates_coeff.push_back(std::make_pair(0,alpha_1)); // 4-term
162  gates_coeff.push_back(std::make_pair(0,alpha_3*0.5+alpha_1*0.5)); // 5-term
163 
164  Useq_bmeas.push_back(0); // odd
165  Useq_bmeas.push_back(1); // even
166  Useq_bmeas.push_back(4); // odd
167  Useq_bmeas.push_back(1); // even
168  Useq_bmeas.push_back(5); // odd
169  Useq_bmeas.push_back(3); // even
170  Useq_bmeas.push_back(5); // odd
171  Useq_bmeas.push_back(1); // even
172  Useq_bmeas.push_back(4); // odd
173  Useq_bmeas.push_back(1); // even
174  Useq_bmeas.push_back(4); // odd
175 
176  Useq_double.push_back(1); // even
177  Useq_double.push_back(4); // odd
178  Useq_double.push_back(1); // even
179  Useq_double.push_back(5); // odd
180  Useq_double.push_back(3); // even
181  Useq_double.push_back(5); // odd
182  Useq_double.push_back(1); // even
183  Useq_double.push_back(4); // odd
184  Useq_double.push_back(1); // even
185  Useq_double.push_back(4); // odd
186 
187  Useq_ameas.push_back(1); // even
188  Useq_ameas.push_back(4); // odd
189  Useq_ameas.push_back(1); // even
190  Useq_ameas.push_back(5); // odd
191  Useq_ameas.push_back(3); // even
192  Useq_ameas.push_back(5); // odd
193  Useq_ameas.push_back(1); // even
194  Useq_ameas.push_back(4); // odd
195  Useq_ameas.push_back(1); // even
196  Useq_ameas.push_back(0); // odd
197  }
198  maquis::cout << "Sequence initialized with " << Useq.size() << " terms." << std::endl;
199 
200  break;
201  }
202  default:
203  {
204  throw std::runtime_error("uknown Trotter decomposition");
205  break;
206  }
207  }
208 
209  /// compute the time evolution gates
210  prepare_te_terms(init_sweep);
211  }
std::vector< block_matrix< Matrix, SymmGroup > > hamil_to_blocks(Lattice const &lat, Model< Matrix, SymmGroup > const &model)
Definition: te_utils.hpp:130
void prepare_te_terms(unsigned sweep)
Definition: tevol_nn_sim.h:214
pos_t size() const
Definition: lattice.h:115

Member Function Documentation

template<class Matrix , class SymmGroup >
results_collector const& nearest_neighbors_evolver< Matrix, SymmGroup >::iteration_results ( ) const
inline

Definition at line 257 of file tevol_nn_sim.h.

258  {
259  return iteration_results_;
260  }
template<class Matrix , class SymmGroup >
void nearest_neighbors_evolver< Matrix, SymmGroup >::operator() ( unsigned  sweep,
unsigned  nsteps 
)
inline

Definition at line 239 of file tevol_nn_sim.h.

240  {
241  iteration_results_.clear();
242 
243  if (nsteps < 2 || !static_cast<bool>((*parms)["te_optim"])) {
244  // nsteps sweeps
245  for (unsigned i=0; i < nsteps; ++i) evolve_time_step(Useq);
246 
247  } else {
248  // one sweep
249  evolve_time_step(Useq_bmeas);
250  // nsteps - 2 sweeps
251  for (unsigned i=1; i < nsteps-1; ++i) evolve_time_step(Useq_double);
252  // one sweep
253  evolve_time_step(Useq_ameas);
254  }
255  }
template<class Matrix , class SymmGroup >
void nearest_neighbors_evolver< Matrix, SymmGroup >::prepare_te_terms ( unsigned  sweep)
inline

Definition at line 214 of file tevol_nn_sim.h.

215  {
216  double dt = (*parms)["dt"];
217  typename Matrix::value_type I;
218  if (sweep < (*parms)["nsweeps_img"])
220  else
222  typename Matrix::value_type alpha = -I * dt;
223 
224  Uterms.resize(gates_coeff.size(), trotter_gate<Matrix, SymmGroup>(L));
225  for (size_t i=0; i<gates_coeff.size(); ++i) {
226  Uterms[i].clear();
227  Uterms[i].pfirst = gates_coeff[i].first;
228  for (size_t p=gates_coeff[i].first; p<L-1; p+=2){
229  int type1 = lattice.get_prop<int>("type", p);
230  int type2 = lattice.get_prop<int>("type", p+1);
231  if ((*parms)["expm_method"] == "heev")
232  Uterms[i].add_term(p, op_exp_hermitian(model.phys_dim(type1)*model.phys_dim(type2), block_terms[p], gates_coeff[i].second*alpha));
233  else
234  Uterms[i].add_term(p, op_exp(model.phys_dim(type1)*model.phys_dim(type2), block_terms[p], gates_coeff[i].second*alpha));
235  }
236  }
237  }
block_matrix< Matrix, SymmGroup > op_exp(Index< SymmGroup > const &phys, block_matrix< Matrix, SymmGroup > M, A const &alpha=1.)
T get_prop(std::string property, pos_t site) const
Definition: lattice.h:103
block_matrix< Matrix, SymmGroup > op_exp_hermitian(Index< SymmGroup > const &phys, block_matrix< Matrix, SymmGroup > M, A const &alpha=1.)

The documentation for this class was generated from the following file: