20 #define CONSTANT_CFL 1 39 template<
typename Gr
idT,
typename StateT>
42 template<
typename DomainT>
43 friend class DomainInitializer;
71 base() : numGrids(0), rhsPtr(&dummyRHS), domainTime(0), stepNumber(0), domainRank(0),
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]); };
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); };
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); };
92 const std::vector<std::string> &
BoundaryNames()
const {
return(boundaryNames); };
96 void SetGrid(
int gridIndex,GridType &inGrid)
98 assert(gridIndex >= 0 && gridIndex < domainGrids.size());
99 domainGrids[gridIndex] = &inGrid;
104 assert(gridIndex >= 0 && gridIndex < domainGrids.size());
105 gridStates[gridIndex] = &inState;
110 assert(gridIndex >= 0 && gridIndex < domainGrids.size());
111 gridTargets[gridIndex] = &inState;
116 assert(gridIndex >= 0 && gridIndex < domainGrids.size());
117 gridParams[gridIndex] = ¶mState;
120 std::string
Name()
const {
return(domainName); };
124 globalPtr = &inGlobal;
129 if(numberOfGrids <= 0)
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);
148 SetMessageStream(inMessageStream);
149 std::ostream &messageStream(*messageStreamPtr);
151 domainConfig = inConfig;
152 domainName = domainConfig.
GetValue(
"ConfigName");
154 if(domainName.empty()){
155 messageStream <<
"Name of domain unspecified." << std::endl;
159 spatialOrder = domainConfig.GetValue<
int>(
ConfigKey(domainName,
"SpatialOrder"));
160 int interiorOrder = (spatialOrder - 1)*2;
163 if(domainConfig.IsSet(
ConfigKey(domainName,
"ScalarNames")))
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();
173 numGridsConfigured = domainConfig.GetValue<
int>(
ConfigKey(domainName,
"NumGrids"));
176 if(numGridsConfigured < 0){
177 messageStream <<
"Number of grids cannot be negative." << std::endl;
179 }
else if (numGridsConfigured == 0){
180 messageStream <<
"Gridless domains are not supported (yet)." << std::endl;
184 if(numGridsConfigured > 1){
185 messageStream <<
"Multiple grids detected." 189 SetNumGrids(numGridsConfigured);
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);
201 geometryNames.push_back(geometryName);
248 messageStream <<
"Domain state meta failed to configure." 255 messageStream <<
"Domain param meta failed to configure." 281 PopulateDomainStateMeta();
282 PopulateDomainParamMeta();
284 if(domainConfig.IsSet(
ConfigKey(domainName,
"IO:Fields")))
285 ioFieldNames = domainConfig.GetValueVector<std::string>(
ConfigKey(domainName,
"IO:Fields"));
288 bcNames = domainConfig.GetValueVector<std::string>(
ConfigKey(domainName,
"BCNames"));
289 int numBoundaries =
bcNames.size();
291 for(
int iBoundary = 0;iBoundary < numBoundaries;iBoundary++){
293 std::string &bcName(
bcNames[iBoundary]);
295 std::string boundaryConfigName(
ConfigKey(domainName,bcName));
303 std::string bcTypeName(boundaryConfig.
GetValue(
ConfigKey(boundaryConfigName,
"BCType")));
307 int bcType = myBC.
BCType();
312 messageStream <<
"BC state dictionary failed to configure for BC " << bcName
318 messageStream <<
"BC param dictionary failed to configure for BC " << bcName
324 messageStream <<
"BC params and fields not configured for " << bcName
335 std::string bcParamKey(
ConfigKey(boundaryConfigName,
"Param"));
337 messageStream <<
"BC param values failed to populate from configuration." << std::endl;
342 messageStream <<
"Deferring setup of hole region." << std::endl;
344 domainBCs.push_back(myBC);
351 std::ostream &inMessageStream)
354 int numBoundaries =
bcNames.size();
355 std::ostream &messageStream(inMessageStream);
357 const std::string ¤tGridName(gridNames[iGrid]);
360 for(
int iBoundary = 0;iBoundary < numBoundaries;iBoundary++){
362 std::string &bcName(
bcNames[iBoundary]);
364 BCType &boundaryBC(domainBCs[iBoundary]);
365 std::string boundaryConfigKey(
ConfigKey(domainName,bcName));
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();
379 domainConfig.GetValueVector<std::string>(
ConfigKey(boundaryConfigKey,
"BoundaryNames"));
380 rnIt = boundaryNames.begin();
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];
391 for(
int iRegion = 0;iRegion < numBoundaryGridRegions;iRegion++){
392 std::string &boundaryName(boundaryNames[iRegion]);
393 std::string gridRegionName(boundaryGridRegionNames[iRegion]);
396 std::string::size_type
x = gridRegionName.find_last_of(
":");
398 std::string regionGridName;
399 if(x != std::string::npos){
400 regionGridName = gridRegionName.substr(0,x);
401 gridRegionName = gridRegionName.substr(x+1);
403 if(x == std::string::npos || regionGridName.empty())
404 regionGridName = currentGridName;
405 std::string regionName = gridRegionName;
409 if(regionGridName != currentGridName){
410 if(!regionGridName.empty()){
411 gridIndex = GetGridIndex(regionGridName);
413 messageStream <<
"Failed to find grid id for \"" 414 << regionGridName <<
"\" in BC resolve." 424 std::vector<BoundaryType> &domainGridBoundaries(GridBoundaries(gridIndex));
425 std::string &bcName(boundaryBC.
BCName());
429 GridType &boundaryGrid(
Grid(gridIndex));
433 int gridRegionIndex = boundaryGrid.GetRegionIndex(regionName);
435 if(gridRegionIndex < 0){
436 messageStream <<
"Failed to find grid region id for \"" 437 << gridNames[gridIndex] <<
":" << regionName
438 <<
"\" in BC resolve." << std::endl;
443 BoundaryType thisBoundary;
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
453 domainGridBoundaries.push_back(thisBoundary);
461 int numGrids = domainGrids.size();
462 int numGridStates = gridStates.size();
463 int numGridParams = gridParams.size();
465 if(numGrids != numGridStates)
467 if(numGridStates != numGridParams)
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;
475 messageStream <<
"WARNING: No fields set up as State Fields." << std::endl;
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();
483 messageStream <<
"Creating state and parameter data for " << domainGrids.size() <<
" grids." 486 while(gridIt != domainGrids.end()){
488 GridType &thisGrid(**gridIt++);
489 StateType &gridState(**stateIt++);
491 StateType &gridParams(**paramIt++);
492 std::string &gridName(*gridNameIt++);
494 const std::vector<size_t> &
bufferSizes(thisGrid.BufferSizes());
500 messageStream <<
"Creating buffers for " << gridName
501 <<
" with bufferSizes(";
503 messageStream <<
")" << std::endl;
505 gridState.SetMetaData(stateDataDictionary);
506 gridParams.SetMetaData(paramDataDictionary);
508 gridState.Create(numPointsBuffer,0);
509 if(!stateFields.empty())
510 gridState.SetStateFields(stateFields);
512 (*targIt)->CopyStateFields(gridState);
514 gridParams.Create(numPointsBuffer,0);
516 std::string paramKeyRoot(
ConfigKey(domainName,
"Param"));
517 messageStream <<
"Configuring parameters with KeyRoot(" 518 << paramKeyRoot <<
")." << std::endl;
520 messageStream <<
"ERROR! Domain parameters failed to populate." << std::endl;
529 if(gridIndex > (domainGrids.size()-1))
532 std::string stateFields(domainConfig.GetValue(
ConfigKey(domainName,
"Advancer:Fields")));
533 messageStream <<
"Setting state fields to (" << stateFields <<
")" << std::endl;
536 messageStream <<
"Creating state and parameter data for grid(" << gridIndex <<
"," 537 << gridNames[gridIndex] <<
")" << std::endl;
540 GridType &thisGrid(
Grid(gridIndex));
541 StateType &gridState(State(gridIndex));
543 StateType &gridParams(Param(gridIndex));
544 std::string &gridName(gridNames[gridIndex]);
546 const std::vector<size_t> &
bufferSizes(thisGrid.BufferSizes());
552 messageStream <<
"Creating buffers for " << gridName
553 <<
" with bufferSizes(";
555 messageStream <<
")" << std::endl;
557 gridState.SetMetaData(stateDataDictionary);
558 gridParams.SetMetaData(paramDataDictionary);
560 gridState.Create(numPointsBuffer,0);
561 gridState.SetStateFields(stateFields);
562 if(gridTargets[gridIndex] == NULL){
563 gridTargets[gridIndex] =
new StateType;
565 gridTargets[gridIndex]->CopyStateData(gridState);
567 gridParams.Create(numPointsBuffer,0);
569 std::string paramKeyRoot(
ConfigKey(domainName,
"Param"));
571 messageStream <<
"ERROR! Domain parameters failed to populate." << std::endl;
582 std::vector<std::string>::const_iterator nameIt = gridNames.begin();
583 while(nameIt != gridNames.end()){
584 if(*nameIt++ == gridName){
597 return(partitionInfo.gridIndexOfLocalGrids);
601 return(partitionInfo.gridIndexOfLocalGrids[localGridIndex]);
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();
616 while(bcIt != domainBCs.end()){
617 BCType &myBC(*bcIt++);
618 Ostr <<
"BC(" <<
bcNames[bcIndex++] <<
") = " 619 << myBC.
BCName() << std::endl;
621 Ostr <<
" Boundary state data: " << std::endl
624 Ostr <<
" No boundary state data. " << std::endl;
627 Ostr <<
" Boundary params: " << std::endl
630 Ostr <<
" No boundary parameters. " << std::endl;
634 Ostr <<
"No boundary conditions configured." << std::endl;
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());
650 Ostr <<
"Grid Sizes: (";
652 Ostr <<
")" << std::endl
653 <<
"Partition Interval: ";
656 <<
"Buffer Sizes: (";
658 Ostr <<
")" << std::endl
659 <<
"Partition Buffer Interval: ";
662 <<
"Buffer size: " << numPointsBuffer << std::endl;
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);
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);
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' ||
699 domainState.Meta().AddField(metaData.name,metaData);
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' ||
711 domainParams.Meta().AddField(metaData.name,metaData);
718 std::vector<std::string> &
GridNames() {
return(gridNames); };
719 std::string
GridName(
int iGrid) {
return(gridNames[iGrid]); };
723 void SetTime(
double inTime){ domainTime = inTime; };
724 double Time(){
return(domainTime); };
725 OperatorType &
Operator(){
return(domainOperator); };
726 const OperatorType &
Operator()
const {
return(domainOperator); };
728 std::vector<BCType> &
BCs() {
return(domainBCs); };
729 const std::vector<BCType> &
BCs()
const {
return(domainBCs); };
730 RHSType &
RHS() {
return(*rhsPtr); };
738 rhsPtr = gridRHSs[0];
743 if(partitionInfo.gridIndexOfLocalGrids.size() != numGrids){
744 if(PartitionDomain(0)){
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;
756 gridRHSs[gridIndex] = &inRHS;
762 return(gridCommunicators[gridIndex]);
767 {
return(domainCommunicator = inCommunicator); };
772 int numLocalGrids = domainGrids.size();
773 partitionInfo.gridIndexOfLocalGrids.resize(numLocalGrids);
774 for(
int iGrid = 0;iGrid < numLocalGrids;iGrid++){
775 partitionInfo.gridIndexOfLocalGrids[iGrid] = iGrid;
778 }
else if(inOptions == 1){
780 int numDomainProcs = 1;
781 if(domainCommunicator.Good()){
782 numDomainProcs = domainCommunicator.NProc();
783 domainRank = domainCommunicator.Rank();
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 ¤tGrid(*domainGrids[iGrid]);
793 const std::vector<size_t> &
gridSizes(currentGrid.GridSizes());
795 for(
int iDim = 0;iDim < numDim;iDim++){
798 numPointsTotal += numPointsGrid[iGrid];
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];
808 if(totalGridProcs > numDomainProcs){
809 int numToScrape = totalGridProcs - numDomainProcs;
810 std::vector<unsigned int> numProcsOrder;
812 std::reverse(numProcsOrder.begin(),numProcsOrder.end());
814 for(
int iScrape = numToScrape;iScrape > 0;iScrape--){
815 int gridIndexToScrape = numProcsOrder[orderIndex];
816 numProcsGrid[gridIndexToScrape]--;
817 numPointsPerProc[gridIndexToScrape] =
818 numPointsGrid[gridIndexToScrape]/numProcsGrid[gridIndexToScrape];
821 int numToDoleOut = numDomainProcs - totalGridProcs;
826 }
else if(inOptions == 3){
833 int numDomainProcs = 1;
834 if(domainCommunicator.Good()){
835 numDomainProcs = domainCommunicator.NProc();
836 domainRank = domainCommunicator.Rank();
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 ¤tGrid(*domainGrids[iGrid]);
846 const std::vector<size_t> &
gridSizes(currentGrid.GridSizes());
848 const std::vector<int> &gridSplitSizes(currentGrid.DecompSizes());
849 if(gridSplitSizes.size() != numDim)
851 for(
int iDim = 0;iDim < numDim;iDim++){
852 numProcsGrid[iGrid] *= gridSplitSizes[iDim];
855 if(numPointsGrid[iGrid] == 0)
857 if(!(numProcsGrid[iGrid] > 0))
859 numPointsTotal += numPointsGrid[iGrid];
860 numProcsTotal += numProcsGrid[iGrid];
861 numPointsPerProc[iGrid] = numPointsGrid[iGrid]/numProcsGrid[iGrid];
862 if(numPointsPerProc[iGrid] == 0 || numPointsPerProc[iGrid] > numPointsGrid[iGrid])
865 if(numProcsTotal != numDomainProcs)
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]);
886 if(gridRHSs.size() != numGrids){
887 gridRHSs.resize(numGrids,NULL);
889 if(ownRHS.size() != numGrids){
890 ownRHS.resize(numGrids,
false);
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]);
902 int Step() {
return(stepNumber); };
903 void SetStep(
int inStep) { stepNumber = inStep; };
908 double timeStep = std::numeric_limits<double>::max();
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;
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);
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();
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());
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();
967 int advancementMode = 0;
968 if(advancementMode == 0){
972 if(domainCommunicator.Good())
973 domainCommunicator.Barrier();
985 { geometryInfoPtr = &geometryInfo; };
1033 template<
typename DomainType>
GridType & Grid(int iGrid)
std::vector< std::string > boundaryNames
boundary::bc::base BCType
void SetTime(double inTime)
void SetGeometryInfo(geometry::info &geometryInfo)
StateType & Target(int iGrid)
fixtures::CommunicatorType & GridCommunicator(int gridIndex)
DataDictionaryType & ParamDictionary()
fixtures::CommunicatorType & SetCommunicator(fixtures::CommunicatorType &inCommunicator)
DataDictionaryType & StateDictionary()
int CreateData(std::ostream &messageStream)
int ResolveBCName(const std::string &inName)
std::vector< std::string > & GeometryNames()
int SetRHS(RHSType &inRHS)
const std::vector< std::string > & BCNames() const
fixtures::ConfigurationType initConfig
pcpp::ParallelGlobalType * globalPtr
void const size_t const size_t * gridSizes
std::vector< RHSType * > rhsvector
plascom2::operators::sbp::base OperatorType
OperatorType & Operator()
void SetSpatialOrder(int inOrder)
void SetGridRegionID(int inID)
double TimeStep(double *outCFL=NULL)
void PopulateDomainStateMeta()
std::vector< size_t > numPointsProc
int ConfigureDomain(fixtures::ConfigurationType &inConfig, std::ostream &inMessageStream)
std::vector< fixtures::CommunicatorType > & GridCommunicators()
OperatorType domainOperator
int ConfigStateValues(fixtures::ConfigurationType &inConfig, const std::string &keyRoot, StateType &inState, std::ostream &messageStream)
virtual int Configure(fixtures::ConfigurationType &inConfig)
DataDictionaryType paramDataDictionary
std::vector< BCType > domainBCs
std::vector< fixtures::CommunicatorType > gridCommunicators
int ConfigureGridDomainBoundaries(fixtures::ConfigurationType &inConfig, int iGrid, std::ostream &inMessageStream)
void SetScalarNames(const std::string &inNames)
void SetGrid(GridType &inGrid)
std::vector< std::vector< BoundaryType > > domainBoundaries
StateType & Param(int iGrid)
std::vector< std::string > bcNames
void SetGridState(int gridIndex, StateType &inState)
virtual int InitializeDomain(DomainType &inDomain)
const std::vector< std::string > & BoundaryNames() const
void const size_t const size_t const size_t const double const double * x
int CreateData(int gridIndex, std::ostream &messageStream)
std::vector< std::string > gridNames
void SetGridTarget(int gridIndex, StateType &inState)
const OperatorType & Operator() const
std::string GridName(int iGrid)
int InitializeRHS(int inOptions)
std::vector< std::string > ioFieldNames
StateType & State(int iGrid)
DataDictionaryType & ParamDictionary()
const std::vector< BCType > & BCs() const
fixtures::ConfigurationType & Config()
std::vector< std::string > & GridNames()
void SortPermutation(const std::vector< T > &values, std::vector< unsigned int > &v)
pcpp::ConfigType ExtractConfigParams(const fixtures::ConfigurationType &inConfig, const std::string &configName)
Main encapsulation of MPI.
GridType::HaloType HaloType
std::string Grid(const GridType &inGrid)
std::vector< BoundaryType > & DomainBoundary(int iGrid)
void PopulateDomainParamMeta()
std::string GetValue(const std::string &key) const
simulation::rhs::domain_base< GridType, StateType, OperatorType > RHSType
Encapsulation for a collection of operator stencils.
static const std::string scalarNames("scalarVars")
void PopulateGridMeta(DataDictionaryType &gridMeta)
partitioninfo partitionInfo
std::vector< BCType > & BCs()
void SetGlobal(pcpp::ParallelGlobalType &inGlobal)
std::vector< int > globalDomainIndex
void const size_t const size_t * bufferSizes
void SetGrid(int gridIndex, GridType &inGrid)
std::string ConfigKey(const std::string &configName, const std::string &keyName)
boundary::base BoundaryType
std::vector< std::vector< BoundaryType > > & DomainBoundaries()
std::vector< int > & LocalGridIndices()
void SetName(const std::string &inName)
void SetBCName(const std::string &inName)
static const char * bcNames[]
std::vector< BoundaryType > & GridBoundaries(int iGrid)
std::ostream & PrettyPrint(std::ostream &outStream) const
std::vector< GridType * > gridvector
void SetGridParams(int gridIndex, StateType ¶mState)
DataDictionaryType & StateDictionary()
std::vector< StateType * > statevector
void PopulateGridParamMeta(DataDictionaryType &gridMeta)
int FinalizeAdvance(double newTime)
std::vector< bool > ownGrid
std::ostream * messageStreamPtr
int Initialize(base &stencilSet, int interiorOrder)
Initialize the sbp::base stencilset with the SBP operator of given order.
std::vector< int > numProcsGrid
fixtures::ConfigurationType domainConfig
const std::vector< std::string > & ScalarNames() const
Simple Block Structured Mesh object.
int SetRHS(int gridIndex, RHSType &inRHS)
std::vector< bool > ownState
StateType::MetaDataSetType DataDictionaryType
int GetGridIndex(const std::string &gridName) const
std::vector< int > gridIndexOfLocalGrids
The global grid index of each local grid (has size of numLocalGrids)
std::vector< std::string > IOFieldNames()
fixtures::CommunicatorType domainCommunicator
DataDictionaryType stateDataDictionary
std::vector< std::string > & ScalarNames()
std::vector< std::string > scalarNames
void SetBCType(int inType)
std::vector< std::string > domainNames
std::vector< int > gridColor
std::vector< bool > ownRHS
int PartitionDomain(int inOptions=0)
void const size_t * numPointsBuffer
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
int SetNumGrids(int numberOfGrids)
void SetMessageStream(std::ostream &inStream)
void ComputeDV(int threadId=0)
std::vector< std::string > geometryNames
int LocalGridIndex(int localGridIndex)
int SetNumThreads(int numThreads)
fixtures::CommunicatorType & Communicator()
int ConfigureDataDictionary(pcpp::ConfigType &inConfig, const std::string &dictName, pcpp::field::metadataset &dataDictionary, std::ostream &messageStream)