Changeset 9fdbcc
- Timestamp:
- May 14, 2013, 12:46:47 PM (12 years ago)
- 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)
- File:
-
- 1 edited
-
src/bin/mpqc/mpqc.cc (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/bin/mpqc/mpqc.cc
rd13755 r9fdbcc 1180 1180 delete[] ckptfile; 1181 1181 } 1182 } 1183 1184 static 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; 1182 1195 } 1183 1196 … … 1640 1653 data.charges.reserve(wfn->molecule()->natom()); 1641 1654 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); 1643 1659 std::vector<double> pos(3, 0.); 1644 1660 for (int j=0;j<3;++j) … … 1714 1730 SCVector3 r = min; 1715 1731 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 1716 1788 // taken from scf::density() 1717 1789 RefSCMatrix nos … … 1735 1807 double tmp = 0.0; 1736 1808 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]; 1738 1810 } 1739 elec_density += nd.get_element(i)*tmp*tmp;1811 elec_density += tmp; 1740 1812 } 1741 1813 const double dens_at_r = elec_density * element_volume_conversion; … … 1764 1836 integral_value += *diter; 1765 1837 integral_value *= volume_element; 1838 int n_electrons = scf->nelectron(); 1839 if (data.DoValenceOnly == MPQCData::DoSampleValenceOnly) 1840 n_electrons -= wfn->molecule()->n_core_electrons(); 1766 1841 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; 1769 1844 std::cout << "Created " << data.sampled_grid.sampled_grid.size() << " grid points" 1770 1845 << " 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; 1772 1848 for (std::vector<double>::iterator diter = data.sampled_grid.sampled_grid.begin(); 1773 1849 diter != data.sampled_grid.sampled_grid.end(); ++diter) … … 1907 1983 MPQCData data(grid); 1908 1984 data.DoLongrange = DoLongrange; // set whether we sample the density 1985 data.DoValenceOnly = DoValenceOnly; // set whether we sample just valence electron and nuclei densities 1909 1986 // now call work horse 1910 1987 mainFunction(grp, values, output, input, generic_input, in_char_array, argc, argv, data);
Note:
See TracChangeset
for help on using the changeset viewer.
