1 /*
2 ARPACK++ v1.2 2/20/2000
3 c++ interface to ARPACK code.
4
5 MODULE ARLGNSym.h.
6 Arpack++ class ARluNonSymGenEig definition
7 (SuperLU 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 ARLGNSYM_H
19 #define ARLGNSYM_H
20
21 #include <cstddef>
22 #include <string>
23 #include "arch.h"
24 #include "arlnsmat.h"
25 #include "arlnspen.h"
26 #include "argnsym.h"
27
28
29 template<class ARFLOAT>
30 class ARluNonSymGenEig:
31 public virtual ARNonSymGenEig<ARFLOAT, ARluNonSymPencil<ARFLOAT, ARFLOAT>,
32 ARluNonSymPencil<ARFLOAT, ARFLOAT> > {
33
34 protected:
35
36 // a) Data structure used to store matrices.
37
38 ARluNonSymPencil<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, ARluNonSymMatrix<ARFLOAT, ARFLOAT>& A,
68 ARluNonSymMatrix<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, ARluNonSymMatrix<ARFLOAT, ARFLOAT>& A,
74 ARluNonSymMatrix<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, ARluNonSymMatrix<ARFLOAT, ARFLOAT>& A,
81 ARluNonSymMatrix<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, ARluNonSymPencil<ARFLOAT, ARFLOAT>,
112 ARluNonSymPencil<ARFLOAT, ARFLOAT> >:: Copy(other);
113 Pencil = other.Pencil;
114 this->objOP = &Pencil;
115 this->objB = &Pencil;
116 this->objA = &Pencil;
117 if (this->mode > 2) {
118 if (this->sigmaI == 0.0) {
119 this->objOP->FactorAsB(this->sigmaR);
120 }
121 else {
122 this->objOP->FactorAsB(this->sigmaR, this->sigmaI, this->part);
123 }
124 }
125
126 } // Copy.
127
128
129 template<class ARFLOAT>
130 inline void ARluNonSymGenEig<ARFLOAT>::
ChangeShift(ARFLOAT sigmaRp,ARFLOAT sigmaIp)131 ChangeShift(ARFLOAT sigmaRp, ARFLOAT sigmaIp)
132 {
133
134 if (sigmaIp == 0.0) {
135 this->objOP->FactorAsB(sigmaRp);
136 }
137 else {
138 this->objOP->FactorAsB(sigmaRp, sigmaIp, this->part);
139 }
140 ARrcNonSymGenEig<ARFLOAT>::ChangeShift(sigmaRp, sigmaIp);
141
142 } // ChangeShift.
143
144
145 template<class ARFLOAT>
SetRegularMode()146 inline void ARluNonSymGenEig<ARFLOAT>::SetRegularMode()
147 {
148
149 ARStdEig<ARFLOAT, ARFLOAT, ARluNonSymPencil<ARFLOAT, ARFLOAT> >::
150 SetRegularMode(&Pencil, &ARluNonSymPencil<ARFLOAT, ARFLOAT>::MultInvBAv);
151
152 } // SetRegularMode.
153
154
155 template<class ARFLOAT>
SetShiftInvertMode(ARFLOAT sigmap)156 inline void ARluNonSymGenEig<ARFLOAT>::SetShiftInvertMode(ARFLOAT sigmap)
157 {
158
159 ARNonSymGenEig<ARFLOAT, ARluNonSymPencil<ARFLOAT, ARFLOAT>,
160 ARluNonSymPencil<ARFLOAT, ARFLOAT> >::
161 SetShiftInvertMode(sigmap, &Pencil,
162 &ARluNonSymPencil<ARFLOAT, ARFLOAT>::MultInvAsBv);
163
164 } // SetShiftInvertMode.
165
166
167 template<class ARFLOAT>
168 inline void ARluNonSymGenEig<ARFLOAT>::
SetComplexShiftMode(char partp,ARFLOAT sigmaRp,ARFLOAT sigmaIp)169 SetComplexShiftMode(char partp, ARFLOAT sigmaRp, ARFLOAT sigmaIp)
170 {
171
172 ARNonSymGenEig<ARFLOAT, ARluNonSymPencil<ARFLOAT, ARFLOAT>,
173 ARluNonSymPencil<ARFLOAT, ARFLOAT> >::
174 SetComplexShiftMode(partp, sigmaRp, sigmaIp, &Pencil,
175 &ARluNonSymPencil<ARFLOAT, ARFLOAT>::MultInvAsBv,
176 &Pencil, &ARluNonSymPencil<ARFLOAT, ARFLOAT>::MultAv);
177
178 } // SetComplexShiftMode.
179
180
181 template<class ARFLOAT>
182 inline ARluNonSymGenEig<ARFLOAT>::
ARluNonSymGenEig(int nevp,ARluNonSymMatrix<ARFLOAT,ARFLOAT> & A,ARluNonSymMatrix<ARFLOAT,ARFLOAT> & B,const std::string & whichp,int ncvp,ARFLOAT tolp,int maxitp,ARFLOAT * residp,bool ishiftp)183 ARluNonSymGenEig(int nevp, ARluNonSymMatrix<ARFLOAT, ARFLOAT>& A,
184 ARluNonSymMatrix<ARFLOAT, ARFLOAT>& B, const std::string& whichp, int ncvp,
185 ARFLOAT tolp, int maxitp, ARFLOAT* residp, bool ishiftp)
186
187 {
188
189 Pencil.DefineMatrices(A, B);
190 this->NoShift();
191 this->DefineParameters(A.ncols(), nevp, &Pencil,
192 &ARluNonSymPencil<ARFLOAT, ARFLOAT>::MultInvBAv, &Pencil,
193 &ARluNonSymPencil<ARFLOAT, ARFLOAT>::MultBv, whichp,
194 ncvp, tolp, maxitp, residp, ishiftp);
195
196 } // Long constructor (regular mode).
197
198
199 template<class ARFLOAT>
200 inline ARluNonSymGenEig<ARFLOAT>::
ARluNonSymGenEig(int nevp,ARluNonSymMatrix<ARFLOAT,ARFLOAT> & A,ARluNonSymMatrix<ARFLOAT,ARFLOAT> & B,ARFLOAT sigmap,const std::string & whichp,int ncvp,ARFLOAT tolp,int maxitp,ARFLOAT * residp,bool ishiftp)201 ARluNonSymGenEig(int nevp, ARluNonSymMatrix<ARFLOAT, ARFLOAT>& A,
202 ARluNonSymMatrix<ARFLOAT, ARFLOAT>& B, ARFLOAT sigmap,
203 const std::string& whichp, int ncvp, ARFLOAT tolp,
204 int maxitp, ARFLOAT* residp, bool ishiftp)
205
206 {
207
208 Pencil.DefineMatrices(A, B);
209 this->DefineParameters(A.ncols(), nevp, &Pencil,
210 &ARluNonSymPencil<ARFLOAT, ARFLOAT>::MultInvAsBv, &Pencil,
211 &ARluNonSymPencil<ARFLOAT, ARFLOAT>::MultBv, whichp,
212 ncvp, tolp, maxitp, residp, ishiftp);
213 SetShiftInvertMode(sigmap);
214
215 } // Long constructor (real shift and invert mode).
216
217
218 template<class ARFLOAT>
219 inline ARluNonSymGenEig<ARFLOAT>::
ARluNonSymGenEig(int nevp,ARluNonSymMatrix<ARFLOAT,ARFLOAT> & A,ARluNonSymMatrix<ARFLOAT,ARFLOAT> & B,char partp,ARFLOAT sigmaRp,ARFLOAT sigmaIp,const std::string & whichp,int ncvp,ARFLOAT tolp,int maxitp,ARFLOAT * residp,bool ishiftp)220 ARluNonSymGenEig(int nevp, ARluNonSymMatrix<ARFLOAT, ARFLOAT>& A,
221 ARluNonSymMatrix<ARFLOAT, ARFLOAT>& B,
222 char partp, ARFLOAT sigmaRp,
223 ARFLOAT sigmaIp, const std::string& whichp, int ncvp, ARFLOAT tolp,
224 int maxitp, ARFLOAT* residp, bool ishiftp)
225
226 {
227
228 Pencil.DefineMatrices(A, B);
229 this->DefineParameters(A.ncols(), nevp, &Pencil,
230 &ARluNonSymPencil<ARFLOAT, ARFLOAT>::MultInvAsBv, &Pencil,
231 &ARluNonSymPencil<ARFLOAT, ARFLOAT>::MultBv, whichp,
232 ncvp, tolp, maxitp, residp, ishiftp);
233 SetComplexShiftMode(partp, sigmaRp, sigmaIp);
234
235 } // Long constructor (complex shift and invert mode).
236
237
238 template<class ARFLOAT>
239 ARluNonSymGenEig<ARFLOAT>& ARluNonSymGenEig<ARFLOAT>::
240 operator=(const ARluNonSymGenEig<ARFLOAT>& other)
241 {
242
243 if (this != &other) { // Stroustrup suggestion.
244 this->ClearMem();
245 Copy(other);
246 }
247 return *this;
248
249 } // operator=.
250
251
252 #endif // ARLGNSYM_H
253