From 0658ec38a6126e5ddb64eddeb33b33b0454ec53c Mon Sep 17 00:00:00 2001 From: Van Dung Nguyen <vdg.nguyen@gmail.com> Date: Thu, 9 Nov 2017 11:30:20 +0100 Subject: [PATCH] eigen solver update --- NonLinearSolver/nlsolver/nonLinearMechSolver.cpp | 14 ++++++-------- NonLinearSolver/nlsolver/nonLinearMechSolver.h | 3 ++- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/NonLinearSolver/nlsolver/nonLinearMechSolver.cpp b/NonLinearSolver/nlsolver/nonLinearMechSolver.cpp index 712757952..09dc39eb9 100644 --- a/NonLinearSolver/nlsolver/nonLinearMechSolver.cpp +++ b/NonLinearSolver/nlsolver/nonLinearMechSolver.cpp @@ -131,7 +131,7 @@ _damageVolumeCenter(0.,0.,0.),_homogenizedCrackSurface(0.), _microBCOld(NULL),_microFailureBC(NULL), _failureBCIsSwitched(false), _pathFollowingSwitchCriterion(0.), _failureBasedOnPreviousState(true), - _macroTime(0.),_macroTimeStep(1.),_macroStep(0.) + _macroTime(0.),_macroTimeStep(1.),_macroStep(0.),_hermitian(true) { // check parallelization of dofManager #if defined(HAVE_MPI) @@ -10126,11 +10126,7 @@ void nonLinearMechSolver::createEigenvalueSolver(){ linearSystemPETSc<double>* lpetB = dynamic_cast<linearSystemPETSc<double>*>(lsysB); if (lpetA != NULL ){ - if (lpetB) - _eigenSolver = new eigenSolver(lpetA,lpetB); - else - _eigenSolver = new eigenSolver(lpetA); - + _eigenSolver = new eigenSolver(lpetA,lpetB,_hermitian); // for eigen mode view if (_eigfield.size() > 0){ for (int i= 0; i< _eigfield.size(); i++){ @@ -10336,7 +10332,8 @@ double nonLinearMechSolver::critialPointTestFunction(double time, double* &mode) fprintf(_outputFile,"Modify number of eigenvalues computed: %d \n",nsize); } // solver eigen solver - _eigenSolver->solve(_numeigenvalue,"smallestReal"); + //_eigenSolver->solve(_numeigenvalue,"smallestReal"); + _eigenSolver->solve(_numeigenvalue,"smallestReal",_eigenSolverMethod,_eigenSolverConvergenCriterion,_eigenSolverNumIteration); std::complex<double> ls = _eigenSolver->getEigenValue(0); std::complex<double> lm = _eigenSolver->getEigenValue(_numeigenvalue-1); @@ -11349,7 +11346,7 @@ void nonLinearMechSolver::eigenValueSolver(const int num , const bool fl){ #endif }; -void nonLinearMechSolver::setEigenSolverParamerters(const int type, const int numiter, const std::string method, const double tol, const bool mktofile){ +void nonLinearMechSolver::setEigenSolverParamerters(const int type, const int numiter, const std::string method, const double tol, const bool mktofile, const bool hem){ if (_eigflag){ if (type == 0){ _eigenSolverType = STATIC; @@ -11366,6 +11363,7 @@ void nonLinearMechSolver::setEigenSolverParamerters(const int type, const int nu _eigenSolverMethod = method; _eigenSolverConvergenCriterion = tol; _MKToFile = mktofile; + _hermitian = hem; } }; diff --git a/NonLinearSolver/nlsolver/nonLinearMechSolver.h b/NonLinearSolver/nlsolver/nonLinearMechSolver.h index 5146a7967..c3b78b72b 100644 --- a/NonLinearSolver/nlsolver/nonLinearMechSolver.h +++ b/NonLinearSolver/nlsolver/nonLinearMechSolver.h @@ -748,6 +748,7 @@ class nonLinearMechSolver int _eigenSolverNumIteration; std::string _eigenSolverMethod; // double _eigenSolverConvergenCriterion; + bool _hermitian; // if matrix is symmetrical or not std::vector<std::vector<nlsField::dataBuildView> > _eigview; std::vector<unknownField*> _eigfield; std::vector<int> _modeview; @@ -932,7 +933,7 @@ class nonLinearMechSolver void addMicroBCForFailure(const nonLinearMicroBC* bc); // for instability void eigenValueSolver(const int num = 10, const bool fl = true); // number of eigenvalue - void setEigenSolverParamerters(const int type, const int numiter, const std::string method, const double tol, const bool mktofile = false); + void setEigenSolverParamerters(const int type, const int numiter, const std::string method, const double tol, const bool mktofile = false, const bool hem = true); void setModeView(const int view); // for view buckling mode void setPerturbationFactor(const double val = 1e-2); void setInstabilityCriterion(const double val = 1e-6); -- GitLab