62 m_session->MatchSolverInfo(
"SolverType",
"VelocityCorrectionScheme",
77 if (
m_session->DefinesSolverInfo(
"ModeType") &&
78 (boost::iequals(
m_session->GetSolverInfo(
"ModeType"),
"SingleMode") ||
79 boost::iequals(
m_session->GetSolverInfo(
"ModeType"),
"HalfMode")))
83 m_equ[0]->UpdateFields()[i]->SetWaveSpace(
true);
104 if (!
m_session->DefinesSolverInfo(
"HOMOGENEOUS") &&
105 !
m_session->DefinesSolverInfo(
"ModeType"))
108 "Imaginary shift only supported with HOMOGENEOUS "
109 "expansion and ModeType set to SingleMode");
111 else if (!boost::iequals(
m_session->GetSolverInfo(
"ModeType"),
115 "Imaginary shift only supported with HOMOGENEOUS "
116 "expansion and ModeType set to SingleMode");
127 boost::ignore_unused(out);
129 ASSERTL0(
false,
"Specific version of Arnoldi driver not implemented");
137 if (
m_comm->GetRank() == 0)
139 if (
m_session->DefinesSolverInfo(
"ModeType") &&
140 boost::iequals(
m_session->GetSolverInfo(
"ModeType"),
"SingleMode"))
142 out <<
"\tSingle Fourier mode : true " << endl;
144 "Expected a homogeneous expansion to be defined "
149 out <<
"\tSingle Fourier mode : false " << endl;
151 if (
m_session->DefinesSolverInfo(
"BetaZero"))
153 out <<
"\tBeta set to Zero : true (overrides LHom)" << endl;
157 out <<
"\tBeta set to Zero : false " << endl;
162 out <<
"\tEvolution operator : "
163 <<
m_session->GetSolverInfo(
"EvolutionOperator") << endl;
167 out <<
"\tShift (Real,Imag) : " <<
m_realShift <<
","
170 out <<
"\tKrylov-space dimension : " <<
m_kdim << endl;
171 out <<
"\tNumber of vectors : " <<
m_nvec << endl;
172 out <<
"\tMax iterations : " <<
m_nits << endl;
173 out <<
"\tEigenvalue tolerance : " <<
m_evtol << endl;
174 out <<
"======================================================" << endl;
186 m_equ[0]->UpdateFields();
187 int nq = fields[0]->GetNcoeffs();
191 Vmath::Vcopy(nq, &array[k * nq], 1, &fields[k]->UpdateCoeffs()[0], 1);
192 fields[k]->SetPhysState(
false);
210 fields =
m_equ[0]->UpdateFields();
219 int nq = fields[0]->GetNcoeffs();
220 Vmath::Vcopy(nq, &fields[k]->GetCoeffs()[0], 1, &array[k * nq], 1);
221 fields[k]->SetPhysState(
false);
233 "Transient Growth non available for Coupled Solver");
235 fields =
m_equ[0]->UpdateFields();
236 int nq = fields[0]->GetNcoeffs();
241 &
m_equ[1]->UpdateFields()[k]->UpdateCoeffs()[0], 1);
252 std::vector<std::string> variables(
m_nfields);
257 variables[i] =
m_equ[0]->GetVariable(i);
260 m_equ[0]->WriteFld(file,
m_equ[0]->UpdateFields()[0], coeffs, variables);
269 std::vector<std::string> variables(
m_nfields);
270 std::vector<Array<OneD, NekDouble>> fieldcoeffs(
m_nfields);
272 int ncoeffs =
m_equ[0]->UpdateFields()[0]->GetNcoeffs();
274 "coeffs is not of sufficient size");
278 variables[i] =
m_equ[0]->GetVariable(i);
279 fieldcoeffs[i] = coeffs + i * ncoeffs;
282 m_equ[0]->WriteFld(file,
m_equ[0]->UpdateFields()[0], fieldcoeffs,
298 evlout <<
"EV: " << setw(2) << i << setw(12) << abs_ev << setw(12)
299 << ang_ev << setw(12) <<
log(abs_ev) /
m_period << setw(12)
304 evlout << setw(12) << resid;
310 NekDouble invmag = 1.0 / (re_ev * re_ev + im_ev * im_ev);
321 evlout <<
"EV: " << setw(2) << i << setw(14) <<
sign * re_ev << setw(14)
332 evlout << setw(12) << resid;
342 std::vector<std::vector<LibUtilities::EquationSharedPtr>> &selectedDomains,
343 std::set<int> &unselectedVariables)
345 selectedDomains.clear();
346 string domain(
"SelectEVCalcDomain0");
347 string condition(
"C0");
348 for (
size_t i = 0; i < 10; ++i)
350 domain[domain.size() - 1] =
'0' + i;
355 for (
size_t j = 0; j < 10; ++j)
357 condition[condition.size() - 1] =
'0' + j;
358 if (!
m_session->DefinesFunction(domain, condition))
364 selectedDomains.push_back(
365 std::vector<LibUtilities::EquationSharedPtr>());
367 selectedDomains[selectedDomains.size() - 1].push_back(
368 m_session->GetFunction(domain, condition));
371 unselectedVariables.clear();
372 string funName(
"SelectEVCalcVariables");
373 std::vector<std::string> variables =
m_session->GetVariables();
376 if (!
m_session->DefinesFunction(funName, variables[v]))
378 unselectedVariables.insert(v);
381 if (unselectedVariables.size() ==
m_nfields)
383 unselectedVariables.clear();
392 std::vector<std::vector<LibUtilities::EquationSharedPtr>> selectedDomains;
393 std::set<int> unselectedVariables;
395 if (selectedDomains.size() == 0 && unselectedVariables.size() == 0)
402 int ncoef = field->GetNcoeffs();
403 int nphys = field->GetNpoints();
406 for (
size_t i = 0; i < field->GetExpSize(); ++i)
410 int nv = geom->GetNumVerts();
413 for (
size_t j = 0; j < nv; ++j)
416 vertex->GetCoords(gct[0], gct[1], gct[2]);
422 for (
size_t m = 0; m < selectedDomains.size(); ++m)
425 for (
size_t n = 0; n < selectedDomains[m].size(); ++n)
427 if (selectedDomains[m][n]->Evaluate(gc[0], gc[1], gc[2]) <= 0.)
442 if (unmask == 0 || unselectedVariables.count(j))
445 exp->GetNcoeffs(), 0.,
446 &
m_maskCoeffs[field->GetCoeff_Offset(i) + j * ncoef], 1);
448 &
m_maskPhys[field->GetPhys_Offset(i) + j * nphys],
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
#define sign(a, b)
return the sign(b)*a
void CopyFwdToAdj()
Copy the forward field to the adjoint system in transient growth calculations.
virtual void v_InitObject(std::ostream &out=std::cout) override
Virtual function for initialisation implementation.
void WriteFld(std::string file, std::vector< Array< OneD, NekDouble > > coeffs)
Write coefficients to file.
NekDouble m_period
Tolerance of iterations.
int m_infosteps
underlying operator is time stepping
virtual void v_Execute(std::ostream &out=std::cout) override
Virtual function for solve implementation.
Array< OneD, NekDouble > m_maskCoeffs
DriverArnoldi(const LibUtilities::SessionReaderSharedPtr pSession, const SpatialDomains::MeshGraphSharedPtr pGraph)
Constructor.
void CopyFieldToArnoldiArray(Array< OneD, NekDouble > &array)
Copy fields to Arnoldi storage.
int m_nvec
Dimension of Krylov subspace.
bool m_timeSteppingAlgorithm
Period of time stepping algorithm.
int m_nits
Number of vectors to test.
void CopyArnoldiArrayToField(Array< OneD, NekDouble > &array)
Copy Arnoldi storage to fields.
void GetMaskInfo(std::vector< std::vector< LibUtilities::EquationSharedPtr > > &selectedDomains, std::set< int > &unselectedVariables)
Array< OneD, NekDouble > m_maskPhys
NekDouble m_evtol
Maxmum number of iterations.
int m_nfields
interval to dump information if required.
SOLVER_UTILS_EXPORT void ArnoldiSummary(std::ostream &out)
void WriteEvs(std::ostream &evlout, const int k, const NekDouble real, const NekDouble imag, NekDouble resid=NekConstants::kNekUnsetDouble, bool DumpInverse=true)
void MaskInit()
Init mask.
Base class for the development of solvers.
LibUtilities::SessionReaderSharedPtr m_session
Session reader object.
virtual SOLVER_UTILS_EXPORT void v_InitObject(std::ostream &out=std::cout)
Virtual function for initialisation implementation.
LibUtilities::CommSharedPtr m_comm
Communication object.
enum EvolutionOperatorType m_EvolutionOperator
Evolution Operator.
Array< OneD, EquationSystemSharedPtr > m_equ
Equation system to solve.
int m_nequ
number of equations
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< Expansion > ExpansionSharedPtr
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
static const NekDouble kNekUnsetDouble
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
std::shared_ptr< PointGeom > PointGeomSharedPtr
std::shared_ptr< Geometry > GeometrySharedPtr
The above copyright notice and this permission notice shall be included.
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
scalarT< T > log(scalarT< T > in)