Changeset 4dfef04


Ignore:
Timestamp:
Aug 10, 2012, 9:34:32 PM (13 years ago)
Author:
Frederik Heber <heber@…>
Children:
499cea
Parents:
d901f7
Message:

FIX: We now always convert from angstroem to bohr radii and vice versa, also rescale density to correct electron number.

File:
1 edited

Legend:

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

    rd901f7 r4dfef04  
    16381638     }
    16391639     {
    1640        // fill positions and charges
     1640       // fill positions and charges (converting from bohr radii to angstroem)
     1641       const double AtomicLengthToAngstroem = 0.52917721;
    16411642       data.positions.reserve(wfn->molecule()->natom());
    16421643       data.charges.reserve(wfn->molecule()->natom());
     
    16451646         std::vector<double> pos(3, 0.);
    16461647         for (int j=0;j<3;++j)
    1647            pos[j] = wfn->molecule()->r(iatom, j);
     1648           pos[j] = wfn->molecule()->r(iatom, j)*AtomicLengthToAngstroem;
    16481649         data.positions.push_back(pos);
    16491650       }
     
    16751676
    16761677       // for the moment we always generate a grid of full size
     1678       // (converting grid dimensions from angstroem to bohr radii)
    16771679       const double AtomicLengthToAngstroem = 0.52917721;
    16781680       SCVector3 min;
     
    16851687       max.z() = min.z() + data.sampled_grid.size/AtomicLengthToAngstroem;
    16861688       const int gridpoints = pow(2,data.sampled_grid.level);
    1687        delta = data.sampled_grid.size / (double) gridpoints;
     1689       delta = (data.sampled_grid.size/AtomicLengthToAngstroem) / (double) gridpoints;
    16881690       std::cout << "Grid starts at " << min
    16891691           << " and ends at " << max
     
    16961698       data.sampled_grid.sampled_grid.clear();
    16971699       data.sampled_grid.sampled_grid.reserve(gridpoints*gridpoints*gridpoints);
    1698        for (r.x() = min.x() ; r.x() < max.x(); r.x() += delta) {
     1700       r = min;
     1701       const double element_volume_conversion =
     1702           1./AtomicLengthToAngstroem/AtomicLengthToAngstroem/AtomicLengthToAngstroem;
     1703       for (size_t x=0; x< gridpoints; ++x) {
     1704         r.x() += delta;
    16991705         std::cout << "Sampling now for x=" << r.x() << std::endl;
    1700          for (r.y() = min.y() ; r.y() < max.y(); r.y() += delta)
    1701            for (r.z() =min.z() ; r.z() < max.z(); r.z() += delta) {
    1702              // only evaluate if we close the basis functions
     1706         for (size_t y=0; y< gridpoints; ++y) {
     1707           r.y() += delta;
     1708           for (size_t z=0; z< gridpoints; ++z) {
     1709             r.z() += delta;
    17031710             if (((r.x() < bmin.x()-boundary) || (r.x() > bmax.x()+boundary))
    17041711               || ((r.y() < bmin.y()-boundary) || (r.y() > bmax.y()+boundary))
     
    17061713               data.sampled_grid.sampled_grid.push_back(0.);
    17071714             } else {
    1708                const double dens_at_r = scf->density(r);
     1715               const double dens_at_r = scf->density(r) * element_volume_conversion;
    17091716//               if (fabs(dens_at_r) > 1e-4)
    17101717//                 std::cout << "Electron density at " << r << " is " << dens_at_r << std::endl;
     
    17121719             }
    17131720           }
     1721           r.z() = min.z();
     1722         }
     1723         r.y() = min.y();
    17141724       }
    1715        assert( data.sampled_grid.size() == gridpoints*gridpoints*gridpoints);
     1725       assert( data.sampled_grid.sampled_grid.size() == gridpoints*gridpoints*gridpoints);
     1726       // normalization of electron charge to equal electron number
     1727       {
     1728         double integral_value = 0.;
     1729         for (std::vector<double>::const_iterator diter = data.sampled_grid.sampled_grid.begin();
     1730             diter != data.sampled_grid.sampled_grid.end(); ++diter)
     1731             integral_value += *diter;
     1732         integral_value *= pow(delta*AtomicLengthToAngstroem,3);
     1733         const double normalization = scf->nelectron()/integral_value;
     1734         std::cout << "Created " << data.sampled_grid.sampled_grid.size() << " grid points "
     1735             << " with integral value of " << integral_value
     1736             << " against nelectron of " << scf->nelectron() << "." << std::endl;
     1737         for (std::vector<double>::iterator diter = data.sampled_grid.sampled_grid.begin();
     1738             diter != data.sampled_grid.sampled_grid.end(); ++diter)
     1739             *diter *= normalization;
     1740       }
    17161741     }
    17171742     scf = 0;
Note: See TracChangeset for help on using the changeset viewer.