1 /*
2    ARPACK++ v1.2 2/20/2000
3    c++ interface to ARPACK code.
4 
5    MODULE ARBSComp.h.
6    Arpack++ class ARluCompStdEig definition
7    (band matrix version).
8 
9    ARPACK Authors
10       Richard Lehoucq
11       Danny Sorensen
12       Chao Yang
13       Dept. of Computational & Applied Mathematics
14       Rice University
15       Houston, Texas
16 */
17 
18 #ifndef ARBSCOMP_H
19 #define ARBSCOMP_H
20 
21 #include <cstddef>
22 #include <string>
23 #include "arch.h"
24 #include "arscomp.h"
25 #include "arbnsmat.h"
26 #include "arrseig.h"
27 
28 
29 template<class ARFLOAT>
30 class ARluCompStdEig:
31   public virtual ARCompStdEig<ARFLOAT,
32                               ARbdNonSymMatrix<arcomplex<ARFLOAT>, ARFLOAT> > {
33 
34  public:
35 
36  // a) Public functions:
37 
38  // a.1) Functions that allow changes in problem parameters.
39 
40   virtual void ChangeShift(arcomplex<ARFLOAT> sigmaRp);
41 
42   virtual void SetRegularMode();
43 
44   virtual void SetShiftInvertMode(arcomplex<ARFLOAT> sigmap);
45 
46  // a.2) Constructors and destructor.
47 
ARluCompStdEig()48   ARluCompStdEig() { }
49   // Short constructor.
50 
51   ARluCompStdEig(int nevp, ARbdNonSymMatrix<arcomplex<ARFLOAT>, ARFLOAT>& A,
52                  const std::string& whichp = "LM", int ncvp = 0,
53                  ARFLOAT tolp = 0.0, int maxitp = 0,
54                  arcomplex<ARFLOAT>* residp = NULL, bool ishiftp = true);
55   // Long constructor (regular mode).
56 
57   ARluCompStdEig(int nevp, ARbdNonSymMatrix<arcomplex<ARFLOAT>, ARFLOAT>& A,
58                  arcomplex<ARFLOAT> sigma, const std::string& whichp = "LM",
59                  int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0,
60                  arcomplex<ARFLOAT>* residp = NULL, bool ishiftp = true);
61   // Long constructor (shift and invert mode).
62 
ARluCompStdEig(const ARluCompStdEig & other)63   ARluCompStdEig(const ARluCompStdEig& other) { Copy(other); }
64   // Copy constructor.
65 
~ARluCompStdEig()66   virtual ~ARluCompStdEig() { }
67   // Destructor.
68 
69 
70  // b) Operators.
71 
72   ARluCompStdEig& operator=(const ARluCompStdEig& other);
73   // Assignment operator.
74 
75 }; // class ARluCompStdEig.
76 
77 
78 // ------------------------------------------------------------------------ //
79 // ARluCompStdEig member functions definition.                              //
80 // ------------------------------------------------------------------------ //
81 
82 
83 template<class ARFLOAT>
84 inline void ARluCompStdEig<ARFLOAT>::
ChangeShift(arcomplex<ARFLOAT> sigmaRp)85 ChangeShift(arcomplex<ARFLOAT> sigmaRp)
86 {
87 
88   this->objOP->FactorAsI(sigmaRp);
89   ARrcStdEig<ARFLOAT, arcomplex<ARFLOAT> >::ChangeShift(sigmaRp);
90 
91 } // ChangeShift.
92 
93 
94 template<class ARFLOAT>
SetRegularMode()95 inline void ARluCompStdEig<ARFLOAT>::SetRegularMode()
96 {
97 
98   ARStdEig<ARFLOAT, arcomplex<ARFLOAT>,
99            ARbdNonSymMatrix<arcomplex<ARFLOAT>,ARFLOAT> >::
100     SetRegularMode(this->objOP,&ARbdNonSymMatrix<arcomplex<ARFLOAT>,ARFLOAT>::MultMv);
101 
102 } // SetRegularMode.
103 
104 
105 template<class ARFLOAT>
106 inline void ARluCompStdEig<ARFLOAT>::
SetShiftInvertMode(arcomplex<ARFLOAT> sigmap)107 SetShiftInvertMode(arcomplex<ARFLOAT> sigmap)
108 {
109 
110   ARStdEig<ARFLOAT, arcomplex<ARFLOAT>,
111            ARbdNonSymMatrix<arcomplex<ARFLOAT>,ARFLOAT> >::
112     SetShiftInvertMode(sigmap, this->objOP,
113                        &ARbdNonSymMatrix<arcomplex<ARFLOAT>,ARFLOAT>::MultInvv);
114 
115 } // SetShiftInvertMode.
116 
117 
118 template<class ARFLOAT>
119 inline ARluCompStdEig<ARFLOAT>::
ARluCompStdEig(int nevp,ARbdNonSymMatrix<arcomplex<ARFLOAT>,ARFLOAT> & A,const std::string & whichp,int ncvp,ARFLOAT tolp,int maxitp,arcomplex<ARFLOAT> * residp,bool ishiftp)120 ARluCompStdEig(int nevp, ARbdNonSymMatrix<arcomplex<ARFLOAT>, ARFLOAT>& A,
121                const std::string& whichp, int ncvp, ARFLOAT tolp,
122                int maxitp, arcomplex<ARFLOAT>* residp, bool ishiftp)
123 
124 {
125 
126   this->NoShift();
127   this->DefineParameters(A.ncols(), nevp, &A,
128                    &ARbdNonSymMatrix<arcomplex<ARFLOAT>, ARFLOAT>::MultMv,
129                    whichp, ncvp, tolp, maxitp, residp, ishiftp);
130 
131 } // Long constructor (regular mode).
132 
133 
134 template<class ARFLOAT>
135 inline ARluCompStdEig<ARFLOAT>::
ARluCompStdEig(int nevp,ARbdNonSymMatrix<arcomplex<ARFLOAT>,ARFLOAT> & A,arcomplex<ARFLOAT> sigmap,const std::string & whichp,int ncvp,ARFLOAT tolp,int maxitp,arcomplex<ARFLOAT> * residp,bool ishiftp)136 ARluCompStdEig(int nevp, ARbdNonSymMatrix<arcomplex<ARFLOAT>, ARFLOAT>& A,
137                arcomplex<ARFLOAT> sigmap, const std::string& whichp, int ncvp,
138                ARFLOAT tolp, int maxitp, arcomplex<ARFLOAT>* residp,
139                bool ishiftp)
140 
141 {
142 
143   this->DefineParameters(A.ncols(), nevp, &A,
144                    &ARbdNonSymMatrix<arcomplex<ARFLOAT>, ARFLOAT>::MultInvv,
145                    whichp, ncvp, tolp, maxitp, residp, ishiftp);
146   ChangeShift(sigmap);
147 
148 } // Long constructor (shift and invert mode).
149 
150 
151 template<class ARFLOAT>
152 ARluCompStdEig<ARFLOAT>& ARluCompStdEig<ARFLOAT>::
153 operator=(const ARluCompStdEig<ARFLOAT>& other)
154 {
155 
156   if (this != &other) { // Stroustrup suggestion.
157     this->ClearMem();
158     Copy(other);
159   }
160   return *this;
161 
162 } // operator=.
163 
164 
165 #endif // ARBSCOMP_H
166