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