Changeset 3ad723 for src


Ignore:
Timestamp:
Feb 15, 2013, 4:48:27 PM (13 years ago)
Author:
Frederik Heber <heber@…>
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)
Message:

Rewrote sampled value gathering due to new non-zero window.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/bin/mpqc/mpqc.cc

    rcf3275 r3ad723  
    16671667       // we have to pay attention to capture the right amount of the exponential decay
    16681668       // 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());
    16711680
    16721681       // for the moment we always generate a grid of full size
     
    16751684       SCVector3 min;
    16761685       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;
    16841690       // due to periodic boundary conditions, we don't need gridpoints-1 here
    16851691       // TODO: in case of open boundary conditions, we need data on the right
    16861692       // 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       }
    16881702       std::cout << "Grid starts at " << min
    16891703           << " and ends at " << max
    16901704           << " with a delta of " << delta
    1691            << " to get " << gridpoints << " gridpoints."
     1705           << " to get " << samplepoints << " samplepoints."
    16921706           << std::endl;
     1707       assert( data.sampled_grid.sampled_grid.size() == samplepoints(0)*samplepoints(1)*samplepoints(2));
    16931708
    16941709       // 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;
    16991710       const double element_volume_conversion =
    17001711           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)) {
    17021715         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;
    17151725           }
    17161726           r.z() = min.z();
     
    17181728         r.y() = min.y();
    17191729       }
    1720        assert( data.sampled_grid.sampled_grid.size() == gridpoints*gridpoints*gridpoints);
     1730       assert( griditer == data.sampled_grid.sampled_grid.end());
    17211731       // normalization of electron charge to equal electron number
    17221732       {
    17231733         double integral_value = 0.;
     1734         const double volume_element = pow(AtomicLengthToAngstroem,3)*delta(0)*delta(1)*delta(2);
    17241735         for (std::vector<double>::const_iterator diter = data.sampled_grid.sampled_grid.begin();
    17251736             diter != data.sampled_grid.sampled_grid.end(); ++diter)
    17261737             integral_value += *diter;
    1727          integral_value *= pow(delta*AtomicLengthToAngstroem,3);
     1738         integral_value *= volume_element;
    17281739         const double normalization =
    17291740             ((integral_value == 0) && (scf->nelectron() == 0)) ?
    17301741                 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"
    17321743             << " with integral value of " << integral_value
    17331744             << " against nelectron of " << scf->nelectron() << "." << std::endl;
Note: See TracChangeset for help on using the changeset viewer.