FieldType calcSuperDensity(size_t site, size_t site2, const HilbertStateType& gs, const EngineType& engine) { HilbertStateType savedVector = gs; FieldType savedValue = 0; FieldType sum = 0; OpNormalFactoryType opNormalFactory(engine); OpLibFactoryType opLibFactory(engine); for (size_t sigma = 0;sigma<2;sigma++) { HilbertStateType phi = gs; LibraryOperatorType& myOp = opLibFactory( LibraryOperatorType::N,site,1-sigma); myOp.applyTo(phi); OperatorType& myOp2 = opNormalFactory(OperatorType::CREATION, site,sigma); myOp2.applyTo(phi); for (size_t sigma2 = 0;sigma2 < 2;sigma2++) { HilbertStateType phi3 = phi; LibraryOperatorType& myOp3 = opLibFactory( LibraryOperatorType::NBAR,site2,1-sigma2); myOp3.applyTo(phi3); OperatorType& myOp4 = opNormalFactory( OperatorType::DESTRUCTION,site2,sigma2); myOp4.applyTo(phi3); if (sigma ==0 && sigma2 ==0) savedVector = phi3; sum += scalarProduct(phi3,phi3); if (sigma ==1 && sigma2 ==1) { savedValue = scalarProduct(phi3,savedVector); } } } sum += 2*real(savedValue); //std::cerr<<"#sum2="<<scalarProduct(tmpV,tmpV)<<"\n"; return sum; }
int main(int argc,char* argv[]) { int opt = 0; PsimagLite::String file(""); while ((opt = getopt(argc, argv, "f:")) != -1) { switch (opt) { case 'f': file=optarg; break; default: /* '?' */ throw std::runtime_error("Wrong usage\n"); } } if (file=="") { throw std::runtime_error("Wrong usage\n"); } FreeFermions::InputCheck inputCheck; InputNgType::Writeable ioWriteable(file,inputCheck); InputNgType::Readable io(ioWriteable); GeometryParamsType geometryParams(io); SizeType electronsUp = GeometryParamsType::readElectrons(io,geometryParams.sites); SizeType dof = 2; // spin up and down GeometryLibraryType geometry(geometryParams); std::cerr<<geometry; SizeType npthreads = 1; ConcurrencyType concurrency(&argc,&argv,npthreads); EngineType engine(geometry.matrix(),dof,true); PsimagLite::Vector<SizeType>::Type ne(dof,electronsUp); // n. of up (= n. of down electrons) HilbertStateType gs(engine,ne); RealType sum = 0; for (SizeType i=0;i<ne[0];i++) sum += engine.eigenvalue(i); std::cerr<<"Energy="<<dof*sum<<"\n"; SizeType n = geometryParams.sites; MatrixType m(n,n); FieldType sum2 = 0; SizeType effectiveN = n; SizeType norb = (geometryParams.type == GeometryLibraryType::FEAS || geometryParams.type == GeometryLibraryType::FEAS1D) ? geometryParams.orbitals : 1; OpLibFactoryType opLibFactory(engine); for (SizeType site = 0; site<effectiveN ; site++) { FieldType y = 0; for (SizeType orb1 = 0;orb1<norb; orb1++) { HilbertStateType phi = gs; LibraryOperatorType& myOp = opLibFactory(LibraryOperatorType::DELTA,site+orb1*n,0); myOp.applyTo(phi); y += scalarProduct(phi,gs); for (SizeType site2=0; site2<effectiveN; site2++) { for (SizeType orb2=0;orb2<norb;orb2++) { HilbertStateType phi2 = gs; LibraryOperatorType& myOp2 = opLibFactory(LibraryOperatorType::DELTA,site2+orb2*n,0); myOp2.applyTo(phi2); FieldType x = scalarProduct(phi2,phi); std::cout<<x<<" "; std::cout.flush(); m(site,site2) += x; sum2 += y*y; } } std::cout<<"\n"; } } }
int main(int argc,char *argv[]) { int opt; size_t n =0; size_t electronsUp=0; RealType step = 0; RealType offset=0; size_t total=0; size_t site = 0; bool ladder = false; std::vector<RealType> v; std::vector<std::string> str; while ((opt = getopt(argc, argv, "n:e:s:p:t:o:i:l")) != -1) { switch (opt) { case 'n': n = atoi(optarg); v.resize(n,0); break; case 'e': electronsUp = atoi(optarg); break; case 's': site = atoi(optarg); break; case 'p': if (v.size()==0) { std::string s(argv[0]); s += "-p must come after -n\n"; throw std::runtime_error(s.c_str()); } PsimagLite::tokenizer(optarg,str,","); if (str.size() & 1) { std::string s(argv[0]); s += " Expecting pairs for -p\n"; throw std::runtime_error(s.c_str()); } for (size_t i=0;i<str.size();i+=2) { v[atoi(str[i].c_str())] = atof(str[i+1].c_str()); } break; case 't': total = atoi(optarg); break; case 'i': step = atof(optarg); break; case 'o': offset = atof(optarg); break; case 'l': ladder = true; break; default: /* '?' */ throw std::runtime_error("Wrong usage\n"); } } if (n==0 || total==0) throw std::runtime_error("Wrong usage\n"); size_t dof = 1; // spinless GeometryParamsType geometryParams; geometryParams.sites = n; GeometryLibraryType* geometry; if (!ladder) { geometryParams.type = GeometryLibraryType::CHAIN; geometry = new GeometryLibraryType(geometryParams); } else { geometryParams.hopping.resize(2); geometryParams.hopping[0] = 1.0; geometryParams.hopping[1] = 0.5; geometryParams.type = GeometryLibraryType::LADDER; geometry = new GeometryLibraryType(geometryParams); } geometry->addPotential(v); std::cerr<<v; ConcurrencyType concurrency(argc,argv); EngineType engine(*geometry,concurrency,dof,false); std::vector<size_t> ne(dof,electronsUp); // 8 up and 8 down bool debug = false; HilbertStateType gs(engine,ne,debug); size_t sigma =0; std::cout<<"#site="<<site<<"\n"; OpLibFactoryType opLibFactory(engine); for (size_t i=0;i<total;++i) { RealType beta = i*step + offset; doOneBeta(engine,ne,opLibFactory,site,sigma,beta); } delete geometry; }
int main(int argc,char *argv[]) { int opt; size_t n =0,electronsUp=0,total=0; RealType offset = 0; std::vector<size_t> sites; std::vector<std::string> str; RealType step = 0; GeometryParamsType geometryParams; std::vector<RealType> v; while ((opt = getopt(argc, argv, "n:e:b:s:t:o:i:g:p:")) != -1) { switch (opt) { case 'n': n = atoi(optarg); break; case 'e': electronsUp = atoi(optarg); break; case 's': str.clear(); PsimagLite::tokenizer(optarg,str,","); for (size_t i=0;i<str.size();i++) { sites.push_back(atoi(str[i].c_str())); } break; case 't': total = atoi(optarg); break; case 'i': step = atof(optarg); break; case 'o': offset = atof(optarg); break; case 'g': str.clear(); PsimagLite::tokenizer(optarg,str,","); setMyGeometry(geometryParams,str); break; case 'p': readPotential(v,optarg); break; default: /* '?' */ throw std::runtime_error("Wrong usage\n"); } } if (n==0 || total==0) throw std::runtime_error("Wrong usage\n"); size_t dof = 2; // spin up and down geometryParams.sites = n; GeometryLibraryType geometry(geometryParams); if (geometryParams.type!=GeometryLibraryType::KTWONIFFOUR) { geometry.addPotential(v); } std::cerr<<geometry; ConcurrencyType concurrency(argc,argv); EngineType engine(geometry,concurrency,dof,false); std::vector<size_t> ne(dof,electronsUp); // 8 up and 8 down bool debug = false; bool verbose = false; HilbertStateType gs(engine,ne,debug); // size_t sigma3 = 0; FieldType superdensity = calcSuperDensity(sites[0],sites[1],gs,engine); std::cout<<"#superdensity="<<superdensity<<"\n"; std::cout<<"#site="<<sites[0]<<" site2="<<sites[1]<<"\n"; PsimagLite::Range<ConcurrencyType> range(0,total,concurrency); enum {SPIN_UP,SPIN_DOWN}; while(!range.end()) { size_t it = range.index(); OpNormalFactoryType opNormalFactory(engine); OpLibFactoryType opLibFactory(engine); OpDiagonalFactoryType opDiagonalFactory(engine); RealType time = it * step + offset; EtoTheIhTimeType eih(time,engine,0); DiagonalOperatorType& eihOp = opDiagonalFactory(eih); // HilbertStateType savedVector = gs; // FieldType savedValue = 0; // FieldType sum = 0; std::vector<HilbertStateType*> savedVector(4); for (size_t sigma = 0;sigma<2;sigma++) { HilbertStateType phi = gs; LibraryOperatorType& myOp = opLibFactory( LibraryOperatorType::N,sites[0],1-sigma); myOp.applyTo(phi); OperatorType& myOp2 = opNormalFactory(OperatorType::CREATION, sites[0],sigma); myOp2.applyTo(phi); for (size_t sigma2 = 0;sigma2 < 2;sigma2++) { savedVector[sigma+sigma2*2] = new HilbertStateType(phi); LibraryOperatorType& myOp3 = opLibFactory( LibraryOperatorType::NBAR,sites[1],1-sigma2); myOp3.applyTo(*savedVector[sigma+sigma2*2]); OperatorType& myOp4 = opNormalFactory( OperatorType::DESTRUCTION,sites[1],sigma2); myOp4.applyTo(*savedVector[sigma+sigma2*2]); if (verbose) std::cerr<<"Applying exp(iHt)\n"; eihOp.applyTo(*savedVector[sigma+sigma2*2]); if (verbose) std::cerr<<"Applying c_{p down}\n"; OperatorType& myOp6 = opNormalFactory( OperatorType::DESTRUCTION,sites[2],SPIN_DOWN); myOp6.applyTo(*savedVector[sigma+sigma2*2]); if (verbose) std::cerr<<"Applying c_{p up}\n"; OperatorType& myOp7 = opNormalFactory( OperatorType::DESTRUCTION,sites[2],SPIN_UP); myOp7.applyTo(*savedVector[sigma+sigma2*2]); // if (verbose) std::cerr<<"Adding "<<sigma<<" "<<sigma2<<" "<<it<<"\n"; // // if (sigma ==0 && sigma2 ==0) savedVector = phi3; // if (sigma ==1 && sigma2 ==1) { // savedValue = scalarProduct(phi3,savedVector); // } // sum += scalarProduct(phi3,phi3); // if (verbose) std::cerr<<"Done with scalar product\n"; } } FieldType sum = 0; size_t total = savedVector.size()*savedVector.size()/2; for (size_t x=0;x<total;x++) { size_t sigma = (x & 3); size_t sigma2 = (x & 12); sigma2 >>= 2; sum += scalarProduct(*savedVector[sigma],*savedVector[sigma2]); } for (size_t x=0;x<savedVector.size();x++) delete savedVector[x]; std::cout<<time<<" "<<(2.0*sum)<<"\n"; range.next(); } }