Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "itensor/all.h"
- #include <iostream>
- #include <chrono>
- #include <cstdlib>
- #include <stdio.h>
- #include <ctime>
- #include <gsl/gsl_blas.h>
- #include <gsl/gsl_linalg.h>
- #include <gsl/gsl_eigen.h>
- #include <gsl/gsl_multimin.h>
- #include <gsl/gsl_complex_math.h>
- #include <string>
- #include <set>
- #include <vector>
- #include <functional>
- #include <algorithm>
- using namespace itensor;
- using namespace std;
- using namespace std::chrono;
- #define Ndimers 1
- #define Nspins 4
- #define UU 1.0
- #define optimization true
- #define ms 4
- #define groups 2
- typedef std::chrono::high_resolution_clock Clock;
- typedef struct params_t {
- int N;
- double U;
- double h;
- int index;
- int point;
- } params_t;
- vector<vector<int>> dimers;
- auto states = vector<MPS>(Ndimers);
- auto sites_dmrg = Hubbard(Nspins);
- auto sites = Hubbard(Nspins);//, {"ConserveSz", false});
- auto H = vector<MPO>(16);
- int find_index(vector <int> numbers, int num)
- {
- vector<int>:: iterator it;
- int pos=0;
- for (it=numbers.begin(); it!=numbers.end(); it++) {
- if (*it == num)
- return pos;
- ++pos;
- }
- return -1;
- }
- double create_state(const gsl_vector *cicoeff, void *params)
- {
- int N = ((params_t *) params)->N;
- int index = ((params_t *) params)->index;
- auto psi = MPS(sites);
- double normalization;
- for(int n = 1; n <= N; n += 2)
- {
- auto s1 = sites(n);
- auto s2 = sites(n+1);
- normalization = 0;
- int pos = n/2*ms;
- for (int i=pos; i<=pos+ms-1; i++)
- normalization += pow(gsl_vector_get(cicoeff,i),2);
- auto wf = ITensor(s1,s2);
- wf.set(s1(2),s2(3), gsl_vector_get(cicoeff, pos)/sqrt(normalization));
- wf.set(s1(3),s2(2), gsl_vector_get(cicoeff, pos+1)/sqrt(normalization));
- wf.set(s1(1),s2(4), gsl_vector_get(cicoeff, pos+2)/sqrt(normalization));
- wf.set(s1(4),s2(1), gsl_vector_get(cicoeff, pos+3)/sqrt(normalization));
- //wf.set(s1(2),s2(2), gsl_vector_get(cicoeff, pos+4)/sqrt(normalization));
- //wf.set(s1(3),s2(3), gsl_vector_get(cicoeff, pos+5)/sqrt(normalization));
- /* wf.set(s1(4),s2(1), gsl_vector_get(cicoeff, pos)/sqrt(normalization));
- wf.set(s1(2),s2(3), gsl_vector_get(cicoeff, pos+1)/sqrt(normalization));
- wf.set(s1(3),s2(2), gsl_vector_get(cicoeff, pos+2)/sqrt(normalization));
- wf.set(s1(1),s2(4), gsl_vector_get(cicoeff, pos+3)/sqrt(normalization));
- wf.set(s1(2),s2(2), gsl_vector_get(cicoeff, pos+4)/sqrt(normalization));
- wf.set(s1(3),s2(3), gsl_vector_get(cicoeff, pos+5)/sqrt(normalization));
- wf.set(s1(2),s2(1), gsl_vector_get(cicoeff, pos+6)/sqrt(normalization));
- wf.set(s1(3),s2(1), gsl_vector_get(cicoeff, pos+7)/sqrt(normalization));
- wf.set(s1(1),s2(2), gsl_vector_get(cicoeff, pos+8)/sqrt(normalization));
- wf.set(s1(1),s2(3), gsl_vector_get(cicoeff, pos+9)/sqrt(normalization));
- wf.set(s1(2),s2(4), gsl_vector_get(cicoeff, pos+10)/sqrt(normalization));
- wf.set(s1(3),s2(4), gsl_vector_get(cicoeff, pos+11)/sqrt(normalization));
- wf.set(s1(4),s2(2), gsl_vector_get(cicoeff, pos+12)/sqrt(normalization));
- wf.set(s1(4),s2(3), gsl_vector_get(cicoeff, pos+13)/sqrt(normalization));
- wf.set(s1(4),s2(4), gsl_vector_get(cicoeff, pos+14)/sqrt(normalization));
- wf.set(s1(1),s2(1), gsl_vector_get(cicoeff, pos+15)/sqrt(normalization));
- */
- psi.ref(n) = ITensor(s1);
- psi.ref(n+1) = ITensor(s2);
- auto [U,S,V] = svd(wf,{inds(psi.ref(n))},{"Cutoff=",1E-8});
- psi.ref(n) = U;
- psi.ref(n+1) = S*V;
- }
- int swaps = 1;
- vector<pair <int,int>> swaps_;
- vector <int> dimer;
- for (int i=0; i<N; i++)
- dimer.push_back(dimers[index][i]);
- while (swaps > 0)
- {
- swaps = 0;
- pair <int,int> pair1;
- for (int i=1; i<N; i++)
- {
- int pos1, pos2;
- pos1 = find_index(dimer, i);
- pos2 = find_index(dimer, i+1);
- if (pos1 > pos2)
- {
- pair1.first = dimer[pos1];
- pair1.second = dimer[pos2];
- swaps_.push_back(pair1);
- swaps += 1;
- int temp = dimer[pos1];
- dimer[pos1] = dimer[pos2];
- dimer[pos2] = temp;
- continue;
- }
- }
- }
- auto s1 = vector<Index>(1);
- auto s2 = vector<Index>(1);
- int ar1, ar2;
- ITensor wf, S,V,U;
- for (int i=swaps_.size()-1; i>=0; i--){
- ar1 = swaps_[i].first;
- ar2 = swaps_[i].second;
- s1.clear(); s1.push_back(siteIndex(psi,ar1));
- s2.clear(); s2.push_back(siteIndex(psi,ar2));
- auto is1 = IndexSet(s1);
- auto is2 = IndexSet(s2);
- psi.position(ar1);
- wf = psi.A(ar1)*psi.A(ar2);
- wf.swapInds(is1,is2);
- wf.noPrime();
- U = psi.A(ar1);
- svd(wf,U,S,V,{"Cutoff=",1E-8});
- psi.setA(ar1,U);
- psi.setA(ar2,S*V);
- }
- states.at(index) = psi;
- int point = ((params_t *) params)->point;
- return inner(states.at(index),H[point],states.at(index));
- }
- void find_grad(const gsl_vector *cicoeff, void *params, gsl_vector *grad)
- {
- /* for (int i=0; i<N; i++) {
- etacoeff[i] += 2*h;
- double energy = 0;
- energy -= eval_energy(N,M,etacoeff,delta);
- etacoeff[i] -= h;
- energy += 8*eval_energy(N,M,etacoeff,delta);
- etacoeff[i] -= 2*h;
- energy -= 8*eval_energy(N,M,etacoeff,delta);
- etacoeff[i] -= h;
- energy += eval_energy(N,M,etacoeff,delta);
- grad[i] = energy/(12*h);
- etacoeff[i] += 2*h;
- }*/
- double h = ((params_t *) params)->h;
- int N = ((params_t *) params)->N;
- gsl_vector *test_cicoeff;
- test_cicoeff = gsl_vector_alloc(ms*groups);
- for (int i=0; i<ms*groups; i++)
- gsl_vector_set(test_cicoeff, i, gsl_vector_get(cicoeff, i));
- for (int i=0; i<ms*groups; i++) {
- gsl_vector_set(test_cicoeff,i, gsl_vector_get(test_cicoeff,i)+ h);
- double energy = 0;
- energy += create_state(test_cicoeff, params);
- gsl_vector_set(test_cicoeff,i, gsl_vector_get(test_cicoeff,i)- h);
- energy -= create_state(test_cicoeff, params);
- gsl_vector_set(grad,i, energy/h);
- }
- }
- void fdf(const gsl_vector *cicoeff, void *params, double *energy, gsl_vector *grad)
- {
- *energy = create_state(cicoeff, params);
- find_grad(cicoeff, params, grad);
- }
- void debug_print(const gsl_multimin_fdfminimizer *s, const int k, int N)
- {
- const gsl_vector *x = NULL;
- const gsl_vector *g = NULL;
- /**
- * Display current iteration.
- */
- //cout << "\nAt iteration k = " << k << endl;
- /*g = gsl_multimin_fdfminimizer_gradient(s);
- cout << "g = [ ";
- for (int i=0; i<N; i++)
- cout << gsl_vector_get(g, i) << " ";
- cout << endl;
- x = gsl_multimin_fdfminimizer_x(s);
- cout << "x = [ ";
- for (int i=0; i<N; i++)
- cout << gsl_vector_get(x, i) << " ";
- cout << endl;*/
- cout << "f(x) = " << gsl_multimin_fdfminimizer_minimum(s) << endl;
- } /** end function print_result() */
- string convertToString(char* a)
- {
- int i, size=strlen(a);
- string s = "";
- for (i = 0; i < size; i++) {
- s = s + a[i];
- }
- return s;
- }
- void generate_H()
- {
- for (int ii=0; ii<=15; ii++)
- {
- double U = UU + ii*0.5;
- auto ampo = AutoMPO(sites);
- for(int b = 1; b < Nspins; ++b)
- {
- ampo += -1.0,"Cdagup",b,"Cup",b+1; //Hopping for spin up
- ampo += -1.0,"Cdagup",b+1,"Cup",b; // <-
- ampo += -1.0,"Cdagdn",b,"Cdn",b+1; //Hopping for spin down
- ampo += -1.0,"Cdagdn",b+1,"Cdn",b;// <-
- ampo += U, "Nup", b, "Ndn", b;
- }
- ampo += U, "Nup", Nspins, "Ndn", Nspins;
- ampo += -1.0,"Cdagup",1,"Cup",Nspins; //Hopping for spin up
- ampo += -1.0,"Cdagup",Nspins,"Cup",1; // <-
- ampo += -1.0,"Cdagdn",1,"Cdn",Nspins; //Hopping for spin down
- ampo += -1.0,"Cdagdn",Nspins,"Cdn",1;// <-
- MPO H_ = toMPO(ampo);
- H.at(ii) = H_;
- }
- }
- void orth_states()
- {
- auto states_temp = vector<MPS>(Ndimers);
- states_temp.at(0) = states[0];
- for (int i=1; i<Ndimers; i++)
- {
- states_temp.at(i) = states.at(i);
- states_temp.at(i).plusEq(-inner(states.at(0),states.at(i))*states.at(0));
- }
- for (int i=1; i<Ndimers; i++)
- {
- states[i] = states_temp[i];
- states[i] /= norm(states_temp[i]); //Check if necessary
- }
- }
- double fRand(double fMin, double fMax)
- {
- double f = (double)rand() / RAND_MAX;
- return fMin + f * (fMax - fMin);
- }
- void computeG(gsl_matrix *G, int point, int ind)
- {
- for (int i=1; i<=Nspins; i++)
- {
- for (int j=1; j<=Nspins; j++)
- {
- for (int sgi=0; sgi<=1; sgi+=1) {
- for (int sgj=0; sgj<=1; sgj+=1) {
- char Cd[7] = "Cdag"; char C[4] = "C";
- char Sgi[3], Sgj[3]; char up[3]="up"; char dn[3]="dn";
- if (sgi == 0) {
- strcpy(Sgi,"dn");
- }
- if (sgj == 0) {
- strcpy(Sgj,"dn");
- }
- if (sgi == 1) {
- strcpy(Sgi,"up");
- }
- if (sgj == 1) {
- strcpy(Sgj, "up");
- }
- MPS Phi_0 = removeQNs(states.at(ind));
- MPO h = H[point];
- auto ampo = AutoMPO(sites);
- if (sgi == sgj) {
- ampo += convertToString(Cd)+convertToString(Sgi), i, convertToString(C)+convertToString(Sgj), j;
- MPO cc = toMPO(ampo);
- MPS h_mps = applyMPO(h,Phi_0); MPS cc_mps = applyMPO(cc,Phi_0);
- cout << " " << inner(Phi_0,cc,h_mps) << " " << inner(Phi_0, h, cc_mps) << " " << i << j << endl;
- double elem = -(inner(Phi_0, h, cc_mps) - inner(Phi_0,cc,h_mps));
- gsl_matrix_set(G, 2*(i-1)+sgi,2*(j-1)+sgj,elem);}
- }
- }
- }
- }
- }
- int main()
- {
- srand (time(NULL));
- //srand(2);
- int N = Nspins;
- params_t *params = NULL;
- params = (params_t *) malloc(sizeof(params_t));
- generate_H();
- params->N = N;
- params->U = UU;
- params->h = 1e-4;
- gsl_vector *cicoeff;
- cicoeff = gsl_vector_alloc(ms*groups);
- FILE *out = fopen("results.txt", "w");
- vector<int> dimer;
- FILE *fp = fopen("input.dat", "r");
- for (int i=0; i<Ndimers; i++)
- {
- int temp;
- for (int j=0; j<N; j++)
- {
- fscanf(fp, "%d ", &temp);
- dimer.push_back(temp);
- }
- dimers.push_back(dimer);
- dimer.clear();
- }
- fclose(fp);
- params->point = 0;
- while (params->point <= 15)
- {
- for (int i=0; i<Ndimers; i++)
- {
- for (int i=0; i<ms*groups; i++)
- gsl_vector_set(cicoeff,i,fRand(0,1));
- /* for (int i=ms; i<ms*groups; i+=ms)
- {
- gsl_vector_set(cicoeff, i, gsl_vector_get(cicoeff, 0));
- gsl_vector_set(cicoeff, i+1, gsl_vector_get(cicoeff, 1));
- gsl_vector_set(cicoeff, i+2, gsl_vector_get(cicoeff, 2));
- gsl_vector_set(cicoeff, i+3, gsl_vector_get(cicoeff, 3));
- gsl_vector_set(cicoeff, i+4, gsl_vector_get(cicoeff, 4));
- gsl_vector_set(cicoeff, i+5, gsl_vector_get(cicoeff, 5));
- gsl_vector_set(cicoeff, i+6, gsl_vector_get(cicoeff, 6));
- gsl_vector_set(cicoeff, i+7, gsl_vector_get(cicoeff, 7));
- gsl_vector_set(cicoeff, i+8, gsl_vector_get(cicoeff, 8));
- gsl_vector_set(cicoeff, i+9, gsl_vector_get(cicoeff, 9));
- gsl_vector_set(cicoeff, i+10, gsl_vector_get(cicoeff, 10));
- gsl_vector_set(cicoeff, i+11, gsl_vector_get(cicoeff, 11));
- gsl_vector_set(cicoeff, i+12, gsl_vector_get(cicoeff, 12));
- gsl_vector_set(cicoeff, i+13, gsl_vector_get(cicoeff, 13));
- gsl_vector_set(cicoeff, i+14, gsl_vector_get(cicoeff, 14));
- gsl_vector_set(cicoeff, i+15, gsl_vector_get(cicoeff, 15));
- }*/
- params->index = i;
- if (optimization)
- {
- int status;
- const gsl_multimin_fdfminimizer_type *T;
- gsl_multimin_fdfminimizer *s;
- gsl_multimin_function_fdf my_func;
- my_func.n = ms*groups;
- my_func.f = &create_state;
- my_func.df = &find_grad;
- my_func.fdf = &fdf;
- my_func.params = params;
- // T = gsl_multimin_fdfminimizer_vector_bfgs;
- // T = gsl_multimin_fdfminimizer_conjugate_pr;
- T = gsl_multimin_fdfminimizer_conjugate_fr;
- // T = gsl_multimin_fdfminimizer_steepest_descent;
- s = gsl_multimin_fdfminimizer_alloc(T, ms*groups);
- gsl_multimin_fdfminimizer_set(s,
- &my_func,
- cicoeff,
- 0.1, /** step size */
- 1e-4); /** tol */
- int k = 0;
- double old_val = 0;
- double new_val;
- do {
- status = gsl_multimin_fdfminimizer_iterate(s);
- /*new_val = gsl_multimin_fdfminimizer_minimum(s);
- if (abs(old_val-new_val) > 1e-6)
- status = -2;
- old_val = new_val;*/
- status = gsl_multimin_test_gradient(s->gradient, 1e-4);
- //debug_print(s, k, ms*groups);
- ++k;
- } while(status == GSL_CONTINUE && k <= 200);
- if (k >= 200)
- cout << "Didn't converge properly.\n";
- cout << "New dimer: " << " " << gsl_multimin_fdfminimizer_minimum(s) << "\n";
- const gsl_vector *x = NULL;
- x = gsl_multimin_fdfminimizer_x(s);
- for (int i=0; i<ms*groups; i++) {
- gsl_vector_set(cicoeff,i,gsl_vector_get(x,i));
- }
- }
- else
- {
- create_state(cicoeff, params);
- }
- for (int gg=0; gg<groups; gg++) {
- double normalization=0;
- for (int i=0; i<ms; i++) {
- normalization += pow(gsl_vector_get(cicoeff,gg*ms+i),2);
- }
- for (int i=0; i<ms; i++) {
- //cout << "cicoeff[" << gg*ms+i+1 << "] = " << gsl_vector_get(cicoeff, gg*ms+i)/sqrt(normalization) << "\t" << endl;
- }
- /*SpinHalf sites4 = SpinHalf(4, {"ConserveQNs=",false});
- auto psi4 = vector<MPS>(ms);
- auto init4 = InitState(sites4);
- init4.set(1, "Up"); init4.set(2, "Up"); init4.set(3, "Dn"); init4.set(4, "Dn");
- psi4.at(0) = MPS(init4); init4 = InitState(sites4);
- init4.set(1, "Up"); init4.set(2, "Dn"); init4.set(3, "Up"); init4.set(4, "Dn");
- psi4.at(1) = MPS(init4); init4 = InitState(sites4);
- init4.set(1, "Up"); init4.set(2, "Dn"); init4.set(3, "Dn"); init4.set(4, "Up");
- psi4.at(2) = MPS(init4); init4 = InitState(sites4);
- init4.set(1, "Dn"); init4.set(2, "Up"); init4.set(3, "Up"); init4.set(4, "Dn");
- psi4.at(3) = MPS(init4); init4 = InitState(sites4);
- init4.set(1, "Dn"); init4.set(2, "Up"); init4.set(3, "Dn"); init4.set(4, "Up");
- psi4.at(4) = MPS(init4); init4 = InitState(sites4);
- init4.set(1, "Dn"); init4.set(2, "Dn"); init4.set(3, "Up"); init4.set(4, "Up");
- psi4.at(5) = MPS(init4); init4 = InitState(sites4);
- init4.set(1, "Dn"); init4.set(2, "Up"); init4.set(3, "Up"); init4.set(4, "Up");
- psi4.at(6) = MPS(init4);init4 = InitState(sites4);
- init4.set(1, "Up"); init4.set(2, "Dn"); init4.set(3, "Up"); init4.set(4, "Up");
- psi4.at(7) = MPS(init4);init4 = InitState(sites4);
- init4.set(1, "Up"); init4.set(2, "Up"); init4.set(3, "Dn"); init4.set(4, "Up");
- psi4.at(8) = MPS(init4); init4 = InitState(sites4);
- init4.set(1, "Up"); init4.set(2, "Up"); init4.set(3, "Up"); init4.set(4, "Dn");
- psi4.at(9) = MPS(init4); init4 = InitState(sites4);
- init4.set(1, "Dn"); init4.set(2, "Dn"); init4.set(3, "Dn"); init4.set(4, "Up");
- psi4.at(10) = MPS(init4);init4 = InitState(sites4);
- init4.set(1, "Dn"); init4.set(2, "Dn"); init4.set(3, "Up"); init4.set(4, "Dn");
- psi4.at(11) = MPS(init4);init4 = InitState(sites4);
- init4.set(1, "Dn"); init4.set(2, "Up"); init4.set(3, "Dn"); init4.set(4, "Dn");
- psi4.at(12) = MPS(init4);init4 = InitState(sites4);
- init4.set(1, "Up"); init4.set(2, "Dn"); init4.set(3, "Dn"); init4.set(4, "Dn");
- psi4.at(13) = MPS(init4); init4 = InitState(sites4);
- init4.set(1, "Dn"); init4.set(2, "Dn"); init4.set(3, "Dn"); init4.set(4, "Dn");
- psi4.at(14) = MPS(init4); init4 = InitState(sites4);
- init4.set(1, "Up"); init4.set(2, "Up"); init4.set(3, "Up"); init4.set(4, "Up");
- psi4.at(15) = MPS(init4); init4 = InitState(sites4);
- auto sz4 = AutoMPO(sites4);
- for(int i=1; i<=4; i++)
- {
- sz4 += "Sz", i;
- }
- MPO Sz4 = toMPO(sz4);
- for (int i=0; i<ms; i++)
- psi4.at(i) *= gsl_vector_get(cicoeff,gg*ms+i)/sqrt(normalization);
- for (int i=1; i<ms; i++)
- {
- auto temp = psi4.at(i);
- psi4.at(0).plusEq(temp);
- }
- cout << "Cluster " << gg+1 << ", Sz = " << inner(psi4.at(0),Sz4,psi4.at(0))/inner(psi4.at(0),psi4.at(0)) << endl;
- */}
- }
- //orth_states();
- gsl_matrix *metric;
- gsl_matrix *Hmat;
- Hmat = gsl_matrix_alloc(Ndimers,Ndimers);
- metric = gsl_matrix_alloc(Ndimers,Ndimers);
- for (int i=0; i<Ndimers; i++)
- gsl_matrix_set(metric, i, i, 1.0);
- for (int i=0; i<Ndimers; i++){
- for (int j=i+1; j<Ndimers; j++){
- double val = inner(states.at(i), states.at(j));
- gsl_matrix_set(metric, i, j, val);
- gsl_matrix_set(metric, j, i, val);}}
- gsl_vector *evals;
- gsl_matrix *evec;
- evals = gsl_vector_alloc(Ndimers);
- evec = gsl_matrix_alloc(Ndimers,Ndimers);
- gsl_eigen_gensymmv_workspace *w;
- w = gsl_eigen_gensymmv_alloc (Ndimers);
- for (int i=0; i<Ndimers; i++){
- for (int j=i; j<Ndimers; j++){
- double val = inner(states.at(i), H[params->point], states.at(j));
- gsl_matrix_set(Hmat, j, i, val);
- gsl_matrix_set(Hmat, i, j, val);}}
- gsl_eigen_gensymmv (Hmat, metric, evals, evec, w);
- cout << params->U << " ";
- fprintf(out, "%lf ", params->U);
- double lowest=1e6;
- for (int i=0; i<Ndimers; i++)
- {
- if (gsl_vector_get(evals, i) < lowest)
- {
- lowest = gsl_vector_get(evals, i);
- }
- }
- cout << lowest << " ";
- fprintf(out, "%.12lf\n", lowest);
- auto dmrg_state = InitState(sites_dmrg);
- for(auto i : range1(N))
- {
- if(i%2 == 1) dmrg_state.set(i,"Up");
- else dmrg_state.set(i,"Dn");
- }
- auto psi0 = randomMPS(dmrg_state);
- auto ampo_dmrg = AutoMPO(sites_dmrg);
- for(int b = 1; b < N; ++b)
- {
- ampo_dmrg += -1.0,"Cdagup",b,"Cup",b+1; //Hopping for spin up
- ampo_dmrg += -1.0,"Cdagup",b+1,"Cup",b; // <-
- ampo_dmrg += -1.0,"Cdagdn",b,"Cdn",b+1; //Hopping for spin down
- ampo_dmrg += -1.0,"Cdagdn",b+1,"Cdn",b;// <-
- ampo_dmrg += params->U, "Nup", b, "Ndn", b;
- }
- ampo_dmrg += params->U, "Nup", N, "Ndn", N;
- ampo_dmrg += -1.0,"Cdagup",1,"Cup",N; //Hopping for spin up
- ampo_dmrg += -1.0,"Cdagup",N,"Cup",1; // <-
- ampo_dmrg += -1.0,"Cdagdn",1,"Cdn",N; //Hopping for spin down
- ampo_dmrg += -1.0,"Cdagdn",N,"Cdn",1;// <-
- MPO H_dmrg = toMPO(ampo_dmrg);
- auto sweeps = Sweeps(10);
- sweeps.maxdim() = 10,40,100,200,200;
- sweeps.cutoff() = 1E-8;
- auto [energy_dmrg, psi] = dmrg(H_dmrg,psi0,sweeps,{"Silent",true});
- auto ampo = AutoMPO(sites);
- for(int i = 1; i <= N; ++i)
- {
- ampo += "Ntot", i;
- }
- auto Ntot = toMPO(ampo);
- cout << energy_dmrg << " " << endl; //<< inner(states.at(0), Ntot, states.at(0)) << endl;
- /*
- auto s2 = AutoMPO(sites);
- auto lattice = squareNextNeighbor(Nx,Ny,{"YPeriodic=", yperiodic});
- for(int i=1; i<=Nx*Ny; i++)
- {
- //s2 += 0.5,"S+",i,"S-",i;
- //s2 += 0.5,"S-",i,"S+",i;
- //s2 += "Sz",i,"Sz",i;
- s2 += "Sz", i;
- }
- MPO S2 = toMPO(s2);
- cout << "Sz = " << inner(states.at(0),S2,states.at(0)) << endl;
- auto sz = AutoMPO(sites);
- for(int i=1; i<=Nx*Ny; i++)
- {
- sz += 0.5,"S+",i,"S-",i;
- sz += 0.5,"S-",i,"S+",i;
- sz += "Sz",i,"Sz",i;
- }
- MPO SZ = toMPO(sz);
- cout << "S^2 = " << inner(states.at(0),SZ, states.at(0)) << endl;
- */
- gsl_matrix *G; G = gsl_matrix_alloc(Nspins*2,Nspins*2);
- for (int p=0; p<Nspins; p++){
- for (int q=0; q<Nspins; q++)
- {for (int pp=0; pp<=1; pp++) { for (int qq=0;qq<=1;qq++) {
- gsl_matrix_set(G,2*p+pp,2*q+qq,0);}}}}
- computeG(G, params->point,0);
- for (int p=0; p<Nspins; p++){
- for (int q=0; q<Nspins; q++)
- {for (int pp=0; pp<=1; pp++) {
- double elem =gsl_matrix_get(G,2*p+pp,2*q+pp);
- cout << elem << " " << p << " " << q << " " << pp << endl;
- }}}
- params->U += 0.5;
- params->point += 1;
- }
- /*
- //Beginning DMRG
- auto dmrg_state = InitState(sites);
- for(auto i : range1(N))
- {
- if(i%2 == 1) dmrg_state.set(i,"Up");
- else dmrg_state.set(i,"Dn");
- }
- auto psi0 = randomMPS(dmrg_state);
- auto ampo_dmrg = AutoMPO(sites);
- for(int i = 1; i < N; ++i)
- {
- ampo_dmrg += -1, "Cdagup", i, "Cup", i+1;
- ampo_dmrg += -1, "Cdagup", i+1, "Cup", i;
- ampo_dmrg += -1, "Cdagdn", i, "Cdn", i+1;
- ampo_dmrg += -1, "Cdagdn", i+1, "Cdn", i;
- ampo_dmrg += params->U, "Nup", i, "Ndn", i;
- }
- ampo_dmrg += params->U, "Nup", N, "Ndn", N;
- ampo_dmrg += -1, "Cdagup", N, "Cup", 1;
- ampo_dmrg += -1, "Cdagup", 1, "Cup", N;
- ampo_dmrg += -1, "Cdagdn", N, "Cdn", 1;
- ampo_dmrg += -1, "Cdagdn", 1, "Cdn", N;
- auto H_dmrg = toMPO(ampo_dmrg);
- auto sweeps = Sweeps(10);
- sweeps.maxdim() = 10,40,100,200,200;
- sweeps.cutoff() = 1E-8;
- auto [energy_dmrg, psi] = dmrg(H_dmrg,psi0,sweeps,{"Silent",true});
- cout << energy_dmrg << endl;*/
- /*double pt2 = eval_pt2(params);
- cout << pt2+eval_element(params,0,0) << endl;
- fprintf(out, "%.12lf\n", pt2+eval_element(params,0,0));*/
- fclose(out);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement