39#include <boost/format.hpp>
88 ASSERTL0(
false,
"Unrecognised evolution operator.");
93 std::dynamic_pointer_cast<SolverUtils::UnsteadySystem>(
m_equ[0]);
95 std::dynamic_pointer_cast<SolverUtils::UnsteadySystem>(
m_equ[1]);
99 ASSERTL0(e == -1,
"No such class class defined.");
100 out <<
"An error occurred during driver initialisation." << std::endl;
109 boost::ignore_unused(out);
111 ASSERTL0(
false,
"Specific version of Parallel-in-Time not implemented");
119 ASSERTL0(
false,
"Specific version of Parallel-in-Time not implemented");
128 ASSERTL0(
false,
"Specific version of Parallel-in-Time not implemented");
137 ASSERTL0(
false,
"Specific version of Parallel-in-Time not implemented");
146 ASSERTL0(
false,
"Specific version of Parallel-in-Time not implemented");
155 ASSERTL0(
false,
"Specific version of Parallel-in-Time not implemented");
164 ASSERTL0(
false,
"Specific version of Parallel-in-Time not implemented");
173 ASSERTL0(
false,
"Specific version of Parallel-in-Time not implemented");
185 boost::ignore_unused(iter, fineSolveTime, coarseSolveTime, restTime,
186 interTime, commTime, predictorOverheadTime,
188 ASSERTL0(
false,
"Specific version of Parallel-in-Time not implemented");
196 std::string AdvectiveType)
200 "EqType SolverInfo tag must be defined.");
201 std::string vEquation =
m_session->DefinesSolverInfo(
"SolverType")
207 "EquationSystem '" + vEquation +
208 "' is not defined.\n"
209 "Ensure equation name is correct and module is compiled.\n");
212 m_session->SetTag(
"AdvectiveType", AdvectiveType);
213 m_session->SetTag(
"ParallelInTimeSolver",
"TimeLevel0");
218 int npx =
m_session->DefinesCmdLineArgument(
"npx")
219 ?
m_session->GetCmdLineArgument<
int>(
"npx")
221 int npy =
m_session->DefinesCmdLineArgument(
"npy")
222 ?
m_session->GetCmdLineArgument<
int>(
"npy")
224 int npz =
m_session->DefinesCmdLineArgument(
"npz")
225 ?
m_session->GetCmdLineArgument<
int>(
"npz")
227 int nsz =
m_session->DefinesCmdLineArgument(
"nsz")
228 ?
m_session->GetCmdLineArgument<
int>(
"nsz")
230 int npt =
m_session->DefinesCmdLineArgument(
"npt")
231 ?
m_session->GetCmdLineArgument<
int>(
"npt")
235 std::string npx_string = std::to_string(npx);
236 std::string npy_string = std::to_string(npy);
237 std::string npz_string = std::to_string(npz);
238 std::string nsz_string = std::to_string(nsz);
239 std::string npt_string = std::to_string(npt);
242 bool useoptfile =
m_session->DefinesCmdLineArgument(
"useoptfile");
243 std::string optfilename = useoptfile ?
m_session->GetFilenames()[0] :
"";
245 char *argv[] = {
const_cast<char *
>(
"Solver"),
246 const_cast<char *
>(
"--npx"),
247 const_cast<char *
>(npx_string.c_str()),
248 const_cast<char *
>(
"--npy"),
249 const_cast<char *
>(npy_string.c_str()),
250 const_cast<char *
>(
"--npz"),
251 const_cast<char *
>(npz_string.c_str()),
252 const_cast<char *
>(
"--nsz"),
253 const_cast<char *
>(nsz_string.c_str()),
254 const_cast<char *
>(
"--npt"),
255 const_cast<char *
>(npt_string.c_str()),
256 const_cast<char *
>(
"--useoptfile"),
257 const_cast<char *
>(optfilename.c_str()),
260 size_t argc = useoptfile ? 13 : 11;
263 std::vector<std::string> sessionFileNames;
264 for (
auto &filename :
m_session->GetFilenames())
267 if (filename.substr(filename.find_last_of(
".") + 1) !=
"opt")
269 sessionFileNames.push_back(filename);
274 for (
size_t timeLevel = 1; timeLevel <
m_nequ; timeLevel++)
277 argc, argv, sessionFileNames,
m_session->GetComm(), timeLevel);
284 graph->SetBndRegionOrdering(
m_graph->GetBndRegionOrdering());
287 graph->SetCompositeOrdering(
m_graph->GetCompositeOrdering());
290 ASSERTL0(session->DefinesSolverInfo(
"EqType"),
291 "EqType SolverInfo tag must be defined.");
292 auto vEquation = session->DefinesSolverInfo(
"SolverType")
293 ? session->GetSolverInfo(
"SolverType")
294 : session->GetSolverInfo(
"EqType");
299 "EquationSystem '" + vEquation +
300 "' is not defined.\n"
301 "Ensure equation name is correct and module is compiled.\n");
304 session->SetTag(
"AdvectiveType", AdvectiveType);
305 session->SetTag(
"ParallelInTimeSolver",
306 "TimeLevel" + std::to_string(timeLevel));
308 vEquation, session, graph);
336 ?
m_session->GetParameter(
"ExactSolution")
373 for (
size_t i = 0; i <
m_nVar; ++i)
390 for (
size_t i = 0; i <
m_nVar; ++i)
408 std::cout <<
"========================================================="
412 std::cout <<
"======================== COARSE PROPAGATOR INFO "
413 "======================="
419 std::cout << std::endl << std::flush;
430 std::cout <<
"========================================================="
434 std::cout <<
"========================= FINE PROPAGATOR INFO "
435 "========================"
441 std::cout << std::endl << std::flush;
451 m_comm->GetSpaceComm()->GetRank() == 0)
453 std::cout << std::endl;
454 std::cout <<
"*******************************************" << std::endl
456 std::cout <<
title << std::endl << std::flush;
457 std::cout <<
"*******************************************" << std::endl
468 m_comm->GetSpaceComm()->GetRank() == 0)
470 std::cout <<
"-------------------------------------------" << std::endl
472 std::cout <<
title << std::endl << std::flush;
473 std::cout <<
"-------------------------------------------" << std::endl
484 m_comm->GetSpaceComm()->GetRank() == 0)
486 std::cout <<
"Total Computation Time : " << time <<
"s" << std::endl
519 for (
size_t i = 0; i < array.size(); ++i)
551 for (
size_t i = 0; i < array.size(); ++i)
565 for (
size_t i = 0; i < in.size(); ++i)
577 for (
size_t i = 0; i < out.size(); ++i)
589 for (
size_t i = 0; i < out.size(); ++i)
601 for (
size_t i = 0; i < in.size(); ++i)
613 for (
size_t i = 0; i < in.size(); ++i)
625 for (
size_t i = 0; i < in.size(); ++i)
684 m_comm->GetSpaceComm()->GetRank() == 0)
690 std::cout <<
"L2 error (variable "
694 std::cout <<
"Linf error (variable "
701 std::cout <<
"L 2 error (variable "
705 std::cout <<
"L inf error (variable "
734 size_t nVar = inarray.size();
737 if (inarray[0].size() > outarray[0].size())
739 for (
size_t i = 0; i < nVar; ++i)
749 for (
size_t i = 0; i < nVar; ++i)
802 PrintSpeedUp(fineSolveTime, coarseSolveTime, restTime, interTime, commTime,
803 predictorTime, OverheadTime);
817 m_comm->GetSpaceComm()->GetRank() == 0)
825 0.0, predictOverheadTime, OverheadTime);
826 std::cout <<
"Speed-up (" << k <<
") = " << speedup << std::endl
835 k, fineSolveTime, coarseSolveTime, restTime, interTime, 0.0,
836 predictOverheadTime, OverheadTime);
837 std::cout <<
"Speed-up (" << k <<
") = " << speedup << std::endl
846 k, fineSolveTime, coarseSolveTime, restTime, interTime,
847 commTime, predictOverheadTime, OverheadTime);
848 std::cout <<
"Speed-up (" << k <<
") = " << speedup << std::endl
851 std::cout <<
"-------------------------------------------" << std::endl
873 for (
size_t n = 0; n <= niter; n++)
882 for (
size_t i = 0; i < buffer1.size(); ++i)
890 for (
size_t i = 0; i < buffer2.size(); ++i)
892 tComm->Recv(0, buffer2[i]);
897 return timer.
Elapsed().count() / niter;
910 if (exp1.size() != exp2.size())
915 for (
int n = 0; n < exp1.size(); ++n)
919 if (exp1[n]->GetExpSize() != exp2[n]->GetExpSize())
925 if (exp1[n]->GetTotPoints() == exp2[n]->GetTotPoints())
927 Vmath::Vcopy(exp1[n]->GetTotPoints(), exp1[n]->GetPhys(), 1,
928 exp2[n]->UpdatePhys(), 1);
934 exp1[n]->FwdTrans(exp1[n]->GetPhys(), exp1[n]->UpdateCoeffs());
936 for (
int i = 0; i < exp1[n]->GetExpSize(); ++i)
940 elmt2 = exp2[n]->GetExp(i);
943 int offset1 = exp1[n]->GetCoeff_Offset(i);
944 int offset2 = exp2[n]->GetCoeff_Offset(i);
949 std::vector<unsigned int> nummodes1(base1.size());
950 std::vector<LibUtilities::BasisType> btype1(base1.size());
951 for (
int j = 0; j < nummodes1.size(); ++j)
953 nummodes1[j] = base1[j]->GetNumModes();
954 btype1[j] = base1[j]->GetBasisType();
958 elmt2->ExtractDataToCoeffs(
959 &exp1[n]->GetCoeffs()[offset1], nummodes1, 0,
960 &exp2[n]->UpdateCoeffs()[offset2], btype1);
964 exp2[n]->BwdTrans(exp2[n]->GetCoeffs(), exp2[n]->UpdatePhys());
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
static SessionReaderSharedPtr CreateInstance(int argc, char *argv[])
Creates an instance of the SessionReader class.
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
Base class for the development of solvers.
LibUtilities::SessionReaderSharedPtr m_session
Session reader object.
LibUtilities::CommSharedPtr m_comm
Communication object.
SpatialDomains::MeshGraphSharedPtr m_graph
MeshGraph object.
enum EvolutionOperatorType m_EvolutionOperator
Evolution Operator.
Array< OneD, EquationSystemSharedPtr > m_equ
Equation system to solve.
int m_nequ
number of equations
size_t m_numChunks
Number of time chunks.
void EvaluateExactSolution(const NekDouble &time)
NekDouble vL2ErrorMax(void)
size_t m_coarseSteps
Number of steps for the coarse solver.
void PrintSpeedUp(NekDouble fineSolveTime, NekDouble coarseSolveTime, NekDouble restTime, NekDouble interTime, NekDouble commTime, NekDouble predictorOverheadTime, NekDouble overheadTime)
void UpdateErrorNorm(const bool normalized)
Array< OneD, NekDouble > m_vL2Errors
void SendSolutionToNextProc(Array< OneD, Array< OneD, NekDouble > > &array, int &convergence)
virtual NekDouble v_EstimateCommunicationTime(void)
size_t m_iterMaxPIT
Maximum number of parallel-in-time iteration.
size_t m_fineSteps
Number of steps for the fine solver.
void SetParallelInTimeEquationSystem(std::string AdvectiveType)
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)
Array< OneD, MultiRegions::ExpListSharedPtr > m_fineFields
Array< OneD, MultiRegions::ExpListSharedPtr > m_coarseFields
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
virtual NekDouble v_EstimateOverheadTime(void)
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)
virtual NekDouble v_EstimateRestrictionTime(void)
virtual NekDouble v_EstimateInterpolationTime(void)
NekDouble m_fineTimeStep
Timestep for fine solver.
void AllocateMemory(void)
void PrintFineSolverInfo(std::ostream &out=std::cout)
size_t m_chunkRank
Rank in time.
void PrintComputationalTime(const NekDouble 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)
virtual SOLVER_UTILS_EXPORT void v_Execute(std::ostream &out=std::cout) override
Virtual function for solve implementation.
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)
void InitialiseInterpolationField(void)
void CopyFromCoarsePhysField(Array< OneD, Array< OneD, NekDouble > > &out)
virtual NekDouble v_EstimateCoarseSolverTime(void)
void UpdateSolution(const Array< OneD, const Array< OneD, NekDouble > > &in)
void CopyToCoarsePhysField(const Array< OneD, const Array< OneD, NekDouble > > &in)
void CopySolutionVector(const Array< OneD, const Array< OneD, NekDouble > > &in, Array< OneD, Array< OneD, NekDouble > > &out)
virtual NekDouble v_EstimateFineSolverTime(void)
size_t m_infoSteps
Number of steps for info I/O.
virtual NekDouble v_EstimatePredictorTime(void)
virtual NekDouble v_ComputeSpeedUp(const size_t iter, NekDouble fineSolveTime, NekDouble coarseSolveTime, NekDouble restTime, NekDouble interTime, NekDouble commTime, NekDouble predictorTime, NekDouble overheadTime)
void PrintErrorNorm(const bool normalized)
SOLVER_UTILS_EXPORT DriverParallelInTime(const LibUtilities::SessionReaderSharedPtr pSession, const SpatialDomains::MeshGraphSharedPtr pGraph)
Constructor.
static MeshGraphSharedPtr Read(const LibUtilities::SessionReaderSharedPtr pSession, LibUtilities::DomainRangeShPtr rng=LibUtilities::NullDomainRangeShPtr, bool fillGraph=true, SpatialDomains::MeshGraphSharedPtr partitionedGraph=nullptr)
std::shared_ptr< SessionReader > SessionReaderSharedPtr
static DomainRangeShPtr NullDomainRangeShPtr
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
std::shared_ptr< Expansion > ExpansionSharedPtr
void InterpExp1ToExp2(const Array< OneD, MultiRegions::ExpListSharedPtr > exp1, Array< OneD, MultiRegions::ExpListSharedPtr > &exp2)
Interpolate from an expansion to an expansion.
EquationSystemFactory & GetEquationSystemFactory()
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
The above copyright notice and this permission notice shall be included.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)