21#include <boost/format.hpp>
39 key +
".difference_to_groundstate",
false);
41 key +
".gridsize",
"medium");
46 <<
" threads ===== " << std::flush;
52 basis.
Fill(bs, Atomlist);
63 Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> es;
66 <<
TimeStamp() <<
" Converting to Eigenframe " << std::flush;
72 std::array<Eigen::MatrixXd, 2> DMAT =
75 Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> es_h;
76 es_h.computeDirect(gyro_hole.
gyration);
78 <<
TimeStamp() <<
" Converting to Eigenframe " << std::flush;
84 Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> es_e;
85 es_e.computeDirect(gyro_electron.
gyration);
87 <<
TimeStamp() <<
" Converting to Eigenframe " << std::flush;
98 Eigen::Vector3d centroid = Eigen::Vector3d::Zero();
99 Eigen::Matrix3d gyration = Eigen::Matrix3d::Zero();
100 for (
const QMAtom& atom : atoms) {
101 double m = elements.
getMass(atom.getElement());
102 const Eigen::Vector3d& pos = atom.getPos();
105 gyration += m * pos * pos.transpose();
109 gyration -= centroid * centroid.transpose();
114 Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> es;
121 const Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d>& es) {
124 <<
"---------------- " << label <<
" ----------------" << std::flush;
126 << (boost::format(
" Norm = %1$9.4f ") % (gyro.
mass))
130 << (boost::format(
" Centroid x = %1$9.4f Ang") %
134 << (boost::format(
" Centroid y = %1$9.4f Ang") %
138 << (boost::format(
" Centroid y = %1$9.4f Ang") %
144 << (boost::format(
" Gyration Tensor xx = %1$9.4f Ang^2") %
148 << (boost::format(
" Gyration Tensor xy = %1$9.4f Ang^2") %
152 << (boost::format(
" Gyration Tensor xz = %1$9.4f Ang^2") %
156 << (boost::format(
" Gyration Tensor yy = %1$9.4f Ang^2") %
160 << (boost::format(
" Gyration Tensor yz = %1$9.4f Ang^2") %
164 << (boost::format(
" Gyration Tensor zz = %1$9.4f Ang^2") %
169 << (boost::format(
" Gyration Tensor D1 = %1$9.4f Ang^2") %
170 (es.eigenvalues()[0] * RA2))
173 << (boost::format(
" Gyration Tensor D2 = %1$9.4f Ang^2") %
174 (es.eigenvalues()[1] * RA2))
177 << (boost::format(
" Gyration Tensor D3 = %1$9.4f Ang^2") %
178 (es.eigenvalues()[2] * RA2))
182 << (boost::format(
" Radius of Gyration = %1$9.4f Ang") %
187 << (boost::format(
" Tensor EF Axis 1 1 = %1$9.4f ") %
188 es.eigenvectors().col(0).x())
191 << (boost::format(
" Tensor EF Axis 1 2 = %1$9.4f ") %
192 es.eigenvectors().col(0).y())
195 << (boost::format(
" Tensor EF Axis 1 3 = %1$9.4f ") %
196 es.eigenvectors().col(0).z())
199 << (boost::format(
" Tensor EF Axis 2 1 = %1$9.4f ") %
200 es.eigenvectors().col(1).x())
203 << (boost::format(
" Tensor EF Axis 2 2 = %1$9.4f ") %
204 es.eigenvectors().col(1).y())
207 << (boost::format(
" Tensor EF Axis 2 3 = %1$9.4f ") %
208 es.eigenvectors().col(1).z())
211 << (boost::format(
" Tensor EF Axis 3 1 = %1$9.4f ") %
212 es.eigenvectors().col(2).x())
215 << (boost::format(
" Tensor EF Axis 3 2 = %1$9.4f ") %
216 es.eigenvectors().col(2).y())
219 << (boost::format(
" Tensor EF Axis 3 3 = %1$9.4f ") %
220 es.eigenvectors().col(2).z())
Container to hold Basisfunctions for all atoms.
void Fill(const BasisSet &bs, const QMMolecule &atoms)
void Load(const std::string &name)
void AnalyzeGeometry(const QMMolecule &atoms)
void ReportAnalysis(std::string label, const Gyrationtensor &gyro, const Eigen::SelfAdjointEigenSolver< Eigen::Matrix3d > &es)
void Initialize(tools::Property &options)
void AnalyzeDensity(const Orbitals &orbitals)
Gyrationtensor IntegrateGyrationTensor(const Eigen::MatrixXd &density_matrix)
container for molecular orbitals
Eigen::MatrixXd DensityMatrixFull(const QMState &state) const
const QMMolecule & QMAtoms() const
const std::string & getDFTbasisName() const
std::array< Eigen::MatrixXd, 2 > DensityMatrixExcitedState(const QMState &state) const
Identifier for QMstates. Strings like S1 are converted into enum +zero indexed int.
std::string ToLongString() const
Timestamp returns the current time as a string Example: cout << TimeStamp()
void GridSetup(const std::string &type, const QMMolecule &atoms, const AOBasis &basis)
#define XTP_LOG(level, log)
base class for all analysis tools