5#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_LINEAREIGENSYSTEMRSPT_H_
6#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_LINEAREIGENSYSTEMRSPT_H_
10#include <molpro/linalg/itsolv/CastOptions.h>
11#include <molpro/linalg/itsolv/DSpaceResetter.h>
12#include <molpro/linalg/itsolv/IterativeSolverTemplate.h>
13#include <molpro/linalg/itsolv/LinearEigensystemRSPTOptions.h>
14#include <molpro/linalg/itsolv/Logger.h>
15#include <molpro/linalg/itsolv/propose_rspace.h>
16#include <molpro/linalg/itsolv/subspace/SubspaceSolverRSPT.h>
17#include <molpro/linalg/itsolv/subspace/XSpace.h>
32template <
class R,
class Q = R,
class P = std::map<
size_t,
typename R::value_type>>
36 using typename SolverTemplate::scalar_type;
40 const std::shared_ptr<Logger>& logger_ = std::make_shared<Logger>())
41 :
SolverTemplate(std::make_shared<subspace::XSpace<R, Q, P>>(handlers, logger_),
42 std::static_pointer_cast<subspace::ISubspaceSolver<R, Q, P>>(
43 std::make_shared<subspace::SubspaceSolverRSPT<R, Q, P>>(logger_)),
44 handlers, std::make_shared<
Statistics>(), logger_),
47 auto xspace = std::dynamic_pointer_cast<subspace::XSpace<R, Q, P>>(this->
m_xspace);
48 xspace->set_hermiticity(
true);
49 auto subspace_solver = std::dynamic_pointer_cast<subspace::SubspaceSolverRSPT<R, Q, P>>(this->
m_subspace_solver);
50 subspace_solver->set_hermiticity(
true);
67 return end_iteration(parameters.front().get(), action.front().get());
69 size_t end_iteration(std::vector<R>& parameters, std::vector<R>& action)
override {
76 this->
m_handlers->rr().axpy(-1, actions, parameters);
83 void precondition(std::vector<R>& parameters, std::vector<R>& action)
const {}
88 auto eval = std::vector<scalar_type>{};
104 void report(std::ostream& cout,
bool endl =
true)
const override {
112 cout <<
"Perturbed energies ";
113 cout << std::fixed << std::setprecision(8);
115 cout << std::defaultfloat;
122 auto xspace = std::dynamic_pointer_cast<subspace::XSpace<R, Q, P>>(this->
m_xspace);
123 xspace->set_hermiticity(hermitian);
124 auto subspace_solver = std::dynamic_pointer_cast<subspace::SubspaceSolverRSPT<R, Q, P>>(this->
m_subspace_solver);
125 subspace_solver->set_hermiticity(hermitian);
140 auto opt = std::make_shared<LinearEigensystemRSPTOptions>();
158 static std::string
str(
const std::vector<double>& a) {
160 for (
const auto& e : a)
161 result += std::to_string(e) +
" ";
165 auto prof = this->
profiler()->push(
"itsolv::construct_residual");
166 auto xspace = std::dynamic_pointer_cast<subspace::XSpace<R, Q, P>>(this->
m_xspace);
167 const auto& q = xspace->paramsq();
168 const auto& n = q.size();
169 const auto& c = params.back();
170 auto& hc = actions.back();
187 for (
size_t k = 0; k < n; k++) {
Class, containing a collection of array handlers used in IterativeSolver Provides a Builder sub-class...
Definition: ArrayHandlers.h:25
Implements IterativeSolver interface that is common to all solvers.
Definition: IterativeSolverTemplate.h:127
std::shared_ptr< subspace::IXSpace< R, R, std::map< size_t, typename R::value_type > > > m_xspace
manages the subspace and associated data
Definition: IterativeSolverTemplate.h:579
void set_n_roots(size_t roots) override
Definition: IterativeSolverTemplate.h:247
std::shared_ptr< ArrayHandlers< R, R, std::map< size_t, typename R::value_type > > > m_handlers
Array handlers.
Definition: IterativeSolverTemplate.h:578
std::shared_ptr< subspace::ISubspaceSolver< R, R, std::map< size_t, typename R::value_type > > > m_subspace_solver
solves the subspace problem
Definition: IterativeSolverTemplate.h:580
std::shared_ptr< Options > get_options() const override
Definition: IterativeSolverTemplate.h:262
const std::shared_ptr< molpro::profiler::Profiler > & profiler() const override
Definition: IterativeSolverTemplate.h:320
bool m_end_iteration_needed
whether end_iteration should be called after any preconditioner
Definition: IterativeSolverTemplate.h:600
void report() const override
Writes a report to std::cout.
Definition: IterativeSolverTemplate.h:287
bool m_normalise_solution
whether to normalise the solutions
Definition: IterativeSolverTemplate.h:590
double m_convergence_threshold
residual norms less than this mark a converged solution
Definition: IterativeSolverTemplate.h:585
const std::vector< int > & working_set() const override
Working set of roots that are not yet converged.
Definition: IterativeSolverTemplate.h:243
void set_options(const Options &options) override
Definition: IterativeSolverTemplate.h:253
std::vector< double > m_errors
errors from the most recent solution
Definition: IterativeSolverTemplate.h:581
One specific implementation of LinearEigensystem using Davidson's algorithm with modifications to man...
Definition: LinearEigensystemRSPT.h:33
void set_hermiticity(bool hermitian) override
Sets hermiticity of kernel.
Definition: LinearEigensystemRSPT.h:120
std::shared_ptr< Options > get_options() const override
Definition: LinearEigensystemRSPT.h:139
void set_options(const Options &options) override
Definition: LinearEigensystemRSPT.h:130
bool get_hermiticity() const override
Gets hermiticity of kernel, if true than it is hermitian, otherwise it is not.
Definition: LinearEigensystemRSPT.h:128
size_t end_iteration(std::vector< R > ¶meters, std::vector< R > &action) override
Definition: LinearEigensystemRSPT.h:69
bool linearEigensystem() const override
Definition: LinearEigensystemRSPT.h:57
double propose_rspace_svd_thresh
Definition: LinearEigensystemRSPT.h:149
double propose_rspace_norm_thresh
vectors with norm less than threshold can be considered null.
Definition: LinearEigensystemRSPT.h:148
void report(std::ostream &cout, bool endl=true) const override
Writes a report to cout output stream.
Definition: LinearEigensystemRSPT.h:104
std::vector< double > m_rspt_values
perturbation series for the eigenvalue
Definition: LinearEigensystemRSPT.h:193
std::vector< scalar_type > eigenvalues() const override
The calculated eigenvalues of the subspace matrix.
Definition: LinearEigensystemRSPT.h:85
bool nonlinear() const override
Report whether the class is a non-linear solver.
Definition: LinearEigensystemRSPT.h:55
void construct_residual(const std::vector< int > &roots, const CVecRef< R > ¶ms, const VecRef< R > &actions) override
Constructs residual for given roots provided their parameters and actions.
Definition: LinearEigensystemRSPT.h:164
size_t end_iteration(const VecRef< R > ¶meters, const VecRef< R > &action) override
constructs next perturbed wavefunction
Definition: LinearEigensystemRSPT.h:66
virtual std::vector< scalar_type > working_set_eigenvalues() const override
Definition: LinearEigensystemRSPT.h:87
static std::string str(const std::vector< double > &a)
Definition: LinearEigensystemRSPT.h:158
void precondition(std::vector< R > ¶meters, std::vector< R > &action) const
Applies the Davidson preconditioner.
Definition: LinearEigensystemRSPT.h:83
size_t end_iteration(R ¶meters, R &actions) override
Definition: LinearEigensystemRSPT.h:72
LinearEigensystemRSPT(const std::shared_ptr< ArrayHandlers< R, Q, P > > &handlers, const std::shared_ptr< Logger > &logger_=std::make_shared< Logger >())
Definition: LinearEigensystemRSPT.h:39
std::shared_ptr< Logger > logger
Definition: LinearEigensystemRSPT.h:147
Interface for a specific iterative solver, it can add special member functions or variables.
Definition: IterativeSolver.h:401
4-parameter interpolation of a 1-dimensional function given two points for which function values and ...
Definition: helper.h:10
std::vector< std::reference_wrapper< const A > > CVecRef
Definition: wrap.h:14
std::vector< std::reference_wrapper< A > > VecRef
Definition: wrap.h:11
const std::shared_ptr< const molpro::Options > options()
Get the Options object associated with iterative-solver.
Definition: options.cpp:4
static const LinearEigensystemRSPTOptions & LinearEigensystemRSPT(const Options &options)
Definition: CastOptions.h:45
Access point for different options in iterative solvers.
Definition: Options.h:20
Information about performance of IterativeSolver instance.
Definition: Statistics.h:10