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