Virtual function for solve implementation.
{
Array<OneD, NekDouble> tmpworkd;
bool random;
int nq =
m_equ[0]->UpdateFields()[0]->GetNcoeffs();
int ido ;
int info;
int iparam[11];
int ipntr[14];
Array<OneD, int> ritzSelect;
Array<OneD, NekDouble> dr;
Array<OneD, NekDouble> di;
Array<OneD, NekDouble> workev;
Array<OneD, NekDouble> z;
Array<OneD, NekDouble> resid(n);
Array<OneD, NekDouble> v(n*
m_kdim);
Array<OneD, NekDouble> workl(lworkl);
Array<OneD, NekDouble> workd(3*n, 0.0);
if(
m_session->DefinesFunction(
"InitialConditions"))
{
out << "\tInital vector : input file " << endl;
info = 1;
}
else
{
out << "\tInital vector : random " << endl;
info = 0;
}
iparam[0] = 1;
iparam[1] = 0;
iparam[3] = 1;
iparam[4] = 0;
iparam[5] = 0;
{
iparam[6] = 3;
}
else
{
iparam[6] = 1;
}
iparam[7] = 0;
iparam[8] = 0;
iparam[9] = 0;
iparam[10]= 0;
int cycle = 0;
std::string name =
m_session->GetFilename().substr(0,
m_session->GetFilename().find_last_of(
'.'))+
".evl";
ofstream pFile(name.c_str());
ido = 0;
while(ido != 99)
{
&v[0], n, iparam, ipntr, &workd[0],
&workl[0], lworkl, info);
out << "\rIteration " << cycle << ", output: " << info << ", ido=" << ido << " " << std::flush;
{
pFile << "Krylov spectrum at iteration: " << cycle << endl;
{
pFile << "EV Magnitude Angle Growth Frequency Residual" << endl;
}
else
{
pFile << "EV Real Imaginary inverse real inverse imag Residual" << endl;
}
out << endl;
for(
int k=0; k<=
m_kdim-1; ++k)
{
{
WriteEvs(out,k, workl[ipntr[5]-1+k],workl[ipntr[6]-1+k]);
}
WriteEvs(pFile,k, workl[ipntr[5]-1+k],workl[ipntr[6]-1+k]);
}
}
cycle++;
if (ido == 99) break;
ASSERTL0(ido == 1,
"Unexpected reverse communication request.");
m_equ[0]->TransCoeffToPhys();
{
out << endl;
}
{
m_equ[1]->TransCoeffToPhys();
}
}
out<< endl << "Converged in " << iparam[8] << " iterations" << endl;
ASSERTL0(info >= 0,
" Error with Dnaupd");
ritzSelect = Array<OneD, int> (
m_kdim,0);
dr = Array<OneD, NekDouble> (
m_nvec+1,0.0);
di = Array<OneD, NekDouble> (
m_nvec+1,0.0);
workev = Array<OneD, NekDouble> (3*
m_kdim);
z = Array<OneD, NekDouble> (n*(
m_nvec+1));
Arpack::Dneupd(1,
"A", ritzSelect.get(), dr.get(), di.get(), z.get(), n, sigmar, sigmai, workev.get(),
"I", n, problem,
m_nvec,
m_evtol, resid.get(),
m_kdim, v.get(), n, iparam, ipntr, workd.get(), workl.get(),lworkl,info);
ASSERTL0(info == 0,
" Error with Dneupd");
int nconv=iparam[4];
Array<OneD, MultiRegions::ExpListSharedPtr> fields =
m_equ[0]->UpdateFields();
out << "Converged Eigenvalues: " << nconv << endl;
pFile << "Converged Eigenvalues:"<< nconv << endl;
{
pFile << "EV Magnitude Angle Growth Frequency" << endl;
}
else
{
pFile << "EV Real Imaginary inverse real inverse imag" << endl;
}
for(int i= 0; i< nconv; ++i)
{
std::string file =
m_session->GetFilename().substr(0,
m_session->GetFilename().find_last_of(
'.')) +
"_eig_" + boost::lexical_cast<std::string>(i);
}
pFile.close();
for(
int j = 0; j <
m_equ[0]->GetNvariables(); ++j)
{
{
out <<
"L 2 error (variable " <<
m_equ[0]->GetVariable(j) <<
") : " << vL2Error << endl;
out <<
"L inf error (variable " <<
m_equ[0]->GetVariable(j) <<
") : " << vLinfError << endl;
}
}
}