1 /*
2    ARPACK++ v1.2 2/20/2000
3    c++ interface to ARPACK code.
4 
5    MODULE ARDGNSym.h.
6    Arpack++ class ARluNonSymGenEig definition
7    (dense 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 ARDGNSYM_H
19 #define ARDGNSYM_H
20 
21 #include <cstddef>
22 #include <string>
23 #include "arch.h"
24 #include "ardnsmat.h"
25 #include "ardnspen.h"
26 #include "argnsym.h"
27 
28 
29 template<class ARFLOAT>
30 class ARluNonSymGenEig:
31   public virtual ARNonSymGenEig<ARFLOAT, ARdsNonSymPencil<ARFLOAT, ARFLOAT>,
32                                 ARdsNonSymPencil<ARFLOAT, ARFLOAT> > {
33 
34  private:
35 
36  // a) Data structure used to store matrices.
37 
38   ARdsNonSymPencil<ARFLOAT, ARFLOAT> Pencil;
39 
40  // b) Protected functions:
41 
42   virtual void Copy(const ARluNonSymGenEig& other);
43   // Makes a deep copy of "other" over "this" object.
44   // Old values are not deleted (this function is to be used
45   // by the copy constructor and the assignment operator only).
46 
47 
48  public:
49 
50  // c) Public functions:
51 
52  // c.1) Functions that allow changes in problem parameters.
53 
54   virtual void ChangeShift(ARFLOAT sigmaRp, ARFLOAT sigmaIp = 0.0);
55 
56   virtual void SetRegularMode();
57 
58   virtual void SetShiftInvertMode(ARFLOAT sigmap);
59 
60   virtual void SetComplexShiftMode(char partp, ARFLOAT sigmaRp,ARFLOAT sigmaIp);
61 
62  // c.2) Constructors and destructor.
63 
ARluNonSymGenEig()64   ARluNonSymGenEig() { }
65   // Short constructor.
66 
67   ARluNonSymGenEig(int nevp, ARdsNonSymMatrix<ARFLOAT, ARFLOAT>& A,
68                    ARdsNonSymMatrix<ARFLOAT, ARFLOAT>& B, const std::string& whichp = "LM",
69                    int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0,
70                    ARFLOAT* residp = NULL, bool ishiftp = true);
71   // Long constructor (regular mode).
72 
73   ARluNonSymGenEig(int nevp, ARdsNonSymMatrix<ARFLOAT, ARFLOAT>& A,
74                    ARdsNonSymMatrix<ARFLOAT, ARFLOAT>& B, ARFLOAT sigma,
75                    const std::string& whichp = "LM", int ncvp = 0,
76                    ARFLOAT tolp = 0.0, int maxitp = 0,
77                    ARFLOAT* residp = NULL, bool ishiftp = true);
78   // Long constructor (real shift and invert mode).
79 
80   ARluNonSymGenEig(int nevp, ARdsNonSymMatrix<ARFLOAT, ARFLOAT>& A,
81                    ARdsNonSymMatrix<ARFLOAT, ARFLOAT>& B, char partp,
82                    ARFLOAT sigmaRp, ARFLOAT sigmaIp, const std::string& whichp = "LM",
83                    int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0,
84                    ARFLOAT* residp = NULL, bool ishiftp = true);
85   // Long constructor (complex shift and invert mode).
86 
ARluNonSymGenEig(const ARluNonSymGenEig & other)87   ARluNonSymGenEig(const ARluNonSymGenEig& other) { Copy(other); }
88   // Copy constructor.
89 
~ARluNonSymGenEig()90   virtual ~ARluNonSymGenEig() { }
91   // Destructor.
92 
93  // d) Operators.
94 
95   ARluNonSymGenEig& operator=(const ARluNonSymGenEig& other);
96   // Assignment operator.
97 
98 }; // class ARluNonSymGenEig.
99 
100 
101 // ------------------------------------------------------------------------ //
102 // ARluNonSymGenEig member functions definition.                            //
103 // ------------------------------------------------------------------------ //
104 
105 
106 template<class ARFLOAT>
107 inline void ARluNonSymGenEig<ARFLOAT>::
Copy(const ARluNonSymGenEig<ARFLOAT> & other)108 Copy(const ARluNonSymGenEig<ARFLOAT>& other)
109 {
110 
111   ARNonSymGenEig<ARFLOAT, ARdsNonSymPencil<ARFLOAT, ARFLOAT>,
112                  ARdsNonSymPencil<ARFLOAT, ARFLOAT> >:: Copy(other);
113   Pencil = other.Pencil;
114   this->objOP  = &Pencil;
115   this->objB   = &Pencil;
116   this->objA   = &Pencil;
117 
118 } // Copy.
119 
120 
121 template<class ARFLOAT>
122 inline void ARluNonSymGenEig<ARFLOAT>::
ChangeShift(ARFLOAT sigmaRp,ARFLOAT sigmaIp)123 ChangeShift(ARFLOAT sigmaRp, ARFLOAT sigmaIp)
124 {
125 
126   if (sigmaIp == 0.0) {
127     this->objOP->FactorAsB(sigmaRp);
128   }
129   else {
130     this->objOP->FactorAsB(sigmaRp, sigmaIp, this->part);
131   }
132   ARrcNonSymGenEig<ARFLOAT>::ChangeShift(sigmaRp, sigmaIp);
133 
134 } // ChangeShift.
135 
136 
137 template<class ARFLOAT>
SetRegularMode()138 inline void ARluNonSymGenEig<ARFLOAT>::SetRegularMode()
139 {
140 
141   ARStdEig<ARFLOAT, ARFLOAT, ARdsNonSymPencil<ARFLOAT, ARFLOAT> >::
142     SetRegularMode(&Pencil, &ARdsNonSymPencil<ARFLOAT, ARFLOAT>::MultInvBAv);
143 
144 } // SetRegularMode.
145 
146 
147 template<class ARFLOAT>
SetShiftInvertMode(ARFLOAT sigmap)148 inline void ARluNonSymGenEig<ARFLOAT>::SetShiftInvertMode(ARFLOAT sigmap)
149 {
150 
151   ARNonSymGenEig<ARFLOAT, ARdsNonSymPencil<ARFLOAT, ARFLOAT>,
152                  ARdsNonSymPencil<ARFLOAT, ARFLOAT> >::
153     SetShiftInvertMode(sigmap, &Pencil,
154                        &ARdsNonSymPencil<ARFLOAT, ARFLOAT>::MultInvAsBv);
155 
156 } // SetShiftInvertMode.
157 
158 
159 template<class ARFLOAT>
160 inline void ARluNonSymGenEig<ARFLOAT>::
SetComplexShiftMode(char partp,ARFLOAT sigmaRp,ARFLOAT sigmaIp)161 SetComplexShiftMode(char partp, ARFLOAT sigmaRp, ARFLOAT sigmaIp)
162 {
163 
164   ARNonSymGenEig<ARFLOAT, ARdsNonSymPencil<ARFLOAT, ARFLOAT>,
165                  ARdsNonSymPencil<ARFLOAT, ARFLOAT> >::
166     SetComplexShiftMode(partp, sigmaRp, sigmaIp, &Pencil,
167                         &ARdsNonSymPencil<ARFLOAT, ARFLOAT>::MultInvAsBv,
168                         &Pencil, &ARdsNonSymPencil<ARFLOAT, ARFLOAT>::MultAv);
169 
170 } // SetComplexShiftMode.
171 
172 
173 template<class ARFLOAT>
174 inline ARluNonSymGenEig<ARFLOAT>::
ARluNonSymGenEig(int nevp,ARdsNonSymMatrix<ARFLOAT,ARFLOAT> & A,ARdsNonSymMatrix<ARFLOAT,ARFLOAT> & B,const std::string & whichp,int ncvp,ARFLOAT tolp,int maxitp,ARFLOAT * residp,bool ishiftp)175 ARluNonSymGenEig(int nevp, ARdsNonSymMatrix<ARFLOAT, ARFLOAT>& A,
176                  ARdsNonSymMatrix<ARFLOAT, ARFLOAT>& B, const std::string& whichp, int ncvp,
177                  ARFLOAT tolp, int maxitp, ARFLOAT* residp, bool ishiftp)
178 
179 {
180 
181   Pencil.DefineMatrices(A, B);
182   this->NoShift();
183   this->DefineParameters(A.ncols(), nevp, &Pencil,
184                    &ARdsNonSymPencil<ARFLOAT, ARFLOAT>::MultInvBAv, &Pencil,
185                    &ARdsNonSymPencil<ARFLOAT, ARFLOAT>::MultBv, whichp,
186                    ncvp, tolp, maxitp, residp, ishiftp);
187 
188 } // Long constructor (regular mode).
189 
190 
191 template<class ARFLOAT>
192 inline ARluNonSymGenEig<ARFLOAT>::
ARluNonSymGenEig(int nevp,ARdsNonSymMatrix<ARFLOAT,ARFLOAT> & A,ARdsNonSymMatrix<ARFLOAT,ARFLOAT> & B,ARFLOAT sigmap,const std::string & whichp,int ncvp,ARFLOAT tolp,int maxitp,ARFLOAT * residp,bool ishiftp)193 ARluNonSymGenEig(int nevp, ARdsNonSymMatrix<ARFLOAT, ARFLOAT>& A,
194                  ARdsNonSymMatrix<ARFLOAT, ARFLOAT>& B, ARFLOAT sigmap,
195                  const std::string& whichp, int ncvp, ARFLOAT tolp,
196                  int maxitp, ARFLOAT* residp, bool ishiftp)
197 
198 {
199 
200   Pencil.DefineMatrices(A, B);
201   this->DefineParameters(A.ncols(), nevp, &Pencil,
202                    &ARdsNonSymPencil<ARFLOAT, ARFLOAT>::MultInvAsBv, &Pencil,
203                    &ARdsNonSymPencil<ARFLOAT, ARFLOAT>::MultBv, whichp,
204                    ncvp, tolp, maxitp, residp, ishiftp);
205   SetShiftInvertMode(sigmap);
206 
207 } // Long constructor (real shift and invert mode).
208 
209 
210 template<class ARFLOAT>
211 inline ARluNonSymGenEig<ARFLOAT>::
ARluNonSymGenEig(int nevp,ARdsNonSymMatrix<ARFLOAT,ARFLOAT> & A,ARdsNonSymMatrix<ARFLOAT,ARFLOAT> & B,char partp,ARFLOAT sigmaRp,ARFLOAT sigmaIp,const std::string & whichp,int ncvp,ARFLOAT tolp,int maxitp,ARFLOAT * residp,bool ishiftp)212 ARluNonSymGenEig(int nevp, ARdsNonSymMatrix<ARFLOAT, ARFLOAT>& A,
213                  ARdsNonSymMatrix<ARFLOAT, ARFLOAT>& B,
214                  char partp, ARFLOAT sigmaRp, ARFLOAT sigmaIp, const std::string& whichp,
215                  int ncvp, ARFLOAT tolp, int maxitp, ARFLOAT* residp,
216                  bool ishiftp)
217 
218 {
219 
220   Pencil.DefineMatrices(A, B);
221   this->DefineParameters(A.ncols(), nevp, &Pencil,
222                    &ARdsNonSymPencil<ARFLOAT, ARFLOAT>::MultInvAsBv, &Pencil,
223                    &ARdsNonSymPencil<ARFLOAT, ARFLOAT>::MultBv, whichp,
224                    ncvp, tolp, maxitp, residp, ishiftp);
225   SetComplexShiftMode(partp, sigmaRp, sigmaIp);
226 
227 } // Long constructor (complex shift and invert mode).
228 
229 
230 template<class ARFLOAT>
231 ARluNonSymGenEig<ARFLOAT>& ARluNonSymGenEig<ARFLOAT>::
232 operator=(const ARluNonSymGenEig<ARFLOAT>& other)
233 {
234 
235   if (this != &other) { // Stroustrup suggestion.
236     this->ClearMem();
237     Copy(other);
238   }
239   return *this;
240 
241 } // operator=.
242 
243 
244 #endif // ARDGNSYM_H
245