Skip to content
Snippets Groups Projects
Commit c2a7e0d7 authored by Axel Modave's avatar Axel Modave
Browse files

pp

parent 6a2bcd55
No related branches found
No related tags found
No related merge requests found
...@@ -18,8 +18,7 @@ void eigenSolver::_try(int ierr) const ...@@ -18,8 +18,7 @@ void eigenSolver::_try(int ierr) const
CHKERRABORT(PETSC_COMM_WORLD, ierr); CHKERRABORT(PETSC_COMM_WORLD, ierr);
} }
eigenSolver::eigenSolver(dofManager<double> *manager, std::string A, eigenSolver::eigenSolver(dofManager<double> *manager, std::string A, std::string B, bool hermitian)
std::string B, bool hermitian)
: _A(0), _B(0), _hermitian(hermitian) : _A(0), _B(0), _hermitian(hermitian)
{ {
if (A.size()) { if (A.size()) {
...@@ -32,7 +31,8 @@ eigenSolver::eigenSolver(dofManager<double> *manager, std::string A, ...@@ -32,7 +31,8 @@ eigenSolver::eigenSolver(dofManager<double> *manager, std::string A,
} }
} }
eigenSolver::eigenSolver(linearSystemPETSc<double> *A,linearSystemPETSc<double> *B, bool hermitian) : _A(A), _B(B), _hermitian(hermitian){} eigenSolver::eigenSolver(linearSystemPETSc<double> *A, linearSystemPETSc<double> *B,
bool hermitian) : _A(A), _B(B), _hermitian(hermitian) {}
bool eigenSolver::solve(int numEigenValues, std::string which, std::string method, double tolVal, int iterMax) bool eigenSolver::solve(int numEigenValues, std::string which, std::string method, double tolVal, int iterMax)
{ {
...@@ -189,7 +189,6 @@ bool eigenSolver::solve(int numEigenValues, std::string which, std::string metho ...@@ -189,7 +189,6 @@ bool eigenSolver::solve(int numEigenValues, std::string which, std::string metho
} }
void eigenSolver::normalize_mode(double scale) { void eigenSolver::normalize_mode(double scale) {
Msg::Info("Normalize all eigenvectors"); Msg::Info("Normalize all eigenvectors");
for (unsigned int i=0; i<_eigenVectors.size(); i++) { for (unsigned int i=0; i<_eigenVectors.size(); i++) {
...@@ -199,19 +198,15 @@ void eigenSolver::normalize_mode(double scale){ ...@@ -199,19 +198,15 @@ void eigenSolver::normalize_mode(double scale){
double normval = std::abs(val); double normval = std::abs(val);
if (normval>norm) if (normval>norm)
norm = normval; norm = normval;
}; }
if (norm==0) { if (norm==0) {
Msg::Error("zero eigenvector"); Msg::Error("zero eigenvector");
return; return;
}; }
for (unsigned int j=0; j<_eigenVectors[i].size(); j++) { for (unsigned int j=0; j<_eigenVectors[i].size(); j++) {
_eigenVectors[i][j] *= (scale/norm); _eigenVectors[i][j] *= (scale/norm);
}; }
}
}; }
};
#endif #endif
...@@ -30,20 +30,26 @@ class eigenSolver{ ...@@ -30,20 +30,26 @@ class eigenSolver{
bool hermitian=true); bool hermitian=true);
bool solve(int numEigenValues=0, std::string which="", std::string method="krylovschur", bool solve(int numEigenValues=0, std::string which="", std::string method="krylovschur",
double tolVal=1.e-7, int iterMax=20); double tolVal=1.e-7, int iterMax=20);
int getNumEigenValues() {return _eigenValues.size();} int getNumEigenValues() {return _eigenValues.size();}
std::complex<double> getEigenValue(int num){ return _eigenValues[num]; } int getNumberEigenvectors() {return _eigenVectors.size();}
std::vector<std::complex<double> > &getEigenVector(int num){ return _eigenVectors[num]; }
void clear() std::complex<double> getEigenValue(int num) {
{ return _eigenValues[num];
_eigenValues.clear(); }
_eigenVectors.clear(); std::complex<double> getEigenVectorComp(int num, int com) {
};
std::complex<double> getEigenVectorComp(int num, int com)
{
return _eigenVectors[num][com]; return _eigenVectors[num][com];
}; };
int getNumberEigenvectors() {return _eigenVectors.size();}; std::vector<std::complex<double> > &getEigenVector(int num) {
return _eigenVectors[num];
}
void normalize_mode(double scale=1.); void normalize_mode(double scale=1.);
void clear() {
_eigenValues.clear();
_eigenVectors.clear();
};
}; };
#else #else
...@@ -58,18 +64,17 @@ class eigenSolver{ ...@@ -58,18 +64,17 @@ class eigenSolver{
std::string B="", bool hermitian=false) {} std::string B="", bool hermitian=false) {}
eigenSolver(linearSystemPETSc<double> *A, linearSystemPETSc<double>* B=NULL, eigenSolver(linearSystemPETSc<double> *A, linearSystemPETSc<double>* B=NULL,
bool hermitian=false) {} bool hermitian=false) {}
bool solve(int numEigenValues=0, std::string which="") bool solve(int=0, std::string="", std::string="", double=0, int=0) {
{
Msg::Error("Eigen solver requires SLEPc"); Msg::Error("Eigen solver requires SLEPc");
return false; return false;
} }
int getNumEigenValues() {return 0;} int getNumEigenValues() {return 0;}
int getNumberEigenvectors() {return 0;}
std::complex<double> getEigenValue(int num) {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;} std::vector<std::complex<double> > &getEigenVector(int num) {return _dummy;}
void normalize_mode(double scale=1.) {}
void clear() {} void clear() {}
std::complex<double> getEigenVectorComp(int num, int com) { return 0.; }
int getNumberEigenvectors() {return 0;};
void normalize_mode(double scale=1.) {};
}; };
#endif #endif
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment