44 std::string DriverArpack::arpackProblemTypeLookupIds[6] = {
45 LibUtilities::SessionReader::RegisterEnumValue(
"ArpackProblemType",
"LargestReal" ,0),
46 LibUtilities::SessionReader::RegisterEnumValue(
"ArpackProblemType",
"SmallestReal" ,1),
47 LibUtilities::SessionReader::RegisterEnumValue(
"ArpackProblemType",
"LargestImag" ,2),
48 LibUtilities::SessionReader::RegisterEnumValue(
"ArpackProblemType",
"SmallestImag" ,3),
49 LibUtilities::SessionReader::RegisterEnumValue(
"ArpackProblemType",
"LargestMag" ,4),
50 LibUtilities::SessionReader::RegisterEnumValue(
"ArpackProblemType",
"SmallestMag" ,5),
52 std::string DriverArpack::arpackProblemTypeDefault = LibUtilities::SessionReader::RegisterDefaultSolverInfo(
"ArpackProblemType",
"LargestMag");
53 std::string DriverArpack::driverLookupId = LibUtilities::SessionReader::RegisterEnumValue(
"Driver",
"Arpack",0);
57 std::string DriverArpack::ArpackProblemTypeTrans[6] =
58 {
"LR",
"SR",
"LI",
"SI",
"LM",
"SM" };
95 m_equ[0]->PrintSummary(out);
98 "ARPACK Arnoldi solver does not support execution in parallel.");
101 out <<
"\tArnoldi solver type : Arpack" << endl;
103 out <<
"\tArpack problem type : ";
107 for(
int i = 0; i <
m_nequ; ++i)
109 m_equ[i]->DoInitialise();
113 m_equ[m_nequ-1] ->TransPhysToCoeff();
123 int nq =
m_equ[0]->UpdateFields()[0]->GetNcoeffs();
146 if(
m_session->DefinesFunction(
"InitialConditions"))
148 out <<
"\tInital vector : input file " << endl;
154 out <<
"\tInital vector : random " << endl;
199 ofstream pFile(name.c_str());
209 &v[0], n, iparam, ipntr, &workd[0],
210 &workl[0], lworkl, info);
214 out <<
"\rIteration " << cycle <<
", output: " << info <<
", ido=" << ido <<
" " << std::flush;
216 if(!((cycle-1)%m_kdim)&&(cycle> m_kdim)&&(ido!=2))
218 pFile <<
"Krylov spectrum at iteration: " << cycle << endl;
222 pFile <<
"EV Magnitude Angle Growth Frequency Residual" << endl;
226 pFile <<
"EV Real Imaginary inverse real inverse imag Residual" << endl;
230 for(
int k = 0; k <
m_kdim; ++k)
233 WriteEvs(pFile,k, workl[ipntr[5]-1+k],workl[ipntr[6]-1+k]);
237 if (ido == 99)
break;
248 m_equ[0]->TransCoeffToPhys();
256 m_equ[1]->TransCoeffToPhys();
276 m_equ[0]->TransCoeffToPhys();
279 for (
int i = 0; i < fields.num_elements(); ++i)
281 fields[i]->IProductWRTBase(fields[i]->GetPhys(),
282 fields[i]->UpdateCoeffs());
290 ASSERTL0(
false,
"Unexpected reverse communication request.");
295 out<< endl <<
"Converged in " << iparam[8] <<
" iterations" << endl;
297 ASSERTL0(info >= 0,
" Error with Dnaupd");
321 z.get(), n, sigmar, sigmai, workev.get(), &B,
323 v.get(), n, iparam, ipntr, workd.get(),
324 workl.get(),lworkl,info);
326 ASSERTL0(info == 0,
" Error with Dneupd");
341 "Need to implement Ritz re-evaluation of" 342 "eigenvalue. Only one half of complex " 343 "value will be correct");
348 out <<
"Converged Eigenvalues: " << nconv << endl;
349 pFile <<
"Converged Eigenvalues: " << nconv << endl;
353 out <<
" Magnitude Angle Growth Frequency" << endl;
354 pFile <<
" Magnitude Angle Growth Frequency" << endl;
355 for(
int i= 0; i< nconv; ++i)
360 std::string file =
m_session->GetSessionName() +
"_eig_" 361 + boost::lexical_cast<std::string>(i)
368 out <<
" Real Imaginary " << endl;
369 pFile <<
" Real Imaginary " << endl;
370 for(
int i= 0; i< nconv; ++i)
377 std::string file =
m_session->GetSessionName() +
"_eig_" 378 + boost::lexical_cast<std::string>(i)
389 for(
int j = 0; j <
m_equ[0]->GetNvariables(); ++j)
393 if (
m_comm->GetRank() == 0)
395 out <<
"L 2 error (variable " <<
m_equ[0]->GetVariable(j) <<
") : " << vL2Error << endl;
396 out <<
"L inf error (variable " <<
m_equ[0]->GetVariable(j) <<
") : " << vLinfError << endl;
Array< OneD, NekDouble > m_imag_evl
static void Dneupd(const int &rvec, const char *howmny, const int *select, double *dr, double *di, double *z, const int &ldz, const double &sigmar, const double &sigmai, double *workev, const char *bmat, const int &n, const char *which, const int &nev, const double &tol, double *resid, const int &ncv, double *v, const int &ldv, int *iparam, int *ipntr, double *workd, double *workl, const int &lworkl, int &info)
Post-processing routine to computed eigenvector of computed eigenvalues in Dnaupd.
virtual ~DriverArpack()
Destructor.
#define ASSERTL0(condition, msg)
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
void CopyFwdToAdj()
Copy the forward field to the adjoint system in transient growth calculations.
NekDouble m_evtol
Maxmum number of iterations.
void CopyArnoldiArrayToField(Array< OneD, NekDouble > &array)
Copy Arnoldi storage to fields.
virtual void v_Execute(std::ostream &out=std::cout)
Virtual function for solve implementation.
SOLVER_UTILS_EXPORT void ArnoldiSummary(std::ostream &out)
void CopyFieldToArnoldiArray(Array< OneD, NekDouble > &array)
Copy fields to Arnoldi storage.
void WriteFld(std::string file, std::vector< Array< OneD, NekDouble > > coeffs)
Write coefficients to file.
virtual void v_InitObject(std::ostream &out=std::cout)
Virtual function for initialisation implementation.
static const NekDouble kNekZeroTol
int m_nvec
Dimension of Krylov subspace.
Array< OneD, NekDouble > m_real_evl
Operator in solve call is negated.
void WriteEvs(std::ostream &evlout, const int k, const NekDouble real, const NekDouble imag, NekDouble resid=NekConstants::kNekUnsetDouble, bool DumpInverse=true)
#define WARNINGL0(condition, msg)
virtual void v_InitObject(std::ostream &out=std::cout)
static void Dnaupd(int &ido, const char *bmat, const int &n, const char *which, const int &nev, const double &tol, double *resid, const int &ncv, double *v, const int &ldv, int *iparam, int *ipntr, double *workd, double *workl, const int &lworkl, int &info)
Top level reverse communication interface to solve real double-precision non-symmetric problems...
enum EvolutionOperatorType m_EvolutionOperator
Evolution Operator.
static const NekDouble kNekUnsetDouble
void Sadd(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Add vector y = alpha + x.
int m_nfields
interval to dump information if required.
bool m_timeSteppingAlgorithm
Period of time stepping algorithm.
static std::string ArpackProblemTypeTrans[]
Array< OneD, EquationSystemSharedPtr > m_equ
Equation system to solve.
int m_infosteps
underlying operator is time stepping
DriverFactory & GetDriverFactory()
LibUtilities::CommSharedPtr m_comm
Communication object.
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Base class for the development of solvers.
std::shared_ptr< SessionReader > SessionReaderSharedPtr
LibUtilities::SessionReaderSharedPtr m_session
Session reader object.
int m_nequ
number of equations
int m_nits
Number of vectors to test.