- Timestamp:
- Feb 15, 2013, 4:48:27 PM (13 years ago)
- Children:
- 8b3553
- Parents:
- cf3275
- git-author:
- Frederik Heber <heber@…> (01/25/13 15:29:34)
- git-committer:
- Frederik Heber <heber@…> (02/15/13 16:48:27)
- File:
-
- 1 edited
-
src/bin/mpqc/mpqc.cc (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/bin/mpqc/mpqc.cc
rcf3275 r3ad723 1667 1667 // we have to pay attention to capture the right amount of the exponential decay 1668 1668 // and also to have a power of two size of the grid at best 1669 double boundary = 5.; // boundary extent around compact domain containing basis functions 1670 double delta = 1.; // step width in density sampling 1669 SCVector3 boundaryV(5.); // boundary extent around compact domain containing basis functions 1670 bmin -= boundaryV; 1671 bmax += boundaryV; 1672 for (size_t i=0;i<3;++i) { 1673 if (bmin(i) < data.sampled_grid.begin[i]) 1674 bmin(i) = data.sampled_grid.begin[i]; 1675 if (bmax(i) > data.sampled_grid.end[i]) 1676 bmax(i) = data.sampled_grid.end[i]; 1677 } 1678 // set the non-zero window of the sampled_grid 1679 data.sampled_grid.setWindow(bmin.data(), bmax.data()); 1671 1680 1672 1681 // for the moment we always generate a grid of full size … … 1675 1684 SCVector3 min; 1676 1685 SCVector3 max; 1677 min.x() = data.sampled_grid.begin[0]/AtomicLengthToAngstroem; 1678 min.y() = data.sampled_grid.begin[1]/AtomicLengthToAngstroem; 1679 min.z() = data.sampled_grid.begin[2]/AtomicLengthToAngstroem; 1680 max.x() = min.x() + data.sampled_grid.size/AtomicLengthToAngstroem; 1681 max.y() = min.y() + data.sampled_grid.size/AtomicLengthToAngstroem; 1682 max.z() = min.z() + data.sampled_grid.size/AtomicLengthToAngstroem; 1683 const int gridpoints = pow(2,data.sampled_grid.level); 1686 SCVector3 delta; 1687 SCVector3 samplepoints; 1688 SCVector3 length; 1689 SCVector3 total; 1684 1690 // due to periodic boundary conditions, we don't need gridpoints-1 here 1685 1691 // TODO: in case of open boundary conditions, we need data on the right 1686 1692 // hand side boundary as well 1687 delta = (data.sampled_grid.size/AtomicLengthToAngstroem) / (double) gridpoints; 1693 const int gridpoints = data.sampled_grid.getGridPointsPerAxis(); 1694 for (size_t i=0;i<3;++i) { 1695 min(i) = bmin(i)/AtomicLengthToAngstroem; 1696 max(i) = bmax(i)/AtomicLengthToAngstroem; 1697 length(i) = bmax(i) - bmin(i); 1698 total(i) = data.sampled_grid.end[i] - data.sampled_grid.begin[i]; 1699 delta(i) = total(i)/AtomicLengthToAngstroem/(double)gridpoints; 1700 samplepoints(i) = floor(gridpoints*(length(i)/total(i))/AtomicLengthToAngstroem)+1; 1701 } 1688 1702 std::cout << "Grid starts at " << min 1689 1703 << " and ends at " << max 1690 1704 << " with a delta of " << delta 1691 << " to get " << gridpoints << " gridpoints."1705 << " to get " << samplepoints << " samplepoints." 1692 1706 << std::endl; 1707 assert( data.sampled_grid.sampled_grid.size() == samplepoints(0)*samplepoints(1)*samplepoints(2)); 1693 1708 1694 1709 // 3. sample the atomic density 1695 SCVector3 r;1696 data.sampled_grid.sampled_grid.clear();1697 data.sampled_grid.sampled_grid.reserve(gridpoints*gridpoints*gridpoints);1698 r = min;1699 1710 const double element_volume_conversion = 1700 1711 1./AtomicLengthToAngstroem/AtomicLengthToAngstroem/AtomicLengthToAngstroem; 1701 for (size_t x=0; x< gridpoints; ++x, r.x() += delta) { 1712 SCVector3 r = min; 1713 std::vector<double>::iterator griditer = data.sampled_grid.sampled_grid.begin(); 1714 for (size_t x = 0; x < samplepoints(0); ++x, r.x() += delta(0)) { 1702 1715 std::cout << "Sampling now for x=" << r.x() << std::endl; 1703 for (size_t y=0; y< gridpoints; ++y, r.y() += delta) { 1704 for (size_t z=0; z< gridpoints; ++z, r.z() += delta) { 1705 if (((r.x() < (bmin.x()-boundary)) || (r.x() > (bmax.x()+boundary))) 1706 || ((r.y() < (bmin.y()-boundary)) || (r.y() > (bmax.y()+boundary))) 1707 || ((r.z() < (bmin.z()-boundary)) || (r.z() > (bmax.z()+boundary)))) { 1708 data.sampled_grid.sampled_grid.push_back(0.); 1709 } else { 1710 const double dens_at_r = scf->density(r) * element_volume_conversion; 1711 // if (fabs(dens_at_r) > 1e-4) 1712 // std::cout << "Electron density at " << r << " is " << dens_at_r << std::endl; 1713 data.sampled_grid.sampled_grid.push_back(dens_at_r); 1714 } 1716 for (size_t y = 0; y < samplepoints(1); ++y, r.y() += delta(1)) { 1717 for (size_t z = 0; z < samplepoints(2); ++z, r.z() += delta(2)) { 1718 const double dens_at_r = scf->density(r) * element_volume_conversion; 1719 // if (fabs(dens_at_r) > 1e-4) 1720 // std::cout << "Electron density at " << r << " is " << dens_at_r << std::endl; 1721 if (griditer != data.sampled_grid.sampled_grid.end()) 1722 *griditer++ = dens_at_r; 1723 else 1724 std::cerr << "PAST RANGE!" << std::endl; 1715 1725 } 1716 1726 r.z() = min.z(); … … 1718 1728 r.y() = min.y(); 1719 1729 } 1720 assert( data.sampled_grid.sampled_grid.size() == gridpoints*gridpoints*gridpoints);1730 assert( griditer == data.sampled_grid.sampled_grid.end()); 1721 1731 // normalization of electron charge to equal electron number 1722 1732 { 1723 1733 double integral_value = 0.; 1734 const double volume_element = pow(AtomicLengthToAngstroem,3)*delta(0)*delta(1)*delta(2); 1724 1735 for (std::vector<double>::const_iterator diter = data.sampled_grid.sampled_grid.begin(); 1725 1736 diter != data.sampled_grid.sampled_grid.end(); ++diter) 1726 1737 integral_value += *diter; 1727 integral_value *= pow(delta*AtomicLengthToAngstroem,3);1738 integral_value *= volume_element; 1728 1739 const double normalization = 1729 1740 ((integral_value == 0) && (scf->nelectron() == 0)) ? 1730 1741 1. : scf->nelectron()/integral_value; 1731 std::cout << "Created " << data.sampled_grid.sampled_grid.size() << " grid points "1742 std::cout << "Created " << data.sampled_grid.sampled_grid.size() << " grid points" 1732 1743 << " with integral value of " << integral_value 1733 1744 << " against nelectron of " << scf->nelectron() << "." << std::endl;
Note:
See TracChangeset
for help on using the changeset viewer.
