17 std::ostream &messageStream)
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();
28 if(iopn < 0) iopn = 0;
52 virtualNode.
ioRank = myRank;
101 std::vector<application_t::DomainBaseType> &localDomains,
102 std::ostream &messageStream)
104 int numDomains = domainPartitionInfo.
numDomains;
105 int numProc = inCommunicator.
Size();
106 if(numDomains == 0) {
107 messageStream <<
"No domains to split." << std::endl;
109 }
else if(numDomains == 1 || numDomains > numProc) {
112 localDomains.resize(numDomains);
113 for(
int i = 0;i < numDomains;i++){
114 localDomains[i].SetCommunicator(inCommunicator);
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." :
".")
126 if(domainPartitionInfo.
domainNames.size() != numDomains){
127 messageStream <<
"Missing domain names." << std::endl;
130 int myRank = inCommunicator.
Rank();
131 int procsPerDomain = numProc/numDomains;
132 if(procsPerDomain <= 0){
133 messageStream <<
"Processors per domain is 0!?" << std::endl;
136 int leftOvers = numProc%numDomains;
138 messageStream <<
"Domain splitting is lopsided with " << leftOvers
139 <<
" leftover processes." << std::endl;
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){
150 localDomains.resize(1);
151 messageStream <<
"Rank " << myRank <<
" taking domain " 156 inCommunicator.
Split(color,myRank,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;
172 template<
typename Gr
idType>
175 std::ostream &messageStream)
177 const std::string gridGenMode(inConfig.
GetValue(gridName+
":GeneratorMode"));
179 if(gridGenMode.empty()){
180 messageStream <<
"GenerateGrid:Error: No generation mode specified." << std::endl;
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;
194 inGrid.SetGridGenerationParameters(gridGenParameters);
195 inGrid.SetGridGenerationOptions(gridGenOptions);
198 messageStream <<
"GenerateGrid:Error: 3D Cylinders not supported yet." << std::endl;
202 messageStream <<
"GenerateGrid:Error: Unknown grid generation mode (" 203 << gridGenMode <<
")" << std::endl;
228 FunctionEntry(
"Configure");
229 std::ostringstream messageStream;
232 if(globalCommunicator.Good())
233 myRank = globalCommunicator.Rank();
236 std::string restartFileName;
237 std::vector<std::string> pc2Arguments(CommandLine().GetArgs());
239 if(!pc2Arguments.empty()){
240 restartFileName = pc2Arguments[0];
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);
253 std::string configFileName(CommandLine().GetOption(
'c'));
255 if(!configFileName.empty()){
256 StdOut(std::string(
"Configuration File Name: ")+configFileName+std::string(
"\n"),2);
258 ErrOut(messageStream.str()+std::string(
"\n"));
259 ErrOut(std::string(
"Processing configuration file ("+configFileName+std::string(
") failed.\n")));
267 }
else if (!restartFileName.empty()) {
270 ErrOut(messageStream.str()+std::string(
"\n"));
271 ErrOut(std::string(
"Processing configuration from restart file (")+
272 restartFileName+std::string(
") failed.\n"));
285 std::string platformInfoString;
286 platformInfo.hostName.assign(globalCommunicator.Hostname());
287 if(appConfig.GetFlagValue(
"System:Discovery")){
288 if(globalCommunicator.Rank() == 0) {
290 platformInfoString = platformInfo.Pack();
292 globalCommunicator.BroadCast(platformInfoString);
293 platformInfo.UnPack(platformInfoString);
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);
311 if(appConfig.IsSet(
"FLUID_MODEL")){
313 ErrOut(
"Failed to convert legacy configuration. Messages:\n");
314 ErrOut(messageStream.str());
319 Ouf.open(
"plascom2.config");
320 Ouf << appConfig << std::endl;
325 globalCommunicator.Barrier();
328 StdOut(messageStream.str(),3);
331 globalCommunicator.Barrier();
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);
346 FunctionExit(
"Configure");
365 FunctionEntry(
"ConfigGeom");
367 std::ostringstream localMessages;
369 std::vector<std::string> geometryNames(appConfig.GetValueVector<std::string>(
"Geometry:Names"));
371 int numGeometries = geometryNames.size();
372 if(numGeometries == 0){
373 ErrOut(
"Warning: No geometry configuration specified.\n");
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]);
392 FunctionExit(
"ConfigGeom");
411 FunctionEntry(
"ConfigDomains");
413 std::ostringstream localMessages;
415 std::vector<std::string> domainNames(appConfig.GetValueVector<std::string>(
"Domain:Names"));
417 int numDomains = domainNames.size();
422 domainNames.resize(numDomains,
"Domain");
426 ErrOut(
"Error: Only single domain simulations are currently supported.\n");
427 FunctionExit(
"ConfigDomains");
431 domainInfo.numDomains = numDomains;
432 domainInfo.domainNames = domainNames;
434 localMessages <<
"Number of domains: " << numDomains << std::endl
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());
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");
452 StdOut(messageStream.str(),2);
455 DebugOut(
"Domains split.\n");
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());
466 int globalDomainIndex = domainInfo.globalDomainIndex[iDomain];
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");
476 appDomains[iDomain].SetGeometryInfo(geometryInfo);
479 DebugOut(
"Domains configured.\n");
481 FunctionExit(
"ConfigDomains");
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 <<
"/" 512 Ostr <<
"VirtualNode:computeRank = " << virtualNode.
computeRank <<
"/" 538 FunctionEntry(
"ConfigSim");
539 std::ostringstream messageStream;
543 virtualNode,messageStream);
546 if(configureVirtualNodeCode){
547 ErrOut(
"Configuration of virtual node failed.\n");
548 return(configureVirtualNodeCode);
550 StdOut(messageStream.str());
556 int configureGeometryCode = ConfigureGeometries();
557 if(configureGeometryCode){
558 ErrOut(
"Configuration of geometries failed.\n");
559 return(configureGeometryCode);
563 int configureDomainsCode = ConfigureDomains();
564 if(configureDomainsCode){
565 ErrOut(
"Configuration of domains failed.\n");
566 return(configureDomainsCode);
569 numStepsMax = appConfig.GetValue<
int>(
ConfigKey(
"PlasCom2",
"NumSteps"));
571 numStepsMax = appConfig.GetValue<
int>(
ConfigKey(
"PlasCom2",
"NumStepsMax"));
575 numStepsIO = appConfig.GetValue<
int>(
ConfigKey(
"PlasCom2",
"NumStepsIO"));
576 numStepsStatus = appConfig.GetValue<
int>(
ConfigKey(
"PlasCom2",
"NumStepsStatus"));
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++);
590 allLocalGridNames.sort();
591 allLocalGridNames.unique();
592 int numAllLocalGrids = allLocalGridNames.size();
595 if(numLocalDomains > 0){
597 int globalDomainIndex = domainInfo.globalDomainIndex[0];
599 DomainBaseType::gridvector &domainGrids(simDomain.Grids());
600 DomainBaseType::statevector &gridStates(simDomain.States());
601 DomainBaseType::statevector &gridParams(simDomain.Params());
603 const std::vector<std::string> &domainGridNames(simDomain.GridNames());
604 int numGlobalGrids = domainGridNames.size();
607 int numProcDomain = domainComm.
Size();
608 int myDomainRank = domainComm.Rank();
611 simDomain.PartitionDomain(0);
613 std::vector<int> &globalGridIndices(simDomain.LocalGridIndices());
614 int numLocalGrids = simDomain.NumberOfLocalGrids();
616 for(
int iLocalGrid = 0;iLocalGrid < numLocalGrids;iLocalGrid++){
618 int iGrid = globalGridIndices[iLocalGrid];
621 const std::string &gridName(domainGridNames[iGrid]);
627 GridType &domainGrid(*domainGrids[iGrid]);
628 StateType &gridState(*gridStates[iGrid]);
629 StateType ¶mState(*gridParams[iGrid]);
633 bool generateGrid =
false;
634 bool readGrid =
false;
635 std::string gridFileName;
637 int gridConfigCode = plascom2::util::ConfigureGrid<GridType>(appConfig,gridName,domainGrid,messageStream);
640 messageStream <<
"Grid(" << iGrid <<
"," << iLocalGrid <<
"," << gridName
641 <<
") failed to configure." << std::endl;
642 ErrOut(messageStream.str());
643 return(gridConfigCode);
645 StdOut(
"++++++++++++\n",2);
646 StdOut(
"Grid Configuration Messages:\n",2);
647 StdOut(messageStream.str(),2);
648 StdOut(
"++++++++++++\n",2);
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"));
655 if(appConfig.IsSet(
ConfigKey(gridName,
"GridFile"))){
656 gridFileName = appConfig.GetValue(
ConfigKey(gridName,
"GridFile"));
657 }
else if(Restart()) {
658 gridFileName = appConfig.GetValue(
"RestartFileName");
660 StdOut(
"WARNING: Setting up without grid data. Consequences unknown.\n");
663 if(readGrid && gridFileName.empty()){
664 ErrOut(
"ReadGrid set but no grid file specified.\n");
672 int domainBoundaryConfigCode = simDomain.ConfigureGridDomainBoundaries(appConfig,iGrid,messageStream);
674 if(domainBoundaryConfigCode){
675 messageStream <<
"Domain boundaries failed to configure." << std::endl;
676 ErrOut(messageStream.str());
677 return(domainBoundaryConfigCode);
679 StdOut(messageStream.str(),2);
685 messageStream <<
"Grid (" << gridName <<
") has gridType(" 686 << gridType <<
")" << std::endl;
689 typedef GridType::HaloType HaloType;
693 std::vector<size_t> &
gridSizes(domainGrid.GridSizes());
694 std::vector<double> &physicalExtent(domainGrid.PhysicalExtent());
695 std::vector<bool> &isPeriodic(domainGrid.PeriodicDirs());
698 if(isPeriodic.empty())
699 isPeriodic.resize(numDim,
false);
702 size_t numGlobalNodes = 1;
703 size_t numGlobalCells = 1;
705 for(
int iDim = 0;iDim < numDim;iDim++){
712 std::vector<double> dX(numDim,0);
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;
720 for(
int iDim = 0;iDim < numDim;iDim++){
721 dX[iDim] = (physicalExtent[2*iDim+1]-physicalExtent[2*iDim])/static_cast<double>(
gridSizes[iDim]-1);
724 domainGrid.SetGridSpacings(dX);
727 int spatialOrder = simDomain.SpatialOrder();
730 messageStream <<
"ERROR! Invalid spatial order specified." << std::endl;
731 ErrOut(messageStream.str());
735 int interiorOrder = (spatialOrder - 1)*2;
736 DomainBaseType::OperatorType &inOperator(simDomain.Operator());
742 int boundaryDepth = std::max(3,inOperator.boundaryDepth+1);
745 std::vector<int> haloDepths(2*numDim,boundaryDepth);
754 std::vector<DomainBaseType::BoundaryType> &gridBoundaries(simDomain.GridBoundaries(iGrid));
756 messageStream <<
"Processing " << gridBoundaries.size() <<
" boundaries." 758 StdOut(messageStream.str(),2);
761 std::vector<DomainBaseType::BoundaryType>::iterator boundIt = gridBoundaries.begin();
763 int processingBoundary = 1;
764 while(boundIt != gridBoundaries.end()){
767 DomainBaseType::BoundaryType &gridBoundary(*boundIt++);
769 DomainBaseType::GridType &boundaryGrid(gridBoundary.Grid());
771 const std::string &boundaryName(gridBoundary.Name());
772 std::vector<size_t> &boundaryGridSizes(boundaryGrid.GridSizes());
773 assert(!boundaryGridSizes.empty());
775 std::vector<simulation::grid::subregion> &gridSubRegions(boundaryGrid.SubRegions());
776 int numSubRegions = gridSubRegions.size();
778 int gridSubRegionIndex = gridBoundary.GridRegionID();
779 if(gridSubRegionIndex >= numSubRegions){
780 messageStream <<
"Boundary subregion out of range" << std::endl;
787 assert(!regionInterval.empty());
792 (gridRegion.
regionInterval[direction].second == (boundaryGridSizes[direction] - 1))){
793 isPeriodic[direction] =
false;
797 messageStream <<
"Domain [" << boundaryName <<
"] boundary in direction " 799 << direction+1 <<
" has BC [" << boundaryCondition.BCName()
800 <<
"]." << std::endl;
802 messageStream <<
"Domain [" << boundaryName <<
"] is a subregion of type [" 803 << boundaryCondition.BCName() <<
"]." << std::endl;
808 messageStream <<
"Setting up domain with PERIODIC directions (";
810 messageStream <<
")" << std::endl;
811 StdOut(messageStream.str(),2);
818 for(
int iDim = 0;iDim < numDim;iDim++)
819 if(isPeriodic[iDim]) pbsCartInfo.
isPeriodic[iDim] = 1;
824 std::vector<int> &decompDirs(domainGrid.DecompDirs());
825 if(!decompDirs.empty()){
832 std::vector<int> &cartCoords(gridComm.CartCoordinates());
833 std::vector<int> &cartDims(gridComm.CartDimensions());
844 partitionInterval,messageStream)){
845 messageStream <<
"ConfigureDomain:SetupSimulationFixtures:Error: Partitioning failed." << std::endl;
846 ErrOut(messageStream.str());
850 std::vector<size_t> extendGrid(2*numDim,0);
852 size_t numPointsPart = partitionInterval.NNodes();
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];
860 if(partitionInterval[iDim].first == 0) {
861 haveNeighbors[2*iDim] =
false;
863 extendGrid[2*iDim] = haloDepths[2*iDim];
865 if(partitionInterval[iDim].second == (
gridSizes[iDim]-1)){
866 haveNeighbors[2*iDim + 1] =
false;
868 extendGrid[2*iDim + 1] = haloDepths[2*iDim+1];
873 messageStream <<
"ConfigureDomain: Configuring grid extensions (";
875 messageStream <<
")" << std::endl;
876 StdOut(messageStream.str(),2);
879 domainGrid.SetDimensionExtensions(extendGrid);
881 if(domainGrid.Finalize()){
882 messageStream <<
"TestFixtures:SetupSimulationFixtures:Error: Grid finalization failed." << std::endl;
887 StdOut(messageStream.str(),2);
891 const std::vector<size_t> &
bufferSizes(domainGrid.BufferSizes());
897 HaloType &inHalo(domainGrid.Halo());
898 inHalo.SetGridInterval(globalInterval);
899 inHalo.SetPartitionInterval(partitionInterval);
903 inHalo.SetNeighbors(haveNeighbors);
904 inHalo.SetPeriodicDirs(pbsCartInfo.
isPeriodic);
906 std::vector<pcpp::IndexIntervalType> remoteHaloExtents(inHalo.CreateRemoteHaloExtents(extendGrid));
907 std::vector<pcpp::IndexIntervalType> localHaloExtents(inHalo.CreateLocalHaloExtents(extendGrid));
910 inHalo.SetLocalPartitionExtent(partitionBufferInterval);
912 inHalo.SetRemoteHaloExtents(remoteHaloExtents);
913 inHalo.SetLocalHaloExtents(localHaloExtents);
915 const std::vector<pcpp::IndexIntervalType> &remoteHaloBufferExtents(inHalo.RemoteHaloBufferExtents());
916 const std::vector<pcpp::IndexIntervalType> &localHaloBufferExtents(inHalo.LocalHaloBufferExtents());
918 inHalo.CreateSimpleSendIndices();
919 inHalo.CreateSimpleRecvIndices();
926 bool withFlux =
false;
927 if(simDomain.CreateData(iGrid,messageStream)){
928 messageStream <<
"Domain data creation failed." << std::endl;
929 ErrOut(messageStream.str());
933 messageStream <<
"Domain data created." << std::endl;
934 StdOut(messageStream.str(),2);
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);
953 bool coordinatesReady =
false;
954 int generatorReturnCode = 0;
955 if(generateGrid && !readGrid){
956 const std::string generatorMode(appConfig.GetValue(gridName+
":GeneratorMode"));
959 generatorMode ==
"Uniform-rectangular"){
960 generatorReturnCode = domainGrid.GenerateCoordinates(messageStream);
962 generatorReturnCode =
GenerateGrid(domainGrid,gridName,appConfig,messageStream);
964 if(generatorReturnCode == 0){
965 coordinatesReady =
true;
967 ErrOut(
"PC2Configuration::Generate grid coordinates failed with messages:\n");
968 ErrOut(messageStream.str());
971 }
else if(!gridFileName.empty()){
973 ErrOut(std::string(
"Fetch grid data failed:\n")+messageStream.str()+std::string(
"\n"));
976 StdOut(std::string(
"Read grid data for (")+gridName+
977 std::string(
") from ")+gridFileName+std::string(
".\n"),2);
978 StdOut(messageStream.str(),2);
980 coordinatesReady =
true;
983 StdOut(
"WARNING: No grid coordinate data. Unsure what's next.");
985 domainGrid.SetType(gridType);
988 domainGrid.ExchangeCoordinates();
994 std::ostringstream domainReportStream;
995 domainReportStream <<
"====== Domain Report =======" << std::endl;
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;
1006 StdOut(domainReportStream.str(),2);
1009 int error = InitializeOverkit();
1011 ErrOut(
"Overkit failed to initialize.\n");
1019 FunctionExit(
"ConfigSim");
1024 int application::InitializeOverkit() {
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);
1030 ovk_context_params *contextParams;
1031 ovkCreateContextParams(&contextParams);
1032 ovkSetContextParamComm(contextParams, globalCommunicator.GetCommunicator());
1033 ovkSetContextParamLogLevel(contextParams, LogLevel);
1034 ovkSetContextParamErrorHandlerType(contextParams, OVK_ERROR_HANDLER_RETURN);
1036 int error = ovkCreateContext(&overkitData.context, contextParams);
1037 if (error != OVK_ERROR_NONE) {
1041 ovkDestroyContextParams(&contextParams);
1047 int application::FinalizeOverkit() {
1049 ovkDestroyContext(&overkitData.context);
1055 int application::ConfigureOverkit() {
1057 overkitData.domains.resize(domainInfo.numLocalDomains);
1059 for (
int iDomain = 0; iDomain < domainInfo.numLocalDomains; iDomain++) {
1062 DomainBaseType::gridvector &domainGrids(simDomain.Grids());
1063 const std::vector<std::string> &domainGridNames(simDomain.GridNames());
1067 int numDim = domainGrids[0]->GridSizes().size();
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());
1075 ovkCreateDomain(overkitData.context, &overkitData.domains[iDomain], domainParams);
1077 ovkDestroyDomainParams(overkitData.context, &domainParams);
1079 DomainBaseType::gridvector::iterator gridIt = domainGrids.begin();
1081 for (
int iGrid = 0; iGrid < simDomain.NumberOfGrids(); iGrid++) {
1083 int gridID = iGrid+1;
1093 std::vector<bool> &isPeriodic(domainGrid.PeriodicDirs());
1094 std::vector<int> &cartCoords(gridComm.CartCoordinates());
1095 std::vector<int> &cartDims(gridComm.CartDimensions());
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;
1105 bool periodic[3] = {
false};
1106 for (
int d = 0; d < numDim; ++d) {
1107 periodic[d] = isPeriodic[d];
1112 int numPointsGlobal[3] = {1};
1113 MPI_Allreduce(localEnd, numPointsGlobal, numDim, MPI_INT, MPI_MAX,
1114 gridComm.GetCommunicator());
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;
1125 std::vector<int> neighborRanks(numNeighbors);
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];
1136 MPI_Cart_rank(gridComm.GetCommunicator(), neighborCoords,
1137 &neighborRanks[iNeighbor]);
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);
1154 ovkSetGridParamLocalBegin(gridParams, localBegin);
1155 ovkSetGridParamLocalEnd(gridParams, localEnd);
1156 ovkSetGridParamNeighborRanks(gridParams, numNeighbors, &neighborRanks[0]);
1158 ovkCreateGridLocal(overkitData.domains[iDomain], NULL, gridParams);
1160 ovkDestroyGridParams(overkitData.domains[iDomain], &gridParams);
1166 ovkCreateGridRemote(overkitData.domains[iDomain], NULL);
std::vector< int > cartDecompDirections
int GenerateGrid(GridType &inGrid, const std::string &gridName, const fixtures::ConfigurationType &inConfig, std::ostream &messageStream)
pcpp::IndexIntervalType regionInterval
int ConfigureVirtualNode(const fixtures::ConfigurationType &inConfig, fixtures::CommunicatorType &inCommunicator, pcpp::VirtualNodeType &virtualNode, std::ostream &messageStream)
DomainBaseType::GridType GridType
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.
void const size_t const size_t * gridSizes
void RenewStream(std::ostringstream &outStream)
void const size_t const size_t const size_t const int const int * gridType
CommunicatorType computeCommunicator
void CartesianSetup(std::ostream &outStream, const std::vector< int > &cartCoords, const std::vector< int > &cartDims)
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.
int FetchGridData(GridType &inGrid, const std::string &gridName, const std::string &gridFileName, std::ostream &messageStream)
DomainBaseType::StateType StateType
DomainBaseT DomainBaseType
CommunicatorType ioCommunicator
std::vector< int > isPeriodic
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
virtual int ConfigureApplication()
Read & BC configuration, process application-wide configuration.
void ConfigureBuildInformation(fixtures::ConfigurationType &inConfig)
void Configuration(std::ostream &outStream, const fixtures::ConfigurationType &inConfig)
pcpp::ConfigType ExtractConfigParams(const fixtures::ConfigurationType &inConfig, const std::string &configName)
Main encapsulation of MPI.
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)
std::string GetValue(const std::string &key) const
CommunicatorType nodeCommunicator
std::vector< std::string > GetValueVector(const std::string &key) const
std::string VirtualNodeReport(pcpp::VirtualNodeType &virtualNode)
Reports the virtual node setup.
int ConvertLegacyConfiguration(fixtures::ConfigurationType &inConfig, fixtures::CommunicatorType &inCommunicator, std::ostream &messageStream)
virtual int ConfigureSimulation()
Configure simluation-specific constructs.
std::vector< int > globalDomainIndex
void const size_t const size_t * bufferSizes
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)
bool IsValidOrder(int overallOrder)
virtual int ConfigureDomains()
Configure simulation domains.
int SetupCartesianTopology(pcpp::CommunicatorType ¶llelCommunicator, pcpp::ParallelTopologyInfoType &topologyInfo, pcpp::CommunicatorType &topoCommunicator, std::ostream &messageStream)
Sets up a communicator with Cartesian topology.
int ConfigureGridInfo(const fixtures::ConfigurationType &inConfig, const std::string &gridName, simulation::geometry::gridinfo &gridInfo, std::ostream &messageStream)
int Split(int color, int key, CommunicatorObject &newcomm)
int Initialize(base &stencilSet, int interiorOrder)
Initialize the sbp::base stencilset with the SBP operator of given order.
Simple Block Structured Mesh object.
int ConfigurePlatformInfo(const fixtures::ConfigurationType &inConfig, pcpp::PlatformInfoType &platformInfo)
std::vector< std::string > domainNames
platform_info PlatformInfo(const std::string &systemInfo)
void InitSimple(const ContainerType &inSize)
void const size_t * numPointsBuffer
bool IsSet(const std::string &Key) const