Changeset 9fdbcc


Ignore:
Timestamp:
May 14, 2013, 12:46:47 PM (12 years ago)
Author:
Frederik Heber <heber@…>
Children:
28666f
Parents:
d13755
git-author:
Frederik Heber <heber@…> (03/27/13 11:10:25)
git-committer:
Frederik Heber <heber@…> (05/14/13 12:46:47)
Message:

Added use of switch in MPQCData to change between valence only and total charges.

File:
1 edited

Legend:

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

    rd13755 r9fdbcc  
    11801180    delete[] ckptfile;
    11811181  }
     1182}
     1183
     1184static int getCoreElectrons(const int z)
     1185{
     1186  int n=0;
     1187  if (z > 2) n += 2;
     1188  if (z > 10) n += 8;
     1189  if (z > 18) n += 8;
     1190  if (z > 30) n += 10;
     1191  if (z > 36) n += 8;
     1192  if (z > 48) n += 10;
     1193  if (z > 54) n += 8;
     1194  return n;
    11821195}
    11831196
     
    16401653         data.charges.reserve(wfn->molecule()->natom());
    16411654         for (int iatom=0;iatom < wfn->molecule()->natom(); ++iatom) {
    1642            data.charges.push_back(wfn->molecule()->Z(iatom));
     1655           double charge = wfn->molecule()->Z(iatom);
     1656           if (data.DoValenceOnly == MPQCData::DoSampleValenceOnly)
     1657             charge -= getCoreElectrons((int)charge);
     1658           data.charges.push_back(charge);
    16431659           std::vector<double> pos(3, 0.);
    16441660           for (int j=0;j<3;++j)
     
    17141730         SCVector3 r = min;
    17151731
     1732         std::set<int> valence_indices;
     1733         if (data.DoValenceOnly == MPQCData::DoSampleValenceOnly) {
     1734           // find valence orbitals
     1735           RefDiagSCMatrix evals = scf->eigenvalues();
     1736//           std::cout << "All Eigenvalues:" << std::endl;
     1737//           for(int i=0;i<wfn->oso_dimension(); ++i)
     1738//             std::cout << i << "th eigenvalue is " << evals(i) << std::endl;
     1739           std::set<double> evals_sorted;
     1740           for(int i=0;i<wfn->oso_dimension(); ++i)
     1741             evals_sorted.insert(evals(i));
     1742           std::set<double> evals_distances;
     1743           std::set<double>::const_iterator advancer = evals_sorted.begin();
     1744           std::set<double>::const_iterator iter = advancer++;
     1745           for(;advancer != evals_sorted.end(); ++advancer,++iter)
     1746             evals_distances.insert((*advancer)-(*iter));
     1747           const double largest_distance = *(evals_distances.rbegin());
     1748           ExEnv::out0()  << "Largest distance between EV is " << largest_distance << std::endl;
     1749           advancer = evals_sorted.begin();
     1750           iter = advancer++;
     1751           for(;advancer != evals_sorted.begin(); ++advancer,++iter)
     1752             if (fabs(fabs((*advancer)-(*iter)) - largest_distance) < 1e-10)
     1753               break;
     1754           assert( advancer != evals_sorted.begin() );
     1755           const double last_core_ev = (*iter);
     1756           ExEnv::out0()  << "Last core EV is " << last_core_ev << std::endl;
     1757           for(int i=0;i<wfn->oso_dimension(); ++i)
     1758             if (evals(i) > last_core_ev)
     1759               valence_indices.insert(i);
     1760//           {
     1761//             int i=0;
     1762//             std::cout << "Valence eigenvalues:" << std::endl;
     1763//             for (std::set<int>::const_iterator iter = valence_indices.begin();
     1764//                 iter != valence_indices.end(); ++iter)
     1765//               std::cout << i++ << "th eigenvalue is " << (*iter) << std::endl;
     1766//           }
     1767         } else {
     1768           // just insert all indices
     1769           for(int i=0;i<wfn->oso_dimension(); ++i)
     1770             valence_indices.insert(i);
     1771         }
     1772
     1773         // testing alternative routine from SCF::so_density()
     1774         RefSCMatrix oso_vector = scf->oso_eigenvectors();
     1775         RefSCMatrix vector = scf->so_to_orthog_so().t() * oso_vector;
     1776         oso_vector = 0;
     1777         RefSymmSCMatrix occ(scf->oso_dimension(), scf->basis_matrixkit());
     1778         occ.assign(0.0);
     1779         for (std::set<int>::const_iterator iter = valence_indices.begin();
     1780             iter != valence_indices.end(); ++iter) {
     1781           const int i = *iter;
     1782           occ(i,i) = scf->occupation(i);
     1783         }
     1784         RefSymmSCMatrix d2(scf->so_dimension(), scf->basis_matrixkit());
     1785         d2.assign(0.0);
     1786         d2.accumulate_transform(vector, occ);
     1787
    17161788         // taken from scf::density()
    17171789         RefSCMatrix nos
     
    17351807                   double tmp = 0.0;
    17361808                   for (int j=0; j<nbasis; ++j) {
    1737                        tmp += nos.get_element(j,i)*bs_values[j];
     1809                       tmp += d2(j,i)*bs_values[j]*bs_values[i];
    17381810                     }
    1739                    elec_density += nd.get_element(i)*tmp*tmp;
     1811                   elec_density += tmp;
    17401812                 }
    17411813               const double dens_at_r = elec_density * element_volume_conversion;
     
    17641836               integral_value += *diter;
    17651837           integral_value *= volume_element;
     1838           int n_electrons = scf->nelectron();
     1839           if (data.DoValenceOnly == MPQCData::DoSampleValenceOnly)
     1840             n_electrons -= wfn->molecule()->n_core_electrons();
    17661841           const double normalization =
    1767                ((integral_value == 0) && (scf->nelectron() == 0)) ?
    1768                    1. : scf->nelectron()/integral_value;
     1842               ((integral_value == 0) && (n_electrons == 0)) ?
     1843                   1. : n_electrons/integral_value;
    17691844           std::cout << "Created " << data.sampled_grid.sampled_grid.size() << " grid points"
    17701845               << " with integral value of " << integral_value
    1771                << " against nelectron of " << scf->nelectron() << "." << std::endl;
     1846               << " against " << ((data.DoValenceOnly == MPQCData::DoSampleValenceOnly) ? "n_valence_electrons" : "n_electrons")
     1847               << " of " << n_electrons << "." << std::endl;
    17721848           for (std::vector<double>::iterator diter = data.sampled_grid.sampled_grid.begin();
    17731849               diter != data.sampled_grid.sampled_grid.end(); ++diter)
     
    19071983  MPQCData data(grid);
    19081984  data.DoLongrange = DoLongrange; // set whether we sample the density
     1985  data.DoValenceOnly = DoValenceOnly; // set whether we sample just valence electron and nuclei densities
    19091986// now call work horse
    19101987  mainFunction(grp, values, output, input, generic_input, in_char_array, argc, argv, data);
Note: See TracChangeset for help on using the changeset viewer.