version 0.4.1
generalizedeigensolverfactory.hh
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2021-2025 The Ikarus Developers ikarus@ibb.uni-stuttgart.de
2// SPDX-License-Identifier: LGPL-3.0-or-later
3
9#pragma once
10
12
13namespace Ikarus {
14
24template <EigenValueSolverType tag, typename MATA, typename MATB>
25requires(Concepts::DenseOrSparseEigenMatrix<std::remove_cvref_t<MATA>> &&
26 std::same_as<std::remove_cvref_t<MATA>, std::remove_cvref_t<MATB>> &&
27 not(tag == EigenValueSolverType::Eigen && Concepts::SparseEigenMatrix<std::remove_cvref_t<MATA>>))
28auto makeGeneralizedSymEigenSolver(MATA&& A, MATB&& B) {
29 using MatrixType = std::remove_cvref_t<MATA>;
30 return GeneralizedSymEigenSolver<tag, MatrixType>{std::forward<MATA>(A), std::forward<MATB>(B)};
31}
32
44template <EigenValueSolverType tag, Concepts::FlatAssembler AssemblerA, Concepts::FlatAssembler AssemblerB>
45requires(std::same_as<typename AssemblerA::MatrixType, typename AssemblerB::MatrixType> &&
46 not(tag == EigenValueSolverType::Eigen && Concepts::SparseEigenMatrix<typename AssemblerA::MatrixType>))
47auto makeGeneralizedSymEigenSolver(const std::shared_ptr<AssemblerA> assemblerA,
48 const std::shared_ptr<AssemblerB> assemblerB) {
49 makeGeneralizedSymEigenSolver(assemblerA->matrix(), assemblerB->matrix());
50}
51
60template <EigenValueSolverType tag, typename MATA>
61requires(Concepts::DenseOrSparseEigenMatrix<std::remove_cvref_t<MATA>> &&
62 not(tag == EigenValueSolverType::Eigen && Concepts::SparseEigenMatrix<std::remove_cvref_t<MATA>>))
64 using MatrixType = std::remove_cvref_t<MATA>;
65 MatrixType I = MatrixType(A.rows(), A.cols());
66 I.setIdentity();
67
68 return GeneralizedSymEigenSolver<tag, MatrixType>{std::forward<MATA>(A), I};
69}
70
78template <EigenValueSolverType tag, Concepts::FlatAssembler AssemblerA>
79requires(Concepts::DenseOrSparseEigenMatrix<typename AssemblerA::MatrixType> &&
80 not(tag == EigenValueSolverType::Eigen && Concepts::SparseEigenMatrix<typename AssemblerA::MatrixType>))
81auto makeIdentitySymEigenSolver(const std::shared_ptr<AssemblerA>& assemblerA) {
82 return makeIdentitySymEigenSolver<tag>(assemblerA->matrix());
83}
84
94template <Concepts::FlatAssembler AssemblerA, Concepts::FlatAssembler AssemblerB>
95requires(std::same_as<typename AssemblerA::MatrixType, typename AssemblerB::MatrixType>)
96auto makePartialGeneralizedSymEigenSolver(std::shared_ptr<AssemblerA> assemblerA,
97 std::shared_ptr<AssemblerB> assemblerB, Eigen::Index nev) {
98 return makePartialGeneralizedSymEigenSolver(assemblerA->matrix(), assemblerB->matrix());
99}
100
108template <typename MATA, typename MATB>
109requires(Concepts::DenseOrSparseEigenMatrix<std::remove_cvref_t<MATA>> &&
110 std::same_as<std::remove_cvref_t<MATA>, std::remove_cvref_t<MATB>>)
111auto makePartialGeneralizedSymEigenSolver(MATA&& A, MATB&& B, Eigen::Index nev) {
112 using MatrixType = std::remove_cvref_t<MATA>;
113 return PartialGeneralizedSymEigenSolver<MatrixType>{std::forward<MATA>(A), std::forward<MATB>(B), nev};
114}
115
123template <typename MATA>
124requires(Concepts::DenseOrSparseEigenMatrix<std::remove_cvref_t<MATA>>)
125auto makePartialIdentitySymEigenSolver(MATA&& A, Eigen::Index nev) {
126 using MatrixType = std::remove_cvref_t<MATA>;
127 MatrixType I = MatrixType(A.rows(), A.cols());
128 I.setIdentity();
129
130 return PartialGeneralizedSymEigenSolver<MatrixType>{std::forward<MATA>(A), I, nev};
131}
132
140template <Concepts::FlatAssembler AssemblerA>
141auto makePartialIdentitySymEigenSolver(const std::shared_ptr<AssemblerA>& assemblerA, Eigen::Index nev) {
142 return makePartialIdentitySymEigenSolver(assemblerA->matrix(), nev);
143}
144
145} // namespace Ikarus
Implementation of wrapper classes for solving a generalized eigenvalue problem.
Definition: assemblermanipulatorbuildingblocks.hh:22
auto makeGeneralizedSymEigenSolver(MATA &&A, MATB &&B)
Factory function to create a GeneralizedSymEigenSolver for a specific backend (Eigen or Spectra) with...
Definition: generalizedeigensolverfactory.hh:28
auto makePartialIdentitySymEigenSolver(MATA &&A, Eigen::Index nev)
Factory function to create a PartialGeneralizedSymEigenSolver with a provided matrix and an identity ...
Definition: generalizedeigensolverfactory.hh:125
auto makeIdentitySymEigenSolver(MATA &&A)
Factory function to create a GeneralizedSymEigenSolver with a provided matrix and an identity matrix.
Definition: generalizedeigensolverfactory.hh:63
auto makePartialGeneralizedSymEigenSolver(std::shared_ptr< AssemblerA > assemblerA, std::shared_ptr< AssemblerB > assemblerB, Eigen::Index nev)
Factory function to create a PartialGeneralizedSymEigenSolver with provided assemblers for both quant...
Definition: generalizedeigensolverfactory.hh:96
Definition: generalizedeigensolver.hh:33
This class implements a wrapper to the Spectra generalized eigen solver for square real symmetric mat...
Definition: generalizedeigensolver.hh:281