array_8d<double> Nevpt2_npdm::compute_EEEE_matrix(array_2d<double>& onepdm, array_4d<double>& twopdm, array_6d<double>& threepdm, array_8d<double>& fourpdm) { if( mpigetrank() == 0 ) { std::cout << "Building spatial <0|EEEE|0>\n"; int dim = threepdm.dim1(); assert( onepdm.dim1() == twopdm.dim1() ); array_8d<double> eeee_matrix(dim,dim,dim,dim,dim,dim,dim,dim); eeee_matrix.Clear(); // Output text file double factor = 1.0; char file[5000]; sprintf (file, "%s%s%d.%d%s", dmrginp.save_prefix().c_str(),"/EEEE_matrix.", 0, 0,".txt"); ofstream ofs(file); ofs << dim << endl; for(int i=0; i<dim; ++i) { for(int j=0; j<dim; ++j) { for(int k=0; k<dim; ++k) { int d_jk = ( j == k ); for(int l=0; l<dim; ++l) { for(int m=0; m<dim; ++m) { int d_lm = ( l == m ); int d_jm = ( j == m ); for(int n=0; n<dim; ++n) { for(int p=0; p<dim; ++p) { int d_np = ( n == p ); int d_lp = ( l == p ); int d_jp = ( j == p ); for(int q=0; q<dim; ++q) { double val = 0.0; // 1PDM terms val += d_jk * d_lm * d_np * onepdm(i,q); // 2PDM terms val += d_jk * d_lm * 2.0*twopdm(i,p,q,n); // Note factor of two difference between Block 2PDMs and other codes val += d_jk * d_np * 2.0*twopdm(i,m,q,l); val += d_jk * d_lp * 2.0*twopdm(i,m,n,q); val += d_jm * d_np * 2.0*twopdm(i,k,l,q); val += d_jm * d_lp * 2.0*twopdm(i,k,q,n); val += d_lm * d_np * 2.0*twopdm(i,k,q,j); val += d_lm * d_jp * 2.0*twopdm(i,k,n,q); // 3PDM terms val += d_jk * threepdm(i,m,p,q,n,l); val += d_jm * threepdm(i,k,p,q,l,n); val += d_lm * threepdm(i,k,p,q,n,j); val += d_np * threepdm(i,k,m,q,l,j); val += d_lp * threepdm(i,k,m,n,q,j); val += d_jp * threepdm(i,k,m,n,l,q); // 4PDM terms val += fourpdm(i,k,m,p,j,l,n,q); if ( abs(val) > 1e-14 ) { ofs << boost::format("%d %d %d %d %d %d %d %d %20.14e\n") % i % j % k % l % m % n % p % q % val; eeee_matrix(i,j,k,l,m,n,p,q) = val; } } } } } } } } } ofs.close(); // Save binary matrix sprintf (file, "%s%s%d.%d%s", dmrginp.save_prefix().c_str(),"/EEEE_matrix.", 0, 0,".bin"); std::ofstream ofs2(file, std::ios::binary); boost::archive::binary_oarchive save(ofs2); save << eeee_matrix; ofs2.close(); return eeee_matrix; } }