1#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_GRAM_SCHMIDT_H
2#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_GRAM_SCHMIDT_H
3#include <molpro/linalg/array/ArrayHandler.h>
4#include <molpro/linalg/itsolv/helper.h>
5#include <molpro/linalg/itsolv/subspace/Matrix.h>
6#include <molpro/linalg/itsolv/wrap.h>
44 auto norm = std::vector<T>(
n, 0);
45 auto w = std::vector<T>{};
46 for (
size_t i = 0;
i <
n; ++
i) {
48 for (
size_t j = 0;
j <
i; ++
j) {
49 for (
size_t k = 0;
k <=
j; ++
k) {
53 for (
size_t j = 0;
j <
i; ++
j) {
54 if (norm[
j] > norm_thresh) {
55 for (
size_t k = 0;
k <=
j; ++
k) {
56 l(
i,
k) -=
w[
j] / norm[
j] * l(
j,
k);
61 for (
size_t j = 0;
j <=
i; ++
j) {
62 for (
size_t k = 0;
k <
j; ++
k) {
63 norm[
i] += 2 * l(
i,
j) * l(
i,
k) *
s(
j,
k);
65 norm[
i] += l(
i,
j) * l(
i,
j) *
s(
j,
j);
68 std::transform(begin(norm), end(norm), begin(norm), [](
auto el) {
return std::sqrt(std::abs(
el)); });
98template <
typename value_type,
typename value_type_abs>
101 const std::vector<value_type_abs>& norm) {
105 for (
size_t i = 0;
i <
nrows; ++
i) {
106 for (
size_t j = 0;
j <
i; ++
j) {
107 for (
size_t k = 0;
k <=
j; ++
k) {
128template <
class R,
typename value_type_abs>
131 const size_t n = params.size();
132 for (
size_t i = 0;
i <
n; ++
i) {
133 auto norm = handler.
dot(params[
i], params[
i]);
134 norm = std::sqrt(std::abs(norm));
136 handler.
scal(1. / norm, params[
i]);
137 for (
size_t j =
i + 1;
j <
n; ++
j) {
138 auto ov = handler.
dot(params[
i], params[
j]);
139 handler.
axpy(-
ov, params[
i], params[
j]);
Enhances various operations between pairs of arrays and allows dynamic code injection with uniform in...
Definition ArrayHandler.h:163
virtual value_type dot(const AL &x, const AR &y)=0
The hermitian inner product <x|y>: conjugate-linear in x, linear in y.
virtual void scal(value_type alpha, AL &x)=0
virtual void axpy(value_type alpha, const AR &x, AL &y)=0
Matrix container that allows simple data access, slicing, copying and resizing without loosing data.
Definition Matrix.h:32
void fill(T value)
Sets all elements of matrix to value.
Definition Matrix.h:93
void resize(const coord_type &dims)
Resize the matrix. The old data is preserved and any new rows/cols are zeroed.
Definition Matrix.h:130
index_type rows() const
Definition Matrix.h:169
Definition gram_schmidt.h:8
std::vector< T > gram_schmidt(const Matrix< T > &s, Matrix< T > &l, T norm_thresh=precision_scaled< T >(1e-14))
Performs Gram-Schmidt orthogonalisation without normalisation.
Definition gram_schmidt.h:39
Matrix< value_type > construct_lin_trans_in_orthogonal_set(const Matrix< value_type > &overlap, const Matrix< value_type > &lin_trans, const std::vector< value_type_abs > &norm)
Construct Gram-Schmidt linear transformation in orthogonal vectors.
Definition gram_schmidt.h:99
auto modified_gram_schmidt(VecRef< R > ¶ms, array::ArrayHandler< R, R > &handler, value_type_abs null_thresh)
Apply modified Gram-Schmidt procedure to orthonormalise parameters.
Definition gram_schmidt.h:129
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< typename array::ArrayHandler< Z, W >::value_type > >
Calculates overlap matrix between left and right vectors.
Definition util.h:57
std::unique_ptr< LinearEigensystem< R, Q, P > > create_LinearEigensystem(const LinearEigensystemOptions &options, const std::shared_ptr< ArrayHandlers< R, Q, P > > &handlers=std::make_shared< molpro::linalg::itsolv::ArrayHandlers< R, Q, P > >())
Definition SolverFactory.h:111
std::vector< std::reference_wrapper< A > > VecRef
Definition wrap.h:11