42#include <boost/algorithm/string.hpp>
43#include <boost/format.hpp>
73 "review a solution from check point files.");
96 for (
size_t i = 0; i <
m_session->GetVariables().size(); ++i)
103 else if (
m_session->GetFunctionType(
"Solution",
112 ASSERTL0(
false,
"solution not defined for variable " +
119 std::map<std::string, int> series;
121 if (
m_session->DefinesParameter(
"N_slices"))
123 m_session->LoadParameter(
"N_slices", tmp, 1);
124 series[
"slices"] = tmp;
126 if (
m_session->DefinesParameter(
"N_start"))
128 m_session->LoadParameter(
"N_start", tmp, 0);
129 series[
"start"] = tmp;
131 if (
m_session->DefinesParameter(
"N_skip"))
133 m_session->LoadParameter(
"N_skip", tmp, 1);
134 series[
"skip"] = tmp;
136 if (
m_session->DefinesParameter(
"BaseFlow_interporder"))
138 m_session->LoadParameter(
"BaseFlow_interporder", tmp, 1);
139 series[
"order"] = tmp;
141 if (
m_session->DefinesParameter(
"Is_periodic"))
143 m_session->LoadParameter(
"Is_periodic", tmp, 1);
144 series[
"isperiodic"] = tmp;
147 std::map<std::string, NekDouble> times;
149 if (
m_session->DefinesParameter(
"time_start"))
151 m_session->LoadParameter(
"time_start", dtmp, 0.);
152 times[
"start"] = dtmp;
154 if (
m_session->DefinesParameter(
"period"))
156 m_session->LoadParameter(
"period", dtmp, 1.);
157 times[
"period"] = dtmp;
194 for (
size_t i = 0; i < outarray.size(); ++i)
234 for (
int i = 0; i <
m_fields.size(); ++i)
236 std::string var =
m_session->GetVariable(i);
243 bool wavespace =
m_fields[i]->GetWaveSpace();
247 m_fields[i]->SetWaveSpace(wavespace);
259 ASSERTL0(
false,
"solution not defined for variable " + var);
279 for (
size_t i = 0; i <
m_session->GetVariables().size(); ++i)
283 int npoints =
m_fields[i]->GetNpoints();
292 for (
size_t i = 0; i <
m_session->GetVariables().size(); ++i)
306 int npoints =
m_fields[0]->GetNpoints();
307 if (boost::iequals(
m_session->GetVariable(0),
"u"))
310 for (
int i = 0; i < velocity.size(); ++i)
315 else if (boost::iequals(
m_session->GetVariable(0),
"rho") &&
316 boost::iequals(
m_session->GetVariable(1),
"rhou"))
319 for (
int i = 0; i < velocity.size(); ++i)
321 Vmath::Vdiv(npoints, physfield[i], 1, physfield[0], 1, velocity[i],
328 ASSERTL0(
false,
"Could not identify velocity for ProcessVorticity");
333 const std::string functionName,
336 std::set<std::string> &variables, std::map<std::string, int> &series,
337 std::map<std::string, NekDouble> ×)
340 for (
size_t i = 0; i <
m_session->GetVariables().size(); ++i)
342 std::string var =
m_session->GetVariable(i);
343 if (variables.count(var))
346 (
m_session->GetFunctionType(functionName, var) ==
348 functionName +
"(" + var +
") is not defined as a file.");
353 if (series.count(
"start"))
362 if (series.count(
"skip"))
371 if (series.count(
"slices"))
380 if (series.count(
"order"))
389 if (series.count(
"isperiodic"))
398 bool timefromfile =
false;
399 if (times.count(
"period"))
407 if (times.count(
"start"))
416 if (
m_session->GetComm()->GetRank() == 0)
418 std::cout <<
"baseflow info : interpolation order " <<
m_interporder
419 <<
", period " <<
m_period <<
", periodicity ";
422 std::cout <<
"yes\n";
428 std::cout <<
"baseflow info : files from " <<
m_start <<
" to "
431 <<
" time intervals" << std::endl;
434 std::string file =
m_session->GetFunctionFilename(
"Solution", 0);
435 DFT(file, pFields, timefromfile);
448 int pSlice, std::map<std::string, NekDouble> ¶ms)
450 std::vector<LibUtilities::FieldDefinitionsSharedPtr> FieldDef;
451 std::vector<std::vector<NekDouble>> FieldData;
453 int numexp = pFields[0]->GetExpSize();
457 for (
int i = 0; i < numexp; ++i)
459 ElementGIDs[i] = pFields[0]->GetExp(i)->GetGeom()->GetGlobalID();
465 fld->Import(pInfile, FieldDef, FieldData,
468 int nFileVar = FieldDef[0]->m_fields.size();
469 for (
int j = 0; j < nFileVar; ++j)
471 std::string var = FieldDef[0]->m_fields[j];
478 for (
int i = 0; i < FieldDef.size(); ++i)
481 FieldDef[i], FieldData[i], FieldDef[i]->m_fields[j], tmp_coeff);
488 fld->ImportFieldMetaData(pInfile, fieldMetaDataMap);
492 auto iter = fieldMetaDataMap.find(
"Time");
493 if (iter != fieldMetaDataMap.end())
495 params[
"time"] = std::stod(iter->second);
545 &
m_interp[v][npoints], 1, &outarray[0], 1, &outarray[0],
548 for (
int i = 2; i <
m_slices; i += 2)
550 phase = (i >> 1) * BetaT;
553 &outarray[0], 1, &outarray[0], 1);
555 1, &outarray[0], 1, &outarray[0], 1);
589 coeff[i] *= (x - ix + padleft - (
NekDouble)j) /
595 for (
int i = ix - padleft; i < ix + padright + 1; ++i)
598 &
m_interp[v][i * npoints], 1, &outarray[0], 1,
630 for (
int i = 0; i < nexp; ++i)
632 BlkMatrix->SetBlock(i, i, loc_mat);
640 const std::string file,
642 const bool timefromfile)
646 int ncoeffs = pFields[it.second]->GetNcoeffs();
653 size_t found = file.find(
"%d");
654 std::map<std::string, NekDouble> params;
655 if (found != std::string::npos)
657 ASSERTL0(file.find(
"%d", found + 1) == std::string::npos,
658 "There are more than one '%d'.");
660 std::vector<NekDouble> times;
663 int filen = nstart + i *
m_skip;
666 if (
m_session->GetComm()->GetRank() == 0)
668 std::cout <<
"read base flow file " << fmt.str() << std::endl;
670 if (timefromfile && params.count(
"time"))
672 times.push_back(params[
"time"]);
697 "Since N_slices is specified, the filename provided for function "
698 "'BaseFlow' must include exactly one instance of the format "
699 "specifier '%d', to index the time-slices.");
710 int npoints = pFields[it.first]->GetNcoeffs();
711#ifdef NEKTAR_USING_FFTW
723 Vmath::Vcopy(npoints, &(it.second)[j * npoints], 1, &(fft_in[j]),
731 for (
int i = 0; i < npoints; i++)
733 m_FFT->FFTFwdTrans(m_tmpIN = fft_in + i *
m_slices,
741 &(it.second)[s * npoints], 1);
751 int nrows = blkmat->GetRows();
752 int ncols = blkmat->GetColumns();
769 out = (*blkmat) * in;
775 &(it.second)[s * npoints], 1);
778 for (
int r = 0; r < sortedinarray.size(); ++r)
780 sortedinarray[0] = 0;
781 sortedoutarray[0] = 0;
#define ASSERTL0(condition, msg)
Describes the specification for a Basis.
static std::shared_ptr< FieldIO > CreateForFile(const LibUtilities::SessionReaderSharedPtr session, const std::string &filename)
Construct a FieldIO object for a given input filename.
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
Defines a specification for a set of points.
void DefineProjection(FuncPointerT func, ObjectPointerT obj)
void DefineOdeRhs(FuncPointerT func, ObjectPointerT obj)
void DefineImplicitSolve(FuncPointerT func, ObjectPointerT obj)
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
A base class for PDEs which include an advection component.
SOLVER_UTILS_EXPORT void v_InitObject(bool DeclareField=true) override
Initialisation object for EquationSystem.
NekDouble m_time
Current time of simulation.
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
SOLVER_UTILS_EXPORT int GetNpoints()
virtual SOLVER_UTILS_EXPORT MultiRegions::ExpListSharedPtr v_GetPressure(void)
SOLVER_UTILS_EXPORT void Checkpoint_Output(const int n)
Write checkpoint file of m_fields.
LibUtilities::SessionReaderSharedPtr m_session
The session reader.
int m_nchk
Number of checkpoints written so far.
SOLVER_UTILS_EXPORT void SetBoundaryConditions(NekDouble time)
Evaluates the boundary conditions at the given time.
int m_checksteps
Number of steps between checkpoints.
LibUtilities::SessionReaderSharedPtr m_session
std::map< std::string, int > m_variableMap
variables
void ImportFldBase(std::string pInfile, const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields, int slice, std::map< std::string, NekDouble > ¶ms)
Import Base flow.
std::map< int, Array< OneD, NekDouble > > m_interp
interpolation vector
NekDouble m_timeStart
period length
void InterpolateField(const std::string variable, Array< OneD, NekDouble > &outarray, NekDouble time)
void DFT(const std::string file, const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields, const bool timefromfile)
void InitObject(const std::string functionName, LibUtilities::SessionReaderSharedPtr pSession, const Array< OneD, const MultiRegions::ExpListSharedPtr > pFields, std::set< std::string > &variables, std::map< std::string, int > &series, std::map< std::string, NekDouble > &time)
int m_start
number of slices
DNekBlkMatSharedPtr GetFloquetBlockMatrix(int nexp)
static std::string className
Name of class.
void v_GetDensity(const Array< OneD, const Array< OneD, NekDouble > > &physfield, Array< OneD, NekDouble > &density) override
static SolverUtils::EquationSystemSharedPtr create(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
Creates an instance of this class.
FileFieldInterpolatorSharedPtr m_solutionFile
void UpdateField(NekDouble time)
Array< OneD, Array< OneD, NekDouble > > m_coord
std::set< std::string > m_variableFile
void DoImplicitSolve(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, NekDouble time, NekDouble lambda)
bool v_PostIntegrate(int step) override
void v_DoInitialise(bool dumpInitialConditions) override
Sets up initial conditions.
FileSolution(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
void DoOdeProjection(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
Compute the projection.
std::map< std::string, LibUtilities::EquationSharedPtr > m_solutionFunction
void v_GetVelocity(const Array< OneD, const Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, NekDouble > > &velocity) override
void DoOdeRhs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
Compute the RHS.
bool v_HasConstantDensity() override
void v_InitObject(bool DeclareField=true) override
Initialise the object.
bool v_RequireFwdTrans() override
Base class for unsteady solvers.
LibUtilities::TimeIntegrationSchemeOperators m_ode
The time integration scheme operators to use.
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
Class representing a segment element in reference space All interface of this class sits in StdExpans...
NektarFFTFactory & GetNektarFFTFactory()
std::shared_ptr< FieldIO > FieldIOSharedPtr
std::map< std::string, std::string > FieldMetaDataMap
std::shared_ptr< SessionReader > SessionReaderSharedPtr
static FieldMetaDataMap NullFieldMetaDataMap
@ eFourierEvenlySpaced
1D Evenly-spaced points using Fourier Fit
@ eFunctionTypeExpression
@ eFourier
Fourier Expansion .
EquationSystemFactory & GetEquationSystemFactory()
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
std::shared_ptr< DNekBlkMat > DNekBlkMatSharedPtr
std::shared_ptr< DNekMat > DNekMatSharedPtr
void Svtvp(int n, const T alpha, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Svtvp (scalar times vector plus vector): z = alpha*x + y.
void Vdiv(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x/y.
void Zero(int n, T *x, const int incx)
Zero vector.
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)