File: eigenSolver.h

package info (click to toggle)
gmsh 4.7.1%2Bds1-5
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 95,484 kB
  • sloc: cpp: 566,747; ansic: 150,384; yacc: 7,198; python: 6,130; java: 3,486; lisp: 622; lex: 621; makefile: 613; perl: 571; sh: 439; xml: 415; javascript: 113; pascal: 35; modula3: 32
file content (91 lines) | stat: -rw-r--r-- 2,549 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle
//
// See the LICENSE.txt file for license information. Please report all
// issues on https://gitlab.onelab.info/gmsh/gmsh/issues.

#ifndef EIGEN_SOLVER_H
#define EIGEN_SOLVER_H

#include <string>
#include <complex>
#include "GmshConfig.h"
#include "GmshMessage.h"
#include "dofManager.h"

#if defined(HAVE_SLEPC)

#include "linearSystemPETSc.h"

class eigenSolver {
private:
  linearSystemPETSc<double> *_sysA, *_sysB;
  bool _hermitian;
  std::vector<std::complex<double> > _eigenValues;
  std::vector<std::vector<std::complex<double> > > _eigenVectors;
  void _check(int ierr) const;

public:
  eigenSolver(dofManager<double> *manager, std::string A, std::string B = "",
              bool hermitian = true);
  eigenSolver(linearSystemPETSc<double> *A, linearSystemPETSc<double> *B = NULL,
              bool hermitian = true);
  bool solve(int numEigenValues = 0, std::string which = "",
             std::string method = "krylovschur", double tolVal = 1.e-7,
             int iterMax = 20);

  int getNumEigenValues() { return _eigenValues.size(); }
  int getNumberEigenvectors() { return _eigenVectors.size(); }

  std::complex<double> getEigenValue(int num) { return _eigenValues[num]; }
  std::complex<double> getEigenVectorComp(int num, int com)
  {
    return _eigenVectors[num][com];
  };
  std::vector<std::complex<double> > &getEigenVector(int num)
  {
    return _eigenVectors[num];
  }

  void normalize_mode(std::vector<int> modeView, double scale = 1.);

  void clear()
  {
    _eigenValues.clear();
    _eigenVectors.clear();
  };
};

#else

#include "linearSystemPETSc.h"

class eigenSolver {
private:
  std::vector<std::complex<double> > _dummy;

public:
  eigenSolver(dofManager<double> *manager, std::string A, std::string B = "",
              bool hermitian = false)
  {
  }
  eigenSolver(linearSystemPETSc<double> *A, linearSystemPETSc<double> *B = NULL,
              bool hermitian = false)
  {
  }
  bool solve(int = 0, std::string = "", std::string = "", double = 0, int = 0)
  {
    Msg::Error("Eigen solver requires SLEPc");
    return false;
  }
  int getNumEigenValues() { return 0; }
  int getNumberEigenvectors() { return 0; }
  std::complex<double> getEigenValue(int num) { return 0.; }
  std::complex<double> getEigenVectorComp(int num, int com) { return 0.; }
  std::vector<std::complex<double> > &getEigenVector(int num) { return _dummy; }
  void normalize_mode(std::vector<int> modeView, double scale = 1.) {}
  void clear() {}
};

#endif

#endif