oomph::ARPACK Class Reference

Class for the ARPACK eigensolver. More...

#include <eigen_solver.h>

+ Inheritance diagram for oomph::ARPACK:

Public Member Functions

 ARPACK ()
 Constructor. More...
 
 ARPACK (const ARPACK &)
 Empty copy constructor. More...
 
virtual ~ARPACK ()
 Destructor, delete the linear solver. More...
 
intnarnoldi ()
 Access function for the number of Arnoldi vectors. More...
 
const intnarnoldi () const
 Access function for the number of Arnoldi vectors (const version) More...
 
void enable_compute_eigenvectors ()
 Set to enable the computation of the eigenvectors (default) More...
 
void disable_compute_eigenvectors ()
 Set to disable the computation of the eigenvectors. More...
 
void solve_eigenproblem (Problem *const &problem_pt, const int &n_eval, Vector< std::complex< double >> &eigenvalue, Vector< DoubleVector > &eigenvector)
 Solve the eigen problem. More...
 
void get_eigenvalues_left_of_shift ()
 Use the eigensolver to find the eigenvalues of a given matrix. More...
 
void get_eigenvalues_right_of_shift ()
 Set the desired eigenvalues to be right of the shift. More...
 
void track_eigenvalue_real_part ()
 Set the real part to be the quantity of interest (default) More...
 
void track_eigenvalue_imaginary_part ()
 Set the imaginary part fo the quantity of interest. More...
 
void track_eigenvalue_magnitude ()
 Set the magnitude to be the quantity of interest. More...
 
LinearSolver *& linear_solver_pt ()
 Return a pointer to the linear solver object. More...
 
LinearSolver *const & linear_solver_pt () const
 Return a pointer to the linear solver object (const version) More...
 
- Public Member Functions inherited from oomph::EigenSolver
 EigenSolver ()
 Empty constructor. More...
 
 EigenSolver (const EigenSolver &)
 Empty copy constructor. More...
 
virtual ~EigenSolver ()
 Empty destructor. More...
 
void set_shift (const double &shift_value)
 Set the value of the shift. More...
 
const doubleget_shift () const
 Return the value of the shift (const version) More...
 
- Public Member Functions inherited from oomph::DistributableLinearAlgebraObject
 DistributableLinearAlgebraObject ()
 Default constructor - create a distribution. More...
 
 DistributableLinearAlgebraObject (const DistributableLinearAlgebraObject &matrix)=delete
 Broken copy constructor. More...
 
void operator= (const DistributableLinearAlgebraObject &)=delete
 Broken assignment operator. More...
 
virtual ~DistributableLinearAlgebraObject ()
 Destructor. More...
 
LinearAlgebraDistributiondistribution_pt () const
 access to the LinearAlgebraDistribution More...
 
unsigned nrow () const
 access function to the number of global rows. More...
 
unsigned nrow_local () const
 access function for the num of local rows on this processor. More...
 
unsigned nrow_local (const unsigned &p) const
 access function for the num of local rows on this processor. More...
 
unsigned first_row () const
 access function for the first row on this processor More...
 
unsigned first_row (const unsigned &p) const
 access function for the first row on this processor More...
 
bool distributed () const
 distribution is serial or distributed More...
 
bool distribution_built () const
 
void build_distribution (const LinearAlgebraDistribution *const dist_pt)
 
void build_distribution (const LinearAlgebraDistribution &dist)
 

Private Attributes

LinearSolverLinear_solver_pt
 Pointer to a linear solver. More...
 
LinearSolverDefault_linear_solver_pt
 Pointer to a default linear solver. More...
 
int Spectrum
 
int NArnoldi
 Number of Arnoldi vectors to compute. More...
 
bool Small
 
bool Compute_eigenvectors
 Boolean to indicate whether or not to compute the eigenvectors. More...
 

Additional Inherited Members

- Protected Member Functions inherited from oomph::DistributableLinearAlgebraObject
void clear_distribution ()
 
- Protected Attributes inherited from oomph::EigenSolver
double Sigma_real
 

Detailed Description

Class for the ARPACK eigensolver.

Constructor & Destructor Documentation

◆ ARPACK() [1/2]

oomph::ARPACK::ARPACK ( )

Constructor.

Constructor, set default values and set the initial linear solver to be superlu

50  : EigenSolver(),
51  Spectrum(1),
52  NArnoldi(30),
53  Small(true),
55  {
56  Default_linear_solver_pt = Linear_solver_pt = new SuperLUSolver;
57  }
int Spectrum
Definition: eigen_solver.h:115
int NArnoldi
Number of Arnoldi vectors to compute.
Definition: eigen_solver.h:119
LinearSolver * Linear_solver_pt
Pointer to a linear solver.
Definition: eigen_solver.h:107
bool Small
Definition: eigen_solver.h:124
LinearSolver * Default_linear_solver_pt
Pointer to a default linear solver.
Definition: eigen_solver.h:110
bool Compute_eigenvectors
Boolean to indicate whether or not to compute the eigenvectors.
Definition: eigen_solver.h:127
EigenSolver()
Empty constructor.
Definition: eigen_solver.h:69

References Default_linear_solver_pt, and Linear_solver_pt.

◆ ARPACK() [2/2]

oomph::ARPACK::ARPACK ( const ARPACK )
inline

Empty copy constructor.

135 {}

◆ ~ARPACK()

oomph::ARPACK::~ARPACK ( )
virtual

Destructor, delete the linear solver.

Destructor, delete the default linear solver.

63  {
65  }

References Default_linear_solver_pt.

Member Function Documentation

◆ disable_compute_eigenvectors()

void oomph::ARPACK::disable_compute_eigenvectors ( )
inline

Set to disable the computation of the eigenvectors.

160  {
161  Compute_eigenvectors = false;
162  }

References Compute_eigenvectors.

◆ enable_compute_eigenvectors()

void oomph::ARPACK::enable_compute_eigenvectors ( )
inline

Set to enable the computation of the eigenvectors (default)

154  {
155  Compute_eigenvectors = true;
156  }

References Compute_eigenvectors.

◆ get_eigenvalues_left_of_shift()

void oomph::ARPACK::get_eigenvalues_left_of_shift ( )
inline

Use the eigensolver to find the eigenvalues of a given matrix.

Set the desired eigenvalues to be left of the shift

178  {
179  Small = true;
180  }

References Small.

◆ get_eigenvalues_right_of_shift()

void oomph::ARPACK::get_eigenvalues_right_of_shift ( )
inline

Set the desired eigenvalues to be right of the shift.

184  {
185  Small = false;
186  }

References Small.

◆ linear_solver_pt() [1/2]

LinearSolver*& oomph::ARPACK::linear_solver_pt ( )
inline

Return a pointer to the linear solver object.

208  {
209  return Linear_solver_pt;
210  }

References Linear_solver_pt.

◆ linear_solver_pt() [2/2]

LinearSolver* const& oomph::ARPACK::linear_solver_pt ( ) const
inline

Return a pointer to the linear solver object (const version)

214  {
215  return Linear_solver_pt;
216  }

References Linear_solver_pt.

◆ narnoldi() [1/2]

int& oomph::ARPACK::narnoldi ( )
inline

Access function for the number of Arnoldi vectors.

142  {
143  return NArnoldi;
144  }

References NArnoldi.

◆ narnoldi() [2/2]

const int& oomph::ARPACK::narnoldi ( ) const
inline

Access function for the number of Arnoldi vectors (const version)

148  {
149  return NArnoldi;
150  }

References NArnoldi.

◆ solve_eigenproblem()

void oomph::ARPACK::solve_eigenproblem ( Problem *const &  problem_pt,
const int n_eval,
Vector< std::complex< double >> &  eigenvalue,
Vector< DoubleVector > &  eigenvector 
)
virtual

Solve the eigen problem.

Use ARPACK to solve an eigen problem that is assembled by elements in a mesh in a Problem object.

Implements oomph::EigenSolver.

76  {
77  bool Verbose = false;
78 
79  // Control parameters
80  int ido = 0; // Reverse communication flag
81  char bmat[2]; // Specifies the type of matrix on the RHS
82  // Must be 'I' for standard eigenvalue problem
83  // 'G' for generalised eigenvalue problem
84  int n; // Dimension of the problem
85  char which[3]; // Set which eigenvalues are required.
86  int nev; // Number of eigenvalues desired
87  double tol = 0.0; // Stopping criteria
88  int ncv; // Number of columns of the matrix V (Dimension of Arnoldi
89  // subspace)
90  int iparam[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // Control parameters
91  // Pointers to starting locations in the workspace vectors
92  int ipntr[14] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
93  int info =
94  0; // Setting to zero gives random initial guess for vector to start
95  // Arnoldi iteration
96 
97  // Set up the sizes of the matrix
98  n = problem_pt->ndof(); // Total size of matrix
99  nev = n_eval; // Number of desired eigenvalues
100  ncv = NArnoldi < n ? NArnoldi : n; // Number of Arnoldi vectors allowed
101  // Maximum possible value is max
102  // dimension of matrix
103 
104  // If we don't have enough Arnoldi vectors to compute the desired number
105  // of eigenvalues then complain
106  if (nev > ncv)
107  {
108  std::ostringstream warning_stream;
109  warning_stream << "Number of requested eigenvalues " << nev << "\n"
110  << "is greater than the number of Arnoldi vectors:" << ncv
111  << "\n";
112  // Increase the number of Arnoldi vectors
113  ncv = nev + 10;
114  if (ncv > n)
115  {
116  ncv = n;
117  }
118 
119  warning_stream << "Increasing number of Arnoldi vectors to " << ncv
120  << "\n but you may want to increase further using\n"
121  << "ARPACK::narnoldi()\n"
122  << "which will also get rid of this warning.\n";
123 
124  OomphLibWarning(
125  warning_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
126  }
127 
128  // Allocate some workspace
129  int lworkl = 3 * ncv * ncv + 6 * ncv;
130 
131  // Array that holds the final set of Arnoldi basis vectors
132  double** v = new double*;
133  *v = new double[ncv * n];
134  // Leading dimension of v (n)
135  int ldv = n;
136 
137  // Residual vector
138  double* resid = new double[n];
139  // Workspace vector
140  double* workd = new double[3 * n];
141  // Workspace vector
142  double* workl = new double[lworkl];
143 
144  bmat[0] = 'G';
145  // If we require eigenvalues to the left of the shift
146  if (Small)
147  {
148  which[0] = 'S';
149  }
150  // Otherwise we require eigenvalues to the right of the shift
151  else
152  {
153  which[0] = 'L';
154  }
155 
156  // Which part of the eigenvalue interests us
157  switch (Spectrum)
158  {
159  // Imaginary part
160  case -1:
161  which[1] = 'I';
162  break;
163 
164  // Magnitude
165  case 0:
166  which[1] = 'M';
167  break;
168 
169  // Real part
170  case 1:
171  which[1] = 'R';
172  break;
173 
174  default:
175  std::ostringstream error_stream;
176  error_stream
177  << "Spectrum is set to an invalid value. It must be 0, 1 or -1\n"
178  << "Not " << Spectrum << std::endl;
179 
180  throw OomphLibError(
181  error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
182  }
183 
184  // %---------------------------------------------------%
185  // | This program uses exact shifts with respect to |
186  // | the current Hessenberg matrix (IPARAM(1) = 1). |
187  // | IPARAM(3) specifies the maximum number of Arnoldi |
188  // | iterations allowed. Mode 3 of DNAUPD is used |
189  // | (IPARAM(7) = 3). All these options can be changed |
190  // | by the user. For details see the documentation in |
191  // | DNAUPD. |
192  // %---------------------------------------------------%
193 
194  int ishifts = 1;
195  int maxitr = 300;
196  int mode = 3; // M is symetric and semi-definite
197 
198  iparam[0] = ishifts; // Exact shifts wrt Hessenberg matrix H
199  iparam[2] = maxitr; // Maximum number of allowed iterations
200  iparam[3] = 1; // Bloacksize to be used in the recurrence
201  iparam[6] = mode; // Mode is shift and invert in real arithmetic
202 
203  // Real and imaginary parts of the shift
204  double sigmar = Sigma_real, sigmai = 0.0;
205 
206  // TEMPORARY
207  // only use non distributed matrice and vectors
208  LinearAlgebraDistribution dist(problem_pt->communicator_pt(), n, false);
209  this->build_distribution(dist);
210 
211  // Before we get into the Arnoldi loop solve the shifted matrix problem
212  // Allocated Row compressed matrices for the mass matrix and shifted main
213  // matrix
214  CRDoubleMatrix M(this->distribution_pt()), AsigmaM(this->distribution_pt());
215 
216  // Assemble the matrices
217  problem_pt->get_eigenproblem_matrices(M, AsigmaM, sigmar);
218 
219  // Allocate storage for the vectors to be used in matrix vector products
220  DoubleVector rhs(this->distribution_pt(), 0.0);
221  DoubleVector x(this->distribution_pt(), 0.0);
222 
223 
224  bool LOOP_FLAG = true;
225  bool First = true;
226 
227  // Enable resolves for the linear solver
229 
230  // Do not report the time taken
232 
233  do
234  {
235  // %---------------------------------------------%
236  // | Repeatedly call the routine DNAUPD and take |
237  // | actions indicated by parameter IDO until |
238  // | either convergence is indicated or maxitr |
239  // | has been exceeded. |
240  // %---------------------------------------------%
241  //
242 
243  DNAUPD(ido,
244  bmat,
245  n,
246  which,
247  nev,
248  tol,
249  resid,
250  ncv,
251  v,
252  ldv,
253  iparam,
254  ipntr,
255  workd,
256  workl,
257  lworkl,
258  info);
259 
260  if (ido == -1)
261  {
262  // %-------------------------------------------%
263  // | Perform matrix vector multiplication |
264  // | y <--- OP*x |
265  // | The user should supply his/her own |
266  // | matrix vector multiplication routine here |
267  // | that takes workd(ipntr(1)) as the input |
268  // | vector, and return the matrix vector |
269  // | product to workd(ipntr(2)). |
270  // %-------------------------------------------%
271  //
272 
273  // Firstly multiply by mx
274  for (int i = 0; i < n; i++)
275  {
276  x[i] = workd[ipntr[0] - 1 + i];
277  }
278  M.multiply(x, rhs);
279 
280  // Now solve the system
281  DoubleVector temp(rhs);
282  if (First)
283  {
284  Linear_solver_pt->solve(&AsigmaM, temp, rhs);
285  First = false;
286  }
287  else
288  {
289  Linear_solver_pt->resolve(temp, rhs);
290  }
291  temp.clear();
292  // AsigmaM.lubksub(rhs);
293  // Put the solution into the workspace
294  for (int i = 0; i < n; i++)
295  {
296  workd[ipntr[1] - 1 + i] = rhs[i];
297  }
298 
299  continue;
300  }
301  else if (ido == 1)
302  {
303  // Already done multiplication by Mx
304  // Need to load the rhs vector
305  for (int i = 0; i < n; i++)
306  {
307  rhs[i] = workd[ipntr[2] - 1 + i];
308  }
309  // Now solve the system
310  // AsigmaM.lubksub(rhs);
311  DoubleVector temp(rhs);
312  if (First)
313  {
314  Linear_solver_pt->solve(&AsigmaM, temp, rhs);
315  First = false;
316  }
317  else
318  {
319  Linear_solver_pt->resolve(temp, rhs);
320  }
321  // Put the solution into the workspace
322  for (int i = 0; i < n; i++)
323  {
324  workd[ipntr[1] - 1 + i] = rhs[i];
325  }
326  continue;
327  }
328  else if (ido == 2)
329  {
330  // Need to multiply by mass matrix
331  // Vector<double> x(n);
332  for (int i = 0; i < n; i++)
333  {
334  x[i] = workd[ipntr[0] - 1 + i];
335  }
336  M.multiply(x, rhs);
337 
338  for (int i = 0; i < n; i++)
339  {
340  workd[ipntr[1] - 1 + i] = rhs[i];
341  }
342  continue;
343  }
344 
345  if (info < 0)
346  {
347  oomph_info << "ERROR" << std::endl;
348  oomph_info << "Error with _naupd, info = '" << info << std::endl;
349  if (info == -7)
350  {
351  oomph_info << "Not enough memory " << std::endl;
352  }
353  }
354 
355  // %-------------------------------------------%
356  // | No fatal errors occurred. |
357  // | Post-Process using DNEUPD. |
358  // | |
359  // | Computed eigenvalues may be extracted. |
360  // | |
361  // | Eigenvectors may also be computed now if |
362  // | desired. (indicated by rvec = .true.) |
363  // %-------------------------------------------%
364  //
365  LOOP_FLAG = false;
366  } while (LOOP_FLAG);
367 
368  // Report any problems
369  if (info == 1)
370  {
371  oomph_info << "Maximum number of iterations reached." << std::endl;
372  }
373  else if (info == 3)
374  {
375  oomph_info << "No shifts could be applied during implicit Arnoldi "
376  << "update, try increasing NCV. " << std::endl;
377  }
378 
379  // Disable resolves for the linear solver
381 
382  // Compute Ritz or Schur vectors, if desired
383  int rvec = Compute_eigenvectors;
384  // Specify the form of the basis computed
385  char howmany[2];
386  howmany[0] = 'A';
387  // Find out the number of converged eigenvalues
388  int nconv = iparam[4];
389 
390  // Note that there is an error (feature) in ARPACK that
391  // means in certain cases, if we request eigenvectors,
392  // consequent Schur factorization of the matrix spanned
393  // by the Arnoldi vectors leads to more converged eigenvalues
394  // than reported by DNAPUD. This is a pain because it
395  // causes a segmentation fault and in every case that I've found
396  // the eigenvalues/vectors are not those desired.
397  // At the moment, I'm just going to leave it, but I note
398  // the problem here to remind myself about it.
399 
400  // Array to select which Ritz vectors are computed
401  int select[ncv];
402  // Array that holds the real part of the eigenvalues
403  double* eval_real = new double[nconv + 1];
404  // Array that holds the imaginary part of the eigenvalues
405  double* eval_imag = new double[nconv + 1];
406 
407  // Workspace
408  double* workev = new double[3 * ncv];
409  // Array to hold the eigenvectors
410  double** z = new double*;
411  *z = new double[(nconv + 1) * n];
412 
413  // Error flag
414  int ierr;
415 
416  DNEUPD(rvec,
417  howmany,
418  select,
419  eval_real,
420  eval_imag,
421  z,
422  ldv,
423  sigmar,
424  sigmai,
425  workev,
426  bmat,
427  n,
428  which,
429  nev,
430  tol,
431  resid,
432  ncv,
433  v,
434  ldv,
435  iparam,
436  ipntr,
437  workd,
438  workl,
439  lworkl,
440  ierr);
441  //
442  // %-----------------------------------------------%
443  // | The real part of the eigenvalue is returned |
444  // | in the first column of the two dimensional |
445  // | array D, and the imaginary part is returned |
446  // | in the second column of D. The corresponding |
447  // | eigenvectors are returned in the first NEV |
448  // | columns of the two dimensional array V if |
449  // | requested. Otherwise, an orthogonal basis |
450  // | for the invariant subspace corresponding to |
451  // | the eigenvalues in D is returned in V. |
452  // %-----------------------------------------------%
453 
454  if (ierr != 0)
455  {
456  oomph_info << "Error with _neupd, info = " << ierr << std::endl;
457  }
458  else
459  // Print the output anyway
460  {
461  // Resize the eigenvalue output vector
462  eigenvalue.resize(nconv);
463  for (int j = 0; j < nconv; j++)
464  {
465  // Turn the output from ARPACK into a complex number
466  std::complex<double> eigen(eval_real[j], eval_imag[j]);
467  // Add the eigenvalues to the output vector
468  eigenvalue[j] = eigen;
469  }
470 
472  {
473  // Load the eigenvectors
474  eigenvector.resize(nconv);
475  for (int j = 0; j < nconv; j++)
476  {
477  eigenvector[j].build(this->distribution_pt(), 0.0);
478  for (int i = 0; i < n; i++)
479  {
480  eigenvector[j][i] = z[0][j * n + i];
481  }
482  }
483  }
484  else
485  {
486  eigenvector.resize(0);
487  }
488 
489  // Report the information
490  if (Verbose)
491  {
492  oomph_info << " ARPACK " << std::endl;
493  oomph_info << " ====== " << std::endl;
494  oomph_info << " Size of the matrix is " << n << std::endl;
495  oomph_info << " The number of Ritz values requested is " << nev
496  << std::endl;
497  oomph_info << " The number of Arnoldi vectors generated (NCV) is "
498  << ncv << std::endl;
499  oomph_info << " What portion of the spectrum: " << which << std::endl;
500  oomph_info << " The number of converged Ritz values is " << nconv
501  << std::endl;
502  oomph_info
503  << " The number of Implicit Arnoldi update iterations taken is "
504  << iparam[2] << std::endl;
505  oomph_info << " The number of OP*x is " << iparam[8] << std::endl;
506  oomph_info << " The convergence criterion is " << tol << std::endl;
507  }
508  }
509 
510  // Clean up the allocated memory
511  delete[] * z;
512  *z = 0;
513  delete z;
514  z = 0;
515  delete[] workev;
516  workev = 0;
517  delete[] eval_imag;
518  eval_imag = 0;
519  delete[] eval_real;
520  eval_real = 0;
521 
522  // Clean up the memory
523  delete[] workl;
524  workl = 0;
525  delete[] workd;
526  workd = 0;
527  delete[] resid;
528  resid = 0;
529  delete[] * v;
530  *v = 0;
531  delete v;
532  v = 0;
533  }
Array< int, Dynamic, 1 > v
Definition: Array_initializer_list_vector_cxx11.cpp:1
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
std::vector< double > DoubleVector
loads clump configuration
Definition: ClumpInput.h:26
#define DNEUPD(RVEC, HOWMNY, SELECT, DR, DI, Z, LDZ, SIGMAR, SIGMAI, WORKEV, BMAT, N, WHICH, NEV, TOL, RESID, NCV, V, LDV, IPARAM, IPNTR, WORKD, WORKL, LWORKL, INFO)
Definition: arpack.h:125
#define DNAUPD(IDO, BMAT, N, WHICH, NEV, TOL, RESID, NCV, V, LDV, IPARAM, IPNTR, WORKD, WORKL, LWORKL, INFO)
Matrix< RealScalar, Dynamic, Dynamic > M
Definition: bench_gemm.cpp:50
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
LinearAlgebraDistribution * distribution_pt() const
access to the LinearAlgebraDistribution
Definition: linear_algebra_distribution.h:457
void build_distribution(const LinearAlgebraDistribution *const dist_pt)
Definition: linear_algebra_distribution.h:507
double Sigma_real
Definition: eigen_solver.h:65
virtual void solve(Problem *const &problem_pt, DoubleVector &result)=0
virtual void enable_resolve()
Definition: linear_solver.h:135
virtual void resolve(const DoubleVector &rhs, DoubleVector &result)
Definition: linear_solver.h:225
void disable_doc_time()
Disable documentation of solve times.
Definition: linear_solver.h:116
virtual void disable_resolve()
Definition: linear_solver.h:144
int info
Definition: level2_cplx_impl.h:39
OomphInfo oomph_info
Definition: oomph_definitions.cc:319
list x
Definition: plotDoE.py:28
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

References oomph::DistributableLinearAlgebraObject::build_distribution(), oomph::DoubleVector::clear(), oomph::Problem::communicator_pt(), Compute_eigenvectors, oomph::LinearSolver::disable_doc_time(), oomph::LinearSolver::disable_resolve(), oomph::DistributableLinearAlgebraObject::distribution_pt(), DNAUPD, DNEUPD, oomph::LinearSolver::enable_resolve(), oomph::Problem::get_eigenproblem_matrices(), i, info, j, Linear_solver_pt, n, NArnoldi, oomph::Problem::ndof(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, oomph::oomph_info, oomph::LinearSolver::resolve(), oomph::EigenSolver::Sigma_real, Small, oomph::LinearSolver::solve(), Spectrum, v, and plotDoE::x.

◆ track_eigenvalue_imaginary_part()

void oomph::ARPACK::track_eigenvalue_imaginary_part ( )
inline

Set the imaginary part fo the quantity of interest.

196  {
197  Spectrum = -1;
198  }

References Spectrum.

◆ track_eigenvalue_magnitude()

void oomph::ARPACK::track_eigenvalue_magnitude ( )
inline

Set the magnitude to be the quantity of interest.

202  {
203  Spectrum = 0;
204  }

References Spectrum.

◆ track_eigenvalue_real_part()

void oomph::ARPACK::track_eigenvalue_real_part ( )
inline

Set the real part to be the quantity of interest (default)

190  {
191  Spectrum = 1;
192  }

References Spectrum.

Member Data Documentation

◆ Compute_eigenvectors

bool oomph::ARPACK::Compute_eigenvectors
private

Boolean to indicate whether or not to compute the eigenvectors.

Referenced by disable_compute_eigenvectors(), enable_compute_eigenvectors(), and solve_eigenproblem().

◆ Default_linear_solver_pt

LinearSolver* oomph::ARPACK::Default_linear_solver_pt
private

Pointer to a default linear solver.

Referenced by ARPACK(), and ~ARPACK().

◆ Linear_solver_pt

LinearSolver* oomph::ARPACK::Linear_solver_pt
private

Pointer to a linear solver.

Referenced by ARPACK(), linear_solver_pt(), and solve_eigenproblem().

◆ NArnoldi

int oomph::ARPACK::NArnoldi
private

Number of Arnoldi vectors to compute.

Referenced by narnoldi(), and solve_eigenproblem().

◆ Small

bool oomph::ARPACK::Small
private

Boolean to set which part of the spectrum left (default) or right of the shifted value.

Referenced by get_eigenvalues_left_of_shift(), get_eigenvalues_right_of_shift(), and solve_eigenproblem().

◆ Spectrum

int oomph::ARPACK::Spectrum
private

Integer to set whether the real, imaginary or magnitude is required to be small or large.

Referenced by solve_eigenproblem(), track_eigenvalue_imaginary_part(), track_eigenvalue_magnitude(), and track_eigenvalue_real_part().


The documentation for this class was generated from the following files: