25#include <boost/format.hpp>
41 Eigen::Matrix3d theta = Eigen::Matrix3d::Zero();
43 double sqr3 = std::sqrt(3);
44 theta(0, 0) = 0.5 * (-MP(4) + sqr3 * MP(7));
45 theta(1, 1) = 0.5 * (-MP(4) - sqr3 * MP(7));
47 theta(0, 1) = theta(1, 0) = 0.5 * sqr3 * MP(8);
48 theta(0, 2) = theta(2, 0) = 0.5 * sqr3 * MP(5);
49 theta(1, 2) = theta(2, 1) = 0.5 * sqr3 * MP(6);
55 const Eigen::Matrix3d& quad_cart) {
56 Eigen::VectorXd quadrupole_polar = Eigen::VectorXd::Zero(5);
57 const double sqr3 = std::sqrt(3);
58 quadrupole_polar(0) = quad_cart(2, 2);
59 quadrupole_polar(1) = (2. / sqr3) * quad_cart(0, 2);
60 quadrupole_polar(2) = (2. / sqr3) * quad_cart(1, 2);
61 quadrupole_polar(3) = (1. / sqr3) * (quad_cart(0, 0) - quad_cart(1, 1));
62 quadrupole_polar(4) = (2. / sqr3) * quad_cart(0, 1);
63 return quadrupole_polar;
67 const Eigen::Vector3d& refPos) {
68 Eigen::Vector3d dir =
pos_ - refPos;
72 const Eigen::Vector3d temp = R *
Q_.segment<3>(1);
73 Q_.segment<3>(1) = temp;
77 Eigen::Matrix3d rotated = R * cartesianquad * R.transpose();
90 double default_pol = 1;
94 }
catch (
const std::runtime_error&) {
97 return (boost::format(
" P %1$+1.7f\n") % default_pol).str();
101 double conv_pos = 1.;
102 if (unit ==
"angstrom") {
104 }
else if (unit ==
"bohr") {
107 throw std::runtime_error(
108 " StaticSite::WriteMpsLine: Unit conversion not known");
110 std::string output =
"";
111 output += (boost::format(
" %1$2s %2$+1.7f %3$+1.7f %4$+1.7f Rank %5$d\n") %
115 output += (boost::format(
" %1$+1.7f\n") %
getCharge()).str();
118 output += (boost::format(
" %1$+1.7f %2$+1.7f %3$+1.7f\n") %
Q_(3) %
124 (boost::format(
" %1$+1.7f %2$+1.7f %3$+1.7f %4$+1.7f %5$+1.7f\n") %
136 table.
addCol<std::string>(
"type", HOFFSET(
data, element));
138 table.
addCol<
double>(
"posX", HOFFSET(
data, posX));
139 table.
addCol<
double>(
"posY", HOFFSET(
data, posY));
140 table.
addCol<
double>(
"posZ", HOFFSET(
data, posZ));
144 table.
addCol<
double>(
"Q00", HOFFSET(
data, Q00));
145 table.
addCol<
double>(
"Q11c", HOFFSET(
data, Q11c));
146 table.
addCol<
double>(
"Q11s", HOFFSET(
data, Q11s));
147 table.
addCol<
double>(
"Q10", HOFFSET(
data, Q10));
148 table.
addCol<
double>(
"Q20", HOFFSET(
data, Q20));
149 table.
addCol<
double>(
"Q21c", HOFFSET(
data, Q21c));
150 table.
addCol<
double>(
"Q21s", HOFFSET(
data, Q21s));
151 table.
addCol<
double>(
"Q22c", HOFFSET(
data, Q22c));
152 table.
addCol<
double>(
"Q22s", HOFFSET(
data, Q22s));
void addCol(const std::string &name, const size_t &offset)
static Eigen::VectorXd CalculateSphericalMultipole(const Eigen::Matrix3d &quad_cart)
Eigen::Matrix3d CalculateCartesianMultipole() const
static void SetupCptTable(CptTable &table)
std::string WriteMpsLine(std::string unit="bohr") const
void WriteData(data &d) const
virtual std::string writepolarization() const
void ReadData(const data &d)
void Translate(const Eigen::VectorXd &shift)
virtual void Rotate(const Eigen::Matrix3d &R, const Eigen::Vector3d &refPos)
Charge transport classes.
base class for all analysis tools
Eigen::Matrix< double, 9, 1 > Vector9d