13 #ifndef HEX_PRECONDITIONERS
14 #define HEX_PRECONDITIONERS
153 virtual void setup () = 0;
161 virtual void update (
double E) = 0;
166 virtual void rhs (
cArrayView chi,
int ienergy,
int instate)
const = 0;
210 std::vector<std::pair<int,int>>
const & ll,
218 virtual void setup ();
219 virtual void update (
double E);
220 virtual void rhs (
cArrayView chi,
int ienergy,
int instate)
const;
236 std::vector<std::pair<int,int>>
const &
l1_l2_;
270 std::vector<std::pair<int,int>>
const & ll,
308 std::vector<std::pair<int,int>>
const & ll,
315 virtual void setup ();
316 virtual void update (
double E);
326 mutable std::vector<CsrMatrix> csr_blocks_;
327 mutable std::vector<cArray> block_;
330 cl_platform_id platform_;
331 cl_device_id device_;
333 cl_command_queue queue_;
365 std::vector<std::pair<int,int>>
const & ll,
377 virtual void setup ();
378 virtual void update (
double E);
405 std::vector<std::pair<int,int>>
const & ll,
417 virtual void setup ();
418 virtual void update (
double E);
426 mutable std::vector<SymDiaMatrix>
SSOR_;
446 std::vector<std::pair<int,int>>
const & ll,
458 virtual void setup ();
459 virtual void update (
double E);
473 mutable std::vector<CsrMatrix::LUft>
lu_;
493 std::vector<std::pair<int,int>>
const & ll,
505 virtual void setup ();
506 virtual void update (
double E);
511 z = DIC_[iblock].upperSolve( DIC_[iblock].dot( DIC_[iblock].lowerSolve(r),
diagonal ) );
516 std::vector<SymDiaMatrix> DIC_;
538 std::vector<std::pair<int,int>>
const & ll,
550 virtual void setup ();
551 virtual void update (
double E);
556 z = spai_[iblock].dot(r);
562 std::vector<CsrMatrix> spai_;
637 std::vector<std::pair<int,int>>
const & ll,
644 s_bspline.ECStheta(),
719 std::vector<std::pair<int,int>>
const & ll,
730 return p_.back()->rad();
750 p_.back()->rhs(chi, ienergy, instate);
756 p_.back()->multiply(p,q);
765 std::vector<PreconditionerBase*> p_;
821 return std::tuple_size<AvailableTypes>::value;
831 template <
int i = 0>
static inline typename std::enable_if<(i < std::tuple_size<AvailableTypes>::value),
PreconditionerBase*>::type
choose (
837 return (i == cmd.
preconditioner) ?
new typename std::tuple_element<i,AvailableTypes>::type (par, inp, ll, bspline, cmd) : choose<i+1>(par, inp, ll, bspline, cmd);
839 template <
int i = 0>
static inline typename std::enable_if<(i == std::tuple_size<AvailableTypes>::value),
PreconditionerBase*>::type
choose (
859 template <
int i = 0>
static inline typename std::enable_if<(i < std::tuple_size<AvailableTypes>::value),
int>::type
findByName (std::string
name)
864 return (name == std::tuple_element<i,AvailableTypes>::type::name) ? i : findByName<i+1>(
name);
866 template <
int i = 0>
static inline typename std::enable_if<(i == std::tuple_size<AvailableTypes>::value),
int>::type
findByName (std::string name)
877 template <
int i = 0>
static inline typename std::enable_if<(i < std::tuple_size<AvailableTypes>::value),std::string>::type name (
unsigned idx)
879 return (i == idx) ? std::tuple_element<i,AvailableTypes>::type::name : name<i+1>(idx);
881 template <
int i = 0>
static inline typename std::enable_if<(i == std::tuple_size<AvailableTypes>::value),std::string>::type name (
unsigned idx)
891 template <
int i = 0>
static inline typename std::enable_if<(i < std::tuple_size<AvailableTypes>::value),std::string>::type
description (
unsigned idx)
893 return (i == idx) ? std::tuple_element<i,AvailableTypes>::type::description : description<i+1>(idx);
895 template <
int i = 0>
static inline typename std::enable_if<(i == std::tuple_size<AvailableTypes>::value),std::string>::type
description (
unsigned idx)
ColMatrix< Complex > SpsSigma
Definition: preconditioners.h:679
virtual RadialIntegrals const & rad() const =0
Get radial integrals.
virtual void CG_prec(int iblock, const cArrayView r, cArrayView z) const
Definition: preconditioners.h:381
Array view.
Definition: arrays.h:186
virtual void precondition(const cArrayView r, cArrayView z) const
Precondition the equation.
Definition: preconditioners.h:374
RadialIntegrals const & rad() const
Get radial integrals.
Definition: preconditioners.h:651
static const std::string description
Definition: preconditioners.h:441
static std::enable_if<(i< std::tuple_size< AvailableTypes >::value), std::string >::type name(unsigned idx)
Get name of the preconditioner.
Definition: preconditioners.h:877
static const std::string name
Definition: preconditioners.h:630
virtual void rhs(cArrayView chi, int ienergy, int instate) const
Return the right-hand side.
Definition: preconditioners.h:454
SymDiaMatrix S_kron_Mm2_
Definition: preconditioners.h:248
void multiply(const cArrayView p, cArrayView q) const
Multiply by the matrix equation.
std::tuple< ILUCGPreconditioner, NoPreconditioner, CGPreconditioner, JacobiCGPreconditioner, GPUCGPreconditioner, SSORCGPreconditioner > AvailableTypes
List of available preconditioners.
Definition: preconditioners.h:814
virtual void update(double E)
Update the preconditioner for the next energy.
Definition: preconditioners.cpp:1095
RadialIntegrals s_rad_
Definition: preconditioners.h:245
Two-resolution preconditioner.
Definition: preconditioners.h:626
static const std::string description
Definition: preconditioners.h:360
static std::enable_if<(i< std::tuple_size< AvailableTypes >::value), PreconditionerBase * >::type choose(Parallel const &par, InputFile const &inp, std::vector< std::pair< int, int >> const &ll, Bspline const &bspline, CommandLine const &cmd)
Return pointer to new preconditioner object.
Definition: preconditioners.h:831
void update(double E)
Update the preconditioner for the next energy.
std::vector< SymDiaMatrix > dia_blocks_
Definition: preconditioners.h:239
RadialIntegrals p_rad_
Definition: preconditioners.h:687
virtual void precondition(const cArrayView r, cArrayView z) const =0
Precondition the equation.
SymDiaMatrix p_half_D_minus_Mm1_tr_kron_S_
Definition: preconditioners.h:696
virtual RadialIntegrals const & rad() const
Get radial integrals.
Definition: preconditioners.h:216
DICCGPreconditioner(Parallel const &par, InputFile const &inp, std::vector< std::pair< int, int >> const &ll, Bspline const &bspline, CommandLine const &cmd)
Definition: preconditioners.h:490
static const std::string description
Definition: preconditioners.h:205
virtual void rhs(cArrayView chi, int ienergy, int instate) const
Return the right-hand side.
Definition: preconditioners.h:279
virtual RadialIntegrals const & rad() const
Get radial integrals.
Definition: preconditioners.h:276
CommandLine const & cmd_
Definition: preconditioners.h:227
SymDiaMatrix p_S_kron_Mm2_
Definition: preconditioners.h:696
DIC-preconditioned CG-based preconditioner.
Definition: preconditioners.h:483
virtual void precondition(const cArrayView r, cArrayView z) const
Precondition the equation.
Definition: preconditioners.h:547
SSOR-preconditioned CG-based preconditioner.
Definition: preconditioners.h:395
virtual void precondition(const cArrayView r, cArrayView z) const
Precondition the equation.
Definition: preconditioners.h:414
Bspline p_bspline_
Definition: preconditioners.h:684
static const std::string name
Definition: preconditioners.h:532
NumberArray< T > sorted_unique(const ArrayView< T > v, int n=1)
Drop all redundant repetitions from sorted array.
Definition: arrays.h:1935
ColMatrix< Complex > psSigma
Definition: preconditioners.h:679
virtual void setup()
Initialize the preconditioner.
virtual void update(double E)
Update the preconditioner for the next energy.
Definition: preconditioners.cpp:860
SymDiaMatrix DIC(SymDiaMatrix const &A)
DIC preconditioner.
Definition: preconditioners.cpp:94
Multi-resolution (V-cycle) preconditioner.
Definition: preconditioners.h:708
void rhs(cArrayView chi, int ienergy, int instate) const
Return the right-hand side.
SymDiaMatrix p_Mm2_kron_S_
Definition: preconditioners.h:696
virtual void rhs(cArrayView chi, int ienergy, int instate) const =0
Return the right-hand side.
std::vector< CsrMatrix > p_csr_
Definition: preconditioners.h:690
virtual void CG_prec(int iblock, const cArrayView r, cArrayView z) const
Definition: preconditioners.cpp:754
A comfortable number array class.
Definition: arrays.h:171
ILU-preconditioned CG-based preconditioner.
Definition: preconditioners.h:436
static const std::string name
Definition: preconditioners.h:302
virtual void update(double E)
Update the preconditioner for the next energy.
MultiresPreconditioner(Parallel const &par, InputFile const &inp, std::vector< std::pair< int, int >> const &ll, Bspline const &bspline, CommandLine const &cmd)
virtual void update(double E)=0
Update the preconditioner for the next energy.
static const std::string name
Definition: preconditioners.h:359
Solution driver without actual preconditioner.
Definition: preconditioners.h:200
B-spline environment.
Definition: bspline.h:35
static const std::string description
Definition: preconditioners.h:400
static const std::string name
Definition: preconditioners.h:204
RowMatrix< Complex > spSigma_
Definition: preconditioners.h:672
ILUCGPreconditioner(Parallel const &par, InputFile const &inp, std::vector< std::pair< int, int >> const &ll, Bspline const &bspline, CommandLine const &cmd)
Definition: preconditioners.h:443
SymDiaMatrix p_S_kron_half_D_minus_Mm1_tr_
Definition: preconditioners.h:696
void update(double E)
Update the preconditioner for the next energy.
Definition: preconditioners.h:741
std::vector< CsrMatrix > csr_blocks_
Definition: preconditioners.h:470
Gauss-Legendre quadrature.
Definition: gauss.h:33
virtual void multiply(const cArrayView p, cArrayView q) const
Multiply by the matrix equation.
Definition: preconditioners.h:373
cArrays invd_
Definition: preconditioners.h:386
static const std::string description
Definition: preconditioners.h:265
virtual void setup()
Initialize the preconditioner.
Definition: preconditioners.cpp:1047
virtual void CG_prec(int iblock, const cArrayView r, cArrayView z) const
Definition: preconditioners.cpp:1120
Parallel const & par_
Definition: preconditioners.h:230
virtual void precondition(const cArrayView r, cArrayView z) const
Precondition the equation.
Definition: preconditioners.h:502
GaussLegendre g_
Definition: preconditioners.h:700
virtual void CG_prec(int iblock, const cArrayView r, cArrayView z) const
void setup()
Initialize the preconditioner.
virtual void update(double E)
Update the preconditioner for the next energy.
Definition: preconditioners.cpp:405
static const std::string name
Definition: preconditioners.h:440
void precondition(const cArrayView r, cArrayView z) const
Precondition the equation.
Definition: preconditioners.h:652
ColMatrix< Complex > SspSigma
Definition: preconditioners.h:678
static std::enable_if<(i< std::tuple_size< AvailableTypes >::value), int >::type findByName(std::string name)
Find preconditioner by name.
Definition: preconditioners.h:859
virtual void precondition(const cArrayView r, cArrayView z) const
Precondition the equation.
Definition: preconditioners.h:455
virtual void precondition(const cArrayView r, cArrayView z) const
Precondition the equation.
Definition: preconditioners.cpp:693
virtual void multiply(const cArrayView p, cArrayView q) const
Multiply by the matrix equation.
Definition: preconditioners.h:500
static std::enable_if<(i< std::tuple_size< AvailableTypes >::value), std::string >::type description(unsigned idx)
Get description of the preconditioner.
Definition: preconditioners.h:891
Command line parameters.
Definition: input.h:34
static const std::string description
Definition: preconditioners.h:533
virtual RadialIntegrals const & rad() const
Get radial integrals.
Definition: preconditioners.h:371
SymDiaMatrix SSOR(SymDiaMatrix const &A)
SSOR preconditioner.
Definition: preconditioners.cpp:175
ColMatrix< Complex > spSigma
DEBUG.
Definition: preconditioners.h:678
virtual RadialIntegrals const & rad() const
Get radial integrals.
Definition: preconditioners.h:499
virtual void CG_prec(int iblock, const cArrayView r, cArrayView z) const
Definition: preconditioners.h:509
virtual void rhs(cArrayView chi, int ienergy, int instate) const
Return the right-hand side.
Definition: preconditioners.h:317
static size_t size()
Number of available preconditioners.
Definition: preconditioners.h:819
virtual void setup()
Initialize the preconditioner.
Definition: preconditioners.h:277
InputFile const & inp_
Definition: preconditioners.h:233
virtual void CG_mmul(int iblock, const cArrayView p, cArrayView q) const
Definition: preconditioners.cpp:735
int preconditioner
Preconditioner to use. See Preconditioners::AvailableTypes for available types.
Definition: input.h:99
std::vector< CsrMatrix::LUft > lu_
Definition: preconditioners.h:473
virtual void multiply(const cArrayView p, cArrayView q) const
Multiply by the matrix equation.
Definition: preconditioners.h:413
void setup()
Initialize the preconditioner.
Definition: preconditioners.h:734
SymDiaMatrix half_D_minus_Mm1_tr_kron_S_
Definition: preconditioners.h:248
static const std::string description
Definition: preconditioners.h:631
cArray iChol(cArrayView const &A, lArrayView const &I, lArrayView const &P)
Sparse incomplete Cholesky decomposition.
virtual RadialIntegrals const & rad() const
Get radial integrals.
Definition: preconditioners.h:452
Jacobi-preconditioned CG-based preconditioner.
Definition: preconditioners.h:355
virtual void setup()
Initialize the preconditioner.
virtual void rhs(cArrayView chi, int ienergy, int instate) const
Return the right-hand side.
Definition: preconditioners.h:545
CG iteration-based preconditioner (GPU variant).
Definition: preconditioners.h:298
void rhs(cArrayView chi, int ienergy, int instate) const
Return the right-hand side.
Definition: preconditioners.h:748
NoPreconditioner(Parallel const &par, InputFile const &inp, std::vector< std::pair< int, int >> const &ll, Bspline const &bspline, CommandLine const &cmd)
Definition: preconditioners.h:207
CG iteration-based preconditioner.
Definition: preconditioners.h:260
Preconditioner traits.
Definition: preconditioners.h:790
std::vector< std::pair< int, int > > const & l1_l2_
Definition: preconditioners.h:236
RowMatrix< Complex > psSigma_
Definition: preconditioners.h:675
CGPreconditioner(Parallel const &par, InputFile const &inp, std::vector< std::pair< int, int >> const &ll, Bspline const &bspline, CommandLine const &cmd)
Definition: preconditioners.h:267
virtual void multiply(const cArrayView p, cArrayView q) const
Multiply by the matrix equation.
Definition: preconditioners.cpp:601
static const std::string name
Definition: preconditioners.h:399
Complex computeSigma_iknot_(int qord, int is, int iknots, int ip, int iknotp) const
virtual void rhs(cArrayView chi, int ienergy, int instate) const
Return the right-hand side.
Definition: preconditioners.h:372
void precondition(const cArrayView r, cArrayView z) const
Precondition the equation.
MPI info.
Definition: parallel.h:29
~MultiresPreconditioner()
virtual void multiply(const cArrayView p, cArrayView q) const
Multiply by the matrix equation.
Definition: preconditioners.h:453
std::vector< CsrMatrix::LUft > p_lu_
Definition: preconditioners.h:693
virtual RadialIntegrals const & rad() const
Get radial integrals.
Definition: preconditioners.h:544
SymDiaMatrix Mm2_kron_S_
Definition: preconditioners.h:248
virtual void precondition(const cArrayView r, cArrayView z) const
Precondition the equation.
Definition: preconditioners.cpp:896
std::vector< SymDiaMatrix > SSOR_
Definition: preconditioners.h:426
static const std::string description
Definition: preconditioners.h:713
SymDiaMatrix S_kron_half_D_minus_Mm1_tr_
Definition: preconditioners.h:248
SPAI-preconditioned CG-based preconditioner.
Definition: preconditioners.h:528
SymDiaMatrix S_kron_Mm1_tr_
Definition: preconditioners.h:248
static const std::string name
Definition: preconditioners.h:264
virtual void update(double E)
Update the preconditioner for the next energy.
Definition: preconditioners.h:278
virtual void CG_prec(int iblock, const cArrayView r, cArrayView z) const
Definition: preconditioners.h:554
virtual void multiply(const cArrayView p, cArrayView q) const
Multiply by the matrix equation.
Definition: preconditioners.h:280
virtual void multiply(const cArrayView p, cArrayView q) const =0
Multiply by the matrix equation.
RadialIntegrals const & rad() const
Get radial integrals.
Definition: preconditioners.h:728
static const std::string name
Definition: preconditioners.h:712
TwoLevelPreconditioner(Parallel const &par, InputFile const &inp, std::vector< std::pair< int, int >> const &ll, Bspline const &s_bspline, CommandLine const &cmd)
Definition: preconditioners.h:634
virtual void multiply(const cArrayView p, cArrayView q) const
Multiply by the matrix equation.
Definition: preconditioners.h:318
virtual RadialIntegrals const & rad() const
Get radial integrals.
Definition: preconditioners.h:411
virtual RadialIntegrals const & rad() const
Get radial integrals.
Definition: preconditioners.h:314
virtual void setup()=0
Initialize the preconditioner.
virtual void CG_prec(int iblock, const cArrayView r, cArrayView z) const
Definition: preconditioners.cpp:1214
CooMatrix SPAI(SymDiaMatrix const &A, iArrayView diagonals)
SPAI preconditioner.
Definition: preconditioners.cpp:273
Complex COO matrix.
Definition: matrix.h:1120
virtual void update(double E)
Update the preconditioner for the next energy.
Definition: preconditioners.cpp:1055
virtual void rhs(cArrayView chi, int ienergy, int instate) const
Return the right-hand side.
Definition: preconditioners.h:412
virtual void update(double E)
Update the preconditioner for the next energy.
virtual void setup()
Initialize the preconditioner.
Definition: preconditioners.cpp:1146
std::complex< double > Complex
Definition: complex.h:20
Symmetric diagonal matrix.
Definition: matrix.h:1547
GPUCGPreconditioner(Parallel const &par, InputFile const &inp, std::vector< std::pair< int, int >> const &ll, Bspline const &bspline, CommandLine const &cmd)
Definition: preconditioners.h:305
double droptol_
Definition: preconditioners.h:467
static const std::string description
Definition: preconditioners.h:488
void multiply(const cArrayView p, cArrayView q) const
Multiply by the matrix equation.
Definition: preconditioners.h:754
SymDiaMatrix S_kron_S_
Definition: preconditioners.h:248
Preconditioner template.
Definition: preconditioners.h:137
virtual void precondition(const cArrayView r, cArrayView z) const
Precondition the equation.
Definition: preconditioners.cpp:701
virtual void update(double E)
Update the preconditioner for the next energy.
Definition: preconditioners.cpp:1155
SSORCGPreconditioner(Parallel const &par, InputFile const &inp, std::vector< std::pair< int, int >> const &ll, Bspline const &bspline, CommandLine const &cmd)
Definition: preconditioners.h:402
virtual void setup()
Initialize the preconditioner.
Definition: preconditioners.cpp:362
virtual void rhs(cArrayView chi, int ienergy, int instate) const
Return the right-hand side.
Definition: preconditioners.h:501
SymDiaMatrix Mm1_tr_kron_S_
Definition: preconditioners.h:248
virtual void setup()
Initialize the preconditioner.
Definition: preconditioners.cpp:773
virtual void multiply(const cArrayView p, cArrayView q) const
Multiply by the matrix equation.
Definition: preconditioners.h:546
SPAICGPreconditioner(Parallel const &par, InputFile const &inp, std::vector< std::pair< int, int >> const &ll, Bspline const &bspline, CommandLine const &cmd)
Definition: preconditioners.h:535
Bspline s_bspline_
Definition: preconditioners.h:242
virtual void rhs(cArrayView chi, int ienergy, int instate) const
Return the right-hand side.
Definition: preconditioners.cpp:478
static const std::string description
Definition: preconditioners.h:303
virtual void setup()
Initialize the preconditioner.
Definition: preconditioners.cpp:1086
SymDiaMatrix half_D_minus_Mm1_tr_
Definition: preconditioners.h:248
JacobiCGPreconditioner(Parallel const &par, InputFile const &inp, std::vector< std::pair< int, int >> const &ll, Bspline const &bspline, CommandLine const &cmd)
Definition: preconditioners.h:362
static const std::string name
Definition: preconditioners.h:487
SymDiaMatrix p_S_kron_S_
Definition: preconditioners.h:696