DTM NdnNdn( const std::vector<Basis> &Bases, const DTV &Vec, Hamiltonian<DT> &ham ){ DTM out = DTM::Zero( Bases.at(0).getL(), Bases.at(1).getL() ); std::vector< int > f1 = Bases.at(0).getFStates(); std::vector< int > f2 = Bases.at(1).getFStates(); size_t f1id = 0, f2id = 0; for ( int &nf2 : f2 ){ std::vector<size_t> ids(2,f2id); f1id = 0; for ( int &nf1 : f1 ){ ids.at(0) = f1id; size_t id = ham.DetermineTotalIndex(ids); for (size_t cnt1 = 0; cnt1 < Bases.at(1).getL(); cnt1++) { for (size_t cnt2 = 0; cnt2 < Bases.at(1).getL(); cnt2++) { if ( btest(nf2, cnt1) && btest(nf2, cnt2) ) { out(cnt1, cnt2) += std::pow(std::abs(Vec(id)), 2);//Vec(id) * std::conj( Vec(id) ); } } } f1id++; } f2id++; } return out; }
std::vector< DTV > Ni( const std::vector<Basis> &Bases, const DTV &Vec, Hamiltonian<DT> &ham ){ std::vector< DTV > out; DTV tmp1 = DTV::Zero(Bases.at(0).getL());//(Bases.at(0).getL(), 0.0e0); DTV tmp2 = DTV::Zero(Bases.at(1).getL());//(Bases.at(1).getL(), 0.0e0); std::vector< int > f1 = Bases.at(0).getFStates(); std::vector< int > f2 = Bases.at(1).getFStates(); size_t f1id = 0, f2id = 0; for ( int &nf2 : f2 ){ std::vector<size_t> ids(2,f2id); f1id = 0; for ( int &nf1 : f1 ){ ids.at(0) = f1id; size_t id = ham.DetermineTotalIndex(ids); for (size_t cnt = 0; cnt < Bases.at(0).getL(); cnt++) { if ( btest(nf1, cnt) ) tmp1(cnt) += std::pow(std::abs(Vec(id)), 2);//Vec(id) * std::conj( Vec(id) ); } for (size_t cnt = 0; cnt < Bases.at(1).getL(); cnt++) { if ( btest(nf2, cnt) ) tmp2(cnt) += std::pow(std::abs(Vec(id)), 2);//Vec(id) * std::conj( Vec(id) ); } f1id++; } f2id++; } out.push_back(tmp1); out.push_back(tmp2); return out; }