12 unsigned int nTimes,std::ostream &outStream);
15 void ReportCounters(
long long **inCounters,
const char **
timerNames,
16 std::vector<std::string> &papiCounterNames,
17 unsigned int nTimes,std::ostream &outStream);
24 typedef DomainBaseType::OperatorType
operator_t;
35 std::ostringstream messageStream;
49 DomainBaseType::gridvector &simGrids(simDomain.Grids());
50 DomainBaseType::statevector &gridStates(simDomain.States());
51 DomainBaseType::statevector &gridParams(simDomain.Params());
52 DomainBaseType::statevector &gridTargets(simDomain.Targets());
54 operator_t &sbpOperator(simDomain.Operator());
56 int numLocalGrids = simDomain.NumberOfLocalGrids();
57 int spatialOrder = simDomain.SpatialOrder();
58 int interiorOrder = (spatialOrder - 1)*2;
60 const std::vector<std::string> &domainGridNames(simDomain.GridNames());
62 if(numLocalGrids <= 0){
63 ErrOut(
"Error: no local grids.\n");
66 std::vector<std::vector<int> > numThreadsGridDim(numLocalGrids);
67 comm_t &domainCommunicator(simDomain.Communicator());
71 for(
int iLocalGrid = 0;iLocalGrid < numLocalGrids;iLocalGrid++){
75 int iGrid = simDomain.LocalGridIndex(iLocalGrid);
77 grid_t &simGrid(*simGrids[iGrid]);
78 state_t &simState(*gridStates[iGrid]);
79 state_t ¶mState(*gridParams[iGrid]);
80 state_t &targetState(*gridTargets[iGrid]);
82 const std::string &gridName(domainGridNames[iGrid]);
84 StdOut(messageStream.str());
91 halo_t &simHalo(simGrid.
Halo());
99 ErrOut(
"Could not initialize flow. Messages:\n");
100 ErrOut(messageStream.str());
102 domainCommunicator.SetExit(1);
104 StdOut(messageStream.str());
116 messageStream <<
"Initializing flow on Domain (" << simDomain.Name()
117 <<
") with initialization case (" << initName <<
")." << std::endl
120 messageStream <<
")" << std::endl
123 messageStream <<
")" << std::endl;
124 StdOut(messageStream.str(),2);
128 initName,initParams,initFlags,0,&messageStream)){
129 ErrOut(
"Solution initialization failed. Messages:\n");
130 ErrOut(messageStream.str());
132 domainCommunicator.SetExit(1);
134 StdOut(messageStream.str());
141 if(domainCommunicator.Check())
146 StdOut(
"Processing restart.\n");
149 ErrOut(
"Restart file name not set. Aborting.\n");
154 std::ostringstream messageOut;
155 messageOut <<
"Restart File Name = " << restartFileName << std::endl;
161 ErrOut(std::string(
"ERROR: FileInfo failed for ")+
162 restartFileName+std::string(
"\nMessages:\n")+
163 messageOut.str()+std::string(
"\n"));
164 domainCommunicator.SetExit(1);
167 if(domainCommunicator.Check())
169 domainCommunicator.StreamBroadCast(restartFileInfo);
171 if(restartFileInfo.
simStep > 0)
172 startStep = restartFileInfo.
simStep;
173 if(restartFileInfo.
simTime > 0)
174 startTime = restartFileInfo.
simTime;
176 std::ostringstream domainPathStream;
178 domainPathStream <<
"Group" << (iGrid < 9 ?
"00" :
183 domainPathStream << domainName <<
"/grid" << iGrid+1;
185 std::string dataPath = domainPathStream.str();
187 std::string fetchMessages(messageOut.str());
189 messageOut <<
"Failed to get state data from " << restartFileName
190 <<
". Aborting with messages:" << std::endl
191 << fetchMessages << std::endl;
205 std::string targetFileName;
209 if(!targetFileName.empty()){
211 std::ostringstream messageOut;
215 ErrOut(std::string(
"ERROR: FileInfo failed for ")+
216 targetFileName+std::string(
"\nMessages:\n")+
217 messageOut.str()+std::string(
"\n"));
218 domainCommunicator.SetExit(1);
221 if(domainCommunicator.Check())
223 domainCommunicator.StreamBroadCast(targetFileInfo);
224 std::ostringstream domainPathStream;
226 domainPathStream <<
"Group" << (iGrid < 9 ?
"00" :
230 domainPathStream << domainName <<
"/grid" << iGrid+1;
232 std::string dataPath = domainPathStream.str();
234 std::string fetchMessages(messageOut.str());
236 messageOut <<
"Failed to get target data from " << targetFileName
237 <<
". Aborting with messages:" << std::endl
238 << fetchMessages << std::endl;
249 rhs_t *nsRHS =
new rhs_t;
250 nsRHS->SetGlobal(*
this);
256 if(nsRHS->Initialize(simGrid,simState,paramState,targetState,sbpOperator)){
265 simDomain.SetRHS(iGrid,*nsRHS);
272 simDomain.SetDomainBCs();
282 StdOut(messageStream.str(),2);
293 bool masterThread =
true;
296 myThreadId = omp_get_thread_num();
297 masterThread = (myThreadId == 0);
308 StdOut(
"Partitioning grids among threads.\n",3);
311 simDomain.InitThreads();
316 StdOut(
"Partitioning grid among threads done.\n",3);
321 ErrOut(
"Grid threading setup failed.\n");
326 StdOut(
"Threads set up, syncing advancer intervals.\n",3);
338 StdOut(
"Intervals sync'd, syncing states.\n",3);
350 StdOut(
"States sync'd.\n",3);
355 simDomain.SetTime(startTime);
360 messageStream <<
"Running PlasCom2 using PBS grids." << std::endl
361 <<
"DomainName: " << domainName << std::endl
362 <<
"SBP Order: " << interiorOrder << std::endl
363 <<
"Current Step: " << startStep << std::endl
364 <<
"Current Time: " << startTime << std::endl
368 <<
"Number of Local Grids: " << numLocalGrids << std::endl;
370 for(
int iLocalGrid = 0;iLocalGrid < numLocalGrids;iLocalGrid++){
372 int iGrid = simDomain.LocalGridIndex(iLocalGrid);
373 grid_t &simGrid(*simGrids[iGrid]);
374 const std::string &gridName(domainGridNames[iGrid]);
379 messageStream <<
"GridName: " << gridName << std::endl
382 messageStream <<
")" << std::endl
384 partitionInterval.PrettyPrint(messageStream);
385 messageStream << std::endl
386 <<
"Buffer Sizes: (";
388 messageStream <<
")" << std::endl
390 partitionBufferInterval.PrettyPrint(messageStream);
391 messageStream << std::endl
392 <<
"Number of Threads: (";
394 messageStream <<
")" << std::endl;
395 StdOut(messageStream.str(),2);
404 StdOut(
"Beginning stepping.\n",3);
413 for(
int iiStep = startStep;iiStep <
numStepsMax;iiStep++){
418 simDomain.SetStep(
iStep);
427 messageStream <<
" Step = " << iiStep
428 <<
" Time = " << simDomain.Time()
430 StdOut(messageStream.str(),1);
442 messageStream <<
"Computing DV before IO" << std::endl;
443 StdOut(messageStream.str(),1);
447 simDomain.ComputeDV(myThreadId);
452 ErrOut(
"ComputeDV failed.\n");
462 messageStream <<
"Performing IO at step " << iiStep << std::endl;
463 StdOut(messageStream.str(),1);
494 std::ostringstream errMsg;
495 errMsg <<
"Advancer returned error code (" << advanceCode
496 <<
"):" << std::endl << messageStream.str()
533 simDomain.SetNumThreads(1);
534 simDomain.SetStep(
iStep);
543 messageStream <<
"Ending at step(" <<
iStep 544 <<
") time( " << simDomain.Time()
547 StdOut(messageStream.str());
551 messageStream <<
"Computing DV before final IO" << std::endl;
552 StdOut(messageStream.str(),1);
555 simDomain.ComputeDV(myThreadId);
558 ErrOut(
"EulerPBSPeriodic: ComputeDV failed.\n");
561 messageStream <<
"Writing final dump." << std::endl;
562 StdOut(messageStream.str(),1);
573 int numGrids = simDomain.NumberOfGrids();
575 for(
int iGrid = 0;iGrid <
numGrids;iGrid++){
576 int gridDimension = simGrids[iGrid]->Dimension();
578 std::vector<size_t> &
gridSizes(simGrids[iGrid]->GridSizes());
579 for(
int iDim = 0;iDim < gridDimension;iDim++)
580 numPointsGrid *= gridSizes[iDim];
585 double *processTimes;
587 std::vector<std::vector<double> > parallelTimes;
588 std::vector<std::vector<long long> > parallelCounts;
590 simAdvancer.
GetTimers(&processTimes,&timerNames,&nTimes);
593 std::ostringstream profileStream;
594 ReportTimings(parallelTimes,timerNames,nTimes,profileStream);
595 StdOut(profileStream.str(),2);
739 std::ostream &outStream)
741 outStream <<
"# -------------------------------------------------------------------" << std::endl
742 <<
"# Routine\tMin\t\tMax\t\tMean" << std::endl
743 <<
"# ___________________________________________________________________" << std::endl;
744 outStream.setf(std::ios::left);
745 for(
int iTimer = 0;iTimer < nTimes;iTimer++){
746 outStream << std::setw(12) << timerNames[iTimer]
747 <<
"\t" << std::setw(14) << inTimers[0][iTimer]
748 <<
"\t" << std::setw(14) << inTimers[1][iTimer]
749 <<
"\t" << std::setw(14) << inTimers[2][iTimer]
755 void ReportCounters(
long long **inCounters,
const char **
timerNames,std::vector<std::string> &papiCounterNames,
756 unsigned int nTimes,std::ostream &outStream)
758 outStream <<
"# -----------------------------------------------------------------" << std::endl
760 for(
int iCount = 0;iCount < numCounters;iCount++)
761 outStream <<
"\t" << papiCounterNames[iCount];
762 outStream << std::endl
763 <<
"# _________________________________________________________________" << std::endl;
764 outStream.setf(std::ios::left);
765 for(
int iTimer = 0;iTimer < nTimes;iTimer++){
766 outStream << std::setw(12) <<
timerNames[iTimer];
767 for(
int iCount = 0;iCount < numCounters;iCount++){
768 outStream <<
"\t" << std::setw(14) << inCounters[iTimer][iCount];
770 outStream << std::endl;
virtual int ErrOut(const std::string &outstr)
void SetCommunication(bool onoff)
std::vector< size_t > numPointsGrid
plascom2::operators::sbp::base operator_t
int InitializeSolution(const GridType &inGrid, StateType &inState, StateType &inParam, std::vector< BoundaryType > &inBoundaries, const std::string &initName, const std::vector< double > &inParams, const std::vector< int > &inFlags, int threadId, std::ostream *messageStream=NULL)
pcpp::IndexIntervalType & PartitionInterval()
virtual void FunctionExit(const StackType &stackentry)
FunctionExit updates the Stack as well as the Profiler.
void const size_t const size_t * gridSizes
int FileInfo(const std::string &hdfFileName, pcpp::io::simfileinfo &fileInfo, std::ostream &messageStream)
void RenewStream(std::ostringstream &outStream)
int InitializeFieldHandles()
virtual void CopyStateData(const base &inBase)
int InitializeQuiescentState(const GridType &inGrid, StateType &inState, StateType &inParam, int threadId, std::ostream *messageStream=NULL)
pcpp::CommunicatorType comm_t
virtual int AdvanceDomain()
Advances domain, grid, and state by one step.
pcpp::IndexIntervalType interval_t
pcpp::ParallelGlobalType global_t
std::bitset< NUMFORMATBITS > formatBits
const std::vector< size_t > & BufferSizes() const
int numProcessors
Number of processors.
DomainBaseT DomainBaseType
void SetNumGrids(int nGrids)
void ReduceTimers(double *processTimes, unsigned int nTimes, std::vector< std::vector< double > > ¶llelTimes, pcpp::CommunicatorType &inCommunicator)
virtual void FunctionEntry(const StackType &stackentry)
FunctionEntry updates the Stack as well as the Profiler.
pcpp::IndexIntervalType & PartitionBufferInterval()
const std::vector< size_t > & GridSizes() const
virtual int StdOut(const std::string &outstr, unsigned char inlev=1)
Main encapsulation of MPI.
std::string GetValue(const std::string &key) const
virtual int WriteDomains()
void SetNumSteps(size_t nSteps)
std::vector< std::string > GetValueVector(const std::string &key) const
DomainInfoType domainInfo
int SetNumPointsGrid(int iGrid, size_t numPoints)
static const char * timerNames[]
void GetTimers(double **timersPtr, const char ***namesPtr, unsigned int *numTimers)
std::string ConfigKey(const std::string &configName, const std::string &keyName)
CommunicatorType globalCommunicator
virtual int InitializeAdvancer(DomainType &inDomain, pcpp::ParallelGlobalType &inGlobal, std::ostream &inStream)
Initializes the advancer object.
void ReportTimings(std::vector< std::vector< double > > &inTimers, const char **timerNames, unsigned int nTimes, std::ostream &outStream)
simulation::grid::halo halo_t
Simple Block Structured Mesh object.
fixtures::ConfigurationType appConfig
std::vector< std::string > domainNames
int numThreads
Number of threads.
bool IsSet(const std::string &Key) const
void SetTimers(bool onoff)
int FetchStateData(const std::string &fileName, const std::string &domainName, GridType &inGrid, StateType &inState, std::ostream &messageStream)