PlasCom2  1.0
XPACC Multi-physics simluation application
Domain.H
Go to the documentation of this file.
1 #ifndef __DOMAIN_H__
2 
3 #include "PCPPTypes.H"
4 #include "PCPPUtil.H"
5 #include "Boundary.H"
6 #include "Stencil.H"
7 #include "ConfigUtil.H"
8 #include "NavierStokesBC.H"
9 #include "RHS.H"
10 #include "Geometry.H"
11 
12 using namespace pcpp::util;
13 using namespace fixtures;
14 
15 namespace simulation {
16 
17 namespace domain {
18 
19 #define CONSTANT_DT 0
20 #define CONSTANT_CFL 1
21 
22 
23  struct info {
24  info() : numDomains(0) {};
25  int numDomains;
26  std::vector<std::string> domainNames;
28  std::vector<int> globalDomainIndex;
29  };
30 
31  struct partitioninfo {
32  std::vector<int> numProcsGrid;
33  std::vector<size_t> numPointsProc;
34  std::vector<int> gridColor;
36  std::vector<int> gridIndexOfLocalGrids;
37  };
38 
39  template<typename GridT,typename StateT>
40  class base {
41 
42  template<typename DomainT>
43  friend class DomainInitializer;
44 
45  public:
46 
47  typedef GridT GridType;
48  typedef StateT StateType;
49  typedef typename GridType::HaloType HaloType;
50 
51  // some fixed types, smells bad
54  typedef typename StateType::MetaDataSetType DataDictionaryType;
56 
57  // typedef euler::rhs<GridType,StateType,OperatorType> RHSType;
59 
60  // typedef BoundaryT BoundaryType;
61  // typedef RHST RHSType;
62 
63  typedef std::vector<GridType*> gridvector;
64  typedef std::vector<StateType*> statevector;
65  typedef std::vector<RHSType*> rhsvector;
66 
67  // typedef simulation::state::halo HaloType;
68 
69  public:
70 
71  base() : numGrids(0), rhsPtr(&dummyRHS), domainTime(0), stepNumber(0), domainRank(0),
72  geometryInfoPtr(NULL)
73  { };
74 
75  StateType &State(int iGrid) { return (*gridStates[iGrid]); };
76  StateType &Target(int iGrid) { return (*gridTargets[iGrid]); };
77  StateType &Param(int iGrid) { return (*gridParams[iGrid]); };
78  GridType &Grid(int iGrid) { return (*domainGrids[iGrid]); };
79  RHSType &RHS(int iGrid) { return (*gridRHSs[iGrid]); };
80 
81  gridvector &Grids() { return (domainGrids); };
82  statevector &States() { return (gridStates); };
83  statevector &Targets() { return (gridTargets); };
84  statevector &Params() { return (gridParams); };
85  rhsvector &RHSs() { return (gridRHSs); };
86 
87  std::vector<BoundaryType> &GridBoundaries(int iGrid) { return (domainBoundaries[iGrid]); };
88  std::vector<BoundaryType> &DomainBoundary(int iGrid) { return (domainBoundaries[iGrid]); };
89  std::vector<std::vector<BoundaryType> > &DomainBoundaries() { return (domainBoundaries); };
90 
91  const std::vector<std::string> &BCNames() const {return(bcNames); };
92  const std::vector<std::string> &BoundaryNames() const {return(boundaryNames); };
93 
94  // const std::vector<std::string> &BoundaryNames() const {return(boundaryNames); };
95 
96  void SetGrid(int gridIndex,GridType &inGrid)
97  {
98  assert(gridIndex >= 0 && gridIndex < domainGrids.size());
99  domainGrids[gridIndex] = &inGrid;
100  };
101 
102  void SetGridState(int gridIndex,StateType &inState)
103  {
104  assert(gridIndex >= 0 && gridIndex < domainGrids.size());
105  gridStates[gridIndex] = &inState;
106  };
107 
108  void SetGridTarget(int gridIndex,StateType &inState)
109  {
110  assert(gridIndex >= 0 && gridIndex < domainGrids.size());
111  gridTargets[gridIndex] = &inState;
112  };
113 
114  void SetGridParams(int gridIndex,StateType &paramState)
115  {
116  assert(gridIndex >= 0 && gridIndex < domainGrids.size());
117  gridParams[gridIndex] = &paramState;
118  };
119 
120  std::string Name() const { return(domainName); };
121 
123  {
124  globalPtr = &inGlobal;
125  };
126 
127  int SetNumGrids(int numberOfGrids)
128  {
129  if(numberOfGrids <= 0)
130  return(1);
131  numGrids = numberOfGrids;
132  ownGrid.resize(numGrids,false);
133  ownState.resize(numGrids,false);
134  ownRHS.resize(numGrids,false);
135  domainGrids.resize(numGrids,NULL);
136  gridStates.resize(numGrids,NULL);
137  gridTargets.resize(numGrids,NULL);
138  gridParams.resize(numGrids,NULL);
139  gridRHSs.resize(numGrids,NULL);
140  domainBoundaries.resize(numGrids);
141  gridCommunicators.resize(numGrids,domainCommunicator);
142  return(0);
143  };
144 
145  int ConfigureDomain(fixtures::ConfigurationType &inConfig,std::ostream &inMessageStream)
146  {
147 
148  SetMessageStream(inMessageStream);
149  std::ostream &messageStream(*messageStreamPtr);
150 
151  domainConfig = inConfig;
152  domainName = domainConfig.GetValue("ConfigName");
153 
154  if(domainName.empty()){
155  messageStream << "Name of domain unspecified." << std::endl;
156  return(1);
157  }
158 
159  spatialOrder = domainConfig.GetValue<int>(ConfigKey(domainName,"SpatialOrder"));
160  int interiorOrder = (spatialOrder - 1)*2;
161  plascom2::operators::sbp::Initialize(domainOperator,interiorOrder);
162 
163  if(domainConfig.IsSet(ConfigKey(domainName,"ScalarNames")))
164  scalarNames = domainConfig.GetValueVector<std::string>(ConfigKey(domainName,"ScalarNames"));
165 
166  int numGridsConfigured = 0;
167  gridNames = domainConfig.GetValueVector<std::string>(ConfigKey(domainName,"GridNames"));
168  if(!domainConfig.IsSet(ConfigKey(domainName,"NumGrids"))){
169  if(gridNames.empty())
170  messageStream << "Number of grids not specified" << std::endl;
171  else numGridsConfigured = gridNames.size();
172  } else {
173  numGridsConfigured = domainConfig.GetValue<int>(ConfigKey(domainName,"NumGrids"));
174  }
175 
176  if(numGridsConfigured < 0){
177  messageStream << "Number of grids cannot be negative." << std::endl;
178  return(1);
179  } else if (numGridsConfigured == 0){
180  messageStream << "Gridless domains are not supported (yet)." << std::endl;
181  return(1);
182  }
183 
184  if(numGridsConfigured > 1){
185  messageStream << "Multiple grids detected."
186  << std::endl;
187  }
188 
189  SetNumGrids(numGridsConfigured);
190 
191  bool nativeGeometry = true;
192  std::vector<std::string>::iterator gridNameIt = gridNames.begin();
193  while(gridNameIt != gridNames.end()){
194  int gridIndex = gridNameIt - gridNames.begin();
195  std::string &gridName(*gridNameIt++);
196  std::string geometryName;
197  std::string::size_type geomPos = gridName.find(":");
198  if(geomPos != std::string::npos){
199  geometryName = gridName.substr(0,geomPos);
200  }
201  geometryNames.push_back(geometryName);
202  // std::string geomKey(ConfigKey(domainName,gridName+":GeometryName"));
203  // if(domainConfig.IsSet(geomKey)){
204  // nativeGeometry = false;
205  // std::string geometryName(domainConfig.GetValue(geomKey));
206  // std::string geomGridKey(ConfigKey(domainName,gridName+":GridName"));
207  // if(domainConfig.IsSet(geomGridKey)){
208  // geometryName = geometryName + ":" + domainConfig.GetValue(geomGridKey);
209  // }
210  // ownGrid[gridIndex] = true;
211  // domainGrids[gridIndex] = new GridT;
212  }
213  // std::sort(geometryNames.begin(),geometryNames.end());
214  // geometryNames.erase(std::unique(geometryNames.begin(),geometryNames.end()),
215  // geometryNames.end());
216 
217  // ------ POSTPONE GRID CONFIGURATION ---------------
218  // typename gridvector::iterator gridIt = domainGrids.begin();
219  // while(gridIt != domainGrids.end()){
220  // int iGrid = gridIt - domainGrids.begin();
221  // const std::string &gridName(gridNames[iGrid]);
222  // GridType *domainGridPtr(*gridIt++);
223  // if(domainGridPtr == NULL){
224  // messageStream << "Grid " << iGrid << " failed to configure, invalid storage."
225  // << std::endl;
226  // return(1);
227  // }
228  // GridType &domainGrid(*domainGridPtr);
229  // if(nativeGeometry){
230  // std::string gridKey(ConfigKey(domainName,gridName));
231  // pcpp::ConfigType gridConfig(GetSubConfig(gridKey,domainConfig));
232  // if(domainGrid->ConfigureGrid(gridConfig,messageStream)){
233  // messageStream << "Grid " << (gridIt - domainGrids.begin())-1
234  // << " failed to configure." << std::endl;
235  // return(1);
236  // }
237  // }
238  // // else {
239  // // if(ConfigureDomainGeometry(domainConfig,geometryNames[iGrid],domainGrid,messageStream)){
240  // // messageStream << "Failed to configure domain grid " << iGrid << " with geometry "
241  // // << geometryNames[iGrid] << "." << std::endl;
242  // // return(1);
243  // // }
244  // // }
245  // }
246 
247  if(ConfigureDataDictionary(domainConfig,"State",stateDataDictionary,messageStream)){
248  messageStream << "Domain state meta failed to configure."
249  << std::endl;
250  return(1);
251  }
252 // std::cout << "Configured state dictionary:" << std::endl
253 // << stateDataDictionary << std::endl;
254  if(ConfigureDataDictionary(domainConfig,"Param",paramDataDictionary,messageStream)){
255  messageStream << "Domain param meta failed to configure."
256  << std::endl;
257  return(1);
258  }
259 // std::cout << "Configured state dictionary:" << std::endl
260 // << paramDataDictionary << std::endl;
261 
262 
263  // ------ POSTPONE CREATION OF ACTUAL STATE ---------
264  // typename statevector::iterator stateIt = gridStates.begin();
265  // typename statevector::iterator paramIt = gridParams.begin();
266  // while(stateIt != gridStates.end()){
267  // int iGrid = stateIt - gridStates.begin();
268  // StateType *&gridState(*stateIt++);
269  // StateType *&gridParam(*paramIt++);
270  // if(gridState == NULL){
271  // ownState[iGrid] = true;
272  // gridState = new StateT;
273  // }
274  // PopulateGridMeta(gridState->Meta());
275  // if(gridParam == NULL){
276  // gridParam = new StateT;
277  // }
278  // PopulateGridParamMeta(gridParam->Meta());
279  // }
280 
281  PopulateDomainStateMeta();
282  PopulateDomainParamMeta();
283 
284  if(domainConfig.IsSet(ConfigKey(domainName,"IO:Fields")))
285  ioFieldNames = domainConfig.GetValueVector<std::string>(ConfigKey(domainName,"IO:Fields"));
286 
287  // Get Domain Boundaries
288  bcNames = domainConfig.GetValueVector<std::string>(ConfigKey(domainName,"BCNames"));
289  int numBoundaries = bcNames.size();
290  // std::cout << "Number of boundary condition types: " << numBoundaries << std::endl;
291  for(int iBoundary = 0;iBoundary < numBoundaries;iBoundary++){
292 
293  std::string &bcName(bcNames[iBoundary]);
294  // std::cout << "BCname = " << bcName << std::endl;
295  std::string boundaryConfigName(ConfigKey(domainName,bcName));
296  // std::cout << "boundaryType (" << bcName << ") has bc config name: ("
297  // << boundaryConfigName << ")" << std::endl;
299  boundaryConfig(pcpp::util::ExtractConfigParams(domainConfig,boundaryConfigName));
300 
302 
303  std::string bcTypeName(boundaryConfig.GetValue(ConfigKey(boundaryConfigName,"BCType")));
304  // std::cout << "bcTypeName = " << bcTypeName << std::endl;
305  myBC.SetBCName(bcTypeName);
307  int bcType = myBC.BCType();
308 
309  if(bcType != boundary::bc::navierstokes::HOLE){
310 
311  if(ConfigureDataDictionary(boundaryConfig,"State",myBC.StateDictionary(),messageStream)){
312  messageStream << "BC state dictionary failed to configure for BC " << bcName
313  << std::endl;
314  return(1);
315  }
316 
317  if(ConfigureDataDictionary(boundaryConfig,"Param",myBC.ParamDictionary(),messageStream)){
318  messageStream << "BC param dictionary failed to configure for BC " << bcName
319  << std::endl;
320  return(1);
321  }
322 
323  if(myBC.ParamDictionary().empty() && myBC.StateDictionary().empty()){
324  messageStream << "BC params and fields not configured for " << bcName
325  << std::endl;
326  return(1);
327  }
328 
329  // Populate any BC parameter metadata from config, and allocate
330  StateType &bcParams(myBC.Params());
331  bcParams.SetMetaData(myBC.ParamDictionary());
332  bcParams.Create();
333 
334  // Populate parameter values from config file - any grid-connected state data done later
335  std::string bcParamKey(ConfigKey(boundaryConfigName,"Param"));
336  if(ConfigStateValues(boundaryConfig,bcParamKey,bcParams,messageStream)){
337  messageStream << "BC param values failed to populate from configuration." << std::endl;
338  return(1);
339  }
340 
341  } else {
342  messageStream << "Deferring setup of hole region." << std::endl;
343  }
344  domainBCs.push_back(myBC);
345  }
346  return(0);
347  }
348 
349 
351  std::ostream &inMessageStream)
352  {
353 
354  int numBoundaries = bcNames.size();
355  std::ostream &messageStream(inMessageStream);
356 
357  const std::string &currentGridName(gridNames[iGrid]);
358 // std::cout << "Processing Grid(" << iGrid << ","
359 // << currentGridName << ") " << std::endl;
360  for(int iBoundary = 0;iBoundary < numBoundaries;iBoundary++){
361 
362  std::string &bcName(bcNames[iBoundary]);
363  // std::cout << "BCName(" << iBoundary << ") = " << bcName << std::endl;
364  BCType &boundaryBC(domainBCs[iBoundary]);
365  std::string boundaryConfigKey(ConfigKey(domainName,bcName));
366  // std::cout << "Boundary config key: " << boundaryConfigKey << std::endl;
367  // std::vector<int> boundaryGridIDs;
368 
369  // This is a vector of grid regions to which this boundary condition applies
370  std::vector<std::string> boundaryGridRegionNames =
371  domainConfig.GetValueVector<std::string>(ConfigKey(boundaryConfigKey,"RegionNames"));
372  int numBoundaryGridRegions = boundaryGridRegionNames.size();
373  std::vector<std::string>::iterator rnIt = boundaryGridRegionNames.begin();
374  // while(rnIt != boundaryGridRegionNames.end()){
375  // std::cout << "Applies to grid region: " << *rnIt++ << std::endl;
376  // }
377 
378  boundaryNames =
379  domainConfig.GetValueVector<std::string>(ConfigKey(boundaryConfigKey,"BoundaryNames"));
380  rnIt = boundaryNames.begin();
381  // while(rnIt != boundaryNames.end()){
382  // std::cout << "Applies to domain boundary name: " << *rnIt++ << std::endl;
383  // }
384  if(boundaryNames.empty() || boundaryNames.size() != boundaryGridRegionNames.size()){
385  messageStream << "WARNING: Setting default boundary names." << std::endl;
386  boundaryNames.resize(numBoundaryGridRegions);
387  for(int iRegion = 0;iRegion < numBoundaryGridRegions;iRegion++)
388  boundaryNames[iRegion] = bcName + std::string(":") + boundaryGridRegionNames[iRegion];
389  }
390  // this boundary condition applies to (numBoundaryRegions) grid boundaries
391  for(int iRegion = 0;iRegion < numBoundaryGridRegions;iRegion++){
392  std::string &boundaryName(boundaryNames[iRegion]);
393  std::string gridRegionName(boundaryGridRegionNames[iRegion]);
394  // std::cout << "IRegion(" << iRegion << ") = (" << boundaryName << "," << gridRegionName << ")"
395  // << std::endl;
396  std::string::size_type x = gridRegionName.find_last_of(":");
397  // std::string geometryName;
398  std::string regionGridName;
399  if(x != std::string::npos){
400  regionGridName = gridRegionName.substr(0,x);
401  gridRegionName = gridRegionName.substr(x+1);
402  }
403  if(x == std::string::npos || regionGridName.empty())
404  regionGridName = currentGridName;
405  std::string regionName = gridRegionName;
406  int gridIndex = 0;
407  // std::cout << "RegionName: " << regionName << std::endl;
408  // std::cout << "regionGridName: " << regionGridName << std::endl;
409  if(regionGridName != currentGridName){
410  if(!regionGridName.empty()){ // make sure *some* grid region will match
411  gridIndex = GetGridIndex(regionGridName);
412  if(gridIndex < 0){
413  messageStream << "Failed to find grid id for \""
414  << regionGridName << "\" in BC resolve."
415  << std::endl;
416  return(1);
417  }
418  }
419  continue;
420  }
421 
422  gridIndex = iGrid;
423 
424  std::vector<BoundaryType> &domainGridBoundaries(GridBoundaries(gridIndex));
425  std::string &bcName(boundaryBC.BCName());
426  // std::cout << "BCTypeName: " << bcName << std::endl;
427  // domainConfig.GetValue<std::string>(ConfigKey(boundaryConfigKey,"Type")));
428  // myBoundary.SetBCName(domainConfig.GetValue<std::string>(ConfigKey(boundaryConfigKey,"Type")));
429  GridType &boundaryGrid(Grid(gridIndex));
430  // std::cout << "gridIndex = " << gridIndex << std::endl;
431  // std::cout << "Finding grid region for regionName = " << regionName
432  // << std::endl;
433  int gridRegionIndex = boundaryGrid.GetRegionIndex(regionName);
434  // std::cout << "gridRegionIndex = " << gridRegionIndex << std::endl;
435  if(gridRegionIndex < 0){
436  messageStream << "Failed to find grid region id for \""
437  << gridNames[gridIndex] << ":" << regionName
438  << "\" in BC resolve." << std::endl;
439  // std::cout << "Did not find region index, aborting." << std::endl;
440  return(1);
441  }
442 
443  BoundaryType thisBoundary;
444  thisBoundary.SetGridRegionID(gridRegionIndex);
445  thisBoundary.SetGrid(boundaryGrid);
446  thisBoundary.SetBC(boundaryBC);
447  thisBoundary.SetName(boundaryName);
448  messageStream << "Found boundary " << boundaryName << " with BC "
449  << bcName << " for (grid:region) = ("
450  << gridNames[gridIndex] << ":" << regionName
451  << ")" << std::endl;
452  // std::cout << "Adding boundary!" << std::endl;
453  domainGridBoundaries.push_back(thisBoundary);
454  }
455  }
456  return(0);
457  };
458 
459  int CreateData(std::ostream &messageStream)
460  {
461  int numGrids = domainGrids.size();
462  int numGridStates = gridStates.size();
463  int numGridParams = gridParams.size();
464 
465  if(numGrids != numGridStates)
466  return(1);
467  if(numGridStates != numGridParams)
468  return(1);
469 
470  std::string stateFields;
471  if(domainConfig.IsSet("Advancer:Fields")){
472  stateFields = domainConfig.GetValue(ConfigKey(domainName,"Advancer:Fields"));
473  messageStream << "Setting state fields to (" << stateFields << ")" << std::endl;
474  } else {
475  messageStream << "WARNING: No fields set up as State Fields." << std::endl;
476  }
477  typename gridvector::iterator gridIt = domainGrids.begin();
478  typename statevector::iterator stateIt = gridStates.begin();
479  typename statevector::iterator targIt = gridTargets.begin();
480  typename statevector::iterator paramIt = gridParams.begin();
481  std::vector<std::string>::iterator gridNameIt = gridNames.begin();
482 
483  messageStream << "Creating state and parameter data for " << domainGrids.size() << " grids."
484  << std::endl;
485 
486  while(gridIt != domainGrids.end()){
487 
488  GridType &thisGrid(**gridIt++);
489  StateType &gridState(**stateIt++);
490  // StateType &gridTarget(**targIt++);
491  StateType &gridParams(**paramIt++);
492  std::string &gridName(*gridNameIt++);
493 
494  const std::vector<size_t> &bufferSizes(thisGrid.BufferSizes());
495  const pcpp::IndexIntervalType &partitionInterval(thisGrid.PartitionInterval());
496  const pcpp::IndexIntervalType &partitionBufferInterval(thisGrid.PartitionBufferInterval());
497  size_t numPointsBuffer = thisGrid.BufferSize();
498 
499 
500  messageStream << "Creating buffers for " << gridName
501  << " with bufferSizes(";
502  pcpp::io::DumpContents(messageStream,bufferSizes,",");
503  messageStream << ")" << std::endl;
504 
505  gridState.SetMetaData(stateDataDictionary);
506  gridParams.SetMetaData(paramDataDictionary);
507 
508  gridState.Create(numPointsBuffer,0);
509  if(!stateFields.empty())
510  gridState.SetStateFields(stateFields);
511  if(*targIt){
512  (*targIt)->CopyStateFields(gridState);
513  }
514  gridParams.Create(numPointsBuffer,0);
515 
516  std::string paramKeyRoot(ConfigKey(domainName,"Param"));
517  messageStream << "Configuring parameters with KeyRoot("
518  << paramKeyRoot << ")." << std::endl;
519  if(ConfigStateValues(domainConfig,paramKeyRoot,gridParams,messageStream)){
520  messageStream << "ERROR! Domain parameters failed to populate." << std::endl;
521  return(1);
522  }
523  }
524  return(0);
525  };
526 
527  int CreateData(int gridIndex,std::ostream &messageStream)
528  {
529  if(gridIndex > (domainGrids.size()-1))
530  return(1);
531 
532  std::string stateFields(domainConfig.GetValue(ConfigKey(domainName,"Advancer:Fields")));
533  messageStream << "Setting state fields to (" << stateFields << ")" << std::endl;
534 
535 
536  messageStream << "Creating state and parameter data for grid(" << gridIndex << ","
537  << gridNames[gridIndex] << ")" << std::endl;
538 
539 
540  GridType &thisGrid(Grid(gridIndex));
541  StateType &gridState(State(gridIndex));
542  // StateType &gridTarget(Target(gridIndex));
543  StateType &gridParams(Param(gridIndex));
544  std::string &gridName(gridNames[gridIndex]);
545 
546  const std::vector<size_t> &bufferSizes(thisGrid.BufferSizes());
547  const pcpp::IndexIntervalType &partitionInterval(thisGrid.PartitionInterval());
548  const pcpp::IndexIntervalType &partitionBufferInterval(thisGrid.PartitionBufferInterval());
549  size_t numPointsBuffer = thisGrid.BufferSize();
550 
551 
552  messageStream << "Creating buffers for " << gridName
553  << " with bufferSizes(";
554  pcpp::io::DumpContents(messageStream,bufferSizes,",");
555  messageStream << ")" << std::endl;
556 
557  gridState.SetMetaData(stateDataDictionary);
558  gridParams.SetMetaData(paramDataDictionary);
559 
560  gridState.Create(numPointsBuffer,0);
561  gridState.SetStateFields(stateFields);
562  if(gridTargets[gridIndex] == NULL){
563  gridTargets[gridIndex] = new StateType;
564  }
565  gridTargets[gridIndex]->CopyStateData(gridState);
566 
567  gridParams.Create(numPointsBuffer,0);
568 
569  std::string paramKeyRoot(ConfigKey(domainName,"Param"));
570  if(ConfigStateValues(domainConfig,paramKeyRoot,gridParams,messageStream)){
571  messageStream << "ERROR! Domain parameters failed to populate." << std::endl;
572  return(1);
573  }
574 
575  return(0);
576 
577  };
578 
579  int GetGridIndex(const std::string &gridName) const
580  {
581  int gridIndex = 0;
582  std::vector<std::string>::const_iterator nameIt = gridNames.begin();
583  while(nameIt != gridNames.end()){
584  if(*nameIt++ == gridName){
585  return(gridIndex);
586  }
587  gridIndex++;
588  }
589  return(-1);
590  };
591 
592 
593  int NumberOfGrids(){ return(numGrids); };
594  int NumberOfLocalGrids(){ return(partitionInfo.gridIndexOfLocalGrids.size()); };
595  std::vector<int> &LocalGridIndices()
596  {
597  return(partitionInfo.gridIndexOfLocalGrids);
598  };
599  int LocalGridIndex(int localGridIndex)
600  {
601  return(partitionInfo.gridIndexOfLocalGrids[localGridIndex]);
602  };
603 
604  std::string Report()
605  {
606  std::ostringstream Ostr;
607  Ostr << "+++Domain data information+++ " << std::endl
608  << "State data dictionary: " << std::endl
609  << stateDataDictionary.Report() << std::endl
610  << "Parameter data dictionary: " << std::endl
611  << paramDataDictionary.Report() << std::endl;
612  if(!domainBCs.empty()){
613  Ostr << "Boundary Conditions: " << std::endl;
614  std::vector<BCType>::iterator bcIt = domainBCs.begin();
615  int bcIndex = 0;
616  while(bcIt != domainBCs.end()){
617  BCType &myBC(*bcIt++);
618  Ostr << "BC(" << bcNames[bcIndex++] << ") = "
619  << myBC.BCName() << std::endl;
620  if(!myBC.StateDictionary().empty()){
621  Ostr << " Boundary state data: " << std::endl
622  << myBC.StateDictionary().Report() << std::endl;
623  } else {
624  Ostr << " No boundary state data. " << std::endl;
625  }
626  if(!myBC.ParamDictionary().empty()){
627  Ostr << " Boundary params: " << std::endl
628  << myBC.ParamDictionary().Report() << std::endl;
629  } else {
630  Ostr << " No boundary parameters. " << std::endl;
631  }
632  }
633  } else {
634  Ostr << "No boundary conditions configured." << std::endl;
635  }
636  Ostr << "Number of grids: " << numGrids << std::endl
637  << "... Grids ..." << std::endl;
638  for(int iGrid = 0;iGrid < numGrids;iGrid++){
639  Ostr << "Grid(" << iGrid+1 << "):" << std::endl
640  << "Grid Name: " << gridNames[iGrid] << std::endl
641  << "Grid Geometry: " << geometryNames[iGrid] << std::endl;
642  if(domainGrids[iGrid] != NULL){
643  Ostr << "Grid Configuration: " << std::endl
644  << domainGrids[iGrid]->ReportConfiguration() << std::endl;
645  std::vector<size_t> &gridSizes(domainGrids[iGrid]->GridSizes());
646  std::vector<size_t> &bufferSizes(domainGrids[iGrid]->BufferSizes());
647  pcpp::IndexIntervalType &partitionInterval(domainGrids[iGrid]->PartitionInterval());
648  pcpp::IndexIntervalType &partitionBufferInterval(domainGrids[iGrid]->PartitionBufferInterval());
649  size_t numPointsBuffer = domainGrids[iGrid]->BufferSize();
650  Ostr << "Grid Sizes: (";
651  pcpp::io::DumpContents(Ostr,gridSizes,",");
652  Ostr << ")" << std::endl
653  << "Partition Interval: ";
654  partitionInterval.PrettyPrint(Ostr);
655  Ostr << std::endl
656  << "Buffer Sizes: (";
657  pcpp::io::DumpContents(Ostr,bufferSizes,",");
658  Ostr << ")" << std::endl
659  << "Partition Buffer Interval: ";
660  partitionBufferInterval.PrettyPrint(Ostr);
661  Ostr << std::endl
662  << "Buffer size: " << numPointsBuffer << std::endl;
663  }
664  }
665  return(Ostr.str());
666  };
667  DataDictionaryType &StateDictionary() { return(stateDataDictionary); };
668  DataDictionaryType &ParamDictionary() { return(paramDataDictionary); };
669 
670  void PopulateGridMeta(DataDictionaryType &gridMeta)
671  {
672  typename DataDictionaryType::iterator metaIt = stateDataDictionary.begin();
673  while(metaIt != stateDataDictionary.end()){
674  typename StateType::MetaDataType &metaData(*metaIt++);
675  if(metaData.loc == 'g' || metaData.loc == 'm' ||
676  metaData.loc == 'c' || metaData.loc == 'n')
677  gridMeta.AddField(metaData.name,metaData);
678  }
679  };
680 
681  void PopulateGridParamMeta(DataDictionaryType &gridMeta)
682  {
683  typename DataDictionaryType::iterator metaIt = paramDataDictionary.begin();
684  while(metaIt != paramDataDictionary.end()){
685  typename StateType::MetaDataType &metaData(*metaIt++);
686  if(metaData.loc == 'g' || metaData.loc == 'm' ||
687  metaData.loc == 'c' || metaData.loc == 'n')
688  gridMeta.AddField(metaData.name,metaData);
689  }
690  };
691 
693  {
694  typename DataDictionaryType::iterator metaIt = stateDataDictionary.begin();
695  while(metaIt != stateDataDictionary.end()){
696  typename StateType::MetaDataType &metaData(*metaIt++);
697  if(metaData.loc == 'g' || metaData.loc == 'd' ||
698  metaData.loc == 's')
699  domainState.Meta().AddField(metaData.name,metaData);
700  // gridMeta.AddField(metaData.name,metaData);
701  }
702  };
703 
705  {
706  typename DataDictionaryType::iterator metaIt = paramDataDictionary.begin();
707  while(metaIt != paramDataDictionary.end()){
708  typename StateType::MetaDataType &metaData(*metaIt++);
709  if(metaData.loc == 'g' || metaData.loc == 'd' ||
710  metaData.loc == 's')
711  domainParams.Meta().AddField(metaData.name,metaData);
712  // gridMeta.AddField(metaData.name,metaData);
713  }
714  };
715 
716  fixtures::ConfigurationType &Config(){return(domainConfig);};
717  std::vector<std::string> &GeometryNames() {return(geometryNames);};
718  std::vector<std::string> &GridNames() {return(gridNames); };
719  std::string GridName(int iGrid) {return(gridNames[iGrid]); };
720  std::vector<std::string> IOFieldNames() { return(ioFieldNames); };
721  void SetSpatialOrder(int inOrder){ spatialOrder = inOrder;};
722  int SpatialOrder(){return(spatialOrder);};
723  void SetTime(double inTime){ domainTime = inTime; };
724  double Time(){return(domainTime); };
725  OperatorType &Operator(){return(domainOperator); };
726  const OperatorType &Operator() const {return(domainOperator); };
727  void SetMessageStream(std::ostream &inStream){messageStreamPtr = &inStream;};
728  std::vector<BCType> &BCs() { return(domainBCs); };
729  const std::vector<BCType> &BCs() const { return(domainBCs); };
730  RHSType &RHS() { return(*rhsPtr); };
731  int SetRHS(RHSType &inRHS)
732  {
733  if(numGrids <= 0){
734  return(1);
735  }
736  if(SetRHS(0,inRHS))
737  return(1);
738  rhsPtr = gridRHSs[0];
739  return(0);
740  };
741  int SetRHS(int gridIndex,RHSType &inRHS)
742  {
743  if(partitionInfo.gridIndexOfLocalGrids.size() != numGrids){
744  if(PartitionDomain(0)){
745  return(1);
746  }
747  }
748  if(gridRHSs.size() != numGrids)
749  gridRHSs.resize(numGrids,NULL);
750  if(ownRHS.size() != numGrids)
751  ownRHS.resize(numGrids,false);
752  if(ownRHS[gridIndex] && (gridRHSs[gridIndex] != NULL)){
753  delete gridRHSs[gridIndex];
754  ownRHS[gridIndex] = false;
755  }
756  gridRHSs[gridIndex] = &inRHS;
757  return(0);
758  };
759  fixtures::CommunicatorType &Communicator() { return(domainCommunicator); };
761  {
762  return(gridCommunicators[gridIndex]);
763  // return(domainGrids[gridIndex]->Communicator());
764  };
765  std::vector<fixtures::CommunicatorType> &GridCommunicators() {return(gridCommunicators); };
767  { return(domainCommunicator = inCommunicator); };
768  int PartitionDomain(int inOptions = 0)
769  {
770  int returnCode = 0;
771  if(inOptions == 0){ // Trivial "partitioning" where all grids are on all procs
772  int numLocalGrids = domainGrids.size();
773  partitionInfo.gridIndexOfLocalGrids.resize(numLocalGrids);
774  for(int iGrid = 0;iGrid < numLocalGrids;iGrid++){
775  partitionInfo.gridIndexOfLocalGrids[iGrid] = iGrid;
776  }
777  // gridCommunicators.resize(numLocalGrids,domainCommunicator);
778  } else if(inOptions == 1){ // Auto-split grids according to size
780  int numDomainProcs = 1;
781  if(domainCommunicator.Good()){
782  numDomainProcs = domainCommunicator.NProc();
783  domainRank = domainCommunicator.Rank();
784  }
785  if(numDomainProcs == 1 || numGrids > numDomainProcs)
786  return(PartitionDomain(0));
787  size_t numPointsTotal = 0;
788  std::vector<size_t> numPointsGrid(numGrids,0);
789  std::vector<int> numProcsGrid(numGrids,0);
790  std::vector<size_t> numPointsPerProc(numGrids,0);
791  for(int iGrid = 0;iGrid < numGrids;iGrid++){
792  GridType &currentGrid(*domainGrids[iGrid]);
793  const std::vector<size_t> &gridSizes(currentGrid.GridSizes());
794  int numDim = gridSizes.size();
795  for(int iDim = 0;iDim < numDim;iDim++){
796  numPointsGrid[iGrid] += gridSizes[iDim];
797  }
798  numPointsTotal += numPointsGrid[iGrid];
799  }
800  size_t targetPointsPerProc = numPointsTotal/numDomainProcs;
801  int totalGridProcs = 0;
802  for(int iGrid = 0;iGrid < numGrids;iGrid++){
803  numProcsGrid[iGrid] = int(numPointsGrid[iGrid]*numDomainProcs/float(numPointsTotal));
804  numProcsGrid[iGrid] = std::max(1,numProcsGrid[iGrid]);
805  totalGridProcs += numProcsGrid[iGrid];
806  numPointsPerProc[iGrid] = numPointsGrid[iGrid]/numProcsGrid[iGrid];
807  }
808  if(totalGridProcs > numDomainProcs){
809  int numToScrape = totalGridProcs - numDomainProcs;
810  std::vector<unsigned int> numProcsOrder;
811  ix::util::SortPermutation(numProcsGrid,numProcsOrder);
812  std::reverse(numProcsOrder.begin(),numProcsOrder.end());
813  int orderIndex = 0;
814  for(int iScrape = numToScrape;iScrape > 0;iScrape--){
815  int gridIndexToScrape = numProcsOrder[orderIndex];
816  numProcsGrid[gridIndexToScrape]--;
817  numPointsPerProc[gridIndexToScrape] =
818  numPointsGrid[gridIndexToScrape]/numProcsGrid[gridIndexToScrape];
819  }
820  } else {
821  int numToDoleOut = numDomainProcs - totalGridProcs;
822  }
823  // if(totalGridProcs == numDomainProcs)
824  // return(PartitionDomain(numProcsGrid));
825 
826  } else if(inOptions == 3){ // Fully user prescribed domain splitting
827 
828  if(!geometryInfoPtr)
829  return(1);
830  // if((splitMap.size() != numGrids) || slitMap.empty())
831  // return(1);
832 
833  int numDomainProcs = 1;
834  if(domainCommunicator.Good()){
835  numDomainProcs = domainCommunicator.NProc();
836  domainRank = domainCommunicator.Rank();
837  }
838 
839  int numProcsTotal = 0;
840  size_t numPointsTotal = 0;
841  std::vector<size_t> numPointsGrid(numGrids,1);
842  std::vector<int> numProcsGrid(numGrids,1);
843  std::vector<size_t> numPointsPerProc(numGrids,0);
844  for(int iGrid = 0;iGrid < numGrids;iGrid++){
845  GridType &currentGrid(*domainGrids[iGrid]);
846  const std::vector<size_t> &gridSizes(currentGrid.GridSizes());
847  int numDim = gridSizes.size();
848  const std::vector<int> &gridSplitSizes(currentGrid.DecompSizes());
849  if(gridSplitSizes.size() != numDim)
850  return(1);
851  for(int iDim = 0;iDim < numDim;iDim++){
852  numProcsGrid[iGrid] *= gridSplitSizes[iDim];
853  numPointsGrid[iGrid] *= gridSizes[iDim];
854  }
855  if(numPointsGrid[iGrid] == 0)
856  return(1);
857  if(!(numProcsGrid[iGrid] > 0))
858  return(1);
859  numPointsTotal += numPointsGrid[iGrid];
860  numProcsTotal += numProcsGrid[iGrid];
861  numPointsPerProc[iGrid] = numPointsGrid[iGrid]/numProcsGrid[iGrid];
862  if(numPointsPerProc[iGrid] == 0 || numPointsPerProc[iGrid] > numPointsGrid[iGrid])
863  return(1);
864  }
865  if(numProcsTotal != numDomainProcs)
866  return(1);
867 
868  // Now split communicator into grid-specific ones
869  // gridCommunicators.resize(numGrids,domainCommunicator);
870  int startRank = 0;
871  for(int iGrid = 0;iGrid < numGrids;iGrid++){
872  int endRank = startRank + numProcsGrid[iGrid];
873  int color = ((domainRank >= startRank) && (domainRank < endRank));
874  domainCommunicator.Split(color,domainRank,gridCommunicators[iGrid]);
875  startRank = endRank;
876  }
877  } else {
878  returnCode = 1;
879  }
880 
881  return(returnCode);
882  };
883 
884  int InitializeRHS(int inOptions)
885  {
886  if(gridRHSs.size() != numGrids){
887  gridRHSs.resize(numGrids,NULL);
888  }
889  if(ownRHS.size() != numGrids){
890  ownRHS.resize(numGrids,false);
891  }
892  std::vector<int>::iterator gridIdIt = partitionInfo.gridIndexOfLocalGrids.begin();
893  while(gridIdIt != partitionInfo.gridIndexOfLocalGrids.end()){
894  int gridIndex = *gridIdIt++;
895  gridRHSs[gridIndex] = new RHSType;
896  ownRHS[gridIndex] = true;
897  RHSType &gridRHS(*gridRHSs[gridIndex]);
898 
899  }
900  };
901 
902  int Step() { return(stepNumber); };
903  void SetStep(int inStep) { stepNumber = inStep; };
904 
905  // Must be called on all threads
906  double TimeStep(double *outCFL = NULL)
907  {
908  double timeStep = std::numeric_limits<double>::max();
909  double cfl = 1.0;
910  // if(timeSteppingMode == CONSTANT_DT){
911  if(true){
912  std::vector<int>::iterator gridIdIt = partitionInfo.gridIndexOfLocalGrids.begin();
913  while(gridIdIt != partitionInfo.gridIndexOfLocalGrids.end()){
914  int gridIndex = *gridIdIt++;
915  double gridDT = gridRHSs[gridIndex]->TimeStep();
916  if(gridDT < timeStep) timeStep = gridDT;
917  }
918  }
919  return(timeStep);
920  };
921 
922  // Must be called on all threads
923  void ComputeDV(int threadId = 0)
924  {
925  std::vector<int> &gridIndexOfLocalGrids(partitionInfo.gridIndexOfLocalGrids);
926  std::vector<int>::iterator gridIdIt = gridIndexOfLocalGrids.begin();
927  while(gridIdIt != gridIndexOfLocalGrids.end()){
928  int gridIndex = *gridIdIt++;
929  gridRHSs[gridIndex]->ComputeDV(threadId);
930  }
931  };
932 
933  int SetNumThreads(int numThreads)
934  {
935  std::vector<int> &gridIndexOfLocalGrids(partitionInfo.gridIndexOfLocalGrids);
936  std::vector<int>::iterator gridIdIt = gridIndexOfLocalGrids.begin();
937  while(gridIdIt != gridIndexOfLocalGrids.end()){
938  int gridIndex = *gridIdIt++;
939  domainGrids[gridIndex]->SetNumThreads(numThreads);
940  gridRHSs[gridIndex]->InitThreadIntervals();
941  }
942  };
943 
945  {
946  std::vector<int> &gridIndexOfLocalGrids(partitionInfo.gridIndexOfLocalGrids);
947  std::vector<int>::iterator gridIdIt = gridIndexOfLocalGrids.begin();
948  while(gridIdIt != gridIndexOfLocalGrids.end()){
949  int gridIndex = *gridIdIt++;
950  gridRHSs[gridIndex]->SetDomainBCs(DomainBoundary(gridIndex),BCs());
951  }
952  return(0);
953  };
954 
956  {
957  std::vector<int> &gridIndexOfLocalGrids(partitionInfo.gridIndexOfLocalGrids);
958  std::vector<int>::iterator gridIdIt = gridIndexOfLocalGrids.begin();
959  while(gridIdIt != gridIndexOfLocalGrids.end()){
960  int gridIndex = *gridIdIt++;
961  gridRHSs[gridIndex]->InitThreadIntervals();
962  }
963  return(0);
964  };
965 
966  int FinalizeAdvance(double newTime){
967  int advancementMode = 0;
968  if(advancementMode == 0){ // just barrier until all grids are done
969  // DOH! this caused failure because MPI not initialized - added a
970  // check to see if the domain communicator is "good" before
971  // invoking barrier.
972  if(domainCommunicator.Good())
973  domainCommunicator.Barrier();
974  // could/should validate here that all grids have the same
975  // time - at least for this mode.
976  SetTime(newTime);
977  return(0);
978  } else {
979  return(1);
980  }
981  return(0);
982  };
983 
984  void SetGeometryInfo(geometry::info &geometryInfo)
985  { geometryInfoPtr = &geometryInfo; };
986 
987  void SetScalarNames(const std::string &inNames){ scalarNames = inNames; };
988  std::vector<std::string> &ScalarNames() { return(scalarNames); };
989  const std::vector<std::string> &ScalarNames() const { return(scalarNames); };
990 
991  protected:
992 
993  geometry::info *geometryInfoPtr;
995  std::ostream *messageStreamPtr;
996  std::string domainName;
997  OperatorType domainOperator;
998  StateType domainState;
999  StateType domainParams;
1000  gridvector domainGrids;
1001  statevector gridStates;
1002  statevector gridTargets;
1003  statevector gridParams;
1004  rhsvector gridRHSs;
1007  double domainTime;
1008  std::vector<bool> ownRHS;
1009  std::vector<bool> ownGrid;
1010  std::vector<bool> ownState;
1012  DataDictionaryType stateDataDictionary;
1013  DataDictionaryType paramDataDictionary;
1014  std::vector<std::string> gridNames;
1015  std::vector<std::string> geometryNames;
1016  std::vector<std::string> ioFieldNames;
1017  std::vector<std::vector<BoundaryType> > domainBoundaries;
1018  std::vector<std::string> bcNames;
1019  std::vector<std::string> boundaryNames;
1020  std::vector<std::string> scalarNames;
1021  std::vector<BCType> domainBCs;
1022  RHSType *rhsPtr;
1023  RHSType dummyRHS;
1025  std::vector<fixtures::CommunicatorType> gridCommunicators;
1029 
1030  };
1031 
1032 
1033  template<typename DomainType>
1034  class Initializer {
1035  protected:
1037  public:
1038  virtual int Configure(fixtures::ConfigurationType &inConfig) {return(0);};
1039  virtual int InitializeDomain(DomainType &inDomain) {return(0);};
1040  };
1041 
1042  // namespace initializer {
1043  // class base {
1044  // protected:
1045  // ConfigurationType initConfig;
1046  // public:
1047  // virtual int Configure(ConfigurationType &inConfig) { return (0); };
1048  // template<typename GridT,typename StateT>
1049  // virtual int InitializeDomain(domain::base<GridT,StateT> &inDomain){ return (0); };
1050  // };
1051 
1052  // };
1053 };
1054 };
1055 #endif
GridType & Grid(int iGrid)
Definition: Domain.H:78
std::string Name() const
Definition: Domain.H:120
statevector gridStates
Definition: Domain.H:1001
std::vector< std::string > boundaryNames
Definition: Domain.H:1019
boundary::bc::base BCType
Definition: Domain.H:53
void SetTime(double inTime)
Definition: Domain.H:723
void SetGeometryInfo(geometry::info &geometryInfo)
Definition: Domain.H:984
StateType & Target(int iGrid)
Definition: Domain.H:76
fixtures::CommunicatorType & GridCommunicator(int gridIndex)
Definition: Domain.H:760
DataDictionaryType & ParamDictionary()
Definition: Domain.H:668
void SetStep(int inStep)
Definition: Domain.H:903
fixtures::CommunicatorType & SetCommunicator(fixtures::CommunicatorType &inCommunicator)
Definition: Domain.H:766
DataDictionaryType & StateDictionary()
Definition: Domain.H:667
rhsvector & RHSs()
Definition: Domain.H:85
RHSType & RHS(int iGrid)
Definition: Domain.H:79
int CreateData(std::ostream &messageStream)
Definition: Domain.H:459
int ResolveBCName(const std::string &inName)
Definition: Boundary.C:8
statevector gridParams
Definition: Domain.H:1003
std::vector< std::string > & GeometryNames()
Definition: Domain.H:717
StateType domainState
Definition: Domain.H:998
int SetRHS(RHSType &inRHS)
Definition: Domain.H:731
const std::vector< std::string > & BCNames() const
Definition: Domain.H:91
fixtures::ConfigurationType initConfig
Definition: Domain.H:1036
pcpp::ParallelGlobalType * globalPtr
Definition: Domain.H:994
void const size_t const size_t * gridSizes
Definition: EulerKernels.H:10
std::vector< RHSType * > rhsvector
Definition: Domain.H:65
plascom2::operators::sbp::base OperatorType
Definition: Domain.H:55
OperatorType & Operator()
Definition: Domain.H:725
void SetSpatialOrder(int inOrder)
Definition: Domain.H:721
double TimeStep(double *outCFL=NULL)
Definition: Domain.H:906
void PopulateDomainStateMeta()
Definition: Domain.H:692
std::vector< size_t > numPointsProc
Definition: Domain.H:33
int ConfigureDomain(fixtures::ConfigurationType &inConfig, std::ostream &inMessageStream)
Definition: Domain.H:145
std::vector< fixtures::CommunicatorType > & GridCommunicators()
Definition: Domain.H:765
void SetBC(BCType &inBC)
Definition: Boundary.H:99
OperatorType domainOperator
Definition: Domain.H:997
int ConfigStateValues(fixtures::ConfigurationType &inConfig, const std::string &keyRoot, StateType &inState, std::ostream &messageStream)
Definition: ConfigUtil.H:7
statevector & Params()
Definition: Domain.H:84
virtual int Configure(fixtures::ConfigurationType &inConfig)
Definition: Domain.H:1038
DataDictionaryType paramDataDictionary
Definition: Domain.H:1013
std::vector< BCType > domainBCs
Definition: Domain.H:1021
std::vector< fixtures::CommunicatorType > gridCommunicators
Definition: Domain.H:1025
int ConfigureGridDomainBoundaries(fixtures::ConfigurationType &inConfig, int iGrid, std::ostream &inMessageStream)
Definition: Domain.H:350
void SetScalarNames(const std::string &inNames)
Definition: Domain.H:987
void SetGrid(GridType &inGrid)
Definition: Boundary.H:167
std::vector< std::vector< BoundaryType > > domainBoundaries
Definition: Domain.H:1017
StateType & Param(int iGrid)
Definition: Domain.H:77
std::vector< std::string > bcNames
Definition: Domain.H:1018
void SetGridState(int gridIndex, StateType &inState)
Definition: Domain.H:102
virtual int InitializeDomain(DomainType &inDomain)
Definition: Domain.H:1039
const std::vector< std::string > & BoundaryNames() const
Definition: Domain.H:92
void const size_t const size_t const size_t const double const double * x
int CreateData(int gridIndex, std::ostream &messageStream)
Definition: Domain.H:527
std::vector< std::string > gridNames
Definition: Domain.H:1014
void SetGridTarget(int gridIndex, StateType &inState)
Definition: Domain.H:108
const OperatorType & Operator() const
Definition: Domain.H:726
std::string GridName(int iGrid)
Definition: Domain.H:719
int InitializeRHS(int inOptions)
Definition: Domain.H:884
std::vector< std::string > ioFieldNames
Definition: Domain.H:1016
StateType & State(int iGrid)
Definition: Domain.H:75
DataDictionaryType & ParamDictionary()
Definition: Boundary.H:64
const std::vector< BCType > & BCs() const
Definition: Domain.H:729
fixtures::ConfigurationType & Config()
Definition: Domain.H:716
std::vector< std::string > & GridNames()
Definition: Domain.H:718
void SortPermutation(const std::vector< T > &values, std::vector< unsigned int > &v)
pcpp::ConfigType ExtractConfigParams(const fixtures::ConfigurationType &inConfig, const std::string &configName)
Definition: PCPPUtil.C:70
Main encapsulation of MPI.
Definition: COMM.H:62
GridType::HaloType HaloType
Definition: Domain.H:49
std::string Report()
Definition: Domain.H:604
std::string Grid(const GridType &inGrid)
Definition: Report.H:14
std::vector< BoundaryType > & DomainBoundary(int iGrid)
Definition: Domain.H:88
void PopulateDomainParamMeta()
Definition: Domain.H:704
std::string GetValue(const std::string &key) const
Definition: Parameters.C:24
simulation::rhs::domain_base< GridType, StateType, OperatorType > RHSType
Definition: Domain.H:58
Encapsulation for a collection of operator stencils.
Definition: Stencil.H:26
static const std::string scalarNames("scalarVars")
void PopulateGridMeta(DataDictionaryType &gridMeta)
Definition: Domain.H:670
partitioninfo partitionInfo
Definition: Domain.H:1028
std::vector< BCType > & BCs()
Definition: Domain.H:728
void SetGlobal(pcpp::ParallelGlobalType &inGlobal)
Definition: Domain.H:122
void DumpContents(std::ostream &Ostr, const ContainerType &c, std::string del="\)
Dump container contents.
Definition: AppTools.H:117
std::string domainName
Definition: Domain.H:996
std::string Report() const
std::vector< int > globalDomainIndex
Definition: Domain.H:28
gridvector domainGrids
Definition: Domain.H:1000
void const size_t const size_t * bufferSizes
Definition: MetricKernels.H:19
statevector & States()
Definition: Domain.H:82
void SetGrid(int gridIndex, GridType &inGrid)
Definition: Domain.H:96
std::string ConfigKey(const std::string &configName, const std::string &keyName)
Definition: PCPPUtil.C:191
boundary::base BoundaryType
Definition: Domain.H:52
statevector gridTargets
Definition: Domain.H:1002
std::vector< std::vector< BoundaryType > > & DomainBoundaries()
Definition: Domain.H:89
std::vector< int > & LocalGridIndices()
Definition: Domain.H:595
void SetName(const std::string &inName)
Definition: Boundary.H:192
void SetBCName(const std::string &inName)
Definition: Boundary.H:62
static const char * bcNames[]
Definition: Boundary.H:11
std::vector< BoundaryType > & GridBoundaries(int iGrid)
Definition: Domain.H:87
std::ostream & PrettyPrint(std::ostream &outStream) const
Definition: IndexUtil.C:6
std::vector< GridType * > gridvector
Definition: Domain.H:63
void SetGridParams(int gridIndex, StateType &paramState)
Definition: Domain.H:114
DataDictionaryType & StateDictionary()
Definition: Boundary.H:66
std::vector< StateType * > statevector
Definition: Domain.H:64
void PopulateGridParamMeta(DataDictionaryType &gridMeta)
Definition: Domain.H:681
gridvector & Grids()
Definition: Domain.H:81
int FinalizeAdvance(double newTime)
Definition: Domain.H:966
std::vector< bool > ownGrid
Definition: Domain.H:1009
std::ostream * messageStreamPtr
Definition: Domain.H:995
int Initialize(base &stencilSet, int interiorOrder)
Initialize the sbp::base stencilset with the SBP operator of given order.
Definition: Stencil.C:360
std::vector< int > numProcsGrid
Definition: Domain.H:32
fixtures::ConfigurationType domainConfig
Definition: Domain.H:1011
const std::vector< std::string > & ScalarNames() const
Definition: Domain.H:989
Simple Block Structured Mesh object.
Definition: IndexUtil.H:21
int SetRHS(int gridIndex, RHSType &inRHS)
Definition: Domain.H:741
std::vector< bool > ownState
Definition: Domain.H:1010
StateType::MetaDataSetType DataDictionaryType
Definition: Domain.H:54
int GetGridIndex(const std::string &gridName) const
Definition: Domain.H:579
std::vector< int > gridIndexOfLocalGrids
The global grid index of each local grid (has size of numLocalGrids)
Definition: Domain.H:36
std::vector< std::string > IOFieldNames()
Definition: Domain.H:720
fixtures::CommunicatorType domainCommunicator
Definition: Domain.H:1024
DataDictionaryType stateDataDictionary
Definition: Domain.H:1012
std::vector< std::string > & ScalarNames()
Definition: Domain.H:988
std::vector< std::string > scalarNames
Definition: Domain.H:1020
StateType domainParams
Definition: Domain.H:999
std::vector< std::string > domainNames
Definition: Domain.H:26
std::vector< int > gridColor
Definition: Domain.H:34
std::vector< bool > ownRHS
Definition: Domain.H:1008
int PartitionDomain(int inOptions=0)
Definition: Domain.H:768
void const size_t * numPointsBuffer
Definition: MetricKernels.H:19
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 * bcParams
Definition: SATKernels.H:10
int SetNumGrids(int numberOfGrids)
Definition: Domain.H:127
void SetMessageStream(std::ostream &inStream)
Definition: Domain.H:727
void ComputeDV(int threadId=0)
Definition: Domain.H:923
statevector & Targets()
Definition: Domain.H:83
std::vector< std::string > geometryNames
Definition: Domain.H:1015
int LocalGridIndex(int localGridIndex)
Definition: Domain.H:599
int SetNumThreads(int numThreads)
Definition: Domain.H:933
fixtures::CommunicatorType & Communicator()
Definition: Domain.H:759
int ConfigureDataDictionary(pcpp::ConfigType &inConfig, const std::string &dictName, pcpp::field::metadataset &dataDictionary, std::ostream &messageStream)
Definition: PCPPUtil.C:129