39#include <boost/format.hpp>
78 NekDouble totalTime = 0.0, predictorTime = 0.0, coarseSolveTime = 0.0,
79 fineSolveTime = 0.0, correctionTime = 0.0;
91 m_comm->GetTimeComm()->Block();
106 for (
size_t i = 0; i <
m_nVar; ++i)
115 for (
size_t i = 0; i <
m_nVar; ++i)
129 predictorTime += timer.
Elapsed().count();
130 totalTime += timer.
Elapsed().count();
137 totalTime += timer.
Elapsed().count();
139 m_comm->GetSpaceComm()->GetRank() == 0)
141 std::cout <<
"Total Computation Time : " << totalTime <<
"s"
148 int convergenceCurr =
false;
159 totalTime += timer.
Elapsed().count();
166 fineSolveTime += timer.
Elapsed().count();
167 totalTime += timer.
Elapsed().count();
173 correctionTime += timer.
Elapsed().count();
174 totalTime += timer.
Elapsed().count();
180 totalTime += timer.
Elapsed().count();
188 coarseSolveTime += timer.
Elapsed().count();
189 totalTime += timer.
Elapsed().count();
195 correctionTime += timer.
Elapsed().count();
196 totalTime += timer.
Elapsed().count();
201 m_comm->GetSpaceComm()->GetRank() == 0)
203 std::cout <<
"Total Computation Time : " << totalTime <<
"s"
206 std::cout <<
" - Predictor Time : " << predictorTime <<
"s"
209 std::cout <<
" - Coarse Solve Time : " << coarseSolveTime <<
"s"
212 std::cout <<
" - Fine Solve Time : " << fineSolveTime <<
"s"
215 std::cout <<
" - Correction Time : " << correctionTime <<
"s"
228 totalTime += timer.
Elapsed().count();
244 totalTime += timer.
Elapsed().count();
247 m_comm->GetTimeComm()->Block();
252 m_comm->GetSpaceComm()->GetRank() == 0)
254 std::cout <<
"Total Computation Time : " << totalTime <<
"s"
257 std::cout <<
" - Predictor Time : " << predictorTime <<
"s" << std::endl
259 std::cout <<
" - Coarse Solve Time : " << coarseSolveTime <<
"s"
262 std::cout <<
" - Fine Solve Time : " << fineSolveTime <<
"s"
265 std::cout <<
" - Correction Time : " << correctionTime <<
"s"
280 for (
size_t i = 0; i <
m_nVar; ++i)
300 "Total number of fine step should be divisible by number of chunks.");
304 "Total number of coarse step should be divisible by number of chunks.");
307 "Total number of fine step should be divisible by number of "
308 "windows times number of chunks.");
311 "Total number of coarse step should be divisible by number of "
312 "windows times number of chunks.");
316 "Fine and coarse total computational times do not match");
319 ->GetTimeIntegrationScheme()
320 ->GetNumIntegrationPhases() == 1,
321 "Only single step time-integration schemes currently supported "
325 ->GetTimeIntegrationScheme()
326 ->GetNumIntegrationPhases() == 1,
327 "Only single step time-integration schemes currently supported "
336 "number of IO_InfoSteps should divide number of fine steps "
346 "number of IO_InfoSteps should divide number of coarse steps "
356 "number of IO_CheckSteps should divide number of fine steps "
366 "number of IO_CheckSteps should divide number of coarse steps "
397 const NekDouble time,
const size_t nstep,
398 const size_t wd,
const size_t iter)
402 m_EqSys[timeLevel]->GetCheckpointSteps()
411 m_EqSys[timeLevel]->SetCheckpointNumber(iChkPts);
414 m_EqSys[timeLevel]->SetIterationNumberPIT(iter);
417 m_EqSys[timeLevel]->SetWindowNumberPIT(wd);
419 m_EqSys[timeLevel]->SetTime(time);
420 m_EqSys[timeLevel]->SetSteps(nstep);
430 for (
size_t i = 0; i <
m_nVar; ++i)
446 for (
size_t i = 0; i <
m_nVar; ++i)
482 for (
size_t i = 0; i <
m_nVar; ++i)
491 for (
size_t i = 0; i <
m_nVar; ++i)
506 if (
m_comm->GetSpaceComm()->GetRank() == 0)
508 for (
size_t j = k; j < kmax; j++)
517 sessionName +
"_" + std::to_string(j - 1) +
".pit";
520 std::string outdir = sessionName +
"_" + std::to_string(j) +
".pit";
522 for (
size_t timeLevel = 0; timeLevel <
m_nTimeLevel; timeLevel++)
526 m_EqSys[timeLevel]->GetCheckpointSteps()
528 m_EqSys[timeLevel]->GetCheckpointSteps()
534 for (
size_t i = 1; i <= nChkPts; i++)
537 std::string filename = sessionName +
"_timeLevel" +
538 std::to_string(timeLevel) +
"_" +
539 std::to_string(iChkPts + i) +
".chk";
542 std::string infullname = indir +
"/" + filename;
545 std::string outfullname = outdir +
"/" + filename;
548 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::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.
NekDouble vL2ErrorMax(void)
void UpdateFieldCoeffs(const size_t timeLevel, const Array< OneD, const Array< OneD, NekDouble > > &in=NullNekDoubleArrayOfArray)
NekDouble m_chunkTime
Time integration interval per chunk.
void SendToNextProc(Array< OneD, Array< OneD, NekDouble > > &array, int &convergence)
size_t m_nTimeLevel
Number of time levels.
size_t m_iterMaxPIT
Maximum number of parallel-in-time iteration.
Array< OneD, size_t > m_nsteps
Number of time steps for each time level.
void InitialiseEqSystem(bool turnoff_output)
SOLVER_UTILS_EXPORT void v_InitObject(std::ostream &out=std::cout) override
Virtual function for initialisation implementation.
void EvaluateExactSolution(const size_t timeLevel, const NekDouble &time)
void GetParametersFromSession(void)
void RecvFromPreviousProc(Array< OneD, Array< OneD, NekDouble > > &array, int &convergence)
Array< OneD, std::shared_ptr< UnsteadySystem > > m_EqSys
Equation system to solve.
void PrintHeader(const std::string &title, const char c)
NekDouble m_tolerPIT
ParallelInTime tolerance.
size_t m_chunkRank
Rank in time.
void PrintSolverInfo(std::ostream &out=std::cout)
size_t m_nVar
Number of variables.
bool m_exactSolution
Using exact solution to compute error norms.
void CopyFromPhysField(const size_t timeLevel, Array< OneD, Array< OneD, NekDouble > > &out)
void CopyToPhysField(const size_t timeLevel, const Array< OneD, const Array< OneD, NekDouble > > &in)
Array< OneD, size_t > m_npts
Number of dof for each time level.
Array< OneD, Array< OneD, NekDouble > > m_exactsoln
void SolutionConvergenceSummary(const size_t timeLevel)
NekDouble m_time
Local time.
Array< OneD, NekDouble > m_timestep
Time step for each time level.
void SolutionConvergenceMonitoring(const size_t timeLevel, const size_t iter)
void Interpolate(const Array< OneD, MultiRegions::ExpListSharedPtr > &infield, const Array< OneD, MultiRegions::ExpListSharedPtr > &outfield, const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
void ApplyWindowing(const size_t w)
SOLVER_UTILS_EXPORT void v_Execute(std::ostream &out=std::cout) override
Virtual function for solve implementation.
static constexpr size_t m_fineLevel
void UpdateInitialConditionFromSolver(const size_t timeLevel)
static std::string driverLookupId
void InterpolateCoarseSolution(void)
static constexpr size_t m_coarseLevel
static std::string className
Name of the class.
void CorrectionWithOldCoarseSolution(void)
void CopyConvergedCheckPoints(const size_t w, const size_t k)
SOLVER_UTILS_EXPORT void v_InitObject(std::ostream &out=std::cout) override
Virtual function for initialisation implementation.
void UpdateSolution(const size_t timeLevel, const NekDouble time, const size_t nstep, const size_t wd, const size_t iter)
Array< OneD, Array< OneD, NekDouble > > m_coarseSolution
void CorrectionWithNewCoarseSolution(void)
static DriverSharedPtr create(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
Creates an instance of this class.
SOLVER_UTILS_EXPORT DriverParareal(const LibUtilities::SessionReaderSharedPtr pSession, const SpatialDomains::MeshGraphSharedPtr pGraph)
Constructor.
void WriteTimeChunkOuput(void)
void AllocateMemory(void)
void AssertParameters(void)
void UpdateSolverInitialCondition(const size_t timeLevel)
Array< OneD, Array< OneD, NekDouble > > m_fineSolution
Array< OneD, Array< OneD, NekDouble > > m_initialCondition
std::shared_ptr< SessionReader > SessionReaderSharedPtr
DriverFactory & GetDriverFactory()
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
std::vector< double > w(NPUPPER)
static Array< OneD, Array< OneD, NekDouble > > NullNekDoubleArrayOfArray
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.