46#include <boost/format.hpp>
93 ASSERTL0(
false,
"Unrecognised evolution operator.");
98 for (
size_t timeLevel = 0; timeLevel <
m_nTimeLevel; timeLevel++)
101 std::dynamic_pointer_cast<SolverUtils::UnsteadySystem>(
111 ASSERTL0(e == -1,
"No such class class defined.");
112 out <<
"An error occurred during driver initialisation." << std::endl;
127 std::string AdvectiveType)
131 "EqType SolverInfo tag must be defined.");
132 std::string vEquation =
m_session->DefinesSolverInfo(
"SolverType")
138 "EquationSystem '" + vEquation +
139 "' is not defined.\n"
140 "Ensure equation name is correct and module is compiled.\n");
143 m_session->SetTag(
"AdvectiveType", AdvectiveType);
144 m_session->SetTag(
"ParallelInTimeSolver",
"TimeLevel0");
149 int npx =
m_session->DefinesCmdLineArgument(
"npx")
150 ?
m_session->GetCmdLineArgument<
int>(
"npx")
152 int npy =
m_session->DefinesCmdLineArgument(
"npy")
153 ?
m_session->GetCmdLineArgument<
int>(
"npy")
155 int npz =
m_session->DefinesCmdLineArgument(
"npz")
156 ?
m_session->GetCmdLineArgument<
int>(
"npz")
158 int nsz =
m_session->DefinesCmdLineArgument(
"nsz")
159 ?
m_session->GetCmdLineArgument<
int>(
"nsz")
161 int npt =
m_session->DefinesCmdLineArgument(
"npt")
162 ?
m_session->GetCmdLineArgument<
int>(
"npt")
166 std::string npx_string = std::to_string(npx);
167 std::string npy_string = std::to_string(npy);
168 std::string npz_string = std::to_string(npz);
169 std::string nsz_string = std::to_string(nsz);
170 std::string npt_string = std::to_string(npt);
171 std::string driver_string =
"Driver=" +
m_session->GetSolverInfo(
"Driver");
174 bool useOptFile =
m_session->DefinesCmdLineArgument(
"use-opt-file");
175 std::string optfilename = useOptFile ?
m_session->GetFilenames()[0] :
"";
177 char *argv[] = {
const_cast<char *
>(
"Solver"),
178 const_cast<char *
>(
"--solverinfo"),
179 const_cast<char *
>(driver_string.c_str()),
180 const_cast<char *
>(
"--npx"),
181 const_cast<char *
>(npx_string.c_str()),
182 const_cast<char *
>(
"--npy"),
183 const_cast<char *
>(npy_string.c_str()),
184 const_cast<char *
>(
"--npz"),
185 const_cast<char *
>(npz_string.c_str()),
186 const_cast<char *
>(
"--nsz"),
187 const_cast<char *
>(nsz_string.c_str()),
188 const_cast<char *
>(
"--npt"),
189 const_cast<char *
>(npt_string.c_str()),
190 const_cast<char *
>(
"-f"),
191 const_cast<char *
>(
"--use-opt-file"),
192 const_cast<char *
>(optfilename.c_str()),
195 size_t argc = useOptFile ? 16 : 14;
198 std::vector<std::string> sessionFileNames;
199 for (
auto &filename :
m_session->GetFilenames())
202 if (filename.substr(filename.find_last_of(
".") + 1) !=
"opt")
204 sessionFileNames.push_back(filename);
209 for (
size_t timeLevel = 1; timeLevel <
m_nTimeLevel; timeLevel++)
212 argc, argv, sessionFileNames,
m_session->GetComm(), timeLevel);
219 graph->SetBndRegionOrdering(
m_graph->GetBndRegionOrdering());
222 graph->SetCompositeOrdering(
m_graph->GetCompositeOrdering());
225 ASSERTL0(session->DefinesSolverInfo(
"EqType"),
226 "EqType SolverInfo tag must be defined.");
227 auto vEquation = session->DefinesSolverInfo(
"SolverType")
228 ? session->GetSolverInfo(
"SolverType")
229 : session->GetSolverInfo(
"EqType");
234 "EquationSystem '" + vEquation +
235 "' is not defined.\n"
236 "Ensure equation name is correct and module is compiled.\n");
239 session->SetTag(
"AdvectiveType", AdvectiveType);
240 session->SetTag(
"ParallelInTimeSolver",
241 "TimeLevel" + std::to_string(timeLevel));
243 vEquation, session, graph);
265 ?
m_session->GetParameter(
"ExactSolution")
279 for (
size_t timeLevel = 0; timeLevel <
m_nTimeLevel; timeLevel++)
281 m_EqSys[timeLevel]->SetInfoSteps(0);
282 m_EqSys[timeLevel]->SetCheckpointSteps(0);
285 m_EqSys[0]->DoInitialise(
true);
288 for (
size_t timeLevel = 1; timeLevel <
m_nTimeLevel; timeLevel++)
290 m_EqSys[timeLevel]->DoInitialise(
false);
297 for (
size_t timeLevel = 0; timeLevel <
m_nTimeLevel; timeLevel++)
300 m_EqSys[timeLevel]->EquationSystem::GetTimeStep();
302 m_npts[timeLevel] =
m_EqSys[timeLevel]->EquationSystem::GetNpoints();
307 for (
size_t i = 0; i <
m_nVar; ++i)
322 for (
size_t timeLevel = 0; timeLevel <
m_nTimeLevel; timeLevel++)
324 std::cout << std::string(71,
'=') << std::endl << std::flush;
325 std::cout <<
"=========================== TIME LEVEL " +
326 std::to_string(timeLevel) +
328 "========================="
332 m_EqSys[timeLevel]->PrintSummary(out);
334 std::cout << std::endl << std::flush;
345 m_comm->GetSpaceComm()->GetRank() == 0)
347 std::cout << std::endl;
348 std::cout << std::string(43, c) << std::endl << std::flush;
349 std::cout <<
title << std::endl << std::flush;
350 std::cout << std::string(43, c) << std::endl << std::flush;
365 for (
size_t i = 0; i <
m_nVar; ++i)
393 for (
size_t i = 0; i <
m_nVar; ++i)
418 for (
size_t i = 0; i <
m_nVar; ++i)
430 for (
size_t i = 0; i <
m_nVar; ++i)
432 m_EqSys[timeLevel]->CopyFromPhysField(i, out[i]);
442 for (
size_t i = 0; i <
m_nVar; ++i)
444 m_EqSys[timeLevel]->CopyToPhysField(i, in[i]);
445 m_EqSys[timeLevel]->UpdateFields()[i]->SetPhysState(
true);
455 for (
size_t i = 0; i <
m_nVar; ++i)
459 m_EqSys[timeLevel]->CopyToPhysField(i, in[i]);
461 m_EqSys[timeLevel]->UpdateFields()[i]->FwdTrans(
462 m_EqSys[timeLevel]->UpdateFields()[i]->GetPhys(),
463 m_EqSys[timeLevel]->UpdateFields()[i]->UpdateCoeffs());
473 for (
size_t i = 0; i <
m_nVar; ++i)
503 const bool normalized)
505 for (
size_t i = 0; i <
m_nVar; ++i)
517 const bool normalized)
520 m_comm->GetSpaceComm()->GetRank() == 0)
522 for (
size_t i = 0; i <
m_nVar; ++i)
526 std::cout <<
"L2 error (variable "
527 <<
m_EqSys[timeLevel]->GetVariable(i)
530 std::cout <<
"Linf error (variable "
531 <<
m_EqSys[timeLevel]->GetVariable(i)
537 std::cout <<
"L 2 error (variable "
538 <<
m_EqSys[timeLevel]->GetVariable(i)
541 std::cout <<
"L inf error (variable "
542 <<
m_EqSys[timeLevel]->GetVariable(i)
556 for (
size_t i = 0; i <
m_nVar; ++i)
579 for (
size_t n = 0; n <= niter; n++)
588 for (
size_t i = 0; i < buffer1.size(); ++i)
596 for (
size_t i = 0; i < buffer2.size(); ++i)
598 m_comm->GetTimeComm()->Recv(0, buffer2[i]);
603 return timer.
Elapsed().count() / niter;
616 if (infield.size() != outfield.size())
621 for (
size_t n = 0; n < infield.size(); ++n)
626 if (infield[n]->GetExpSize() != outfield[n]->GetExpSize())
633 ? infield[n]->UpdatePhys()
636 ? outfield[n]->UpdatePhys()
640 if (infield[n]->GetTotPoints() == outfield[n]->GetTotPoints())
642 Vmath::Vcopy(infield[n]->GetTotPoints(), inphys, 1, outphys, 1);
647 for (
size_t i = 0; i < infield[n]->GetExpSize(); ++i)
650 auto inElmt = infield[n]->GetExp(i);
651 auto outElmt = outfield[n]->GetExp(i);
654 size_t inoffset = infield[n]->GetPhys_Offset(i);
655 size_t outoffset = outfield[n]->GetPhys_Offset(i);
659 inElmt->FwdTrans(inphys + inoffset, incoeff);
665 expPtr = std::make_shared<StdRegions::StdSegExp>(
667 inElmt->GetBasis(0)->GetBasisType(),
668 inElmt->GetBasis(0)->GetNumModes(),
669 outElmt->GetBasis(0)->GetPointsKey()));
673 expPtr = std::make_shared<StdRegions::StdQuadExp>(
675 inElmt->GetBasis(0)->GetBasisType(),
676 inElmt->GetBasis(0)->GetNumModes(),
677 outElmt->GetBasis(0)->GetPointsKey()),
679 inElmt->GetBasis(1)->GetBasisType(),
680 inElmt->GetBasis(1)->GetNumModes(),
681 outElmt->GetBasis(1)->GetPointsKey()));
685 expPtr = std::make_shared<StdRegions::StdTriExp>(
687 inElmt->GetBasis(0)->GetBasisType(),
688 inElmt->GetBasis(0)->GetNumModes(),
689 outElmt->GetBasis(0)->GetPointsKey()),
691 inElmt->GetBasis(1)->GetBasisType(),
692 inElmt->GetBasis(1)->GetNumModes(),
693 outElmt->GetBasis(1)->GetPointsKey()));
697 expPtr = std::make_shared<StdRegions::StdHexExp>(
699 inElmt->GetBasis(0)->GetBasisType(),
700 inElmt->GetBasis(0)->GetNumModes(),
701 outElmt->GetBasis(0)->GetPointsKey()),
703 inElmt->GetBasis(1)->GetBasisType(),
704 inElmt->GetBasis(1)->GetNumModes(),
705 outElmt->GetBasis(1)->GetPointsKey()),
707 inElmt->GetBasis(2)->GetBasisType(),
708 inElmt->GetBasis(2)->GetNumModes(),
709 outElmt->GetBasis(2)->GetPointsKey()));
713 expPtr = std::make_shared<StdRegions::StdPrismExp>(
715 inElmt->GetBasis(0)->GetBasisType(),
716 inElmt->GetBasis(0)->GetNumModes(),
717 outElmt->GetBasis(0)->GetPointsKey()),
719 inElmt->GetBasis(1)->GetBasisType(),
720 inElmt->GetBasis(1)->GetNumModes(),
721 outElmt->GetBasis(1)->GetPointsKey()),
723 inElmt->GetBasis(2)->GetBasisType(),
724 inElmt->GetBasis(2)->GetNumModes(),
725 outElmt->GetBasis(2)->GetPointsKey()));
729 expPtr = std::make_shared<StdRegions::StdPyrExp>(
731 inElmt->GetBasis(0)->GetBasisType(),
732 inElmt->GetBasis(0)->GetNumModes(),
733 outElmt->GetBasis(0)->GetPointsKey()),
735 inElmt->GetBasis(1)->GetBasisType(),
736 inElmt->GetBasis(1)->GetNumModes(),
737 outElmt->GetBasis(1)->GetPointsKey()),
739 inElmt->GetBasis(2)->GetBasisType(),
740 inElmt->GetBasis(2)->GetNumModes(),
741 outElmt->GetBasis(2)->GetPointsKey()));
745 expPtr = std::make_shared<StdRegions::StdTetExp>(
747 inElmt->GetBasis(0)->GetBasisType(),
748 inElmt->GetBasis(0)->GetNumModes(),
749 outElmt->GetBasis(0)->GetPointsKey()),
751 inElmt->GetBasis(1)->GetBasisType(),
752 inElmt->GetBasis(1)->GetNumModes(),
753 outElmt->GetBasis(1)->GetPointsKey()),
755 inElmt->GetBasis(2)->GetBasisType(),
756 inElmt->GetBasis(2)->GetNumModes(),
757 outElmt->GetBasis(2)->GetPointsKey()));
762 expPtr->BwdTrans(incoeff, tmp);
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
Describes the specification for a Basis.
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.
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.
size_t m_numChunks
Number of time chunks.
NekDouble vL2ErrorMax(void)
Array< OneD, NekDouble > m_vL2Errors
Storage for parallel-in-time iteration.
void UpdateFieldCoeffs(const size_t timeLevel, const Array< OneD, const Array< OneD, NekDouble > > &in=NullNekDoubleArrayOfArray)
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.
void PrintErrorNorm(const size_t timeLevel, const bool normalized)
void SetParallelInTimeEquationSystem(std::string AdvectiveType)
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.
Array< OneD, NekDouble > m_vLinfErrors
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)
SOLVER_UTILS_EXPORT void v_Execute(std::ostream &out=std::cout) override
Virtual function for solve implementation.
Array< OneD, size_t > m_npts
Number of dof for each time level.
Array< OneD, Array< OneD, NekDouble > > m_exactsoln
NekDouble EstimateCommunicationTime(Array< OneD, Array< OneD, NekDouble > > &buffer1, Array< OneD, Array< OneD, NekDouble > > &buffer2)
void SolutionConvergenceSummary(const size_t timeLevel)
Array< OneD, NekDouble > m_timestep
Time step for each time level.
void CopySolutionVector(const Array< OneD, const Array< OneD, NekDouble > > &in, Array< OneD, Array< OneD, NekDouble > > &out)
void UpdateErrorNorm(const size_t timeLevel, const bool normalized)
void SolutionConvergenceMonitoring(const size_t timeLevel, const size_t iter)
SOLVER_UTILS_EXPORT DriverParallelInTime(const LibUtilities::SessionReaderSharedPtr pSession, const SpatialDomains::MeshGraphSharedPtr pGraph)
Constructor.
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)
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
EquationSystemFactory & GetEquationSystemFactory()
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
std::shared_ptr< StdExpansion > StdExpansionSharedPtr
static Array< OneD, Array< OneD, NekDouble > > NullNekDoubleArrayOfArray
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)