PlasCom2  1.0
XPACC Multi-physics simluation application
PC2Configuration.C
Go to the documentation of this file.
1 #include "PlasCom2.H"
2 #include "PCPPReport.H"
3 #include "PCPPUtil.H"
4 #include "PCPPIntervalUtils.H"
6 #include "PC2Util.H"
7 #include "Report.H"
8 #include "GridGenerator.H"
9 
10 namespace plascom2 {
11 
12  namespace util {
13 
15  fixtures::CommunicatorType &inCommunicator,
16  pcpp::VirtualNodeType &virtualNode,
17  std::ostream &messageStream)
18  {
19  int iopn = 0;
20  int ppn = 0;
21  if(inConfig.IsSet("VirtualNode:NumIO"))
22  iopn = inConfig.GetValue<int>("VirtualNode:NumIO");
23  if(inConfig.IsSet("VirtualNode:NumProc"))
24  ppn = inConfig.GetValue<int>("VirtualNode:NumProc");
25  int myRank = inCommunicator.Rank();
26  int numProc = inCommunicator.Size();
27  if(ppn <= 0) ppn = 1;
28  if(iopn < 0) iopn = 0;
29  if(ppn == 1){
30  virtualNode.procsPerNode = inCommunicator.Size();
31  } else {
32  virtualNode.procsPerNode = ppn;
33  }
34  int numNodes = numProc/virtualNode.procsPerNode;
35  int nodeColor = myRank/virtualNode.procsPerNode;
36  virtualNode.numNodes = numNodes;
37  inCommunicator.Split(nodeColor,myRank,virtualNode.nodeCommunicator);
38  virtualNode.nodeRank = virtualNode.nodeCommunicator.Rank();
39  virtualNode.performIO = 1;
40  virtualNode.performCompute = 1;
41  if(iopn > 0) {
42  virtualNode.ioPerNode = iopn;
43  if(virtualNode.nodeRank > 0)
44  virtualNode.performIO = 0;
45  else
46  virtualNode.performCompute = 0;
47  }
48  if(virtualNode.performIO > 0 &&
49  virtualNode.performCompute > 0){
50  virtualNode.ioCommunicator = inCommunicator;
51  virtualNode.computeCommunicator = inCommunicator;
52  virtualNode.ioRank = myRank;
53  virtualNode.computeRank = myRank;
54  } else if(virtualNode.performCompute > 0){
55  inCommunicator.Split(virtualNode.performCompute,myRank,virtualNode.computeCommunicator);
56  virtualNode.ioRank = -1;
57  virtualNode.computeRank = virtualNode.computeCommunicator.Rank();
58  } else {
59  inCommunicator.Split(virtualNode.performCompute,myRank,virtualNode.ioCommunicator);
60  virtualNode.computeRank = -1;
61  virtualNode.ioRank = virtualNode.ioCommunicator.Rank();
62  }
63  return(0);
64  };
65 
99  fixtures::CommunicatorType &inCommunicator,
100  application_t::DomainInfoType &domainPartitionInfo,
101  std::vector<application_t::DomainBaseType> &localDomains,
102  std::ostream &messageStream)
103  {
104  int numDomains = domainPartitionInfo.numDomains;
105  int numProc = inCommunicator.Size();
106  if(numDomains == 0) {
107  messageStream << "No domains to split." << std::endl;
108  return(1);
109  } else if(numDomains == 1 || numDomains > numProc) {
110  domainPartitionInfo.numLocalDomains = numDomains;
111  domainPartitionInfo.globalDomainIndex.resize(numDomains,0);
112  localDomains.resize(numDomains);
113  for(int i = 0;i < numDomains;i++){
114  localDomains[i].SetCommunicator(inCommunicator);
115  domainPartitionInfo.globalDomainIndex[i] = i;
116  }
117  messageStream << (numProc > 1 ? "Splitting " : "Assigning ")
118  << numDomains << " domain"
119  << (numDomains > 1 ? "s " : " ")
120  << (numProc > 1 ? "across " : "to ")
121  << numProc << " processor"
122  << (numProc > 1 ? "s." : ".")
123  << std::endl;
124  return(0);
125  }
126  if(domainPartitionInfo.domainNames.size() != numDomains){
127  messageStream << "Missing domain names." << std::endl;
128  return(1);
129  }
130  int myRank = inCommunicator.Rank();
131  int procsPerDomain = numProc/numDomains;
132  if(procsPerDomain <= 0){
133  messageStream << "Processors per domain is 0!?" << std::endl;
134  return(1);
135  }
136  int leftOvers = numProc%numDomains;
137  if(leftOvers > 0)
138  messageStream << "Domain splitting is lopsided with " << leftOvers
139  << " leftover processes." << std::endl;
140  int color = -1;
141  int endingRank = 0;
142  for(int i = 0;i < numDomains;i++){
143  int startingRank = endingRank;
144  endingRank += procsPerDomain;
145  if(i < leftOvers) endingRank++;
146  if(myRank <= startingRank && myRank < endingRank){
147  color = i;
148  domainPartitionInfo.numLocalDomains = 1;
149  domainPartitionInfo.globalDomainIndex.resize(1,i);
150  localDomains.resize(1);
151  messageStream << "Rank " << myRank << " taking domain "
152  << i << ": " << domainPartitionInfo.domainNames[i]
153  << std::endl;
154  }
155  }
156  inCommunicator.Split(color,myRank,localDomains[0].Communicator());
157  fixtures::CommunicatorType &domainCommunicator(localDomains[0].Communicator());
158  int domainRank = domainCommunicator.Rank();
159  int numDomainProcs = domainCommunicator.Size();
160  messageStream << "DomainRank (global,domain/domain size):" << myRank
161  << "," << domainRank << "/" << numDomainProcs << std::endl;
162  return(0);
163  }
164 
166  pcpp::PlatformInfoType &platformInfo)
167  {
168  return(0);
169  }
170  }
171 
172  template<typename GridType>
173  int GenerateGrid(GridType &inGrid,const std::string &gridName,
174  const fixtures::ConfigurationType &inConfig,
175  std::ostream &messageStream)
176  {
177  const std::string gridGenMode(inConfig.GetValue(gridName+":GeneratorMode"));
178 
179  if(gridGenMode.empty()){
180  messageStream << "GenerateGrid:Error: No generation mode specified." << std::endl;
181  return(1);
182  }
183 
184  if(gridGenMode == "Cylinder"){
185  int gridDimension = inGrid.Dimension();
186  if(gridDimension == 2) {
187  messageStream << "GenerateGrid: Generating grid with Cylinder2D." << std::endl;
188  std::vector<double> gridGenParameters(inConfig.GetValueVector<double>(gridName+":GeneratorParameters"));
189  std::vector<int> gridGenOptions(inConfig.GetValueVector<int>(gridName+":GeneratorOptions"));
190  if(gridGenParameters.empty()){
191  gridGenParameters.resize(2,.5);
192  gridGenParameters[1] = 1.5;
193  }
194  inGrid.SetGridGenerationParameters(gridGenParameters);
195  inGrid.SetGridGenerationOptions(gridGenOptions);
196  return(inGrid.GenerateGrid(gridgen::Cylinder2D,messageStream));
197  } else {
198  messageStream << "GenerateGrid:Error: 3D Cylinders not supported yet." << std::endl;
199  return(1);
200  }
201  } else {
202  messageStream << "GenerateGrid:Error: Unknown grid generation mode ("
203  << gridGenMode << ")" << std::endl;
204  return(1);
205  }
206  return(1);
207  };
208 
226 
227  {
228  FunctionEntry("Configure");
229  std::ostringstream messageStream;
230 
231  int myRank = 0;
232  if(globalCommunicator.Good())
233  myRank = globalCommunicator.Rank();
234 
235  // Populate the configuration object from the config file, or restart file
236  std::string restartFileName; // temporarily set the restartFileName here
237  std::vector<std::string> pc2Arguments(CommandLine().GetArgs());
238 
239  if(!pc2Arguments.empty()){
240  restartFileName = pc2Arguments[0];
241  SetRestart();
243  param.first="RestartFileName";
244  param.second=restartFileName;
245  appConfig.push_back(param);
246  if(pc2Arguments.size() > 1){
247  param.first="TargetFileName";
248  param.second=pc2Arguments[1];
249  appConfig.push_back(param);
250  }
251  }
252 
253  std::string configFileName(CommandLine().GetOption('c'));
254 
255  if(!configFileName.empty()){
256  StdOut(std::string("Configuration File Name: ")+configFileName+std::string("\n"),2);
257  if(pcpp::util::ProcessConfigurationFile(configFileName,appConfig,globalCommunicator,messageStream)){
258  ErrOut(messageStream.str()+std::string("\n"));
259  ErrOut(std::string("Processing configuration file ("+configFileName+std::string(") failed.\n")));
260  return(2);
261  } else {
262  // StdOut(messageStream.str(),2);
263  pcpp::io::RenewStream(messageStream);
264  // if(Configure())
265  // return(1);
266  }
267  } else if (!restartFileName.empty()) { // no configuration file specified
268  // get config from restart file (do it now)
269  if(pcpp::util::ProcessConfigurationRestart(restartFileName,appConfig,globalCommunicator,messageStream)){
270  ErrOut(messageStream.str()+std::string("\n"));
271  ErrOut(std::string("Processing configuration from restart file (")+
272  restartFileName+std::string(") failed.\n"));
273  return(2);
274  }
275  } else {
276  // Set the defaults
277  std::istringstream Istr(PC2DefaultConfiguration);
278  Istr >> appConfig;
279  }
280 
281  // Add any build information
282  ConfigureBuildInformation(appConfig);
283 
284  // Should stop if configuration not possible
285  std::string platformInfoString;
286  platformInfo.hostName.assign(globalCommunicator.Hostname());
287  if(appConfig.GetFlagValue("System:Discovery")){
288  if(globalCommunicator.Rank() == 0) {
289  platformInfo = pcpp::PlatformInfo(pcpp::SystemInfo());
290  platformInfoString = platformInfo.Pack();
291  }
292  globalCommunicator.BroadCast(platformInfoString);
293  platformInfo.UnPack(platformInfoString);
294  } else {
295  // Get platform info from configuration
296  // if(util::ConfigurePlatformInfo(appConfig,platformInfo))
297 
298  }
299 
300  // Report the platform information (if verbosity high enough)
301  std::ostringstream processInfoOut;
302  processInfoOut << "Platform Information ("
303  << globalCommunicator.Rank() << "/"
304  << globalCommunicator.Size() << "):" << std::endl
305  << "--------------------------------" << std::endl
306  << platformInfo << std::endl;
307  StdOut(processInfoOut.str(),2);
308 
309 
310  // Convert the legacy PlasComCM configuration to PlasCom2 config
311  if(appConfig.IsSet("FLUID_MODEL")){
312  if(util::ConvertLegacyConfiguration(appConfig,globalCommunicator,messageStream)){
313  ErrOut("Failed to convert legacy configuration. Messages:\n");
314  ErrOut(messageStream.str());
315  return(1);
316  }
317  if(myRank == 0){
318  std::ofstream Ouf;
319  Ouf.open("plascom2.config");
320  Ouf << appConfig << std::endl;
321  Ouf.close();
322  }
323  }
324 
325  globalCommunicator.Barrier();
326 
327  pcpp::report::Configuration(messageStream,appConfig);
328  StdOut(messageStream.str(),3);
329  pcpp::io::RenewStream(messageStream);
330 
331  globalCommunicator.Barrier();
332 
333  // If there is a simulation to do, then configure it
334  if(appConfig.IsSet("Domain:Names")){
335  int simulationConfigCode = ConfigureSimulation();
336  if(simulationConfigCode){
337  std::ostringstream errStream;
338  errStream << "Simulation failed to configure with error code ("
339  << simulationConfigCode << ")." << std::endl;
340  ErrOut(errStream.str());
341  return(simulationConfigCode);
342  }
343  }
344 
345 
346  FunctionExit("Configure");
347 
348  return(0);
349  }
350 
351 
364  {
365  FunctionEntry("ConfigGeom");
366 
367  std::ostringstream localMessages;
368 
369  std::vector<std::string> geometryNames(appConfig.GetValueVector<std::string>("Geometry:Names"));
370 
371  int numGeometries = geometryNames.size();
372  if(numGeometries == 0){
373  ErrOut("Warning: No geometry configuration specified.\n");
374  return(1);
375  }
376  geometryInfo.geometryNames = geometryNames;
377  geometryInfo.gridNames.resize(numGeometries);
378  geometryInfo.gridInfos.resize(numGeometries);
379  for(int iGeo = 0;iGeo < numGeometries;iGeo++){
380  std::string geometryName(geometryNames[iGeo]);
381  std::vector<std::string> gridNames(appConfig.GetValueVector<std::string>(geometryName+":GridNames"));
382  geometryInfo.gridNames[iGeo] = gridNames;
383  int numGeomGrids = gridNames.size();
384  geometryInfo.gridInfos[iGeo].resize(numGeomGrids);
385  std::vector<simulation::geometry::gridinfo> &gridInfos(geometryInfo.gridInfos[iGeo]);
386  for(int iGeomGrid = 0;iGeomGrid < numGeomGrids;iGeomGrid++){
387  const std::string gridName(geometryName+":"+gridNames[iGeomGrid]);
388  plascom2::util::ConfigureGridInfo(appConfig,gridName,gridInfos[iGeomGrid],
389  localMessages);
390  }
391  }
392  FunctionExit("ConfigGeom");
393 
394  return(0);
395  };
396 
409  {
410 
411  FunctionEntry("ConfigDomains");
412 
413  std::ostringstream localMessages;
414 
415  std::vector<std::string> domainNames(appConfig.GetValueVector<std::string>("Domain:Names"));
416 
417  int numDomains = domainNames.size();
418 
419  // Should never do this because of check in caller
420  if(numDomains == 0){
421  numDomains = 1;
422  domainNames.resize(numDomains,"Domain");
423  }
424 
425  if(numDomains > 1){
426  ErrOut("Error: Only single domain simulations are currently supported.\n");
427  FunctionExit("ConfigDomains");
428  return(1);
429  }
430 
431  domainInfo.numDomains = numDomains;
432  domainInfo.domainNames = domainNames;
433 
434  localMessages << "Number of domains: " << numDomains << std::endl
435  << "Domain Names: ";
436  std::vector<std::string>::iterator dnIt = domainNames.begin();
437  while(dnIt != domainNames.end())
438  localMessages << *dnIt++ << " ";
439  localMessages << std::endl;
440  DebugOut(localMessages.str());
441  pcpp::io::RenewStream(localMessages);
442 
443  // Not sure splitting should be done here, no harm when only one domain
444  std::ostringstream messageStream;
445  DebugOut("Splitting domains.\n");
446  if(util::SplitDomains(appConfig,globalCommunicator,domainInfo,appDomains,messageStream)){
447  ErrOut("Domain splitting failed:\n");
448  ErrOut(messageStream.str());
449  FunctionExit("ConfigDomains");
450  return(1);
451  } else {
452  StdOut(messageStream.str(),2);
453  pcpp::io::RenewStream(messageStream);
454  }
455  DebugOut("Domains split.\n");
456 
457 
458  DebugOut("Configuring domains.\n");
459  domainAdvancers.resize(numDomains,NULL);
460  domainInitializers.resize(numDomains);
461  for(int iDomain = 0;iDomain < numDomains;iDomain++){
462  std::string &domainName(domainInfo.domainNames[iDomain]);
463  localMessages << "Configuring domain: " << domainName << std::endl;
464  DebugOut(localMessages.str());
465  pcpp::io::RenewStream(localMessages);
466  int globalDomainIndex = domainInfo.globalDomainIndex[iDomain];
467  fixtures::ConfigurationType domainConfig(pcpp::util::ExtractConfigParams(appConfig,domainName));
468  if(appDomains[iDomain].ConfigureDomain(domainConfig,messageStream)){
469  messageStream << "Domain(" << iDomain+1 << ") \"" << domainName << "\""
470  << " failed to configure." << std::endl;
471  ErrOut(messageStream.str());
472  FunctionExit("ConfigDomains");
473  return(1);
474  }
475  // Set the Geometry Info
476  appDomains[iDomain].SetGeometryInfo(geometryInfo);
477  }
478 
479  DebugOut("Domains configured.\n");
480 
481  FunctionExit("ConfigDomains");
482  return(0);
483  }
484 
499  std::string VirtualNodeReport(pcpp::VirtualNodeType &virtualNode)
500  {
501  std::ostringstream Ostr;
502  Ostr << "VirtualNode:NumNodes = " << virtualNode.numNodes << std::endl
503  << "VirtualNode:PPN = " << virtualNode.procsPerNode << std::endl
504  << "VirtualNode:ioPerNode = " << virtualNode.ioPerNode << std::endl
505  << "VirtualNode:performIO = " << virtualNode.performIO << std::endl
506  << "VirtualNode:performCompute = " << virtualNode.performCompute << std::endl;
507  if(virtualNode.ioRank > -1){
508  Ostr << "VirtualNode:ioRank = " << virtualNode.ioRank << "/"
509  << virtualNode.ioCommunicator.Size() << std::endl;
510  }
511  if(virtualNode.computeRank > -1) {
512  Ostr << "VirtualNode:computeRank = " << virtualNode.computeRank << "/"
513  << virtualNode.computeCommunicator.Size() << std::endl;
514  }
515  return(Ostr.str());
516  }
517 
518 
537  {
538  FunctionEntry("ConfigSim");
539  std::ostringstream messageStream;
540 
541  // Configure the virtual node(s)
542  int configureVirtualNodeCode = util::ConfigureVirtualNode(appConfig,globalCommunicator,
543  virtualNode,messageStream);
544 
545  // Report the virtual node confguration
546  if(configureVirtualNodeCode){
547  ErrOut("Configuration of virtual node failed.\n");
548  return(configureVirtualNodeCode);
549  } else {
550  StdOut(messageStream.str());
551  pcpp::io::RenewStream(messageStream);
552  }
553  StdOut(VirtualNodeReport(virtualNode),2);
554 
555  // Configure the geometries
556  int configureGeometryCode = ConfigureGeometries();
557  if(configureGeometryCode){
558  ErrOut("Configuration of geometries failed.\n");
559  return(configureGeometryCode);
560  }
561 
562  // Configure the domains
563  int configureDomainsCode = ConfigureDomains();
564  if(configureDomainsCode){
565  ErrOut("Configuration of domains failed.\n");
566  return(configureDomainsCode);
567  }
568 
569  numStepsMax = appConfig.GetValue<int>(ConfigKey("PlasCom2","NumSteps"));
570  if(numStepsMax < 0)
571  numStepsMax = appConfig.GetValue<int>(ConfigKey("PlasCom2","NumStepsMax"));
572  if(numStepsMax < 0)
573  numStepsMax = 0;
574 
575  numStepsIO = appConfig.GetValue<int>(ConfigKey("PlasCom2","NumStepsIO"));
576  numStepsStatus = appConfig.GetValue<int>(ConfigKey("PlasCom2","NumStepsStatus"));
577 
578 
579  // Make a list of all the grid names for the local domains
580  // domains might get split again according to grids.
581  std::list<std::string> allLocalGridNames;
582  int numLocalDomains = domainInfo.numLocalDomains;
583  for(int iDomain = 0;iDomain < numLocalDomains;iDomain++){
584  int globalDomainIndex = domainInfo.globalDomainIndex[iDomain];
585  std::vector<std::string> domainGridNames(appDomains[iDomain].GridNames());
586  std::vector<std::string>::iterator dnIt = domainGridNames.begin();
587  while(dnIt != domainGridNames.end())
588  allLocalGridNames.push_back(*dnIt++);
589  }
590  allLocalGridNames.sort();
591  allLocalGridNames.unique();
592  int numAllLocalGrids = allLocalGridNames.size();
593 
594  // ----- FIXME - right now hard-code to single domain/single grid -----
595  if(numLocalDomains > 0){
596 
597  int globalDomainIndex = domainInfo.globalDomainIndex[0]; // hardcode to one (first) domain
598  DomainBaseType &simDomain(appDomains[0]);
599  DomainBaseType::gridvector &domainGrids(simDomain.Grids());
600  DomainBaseType::statevector &gridStates(simDomain.States());
601  DomainBaseType::statevector &gridParams(simDomain.Params());
602 
603  const std::vector<std::string> &domainGridNames(simDomain.GridNames());
604  int numGlobalGrids = domainGridNames.size();
605 
606  pcpp::CommunicatorType &domainComm(simDomain.Communicator());
607  int numProcDomain = domainComm.Size();
608  int myDomainRank = domainComm.Rank();
609 
610  // Partition the grids among processors
611  simDomain.PartitionDomain(0);
612 
613  std::vector<int> &globalGridIndices(simDomain.LocalGridIndices());
614  int numLocalGrids = simDomain.NumberOfLocalGrids();
615  // std::cout << "Number of local grids: " << numLocalGrids << std::endl;
616  for(int iLocalGrid = 0;iLocalGrid < numLocalGrids;iLocalGrid++){
617 
618  int iGrid = globalGridIndices[iLocalGrid];
619  // std::cout << "Processing grid(" << iLocalGrid << "," << iGrid << ")"
620  // << std::endl;
621  const std::string &gridName(domainGridNames[iGrid]);
622 
623  domainGrids[iGrid] = new GridType;
624  gridStates[iGrid] = new StateType;
625  gridParams[iGrid] = new StateType;
626 
627  GridType &domainGrid(*domainGrids[iGrid]);
628  StateType &gridState(*gridStates[iGrid]);
629  StateType &paramState(*gridParams[iGrid]);
630 
631  pcpp::CommunicatorType &domainGridComm(simDomain.GridCommunicator(iGrid));
632 
633  bool generateGrid = false;
634  bool readGrid = false;
635  std::string gridFileName;
636 
637  int gridConfigCode = plascom2::util::ConfigureGrid<GridType>(appConfig,gridName,domainGrid,messageStream);
638 
639  if(gridConfigCode){
640  messageStream << "Grid(" << iGrid << "," << iLocalGrid << "," << gridName
641  << ") failed to configure." << std::endl;
642  ErrOut(messageStream.str());
643  return(gridConfigCode);
644  } else {
645  StdOut("++++++++++++\n",2);
646  StdOut("Grid Configuration Messages:\n",2);
647  StdOut(messageStream.str(),2);
648  StdOut("++++++++++++\n",2);
649  pcpp::io::RenewStream(messageStream);
650  if(appConfig.IsSet(ConfigKey(gridName,"GenerateGrid")))
651  generateGrid = appConfig.GetFlagValue(ConfigKey(gridName,"GenerateGrid"));
652  if(appConfig.IsSet(ConfigKey(gridName,"ReadGrid")))
653  readGrid = appConfig.GetFlagValue(ConfigKey(gridName,"ReadGrid"));
654  if(!generateGrid){
655  if(appConfig.IsSet(ConfigKey(gridName,"GridFile"))){
656  gridFileName = appConfig.GetValue(ConfigKey(gridName,"GridFile"));
657  } else if(Restart()) {
658  gridFileName = appConfig.GetValue("RestartFileName");
659  } else {
660  StdOut("WARNING: Setting up without grid data. Consequences unknown.\n");
661  }
662  }
663  if(readGrid && gridFileName.empty()){
664  ErrOut("ReadGrid set but no grid file specified.\n");
665  return(1);
666  }
667  }
668 
669  // @todo Need to examine the following boundary handling block for multiple grids
670  {
671  // std::cout << "Configuring grid domain boundaries for GridID: " << iGrid+1 << std::endl;
672  int domainBoundaryConfigCode = simDomain.ConfigureGridDomainBoundaries(appConfig,iGrid,messageStream);
673 
674  if(domainBoundaryConfigCode){
675  messageStream << "Domain boundaries failed to configure." << std::endl;
676  ErrOut(messageStream.str());
677  return(domainBoundaryConfigCode);
678  } else {
679  StdOut(messageStream.str(),2);
680  pcpp::io::RenewStream(messageStream);
681  }
682  }
683 
684  int gridType = domainGrid.Type();
685  messageStream << "Grid (" << gridName << ") has gridType("
686  << gridType << ")" << std::endl;
687  if(true) {
688 
689  typedef GridType::HaloType HaloType;
690 
691 
692  pcpp::CommunicatorType &gridComm(domainGrid.Communicator());
693  std::vector<size_t> &gridSizes(domainGrid.GridSizes());
694  std::vector<double> &physicalExtent(domainGrid.PhysicalExtent());
695  std::vector<bool> &isPeriodic(domainGrid.PeriodicDirs());
696  int numDim = gridSizes.size();
697 
698  if(isPeriodic.empty())
699  isPeriodic.resize(numDim,false);
700 
701 
702  size_t numGlobalNodes = 1;
703  size_t numGlobalCells = 1;
704 
705  for(int iDim = 0;iDim < numDim;iDim++){
706  numGlobalNodes *= gridSizes[iDim];
707  numGlobalCells *= (gridSizes[iDim]-1);
708  }
709 
710  if((gridType < simulation::grid::RECTILINEAR || generateGrid) && !readGrid){
711 
712  std::vector<double> dX(numDim,0);
713 
714  if(physicalExtent.empty()){
715  physicalExtent.resize(numDim*2,0);
716  for(int iDim = 0;iDim < numDim;iDim++)
717  physicalExtent[2*iDim+1] = 1.0;
718  }
719 
720  for(int iDim = 0;iDim < numDim;iDim++){
721  dX[iDim] = (physicalExtent[2*iDim+1]-physicalExtent[2*iDim])/static_cast<double>(gridSizes[iDim]-1);
722  }
723 
724  domainGrid.SetGridSpacings(dX);
725  }
726 
727  int spatialOrder = simDomain.SpatialOrder();
728 
729  if(!plascom2::operators::sbp::IsValidOrder(spatialOrder)){
730  messageStream << "ERROR! Invalid spatial order specified." << std::endl;
731  ErrOut(messageStream.str());
732  return(1);
733  }
734 
735  int interiorOrder = (spatialOrder - 1)*2;
736  DomainBaseType::OperatorType &inOperator(simDomain.Operator());
737  plascom2::operators::sbp::Initialize(inOperator,interiorOrder);
738 
741  // int boundaryDepth = inOperator.boundaryDepth;
742  int boundaryDepth = std::max(3,inOperator.boundaryDepth+1);
743  // int boundaryDepth = std::max(3,interiorOrder+1);
744 
745  std::vector<int> haloDepths(2*numDim,boundaryDepth);
746 
747  // pcpp::ParallelTopologyInfoType cartInfo;
748  if(true){
749 
750  // determine which domain boundaries have bc's in this domain
751  // Grab the grid-specific boundaries for this grid
752  // Check the direction of each one
754  std::vector<DomainBaseType::BoundaryType> &gridBoundaries(simDomain.GridBoundaries(iGrid));
755 
756  messageStream << "Processing " << gridBoundaries.size() << " boundaries."
757  << std::endl;
758  StdOut(messageStream.str(),2);
759  pcpp::io::RenewStream(messageStream);
760 
761  std::vector<DomainBaseType::BoundaryType>::iterator boundIt = gridBoundaries.begin();
762 
763  int processingBoundary = 1;
764  while(boundIt != gridBoundaries.end()){
765 
766  // std::cout << "Boundary " << processingBoundary++ << std::endl;
767  DomainBaseType::BoundaryType &gridBoundary(*boundIt++);
768  DomainBaseType::BCType &boundaryCondition(gridBoundary.BC());
769  DomainBaseType::GridType &boundaryGrid(gridBoundary.Grid());
770 
771  const std::string &boundaryName(gridBoundary.Name());
772  std::vector<size_t> &boundaryGridSizes(boundaryGrid.GridSizes());
773  assert(!boundaryGridSizes.empty());
774  // std::cout << "Boundary name: " << boundaryName << std::endl;
775  std::vector<simulation::grid::subregion> &gridSubRegions(boundaryGrid.SubRegions());
776  int numSubRegions = gridSubRegions.size();
777  // std::cout << "Number of subregions: " << numSubRegions << std::endl;
778  int gridSubRegionIndex = gridBoundary.GridRegionID();
779  if(gridSubRegionIndex >= numSubRegions){
780  messageStream << "Boundary subregion out of range" << std::endl;
781  return(1);
782  }
783  // std::cout << "Subregion index: " << gridSubRegionIndex << std::endl;
784  simulation::grid::subregion &gridRegion(gridSubRegions[gridSubRegionIndex]);
785  int direction = std::abs(gridRegion.normalDirection)-1;
786  pcpp::IndexIntervalType &regionInterval(gridRegion.regionInterval);
787  assert(!regionInterval.empty());
788 
789  if(gridRegion.normalDirection != 0){
790  // std::cout << "Normal direction: " << gridRegion.normalDirection << std::endl;
791  if((gridRegion.regionInterval[direction].first == 0) ||
792  (gridRegion.regionInterval[direction].second == (boundaryGridSizes[direction] - 1))){
793  isPeriodic[direction] = false;
794  } else {
795  // std::cout << "Lies off domain boundary." << std::endl;
796  }
797  messageStream << "Domain [" << boundaryName << "] boundary in direction "
798  << (gridRegion.normalDirection > 0 ? "-" : "+") << "X"
799  << direction+1 << " has BC [" << boundaryCondition.BCName()
800  << "]." << std::endl;
801  } else {
802  messageStream << "Domain [" << boundaryName << "] is a subregion of type ["
803  << boundaryCondition.BCName() << "]." << std::endl;
804  }
805 
806  }
807 
808  messageStream << "Setting up domain with PERIODIC directions (";
809  pcpp::io::DumpContents(messageStream,isPeriodic,",");
810  messageStream << ")" << std::endl;
811  StdOut(messageStream.str(),2);
812  pcpp::io::RenewStream(messageStream);
813  }
814 
815  pcpp::ParallelTopologyInfoType pbsCartInfo;
816  pbsCartInfo.numDimensions = numDim;
817  pbsCartInfo.isPeriodic.resize(numDim,0);
818  for(int iDim = 0;iDim < numDim;iDim++)
819  if(isPeriodic[iDim]) pbsCartInfo.isPeriodic[iDim] = 1;
820 
821  // Check for grid-guidance on partitioning
822  // (any such guidance came from the grid config earlier)
824  std::vector<int> &decompDirs(domainGrid.DecompDirs());
825  if(!decompDirs.empty()){
826  pbsCartInfo.cartDecompDirections = decompDirs;
827  }
828 
829  pcpp::comm::SetupCartesianTopology(domainGridComm,pbsCartInfo,gridComm,messageStream);
830 
831  // Grab the local coordinates and global dimension of the Cartesian topo
832  std::vector<int> &cartCoords(gridComm.CartCoordinates());
833  std::vector<int> &cartDims(gridComm.CartDimensions());
834 
835  // Generate a report of the Cartesian setup and put it the messageStream
836  pcpp::report::CartesianSetup(messageStream,pbsCartInfo);
837 
838  pcpp::IndexIntervalType &partitionInterval(domainGrid.PartitionInterval());
839  pcpp::IndexIntervalType globalInterval;
840  globalInterval.InitSimple(gridSizes);
841 
842  // === Partition the grid ===
843  if(pcpp::util::PartitionCartesianInterval(globalInterval,cartDims,cartCoords,
844  partitionInterval,messageStream)){
845  messageStream << "ConfigureDomain:SetupSimulationFixtures:Error: Partitioning failed." << std::endl;
846  ErrOut(messageStream.str());
847  return(1);
848  }
849 
850  std::vector<size_t> extendGrid(2*numDim,0);
851  // std::vector<bool> isPeriodic(numDim,true);
852  size_t numPointsPart = partitionInterval.NNodes();
853 
854  std::vector<bool> haveNeighbors(2*numDim,true);
855  for(int iDim = 0;iDim < numDim; iDim++){
856  if(isPeriodic[iDim]){
857  extendGrid[2*iDim] = haloDepths[2*iDim];
858  extendGrid[2*iDim+1] = haloDepths[2*iDim+1];
859  } else {
860  if(partitionInterval[iDim].first == 0) {
861  haveNeighbors[2*iDim] = false;
862  } else {
863  extendGrid[2*iDim] = haloDepths[2*iDim];
864  }
865  if(partitionInterval[iDim].second == (gridSizes[iDim]-1)){
866  haveNeighbors[2*iDim + 1] = false;
867  } else {
868  extendGrid[2*iDim + 1] = haloDepths[2*iDim+1];
869  }
870  }
871  }
872 
873  messageStream << "ConfigureDomain: Configuring grid extensions (";
874  pcpp::io::DumpContents(messageStream,extendGrid,",");
875  messageStream << ")" << std::endl;
876  StdOut(messageStream.str(),2);
877  pcpp::io::RenewStream(messageStream);
878 
879  domainGrid.SetDimensionExtensions(extendGrid);
880 
881  if(domainGrid.Finalize()){ // generates coordinates if true is passed
882  messageStream << "TestFixtures:SetupSimulationFixtures:Error: Grid finalization failed." << std::endl;
883  return(1);
884  }
885 
886  messageStream << simulation::report::Grid(domainGrid) << std::endl;
887  StdOut(messageStream.str(),2);
888  pcpp::io::RenewStream(messageStream);
889 
890 
891  const std::vector<size_t> &bufferSizes(domainGrid.BufferSizes());
892  // const pcpp::IndexIntervalType &partitionInterval(domainGrid.PartitionInterval());
893  const pcpp::IndexIntervalType &partitionBufferInterval(domainGrid.PartitionBufferInterval());
894  size_t numPointsBuffer = domainGrid.BufferSize();
895 
896  // Set up the HALO data structure for this grid/geometry
897  HaloType &inHalo(domainGrid.Halo());
898  inHalo.SetGridInterval(globalInterval);
899  inHalo.SetPartitionInterval(partitionInterval);
900 
901  // This forces the halo to have neighbors even on
902  // partitions with domain boundaries.
903  inHalo.SetNeighbors(haveNeighbors);
904  inHalo.SetPeriodicDirs(pbsCartInfo.isPeriodic);
905 
906  std::vector<pcpp::IndexIntervalType> remoteHaloExtents(inHalo.CreateRemoteHaloExtents(extendGrid));
907  std::vector<pcpp::IndexIntervalType> localHaloExtents(inHalo.CreateLocalHaloExtents(extendGrid));
908 
909  inHalo.SetLocalBufferSizes(bufferSizes);
910  inHalo.SetLocalPartitionExtent(partitionBufferInterval);
911 
912  inHalo.SetRemoteHaloExtents(remoteHaloExtents);
913  inHalo.SetLocalHaloExtents(localHaloExtents);
914 
915  const std::vector<pcpp::IndexIntervalType> &remoteHaloBufferExtents(inHalo.RemoteHaloBufferExtents());
916  const std::vector<pcpp::IndexIntervalType> &localHaloBufferExtents(inHalo.LocalHaloBufferExtents());
917 
918  inHalo.CreateSimpleSendIndices();
919  inHalo.CreateSimpleRecvIndices();
920  }
921 
922  if(true) {
923 
925  int numScalar = 0;
926  bool withFlux = false;
927  if(simDomain.CreateData(iGrid,messageStream)){
928  messageStream << "Domain data creation failed." << std::endl;
929  ErrOut(messageStream.str());
930  pcpp::io::RenewStream(messageStream);
931  return(1);
932  } else {
933  messageStream << "Domain data created." << std::endl;
934  StdOut(messageStream.str(),2);
935  pcpp::io::RenewStream(messageStream);
936  }
937  }
938 
939  int refLengthHandle = paramState.GetFieldIndex("refLength");
940  if(refLengthHandle >= 0){
941  double *refLengthPtr = paramState.GetFieldBuffer<double>("refLength");
942  double refLengthValue = *refLengthPtr;
943  if(refLengthValue > 0){
944  std::vector<double> lengthScale(domainGrid.Dimension(),1.0/refLengthValue);
945  domainGrid.SetScaleFactor(lengthScale);
946  }
947  }
948 
949  if(gridType < simulation::grid::RECTILINEAR && !readGrid){
950  generateGrid = true;
951  }
952 
953  bool coordinatesReady = false;
954  int generatorReturnCode = 0;
955  if(generateGrid && !readGrid){
956  const std::string generatorMode(appConfig.GetValue(gridName+":GeneratorMode"));
958  if(gridType < simulation::grid::RECTILINEAR || generatorMode == "Uniform" ||
959  generatorMode == "Uniform-rectangular"){
960  generatorReturnCode = domainGrid.GenerateCoordinates(messageStream);
961  } else {
962  generatorReturnCode = GenerateGrid(domainGrid,gridName,appConfig,messageStream);
963  }
964  if(generatorReturnCode == 0){
965  coordinatesReady = true;
966  } else {
967  ErrOut("PC2Configuration::Generate grid coordinates failed with messages:\n");
968  ErrOut(messageStream.str());
969  return(1);
970  }
971  } else if(!gridFileName.empty()){
972  if(pcpp::io::hdf5::FetchGridData(domainGrid,gridName,gridFileName,messageStream)){
973  ErrOut(std::string("Fetch grid data failed:\n")+messageStream.str()+std::string("\n"));
974  return(1);
975  } else {
976  StdOut(std::string("Read grid data for (")+gridName+
977  std::string(") from ")+gridFileName+std::string(".\n"),2);
978  StdOut(messageStream.str(),2);
979  pcpp::io::RenewStream(messageStream);
980  coordinatesReady = true;
981  }
982  } else {
983  StdOut("WARNING: No grid coordinate data. Unsure what's next.");
984  }
985  domainGrid.SetType(gridType);
986 
987  if(coordinatesReady)
988  domainGrid.ExchangeCoordinates();
989 
990  } // End of loop over local grids
991 
992  // Report the domain configuration
993  // int numDomains = appDomains.size();
994  std::ostringstream domainReportStream;
995  domainReportStream << "====== Domain Report =======" << std::endl;
996 
997  for(int iDomain = 0;iDomain < domainInfo.numLocalDomains;iDomain++){
998  std::string domainName(domainInfo.domainNames[iDomain]);
999  int globalDomainIndex2 = domainInfo.globalDomainIndex[iDomain];
1000  domainReportStream << "------" << domainName << "------" << std::endl;
1001  domainReportStream << "Domain ID (local,global) = (" << iDomain+1 << ","
1002  << globalDomainIndex2+1 << ")" << std::endl;
1003  domainReportStream << appDomains[iDomain].Report() << std::endl;
1004  }
1005 
1006  StdOut(domainReportStream.str(),2);
1007 
1008 #ifdef USE_OVERKIT
1009  int error = InitializeOverkit();
1010  if (error) {
1011  ErrOut("Overkit failed to initialize.\n");
1012  return(error);
1013  }
1014  ConfigureOverkit();
1015 #endif
1016 
1017  }
1018 
1019  FunctionExit("ConfigSim");
1020  return(0);
1021  }
1022 
1023 #ifdef USE_OVERKIT
1024  int application::InitializeOverkit() {
1025 
1026  ovk_log_level LogLevel = OVK_LOG_ERRORS;
1027  if (VerbLevel() >= 1) LogLevel = ovk_log_level(LogLevel | OVK_LOG_WARNINGS);
1028  if (VerbLevel() >= 2) LogLevel = ovk_log_level(LogLevel | OVK_LOG_STATUS);
1029 
1030  ovk_context_params *contextParams;
1031  ovkCreateContextParams(&contextParams);
1032  ovkSetContextParamComm(contextParams, globalCommunicator.GetCommunicator());
1033  ovkSetContextParamLogLevel(contextParams, LogLevel);
1034  ovkSetContextParamErrorHandlerType(contextParams, OVK_ERROR_HANDLER_RETURN);
1035 
1036  int error = ovkCreateContext(&overkitData.context, contextParams);
1037  if (error != OVK_ERROR_NONE) {
1038  return(1);
1039  }
1040 
1041  ovkDestroyContextParams(&contextParams);
1042 
1043  return(0);
1044 
1045  }
1046 
1047  int application::FinalizeOverkit() {
1048 
1049  ovkDestroyContext(&overkitData.context);
1050 
1051  return(0);
1052 
1053  }
1054 
1055  int application::ConfigureOverkit() {
1056 
1057  overkitData.domains.resize(domainInfo.numLocalDomains);
1058 
1059  for (int iDomain = 0; iDomain < domainInfo.numLocalDomains; iDomain++) {
1060 
1061  DomainBaseType &simDomain(appDomains[iDomain]);
1062  DomainBaseType::gridvector &domainGrids(simDomain.Grids());
1063  const std::vector<std::string> &domainGridNames(simDomain.GridNames());
1064 
1065  // Overkit currently assumes all grids within a domain have the same dimension (now that
1066  // I think about it, I'm not sure this is a good assumption...)
1067  int numDim = domainGrids[0]->GridSizes().size();
1068 
1069  ovk_domain_params *domainParams;
1070  ovkCreateDomainParams(overkitData.context, &domainParams);
1071  ovkSetDomainParamName(domainParams, simDomain.Name().c_str());
1072  ovkSetDomainParamDimension(domainParams, numDim);
1073  ovkSetDomainParamComm(domainParams, simDomain.Communicator().GetCommunicator());
1074 
1075  ovkCreateDomain(overkitData.context, &overkitData.domains[iDomain], domainParams);
1076 
1077  ovkDestroyDomainParams(overkitData.context, &domainParams);
1078 
1079  DomainBaseType::gridvector::iterator gridIt = domainGrids.begin();
1080 
1081  for (int iGrid = 0; iGrid < simDomain.NumberOfGrids(); iGrid++) {
1082 
1083  int gridID = iGrid+1;
1084 
1085  // Assume single grid for now
1086 // if ((*gridIt)-><ID>() == gridID) {
1087  if (true) {
1088 
1089  GridType &domainGrid(**gridIt);
1090 
1091  pcpp::CommunicatorType &gridComm(domainGrid.Communicator());
1092  pcpp::IndexIntervalType &partitionInterval(domainGrid.PartitionInterval());
1093  std::vector<bool> &isPeriodic(domainGrid.PeriodicDirs());
1094  std::vector<int> &cartCoords(gridComm.CartCoordinates());
1095  std::vector<int> &cartDims(gridComm.CartDimensions());
1096 
1097  // Local index range
1098  int localBegin[3] = {0}, localEnd[3] = {1};
1099  for (int d = 0; d < numDim; ++d) {
1100  localBegin[d] = partitionInterval[d].first;
1101  localEnd[d] = partitionInterval[d].second + 1;
1102  }
1103 
1104  // Periodicity
1105  bool periodic[3] = {false};
1106  for (int d = 0; d < numDim; ++d) {
1107  periodic[d] = isPeriodic[d];
1108  }
1109 
1111  // Temporary hack to get the global grid size
1112  int numPointsGlobal[3] = {1};
1113  MPI_Allreduce(localEnd, numPointsGlobal, numDim, MPI_INT, MPI_MAX,
1114  gridComm.GetCommunicator());
1115 
1116  // Neighboring ranks
1117  int neighborOffsetLower[3] = {0}, neighborOffsetUpper[3] = {0};
1118  int numNeighbors = 1;
1119  for (int d = 0; d < numDim; ++d) {
1120  neighborOffsetLower[d] = cartCoords[d] > 0 ? -1 : 0;
1121  neighborOffsetUpper[d] = cartCoords[d] < cartDims[d]-1 ? 1 : 0;
1122  numNeighbors *= neighborOffsetUpper[d]-neighborOffsetLower[d]+1;
1123  }
1124  --numNeighbors; // Don't count self as a neighbor
1125  std::vector<int> neighborRanks(numNeighbors);
1126  int iNeighbor = 0;
1127  for (int k = neighborOffsetLower[2]; k <= neighborOffsetUpper[2]; ++k) {
1128  for (int j = neighborOffsetLower[1]; j <= neighborOffsetUpper[1]; ++j) {
1129  for (int i = neighborOffsetLower[0]; i <= neighborOffsetUpper[0]; ++i) {
1130  if (i != 0 || j != 0 || k != 0) {
1131  int neighborOffset[3] = {i, j, k};
1132  int neighborCoords[3] = {0};
1133  for (int d = 0; d < numDim; ++d) {
1134  neighborCoords[d] = cartCoords[d] + neighborOffset[d];
1135  }
1136  MPI_Cart_rank(gridComm.GetCommunicator(), neighborCoords,
1137  &neighborRanks[iNeighbor]);
1138  ++iNeighbor;
1139  }
1140  }
1141  }
1142  }
1143 
1144  ovk_grid_params *gridParams;
1145  ovkCreateGridParams(overkitData.domains[iDomain], &gridParams);
1146  ovkSetGridParamID(gridParams, gridID);
1147  ovkSetGridParamName(gridParams, domainGridNames[iGrid].c_str());
1148  ovkSetGridParamComm(gridParams, gridComm.GetCommunicator());
1149  ovkSetGridParamSize(gridParams, numPointsGlobal);
1150  ovkSetGridParamPeriodic(gridParams, periodic);
1151 // ovkSetGridParamPeriodicStorage(gridParams, <PeriodicStorage>);
1152 // ovkSetGridParamPeriodicLength(gridParams, <PeriodicLength>);
1153 // ovkSetGridParamGridType(gridParams, <GridType>);
1154  ovkSetGridParamLocalBegin(gridParams, localBegin);
1155  ovkSetGridParamLocalEnd(gridParams, localEnd);
1156  ovkSetGridParamNeighborRanks(gridParams, numNeighbors, &neighborRanks[0]);
1157 
1158  ovkCreateGridLocal(overkitData.domains[iDomain], NULL, gridParams);
1159 
1160  ovkDestroyGridParams(overkitData.domains[iDomain], &gridParams);
1161 
1162  ++gridIt;
1163 
1164  } else {
1165 
1166  ovkCreateGridRemote(overkitData.domains[iDomain], NULL);
1167 
1168  }
1169 
1170  }
1171 
1172  }
1173 
1174  return(0);
1175  }
1176 #endif
1177 
1178 }
1179 
1180 
std::vector< int > cartDecompDirections
Definition: PCPPCommUtil.H:22
int GenerateGrid(GridType &inGrid, const std::string &gridName, const fixtures::ConfigurationType &inConfig, std::ostream &messageStream)
pcpp::IndexIntervalType regionInterval
Definition: Grid.H:39
int ConfigureVirtualNode(const fixtures::ConfigurationType &inConfig, fixtures::CommunicatorType &inCommunicator, pcpp::VirtualNodeType &virtualNode, std::ostream &messageStream)
DomainBaseType::GridType GridType
Definition: Simulation.H:30
int SplitDomains(const fixtures::ConfigurationType &inConfig, fixtures::CommunicatorType &inCommunicator, application_t::DomainInfoType &domainPartitionInfo, std::vector< application_t::DomainBaseType > &localDomains, std::ostream &messageStream)
Parititon domains among processors.
int ProcessConfigurationFile(const std::string &configFileName, pcpp::ConfigType &plascomConfig, pcpp::CommunicatorType &globalCommunicator, std::ostream &messageStream)
Populate a configuration object from file in parallel.
Definition: PCPPUtil.C:326
void const size_t const size_t * gridSizes
Definition: EulerKernels.H:10
void RenewStream(std::ostringstream &outStream)
void const size_t const size_t const size_t const int const int * gridType
Definition: EulerKernels.H:10
CommunicatorType computeCommunicator
Definition: PCPPTypes.H:71
Definition: PC2IO.H:10
void CartesianSetup(std::ostream &outStream, const std::vector< int > &cartCoords, const std::vector< int > &cartDims)
Definition: PCPPReport.C:199
const std::string PC2DefaultConfiguration(std::string("System:Discovery = OFF\)+std::string("PlasCom2:RunMode=BareBones\"))
int ProcessConfigurationRestart(const std::string &restartFileName, pcpp::ConfigType &inConfig, pcpp::CommunicatorType &configCommunicator, std::ostream &messageStream)
Populate a configuration object from an HDF5 restart file.
Definition: PCPPUtil.C:396
int FetchGridData(GridType &inGrid, const std::string &gridName, const std::string &gridFileName, std::ostream &messageStream)
Definition: PCPPHDF5.H:1746
DomainBaseType::StateType StateType
Definition: Simulation.H:31
DomainBaseT DomainBaseType
Definition: Simulation.H:29
CommunicatorType ioCommunicator
Definition: PCPPTypes.H:70
std::vector< int > isPeriodic
Definition: PCPPCommUtil.H:24
void const size_t const size_t const int const size_t const size_t const size_t const size_t const int const double const double const double const double const double const double const double const double const int * numScalar
Definition: SATKernels.H:10
virtual int ConfigureApplication()
Read & BC configuration, process application-wide configuration.
void ConfigureBuildInformation(fixtures::ConfigurationType &inConfig)
void Configuration(std::ostream &outStream, const fixtures::ConfigurationType &inConfig)
Definition: PCPPReport.C:186
pcpp::ConfigType ExtractConfigParams(const fixtures::ConfigurationType &inConfig, const std::string &configName)
Definition: PCPPUtil.C:70
Main encapsulation of MPI.
Definition: COMM.H:62
int Cylinder2D(const std::vector< int > &inOptions, const std::vector< double > &inParameters, const std::vector< size_t > &gridSizes, const std::vector< size_t > &ij, std::vector< double > &xy)
int ConfigureGeometries()
Configure simulation geometries.
std::string Grid(const GridType &inGrid)
Definition: Report.H:14
std::string GetValue(const std::string &key) const
Definition: Parameters.C:24
CommunicatorType nodeCommunicator
Definition: PCPPTypes.H:69
std::vector< std::string > GetValueVector(const std::string &key) const
Definition: Parameters.C:36
std::string VirtualNodeReport(pcpp::VirtualNodeType &virtualNode)
Reports the virtual node setup.
int ConvertLegacyConfiguration(fixtures::ConfigurationType &inConfig, fixtures::CommunicatorType &inCommunicator, std::ostream &messageStream)
Definition: PC2Util.C:471
void DumpContents(std::ostream &Ostr, const ContainerType &c, std::string del="\)
Dump container contents.
Definition: AppTools.H:117
virtual int ConfigureSimulation()
Configure simluation-specific constructs.
std::vector< int > globalDomainIndex
Definition: Domain.H:28
std::string SystemInfo()
Definition: UnixUtils.C:99
void const size_t const size_t * bufferSizes
Definition: MetricKernels.H:19
int PartitionCartesianInterval(const pcpp::IndexIntervalType &globalExtent, const std::vector< int > &cartDims, const std::vector< int > &cartCoords, pcpp::IndexIntervalType &partExtent, std::ostream &messageStream)
Get local sub-interval of an n-dimensional integer interval.
std::string ConfigKey(const std::string &configName, const std::string &keyName)
Definition: PCPPUtil.C:191
bool IsValidOrder(int overallOrder)
Definition: Stencil.C:352
virtual int ConfigureDomains()
Configure simulation domains.
Definition: EulerRHS.H:33
int SetupCartesianTopology(pcpp::CommunicatorType &parallelCommunicator, pcpp::ParallelTopologyInfoType &topologyInfo, pcpp::CommunicatorType &topoCommunicator, std::ostream &messageStream)
Sets up a communicator with Cartesian topology.
Definition: PCPPCommUtil.C:48
int ConfigureGridInfo(const fixtures::ConfigurationType &inConfig, const std::string &gridName, simulation::geometry::gridinfo &gridInfo, std::ostream &messageStream)
Definition: PC2Util.C:805
int Split(int color, int key, CommunicatorObject &newcomm)
Definition: COMM.C:151
int Initialize(base &stencilSet, int interiorOrder)
Initialize the sbp::base stencilset with the SBP operator of given order.
Definition: Stencil.C:360
Simple Block Structured Mesh object.
Definition: IndexUtil.H:21
int ConfigurePlatformInfo(const fixtures::ConfigurationType &inConfig, pcpp::PlatformInfoType &platformInfo)
Simple key-value pair.
std::vector< std::string > domainNames
Definition: Domain.H:26
platform_info PlatformInfo(const std::string &systemInfo)
Definition: UnixUtils.C:45
void InitSimple(const ContainerType &inSize)
Definition: IndexUtil.H:169
void const size_t * numPointsBuffer
Definition: MetricKernels.H:19
bool IsSet(const std::string &Key) const
Definition: Parameters.C:115