40#include <boost/format.hpp>
129 int convergenceCurr = 0;
131 int convergence = convergencePrev;
140 m_comm->GetSpaceComm()->GetRank() == 0)
142 std::cout <<
"Iteration " << k + 1 << std::endl << std::flush;
195 CPUtime += timer.
Elapsed().count();
214 for (
size_t i = 0; i <
m_nVar; ++i)
232 for (
size_t n = 0; n < niter; n++)
242 return timer.
Elapsed().count() / niter;
254 for (
size_t n = 0; n < niter; n++)
261 return timer.
Elapsed().count() / niter;
273 for (
int i = 0; i < niter; i++)
279 return timer.
Elapsed().count() / niter;
291 for (
int i = 0; i < niter; i++)
297 return timer.
Elapsed().count() / niter;
309 for (
int i = 0; i < niter; i++)
316 return timer.
Elapsed().count() / niter;
328 for (
int i = 0; i < niter; i++)
335 return timer.
Elapsed().count() / niter;
355 size_t nComm = (iter * (2 *
m_numChunks - iter - 1)) / 2;
357 NekDouble ratioPredictor = predictorTime / fineSolveTime;
358 NekDouble ratioSolve = coarseSolveTime / fineSolveTime;
359 NekDouble ratioFAS = (restTime + interTime) / fineSolveTime;
360 NekDouble ratioComm = commTime / fineSolveTime;
361 NekDouble ratioOverhead = overheadTime / fineSolveTime;
364 return Kiter / (ratioPredictor + ratio * (1.0 + ratioSolve + ratioFAS) +
365 (ratioComm * nComm + ratioOverhead) /
m_numChunks);
380 "Total number of fine step should be divisible by number of chunks.");
384 "Total number of coarse step should be divisible by number of chunks.");
387 "Please use same timestep for both coarse and fine solver");
390 "Please use same timestep for both coarse and fine solver");
396 "number of IO_CheckSteps should divide number of fine steps "
403 "number of IO_InfoSteps should divide number of fine steps "
415 std::dynamic_pointer_cast<LibUtilities::TimeIntegrationSchemeSDC>(
418 std::dynamic_pointer_cast<LibUtilities::TimeIntegrationSchemeSDC>(
423 "Should only be run with a SDC method");
426 "Should only be run with a SDC method");
461 for (
size_t i = 0; i <
m_nVar; ++i)
544 std::shared_ptr<LibUtilities::TimeIntegrationSchemeSDC> SDCsolver,
547 int nQuad = SDCsolver->GetQuadPtsNumber();
548 int nVar = SDCsolver->GetNvars();
550 for (
int n = 0; n < nQuad; ++n)
554 for (
int i = 0; i < nVar; ++i)
557 SDCsolver->GetSolutionVector()[index][i], 1,
558 SDCsolver->UpdateSolutionVector()[n][i], 1);
560 SDCsolver->GetResidualVector()[index][i], 1,
561 SDCsolver->UpdateResidualVector()[n][i], 1);
698 for (
size_t i = 0; i <
m_nVar; ++i)
741 for (
size_t i = 0; i <
m_nVar; ++i)
822 for (
size_t i = 0; i <
m_nVar; ++i)
844 for (
size_t i = 0; i <
m_nVar; ++i)
852 for (
size_t i = 0; i <
m_nVar; ++i)
891 for (
size_t i = 0; i <
m_nVar; ++i)
899 for (
size_t i = 0; i <
m_nVar; ++i)
917 for (
size_t i = 0; i <
m_nVar; ++i)
977 for (
size_t i = 0; i <
m_nVar; ++i)
995 for (
size_t i = 0; i <
m_nVar; ++i)
1015 static std::string newdir =
m_session->GetSessionName() +
".pit";
1017 if ((chkPts + 1) % IOChkStep == 0)
1019 size_t index = (chkPts + 1) / IOChkStep;
1020 std::string filename = newdir +
"/" +
m_session->GetSessionName();
1022 if (!fs::is_directory(newdir))
1024 fs::create_directory(newdir);
1029 boost::lexical_cast<std::string>(index) +
".fld");
#define ASSERTL0(condition, msg)
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Defines a specification for a set of points.
static std::string RegisterEnumValue(std::string pEnum, std::string pString, int pEnumValue)
Registers an enumeration value.
LibUtilities::SessionReaderSharedPtr m_session
Session reader object.
LibUtilities::CommSharedPtr m_comm
Communication object.
Array< OneD, Array< OneD, Array< OneD, NekDouble > > > m_solutionRest
void CoarseIntegratedResidualEval(void)
bool m_updateFineResidual
void AssertParameters(void)
std::shared_ptr< LibUtilities::TimeIntegrationSchemeSDC > m_coarseSDCSolver
virtual NekDouble v_EstimateFineSolverTime(void) override
void CoarseResidualEval(void)
void UpdateFineFirstQuadrature(void)
static std::string className
Name of the class.
virtual NekDouble v_ComputeSpeedUp(const size_t iter, NekDouble fineSolveTime, NekDouble coarseSolveTime, NekDouble restTime, NekDouble interTime, NekDouble commTime, NekDouble predictorOverheadTime, NekDouble overheadTime) override
void ComputeFASCorrection(void)
void CorrectInitialFineResidual(void)
void SaveCoarseSolution(void)
void UpdateCoarseFirstQuadrature(void)
virtual NekDouble v_EstimateRestrictionTime(void) override
void ComputeFineInitialGuess(void)
Array< OneD, Array< OneD, Array< OneD, NekDouble > > > m_residualRest
static DriverSharedPtr create(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
Creates an instance of this class.
void CorrectInitialFineSolution(void)
void InitialiseSDCScheme(bool pfasst)
void Correct(const Array< OneD, Array< OneD, NekDouble > > &coarse, Array< OneD, Array< OneD, NekDouble > > &fine, bool forced)
void FineResidualEval(void)
Array< OneD, Array< OneD, Array< OneD, NekDouble > > > m_tmpcoarse_arr
void SetTime(const NekDouble &time)
Array< OneD, NekDouble > m_ImatFtoC
void InterpolateCoarseResidual(void)
void RestrictFineSolution(void)
virtual NekDouble v_EstimatePredictorTime(void) override
void Interpolate(const Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &coarse, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &fine, bool forced)
virtual SOLVER_UTILS_EXPORT void v_Execute(std::ostream &out=std::cout) override
Virtual function for solve implementation.
void WriteOutput(size_t chkPts)
void SaveCoarseResidual(void)
virtual SOLVER_UTILS_EXPORT void v_InitObject(std::ostream &out=std::cout) override
Virtual function for initialisation implementation.
Array< OneD, NekDouble > m_ImatCtoF
void CorrectFineSolution(void)
void InterpolateCoarseSolution(void)
void CopyQuadratureSolutionAndResidual(std::shared_ptr< LibUtilities::TimeIntegrationSchemeSDC > SDCsolver, const int index)
void CorrectFineResidual(void)
void RunCoarseSweep(void)
virtual NekDouble v_EstimateCommunicationTime(void) override
virtual NekDouble v_EstimateCoarseSolverTime(void) override
void RestrictFineResidual(void)
virtual NekDouble v_EstimateInterpolationTime(void) override
virtual NekDouble v_EstimateOverheadTime(void) override
void ComputeCoarseInitialGuess(void)
void EvaluateSDCResidualNorm(void)
Array< OneD, Array< OneD, Array< OneD, NekDouble > > > m_tmpfine_arr
SOLVER_UTILS_EXPORT DriverPFASST(const LibUtilities::SessionReaderSharedPtr pSession, const SpatialDomains::MeshGraphSharedPtr pGraph)
Constructor.
void Restrict(const Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &fine, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &coarse)
static std::string driverLookupId
void FineIntegratedResidualEval(void)
bool IsNotInitialCondition(const size_t n)
void ApplyWindowing(void)
void SetTimeInterpolator(void)
std::shared_ptr< LibUtilities::TimeIntegrationSchemeSDC > m_fineSDCSolver
Base class for the development of parallel-in-time solvers.
size_t m_numChunks
Number of time chunks.
NekDouble m_totalTime
Total time integration interval.
void EvaluateExactSolution(const NekDouble &time)
NekDouble vL2ErrorMax(void)
size_t m_coarseSteps
Number of steps for the coarse solver.
Array< OneD, NekDouble > m_vL2Errors
void SendSolutionToNextProc(Array< OneD, Array< OneD, NekDouble > > &array, int &convergence)
NekDouble m_chunkTime
Time for chunks.
size_t m_iterMaxPIT
Maximum number of parallel-in-time iteration.
size_t m_fineSteps
Number of steps for the fine solver.
NekDouble m_coarseTimeStep
Timestep for coarse solver.
void RecvInitialConditionFromPreviousProc(Array< OneD, Array< OneD, NekDouble > > &array, int &convergence)
void InitialiseEqSystem(bool turnoff_output)
void CopyFromFinePhysField(Array< OneD, Array< OneD, NekDouble > > &out)
Array< OneD, Array< OneD, NekDouble > > m_tmpfine
void Interpolator(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
std::shared_ptr< SolverUtils::UnsteadySystem > m_coarseEqSys
virtual SOLVER_UTILS_EXPORT void v_InitObject(std::ostream &out=std::cout) override
Virtual function for initialisation implementation.
Array< OneD, NekDouble > m_vLinfErrors
void PrintHeaderTitle1(const std::string &title)
void GetParametersFromSession(void)
NekDouble m_tolerPIT
ParallelInTime tolerance.
void PrintCoarseSolverInfo(std::ostream &out=std::cout)
NekDouble m_fineTimeStep
Timestep for fine solver.
void AllocateMemory(void)
void PrintFineSolverInfo(std::ostream &out=std::cout)
size_t m_chunkRank
Rank in time.
size_t m_checkSteps
Number of steps for checkpoint.
Array< OneD, Array< OneD, NekDouble > > m_tmpcoarse
std::shared_ptr< SolverUtils::UnsteadySystem > m_fineEqSys
Array< OneD, Array< OneD, NekDouble > > m_exactsoln
NekDouble EstimateCommunicationTime(Array< OneD, Array< OneD, NekDouble > > &buffer1, Array< OneD, Array< OneD, NekDouble > > &buffer2)
void SolutionConvergenceSummary(const NekDouble &time)
NekDouble m_time
Local time.
void InitialiseInterpolationField(void)
void CopyFromCoarsePhysField(Array< OneD, Array< OneD, NekDouble > > &out)
void UpdateSolution(const Array< OneD, const Array< OneD, NekDouble > > &in)
void CopySolutionVector(const Array< OneD, const Array< OneD, NekDouble > > &in, Array< OneD, Array< OneD, NekDouble > > &out)
size_t m_infoSteps
Number of steps for info I/O.
void PrintErrorNorm(const bool normalized)
PointsManagerT & PointsManager(void)
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
DriverFactory & GetDriverFactory()
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
std::vector< double > w(NPUPPER)
The above copyright notice and this permission notice shall be included.
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 Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
void Zero(int n, T *x, const int incx)
Zero vector.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.