1#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_XSPACE_H
2#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_XSPACE_H
3#include <molpro/linalg/itsolv/helper.h>
4#include <molpro/linalg/itsolv/subspace/util.h>
5#include <molpro/linalg/itsolv/subspace/DSpace.h>
6#include <molpro/linalg/itsolv/subspace/Dimensions.h>
7#include <molpro/linalg/itsolv/subspace/IXSpace.h>
8#include <molpro/linalg/itsolv/subspace/PSpace.h>
9#include <molpro/linalg/itsolv/subspace/QSpace.h>
18 NewData(
size_t nQnew,
size_t nX,
size_t nRHS) {
20 qq[d].resize({nQnew, nQnew});
21 qx[d].resize({nQnew, nX});
22 xq[d].resize({nX, nQnew});
33template <
class R,
class Q,
class P>
38 bool action_dot_action =
false) {
39 auto nQnew = params.size();
40 auto data =
NewData(nQnew, dims.
nX, rhs.size());
51 util::overlap(action_dot_action ? actions : params, qactions, handlers.
rq());
53 util::overlap(action_dot_action ? actions : params, dactions, handlers.
rq());
75 logger.
data_dump(
"xspace::update_qspace_data() nQnew = ", nQnew);
87template <
class Q,
class P>
91 const auto nP = pparams.size();
92 const auto nQ = qparams.size();
93 const auto nX = nP + nQ;
94 auto nD = dparams.size();
95 const auto nRHS = rhs.size();
96 auto data =
NewData(nD, nX, nRHS);
102 logger.
data_dump(
"xspace::update_dspace_overlap_data() nD = ", nD);
110template <
class Q,
class P>
115 const auto nP = pparams.size();
116 const auto nQ = qparams.size();
117 const auto nX = nP + nQ;
118 auto nD = dparams.size();
119 auto data =
NewData(nD, nX, 0);
121 data.qq[e].slice() =
util::overlap(dparams, dactions, handler_qq);
122 data.xq[e].slice({0, 0}, {nP, nD}) =
util::overlap(pparams, dactions, handler_qp);
123 data.xq[e].slice({nP, 0}, {nX, nD}) =
util::overlap(qparams, dactions, handler_qq);
124 data.qx[e].slice({0, nP}, {nD, nX}) =
util::overlap(dparams, qactions, handler_qq);
125 transpose_copy(data.qx[e].slice({0, 0}, {nD, nP}), data.xq[e].slice({0, 0}, {nP, nD}));
126 logger.
data_dump(
"xspace::update_dspace_action_data() nD = ", nD);
135 const auto& dd = new_data.
qq.at(e);
136 const auto& dx = new_data.
qx.at(e);
137 const auto& xd = new_data.
xq.at(e);
138 data[e].slice({dims.
oD, dims.
oD}, {dims.
oD + dims.
nD, dims.
oD + dims.
nD}) = dd;
139 data[e].slice({dims.
oD, dims.
oP}, {dims.
oD + dims.
nD, dims.
oP + dims.
nP}) = dx.slice({0, 0}, {dims.nD, dims.nP});
140 data[e].slice({dims.
oD, dims.
oQ}, {dims.
oD + dims.
nD, dims.
oQ + dims.
nQ}) =
141 dx.slice({0, dims.nP}, {dims.nD, dims.nP + dims.nQ});
142 data[e].slice({dims.
oP, dims.
oD}, {dims.
oP + dims.
nP, dims.
oD + dims.
nD}) = xd.slice({0, 0}, {dims.nP, dims.nD});
143 data[e].slice({dims.
oQ, dims.
oD}, {dims.
oQ + dims.
nQ, dims.
oD + dims.
nD}) =
144 xd.slice({dims.nP, 0}, {dims.nP + dims.nQ, dims.nD});
148template <
class R,
class Q,
class P>
157 data = null_data<EqnData::H, EqnData::S, EqnData::rhs>();
162 m_logger->trace(
"QSpace::update_qspace");
191 throw std::runtime_error(
"P space can only be used with hermitian kernels");
199 for (
size_t i = 0, ij = 0; i < nP; ++i)
200 for (
size_t j = 0; j < nP; ++j, ++ij)
207 for (
const auto& r :
rhs)
209 for (
const auto& r :
rhs) {
210 auto d = std::abs(this->
m_handlers->rr().dot(r, r));
212 throw std::runtime_error(
"RHS vector cannot be zero");
298 data[d].remove_row_col(i, i);
Enhances various operations between pairs of arrays and allows dynamic code injection with uniform in...
Definition: ArrayHandler.h:162
Non-owning container taking a pointer to the data buffer and its size and exposing routines for itera...
Definition: Span.h:31
Class, containing a collection of array handlers used in IterativeSolver Provides a Builder sub-class...
Definition: ArrayHandlers.h:25
auto & rp()
Definition: ArrayHandlers.h:44
auto & rr()
Definition: ArrayHandlers.h:39
auto & rq()
Definition: ArrayHandlers.h:42
void data_dump(std::string_view what, Ts...data) const
Definition: Logger.h:512
CVecRef< Q > cparams() const
Definition: DSpace.h:51
CVecRef< Q > cactions() const
Definition: DSpace.h:55
VecRef< Q > params()
Definition: DSpace.h:49
VecRef< Q > actions()
Definition: DSpace.h:53
size_t size() const
Definition: DSpace.h:47
void erase(size_t i)
Erases parameter i.
Definition: DSpace.h:41
void update(VecRef< Q > ¶ms, VecRef< Q > &actions)
Clears current D space and moves params and action inside.
Definition: DSpace.h:26
Full subspace.
Definition: IXSpace.h:19
R R
Definition: IXSpace.h:21
P P
Definition: IXSpace.h:23
SubspaceData data
Equation data in the subspace.
Definition: IXSpace.h:28
Q Q
Definition: IXSpace.h:22
void update(const CVecRef< P > ¶ms, array::ArrayHandler< P, P > &handler)
Definition: PSpace.h:15
CVecRef< P > params() const
Definition: PSpace.h:20
size_t size() const
Definition: PSpace.h:24
void erase(size_t i)
Definition: PSpace.h:26
CVecRef< P > cparams() const
Definition: PSpace.h:21
CVecRef< Q > cparamsq() const override
Definition: XSpace.h:268
bool get_hermiticity()
Definition: XSpace.h:277
CVecRef< Q > cactionsq() const override
Definition: XSpace.h:269
void remove_data(size_t i)
Definition: XSpace.h:296
void update_dimensions()
Definition: XSpace.h:285
std::vector< Q > m_rhs
Right hand side vectors.
Definition: XSpace.h:307
CVecRef< P > cparamsp() const override
Definition: XSpace.h:267
CVecRef< Q > cparamsd() const override
Definition: XSpace.h:270
void update_qspace(const CVecRef< R > ¶ms, const CVecRef< R > &actions) override
Update parameters in Q space and corresponding equation data.
Definition: XSpace.h:161
void add_rhs_equations(const CVecRef< R > &rhs)
For a system of linear equations Ax=b, adds rhs vectors b.
Definition: XSpace.h:205
void update_dspace(VecRef< Q > ¶ms, VecRef< Q > &actions) override
Clears old D space container and stores new params and actions.
Definition: XSpace.h:171
void erased(size_t i) override
Removes parameter i from D subspace.
Definition: XSpace.h:249
VecRef< Q > actionsd() override
Definition: XSpace.h:259
void update_pspace(const CVecRef< P > ¶ms, const array::Span< value_type > &pp_action_matrix) override
Definition: XSpace.h:188
std::vector< value_type_abs > m_rhs_norm
norm of RHS vectors
Definition: XSpace.h:308
PSpace< R, P > pspace
Definition: XSpace.h:280
CVecRef< Q > rhs() const
Access RHS vectors in linear equations.
Definition: XSpace.h:220
CVecRef< Q > paramsq() const override
Definition: XSpace.h:262
Dimensions m_dim
Definition: XSpace.h:306
CVecRef< Q > actionsq() const override
Definition: XSpace.h:263
std::shared_ptr< Logger > m_logger
Definition: XSpace.h:305
VecRef< Q > paramsq() override
Definition: XSpace.h:256
CVecRef< Q > paramsd() const override
Definition: XSpace.h:264
VecRef< P > paramsp() override
Definition: XSpace.h:255
VecRef< Q > paramsd() override
Definition: XSpace.h:258
const Dimensions & dimensions() const override
Definition: XSpace.h:225
bool m_hermitian
whether the matrix is Hermitian
Definition: XSpace.h:309
VecRef< Q > actionsq() override
Definition: XSpace.h:257
CVecRef< P > paramsp() const override
Definition: XSpace.h:261
std::shared_ptr< ArrayHandlers< R, Q, P > > m_handlers
Definition: XSpace.h:304
void eraseq(size_t i) override
Removes parameter i from Q subspace.
Definition: XSpace.h:237
const std::vector< value_type_abs > & rhs_norm() const
Norm of RHS vectors.
Definition: XSpace.h:223
auto update_rhs_with_pspace()
Update projection of RHS data onto P space.
Definition: XSpace.h:291
void erasep(size_t i) override
Removes parameter i from P subspace.
Definition: XSpace.h:243
QSpace< R, Q, P > qspace
Definition: XSpace.h:281
void set_logger(std::shared_ptr< Logger > logger) override
Definition: XSpace.h:273
void set_action_action()
Definition: XSpace.h:278
CVecRef< Q > actionsd() const override
Definition: XSpace.h:265
CVecRef< Q > cactionsd() const override
Definition: XSpace.h:271
bool m_action_dot_action
whether the H matrix is action.action instead of action.parameter
Definition: XSpace.h:310
void erase(size_t i) override
Removes parameter i from the full subspace.
Definition: XSpace.h:227
DSpace< Q > dspace
Definition: XSpace.h:282
XSpace(const std::shared_ptr< ArrayHandlers< R, Q, P > > &handlers, const std::shared_ptr< Logger > &logger)
Definition: XSpace.h:155
void set_hermiticity(bool hermitian)
Set Hermiticity of the subspace. P space can only be used with Hermitian problems.
Definition: XSpace.h:276
auto overlap(const CVecRef< R > &left, const CVecRef< Q > &right, array::ArrayHandler< Z, W > &handler) -> std::enable_if_t< detail::Z_and_W_are_one_of_R_and_Q< R, Q, Z, W >, Matrix< double > >
Calculates overlap matrix between left and right vectors.
Definition: util.h:49
auto update_dspace_action_data(const CVecRef< P > &pparams, const CVecRef< Q > &qparams, const CVecRef< Q > &qactions, const CVecRef< Q > &dparams, const CVecRef< Q > &dactions, array::ArrayHandler< Q, P > &handler_qp, array::ArrayHandler< Q, Q > &handler_qq, Logger &logger)
Calculates overlap blocks between D space and the rest of the subspace.
Definition: XSpace.h:111
auto update_qspace_data(const CVecRef< R > ¶ms, const CVecRef< R > &actions, const CVecRef< P > &pparams, const CVecRef< Q > &qparams, const CVecRef< Q > &qactions, const CVecRef< Q > &dparams, const CVecRef< Q > &dactions, const CVecRef< Q > &rhs, const Dimensions &dims, ArrayHandlers< R, Q, P > &handlers, Logger &logger, bool hermitian=false, bool action_dot_action=false)
Returns new sections of equation data.
Definition: XSpace.h:34
auto update_dspace_overlap_data(const CVecRef< P > &pparams, const CVecRef< Q > &qparams, const CVecRef< Q > &dparams, const CVecRef< Q > &rhs, array::ArrayHandler< Q, P > &handler_qp, array::ArrayHandler< Q, Q > &handler_qq, Logger &logger)
Calculates overlap blocks between D space and the rest of the subspace.
Definition: XSpace.h:88
void copy_dspace_eqn_data(const NewData &new_data, SubspaceData &data, const subspace::EqnData e, const Dimensions &dims)
Definition: XSpace.h:133
EqnData
Definition: SubspaceData.h:7
std::map< EqnData, Matrix< double > > SubspaceData
Definition: SubspaceData.h:9
void transpose_copy(ML &&ml, const MR &mr)
Definition: Matrix.h:283
auto cwrap(ForwardIt begin, ForwardIt end)
Takes a begin and end iterators and returns a vector of references to each element.
Definition: wrap.h:52
std::vector< std::reference_wrapper< const A > > CVecRef
Definition: wrap.h:14
std::vector< std::reference_wrapper< A > > VecRef
Definition: wrap.h:11
Stores partitioning of XSpace into P, Q and R blocks with sizes and offsets for each one.
Definition: Dimensions.h:8
size_t oQ
Definition: Dimensions.h:16
size_t nD
Definition: Dimensions.h:13
size_t nX
Definition: Dimensions.h:14
size_t nQ
Definition: Dimensions.h:12
size_t nRHS
number of rigt-hand-side vectors in the system of linear equations
Definition: Dimensions.h:18
size_t nP
Definition: Dimensions.h:11
size_t oP
Definition: Dimensions.h:15
size_t oD
Definition: Dimensions.h:17
void update(const CVecRef< R > ¶ms, const CVecRef< R > &actions, const SubspaceData &qq, const SubspaceData &qx, const SubspaceData &xq, const Dimensions &dims, SubspaceData &old_data)
Prepends parameters to the start of Q space.
Definition: QSpace.h:78
VecRef< Q > params()
Definition: QSpace.h:137
CVecRef< Q > cactions() const
Definition: QSpace.h:159
size_t size() const
Definition: QSpace.h:135
CVecRef< Q > cparams() const
Definition: QSpace.h:147
void erase(size_t i)
Erases q parameter i.
Definition: QSpace.h:129
VecRef< Q > actions()
Definition: QSpace.h:149
New sections of equation data.
Definition: XSpace.h:17
SubspaceData qq
data block between new paramters
Definition: XSpace.h:27
SubspaceData qx
data block between new parameters and current X space
Definition: XSpace.h:28
NewData(size_t nQnew, size_t nX, size_t nRHS)
Definition: XSpace.h:18
SubspaceData xq
data block between current X space and new parameters
Definition: XSpace.h:29