39#include <boost/format.hpp>
101 for (
size_t i = 0; i <
m_nVar; ++i)
148 CPUtime += timer.
Elapsed().count();
156 int convergenceCurr =
false;
187 CPUtime += timer.
Elapsed().count();
196 convergenceCurr =
true;
240 for (
size_t i = 0; i <
m_nVar; ++i)
265 for (
size_t n = 0; n < niter; n++)
270 return timer.
Elapsed().count() / niter;
289 for (
size_t n = 0; n < niter; n++)
294 return timer.
Elapsed().count() / niter;
305 for (
size_t i = 0; i <
m_nVar; ++i)
326 for (
size_t i = 0; i <
m_fineEqSys->GetNvariables(); ++i)
351 for (
size_t i = 0; i <
m_nVar; ++i)
400 size_t nComm = (iter * (2 *
m_numChunks - iter - 1)) / 2;
402 NekDouble ratioPredictor = predictorTime / fineSolveTime;
403 NekDouble ratioSolve = coarseSolveTime / fineSolveTime;
404 NekDouble ratioInterp = (restTime + interTime) / fineSolveTime;
405 NekDouble ratioComm = commTime / fineSolveTime;
406 NekDouble ratioOverhead = overheadTime / fineSolveTime;
408 return 1.0 / (ratioPredictor + ratio * (1.0 + ratioSolve + ratioInterp) +
409 (ratioComm * nComm + ratioOverhead) /
m_numChunks);
420 "Total number of fine step should be divisible by number of chunks.");
424 "Total number of coarse step should be divisible by number of chunks.");
427 "Total number of fine step should be divisible by number of "
428 "windows times number of chunks.");
431 "Total number of coarse step should be divisible by number of "
432 "windows times number of chunks.");
436 "Fine and coarse total computational times do not match");
443 "number of IO_InfoSteps should divide number of fine steps "
451 "number of IO_CheckSteps should divide number of fine steps "
460 const NekDouble time,
const size_t nstep,
472 for (
size_t i = 0; i <
m_fineEqSys->GetNvariables(); ++i)
494 const NekDouble time,
const size_t nstep,
const size_t iter,
518 for (
size_t i = 0; i <
m_fineEqSys->GetNvariables(); ++i)
527 for (
size_t i = 0; i <
m_fineEqSys->GetNvariables(); ++i)
541 for (
size_t i = 0; i < fine.size(); ++i)
543 Vmath::Vadd(fine[i].size(), fine[i], 1, coarse_new[i], 1, fine[i], 1);
544 Vmath::Vsub(fine[i].size(), fine[i], 1, coarse_old[i], 1, fine[i], 1);
570 for (
size_t i = 0; i < in.size(); ++i)
577 for (
size_t i = 0; i < out.size(); ++i)
595 for (
size_t j = k; j < kmax; j++)
601 std::string indir =
m_fineEqSys->GetSessionName() +
"_" +
602 boost::lexical_cast<std::string>(j) +
".pit";
605 std::string outdir =
m_fineEqSys->GetSessionName() +
"_" +
606 boost::lexical_cast<std::string>(j + 1) +
615 for (
size_t i = 0; i < nChkPts; i++)
618 std::string filename =
620 boost::lexical_cast<std::string>(iChkPts) +
".chk";
623 std::string infullname = indir +
"/" + filename;
626 std::string outfullname = outdir +
"/" + filename;
629 fs::remove_all(outfullname);
#define ASSERTL0(condition, msg)
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
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.
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.
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.
void CopyToFinePhysField(const Array< OneD, const Array< OneD, NekDouble > > &in)
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.
void PrintHeaderTitle1(const std::string &title)
void GetParametersFromSession(void)
void PrintHeaderTitle2(const std::string &title)
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.
bool m_exactSolution
Using exact solution to compute error norms.
size_t m_checkSteps
Number of steps for checkpoint.
void SolutionConvergenceMonitoring(const NekDouble &time)
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 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.
virtual SOLVER_UTILS_EXPORT void v_Execute(std::ostream &out=std::cout) override
Virtual function for solve implementation.
virtual NekDouble v_EstimatePredictorTime(void) override
void CopyConvergedCheckPoints(const size_t w, const size_t k, size_t kmax)
void ApplyWindowing(const Array< OneD, const Array< OneD, NekDouble > > &in, Array< OneD, Array< OneD, NekDouble > > &out)
static std::string driverLookupId
static std::string className
Name of the class.
virtual NekDouble v_EstimateInterpolationTime(void) override
virtual NekDouble v_EstimateCommunicationTime(void) override
virtual SOLVER_UTILS_EXPORT void v_InitObject(std::ostream &out=std::cout) override
Virtual function for initialisation implementation.
virtual NekDouble v_EstimateRestrictionTime(void) override
void PrintSolutionFile(void)
void RunFineSolve(const NekDouble time, const size_t nstep, const size_t iter, const size_t wd, const Array< OneD, const Array< OneD, NekDouble > > &input, Array< OneD, Array< OneD, NekDouble > > &output)
static DriverSharedPtr create(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
Creates an instance of this class.
void PararealCorrection(const Array< OneD, const Array< OneD, NekDouble > > &coarse_new, const Array< OneD, const Array< OneD, NekDouble > > &coarse_old, Array< OneD, Array< OneD, NekDouble > > &fine)
SOLVER_UTILS_EXPORT DriverParareal(const LibUtilities::SessionReaderSharedPtr pSession, const SpatialDomains::MeshGraphSharedPtr pGraph)
Constructor.
virtual NekDouble v_EstimateFineSolverTime(void) override
void AssertParameters(void)
virtual NekDouble v_EstimateOverheadTime(void) override
void RunCoarseSolve(const NekDouble time, const size_t nstep, const Array< OneD, const Array< OneD, NekDouble > > &input, Array< OneD, Array< OneD, NekDouble > > &output)
virtual NekDouble v_ComputeSpeedUp(const size_t iter, NekDouble fineSolveTime, NekDouble coarseSolveTime, NekDouble restTime, NekDouble interTime, NekDouble commTime, NekDouble predictorOverheadTime, NekDouble overheadTime) override
virtual NekDouble v_EstimateCoarseSolverTime(void) override
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.
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 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.