49 double Echange =
E_hist_.getDiff().Etotal();
50 std::string info =
"not converged";
51 bool converged =
false;
52 if (std::abs(Echange) <
deltaE_) {
58 <<
" is " << info <<
" deltaE=" << Echange << std::flush;
66#pragma omp parallel for reduction(+ : e)
83#pragma omp declare reduction(CustomPlus : eeInteractor::E_terms : omp_out += \
90#pragma omp parallel for reduction(CustomPlus : terms)
92 for (
Index j = 0; j < i; ++j) {
97#pragma omp parallel for reduction(CustomPlus : terms)
103#pragma omp parallel for reduction(CustomPlus : terms)
114#pragma omp parallel for reduction(+ : e)
117 e += site.deltaQ_V_ext();
139 Index dof_polarization = 0;
141 dof_polarization += seg.size() * 3;
143 return dof_polarization;
148 Eigen::VectorXd initial_induced_dipoles =
149 Eigen::VectorXd::Zero(dof_polarization);
153 initial_induced_dipoles.segment(index, 3 * seg.size()) =
155 index += 3 * seg.size();
157 return initial_induced_dipoles;
162 Eigen::VectorXd last_induced_dipoles =
163 Eigen::VectorXd::Zero(dof_polarization);
167 last_induced_dipoles.segment<3>(index) = site.Induced_Dipole();
171 return last_induced_dipoles;
178 site.setInduced_Dipole(x.segment<3>(index));
185 const Eigen::VectorXd& initial_guess) {
186 Eigen::VectorXd b = Eigen::VectorXd::Zero(initial_guess.size());
190 auto V = site.V() + site.V_noE();
191 b.segment<3>(index) = -
V;
198 Eigen::DiagonalPreconditioner<double>>
203 Eigen::VectorXd x = cg.solveWithGuess(b, initial_guess);
206 <<
TimeStamp() <<
" CG: #iterations: " << cg.iterations()
207 <<
", estimated error: " << cg.error() << std::flush;
209 if (cg.info() == Eigen::ComputationInfo::NoConvergence) {
211 errormsg_ =
"PCG iterations did not converge";
214 if (cg.info() == Eigen::ComputationInfo::NumericalIssue) {
226 std::accumulate(energies.begin(), energies.end(), 0.0);
228 <<
" Calculated static-static and polar-static "
229 "interaction with other regions"
233 <<
" Calculated static interaction in region "
237 <<
TimeStamp() <<
" Starting Solving for classical polarization with "
238 << dof_polarization <<
" degrees of freedom." << std::flush;
240 Eigen::VectorXd initial_induced_dipoles;
255 x = initial_induced_dipoles;
262 <<
" Calculated polar interaction in region"
266 <<
" Calculated polar interaction with other regions"
270 <<
" Internal static energy [hrt]= "
273 <<
" External static energy [hrt]= "
276 << std::setprecision(10)
277 <<
" Total static energy [hrt]= " << e_contrib.
Estatic() << std::flush;
280 <<
" internal dQ-dQ energy [hrt]= "
284 <<
" internal Q-dQ energy [hrt]= "
288 <<
" Internal energy [hrt]= "
292 <<
" External polar energy [hrt]= "
296 << std::setprecision(10)
297 <<
" Total polar energy [hrt]= " << e_contrib.
Epolar() << std::flush;
300 << std::setprecision(10) <<
" Total energy [hrt]= " << e_contrib.
Etotal()
318#pragma omp parallel for reduction(+ : e)
321 double e_thread = 0.0;
341#pragma omp parallel for reduction(+ : e)
343 double e_thread = 0.0;
void addInternalPolarContrib(const eeInteractor::E_terms &induction_terms)
double & E_static_static()
The periodic Ewald background, as a Region.
double ApplyFieldTo(std::vector< PolarSegment > &foreground) const
Index size() const override
std::vector< PolarSegment > segments_
void WriteToCpt(CheckpointWriter &w) const override
void ReadFromCpt(CheckpointReader &r) override
Eigen::VectorXd CalcInducedDipoleInsideSegments() const
PolarRegion(Index id, Logger &log)
void AppendResult(tools::Property &prop) const override
void WriteInducedDipolesToSegments(const Eigen::VectorXd &x)
double InteractwithEwaldRegion(const EwaldRegion ®ion) override
void ReadFromCpt(CheckpointReader &r) override
double InteractwithQMRegion(const QMRegion ®ion) override
void Initialize(const tools::Property &prop) override
bool Converged() const override
eeInteractor::E_terms PolarEnergy() const
Eigen::VectorXd CalcInducedDipolesViaPCG(const Eigen::VectorXd &initial_guess)
Eigen::VectorXd ReadInducedDipolesFromLastIteration() const
std::string identify() const override
double StaticInteraction()
hist< Energy_terms > E_hist_
void WriteToCpt(CheckpointWriter &w) const override
double InteractwithPolarRegion(const PolarRegion ®ion) override
void Evaluate(std::vector< std::unique_ptr< Region > > ®ions) override
double InteractwithStaticRegion(const StaticRegion ®ion) override
double PolarEnergy_extern() const
Class to represent Atom/Site in electrostatic+polarization.
void ApplyQMFieldToPolarSegments(std::vector< PolarSegment > &segments) const
std::vector< double > ApplyInfluenceOfOtherRegions(std::vector< std::unique_ptr< Region > > ®ions)
Timestamp returns the current time as a string Example: cout << TimeStamp().
Mediates interaction between polar and static sites.
double ApplyStaticField(const T &segment1, PolarSegment &segment2) const
double ApplyInducedField(const PolarSegment &segment1, PolarSegment &segment2) const
E_terms CalcPolarEnergy(const S1 &segment1, const S2 &segment2) const
Eigen::VectorXd Cholesky_IntraSegment(const PolarSegment &seg) const
double CalcPolarEnergy_IntraSegment(const PolarSegment &seg) const
#define XTP_LOG(level, log)
Charge transport classes.
ClassicalSegment< PolarSite > PolarSegment
ClassicalSegment< StaticSite > StaticSegment
Provides a means for comparing floating point numbers.