51#ifdef HAVE_MUELU_EPETRAEXT
69 long ExtractNonSerializableData(
const Teuchos::ParameterList& inList, Teuchos::ParameterList& serialList, Teuchos::ParameterList& nonSerialList) {
70 using Teuchos::ParameterList;
74 for (ParameterList::ConstIterator inListEntry = inList.begin(); inListEntry != inList.end(); inListEntry++) {
75 const std::string& levelName = inListEntry->first;
78 if (inList.isSublist(levelName) && ((levelName.find(
"level ") == 0 && levelName.size() > 6) || levelName.find(
"user data") == 0)) {
79 int levelID = strtol(levelName.substr(6).c_str(), 0, 0);
81 if(levelName.find(
"user data") == std::string::npos) {
83 levelID = strtol(levelName.substr(6).c_str(), 0, 0);
84 if (maxLevel < levelID)
89 const ParameterList& levelList = inList.sublist(levelName);
90 for (ParameterList::ConstIterator levelListEntry = levelList.begin(); levelListEntry != levelList.end(); levelListEntry++) {
91 const std::string& name = levelListEntry->first;
92 if (name ==
"A" || name ==
"P" || name ==
"R" || name==
"M" || name ==
"Mdiag" || name ==
"K" || name ==
"Nullspace" || name ==
"Coordinates"
93 || name ==
"D0" || name ==
"M1" || name ==
"Ms" || name ==
"M0inv"
94 || name ==
"Pnodal" || name ==
"NodeMatrix" || name ==
"NodeAggMatrix"
95 || name ==
"Node Comm" || name ==
"DualNodeID2PrimalNodeID"
96#ifdef HAVE_MUELU_INTREPID2
97 || name ==
"pcoarsen: element to node map"
99 || name ==
"output stream"
102 nonSerialList.sublist(levelName).setEntry(name, levelListEntry->second);
104#ifdef HAVE_MUELU_MATLAB
107 nonSerialList.sublist(levelName).setEntry(name, levelListEntry->second);
111 nonSerialList.sublist(levelName).setEntry(name, levelListEntry->second);
113 serialList.sublist(levelName).setEntry(name, levelListEntry->second);
118 serialList.setEntry(inListEntry->first, inListEntry->second);
129 char* buf = (
char*) malloc(stream.size() + 1);
130 strcpy(buf, stream.c_str());
131 char* token = strtok(buf, delimChars);
141 char* tokStart = token;
142 char* tokEnd = token + strlen(token) - 1;
143 while(*tokStart ==
' ' && tokStart < tokEnd)
145 while(*tokEnd ==
' ' && tokStart < tokEnd)
148 if(tokStart < tokEnd)
150 std::string finishedToken(tokStart, tokEnd - tokStart);
151 tokenList.push_back(finishedToken);
153 token = strtok(NULL, delimChars);
161 char* str = (
char*) malloc(name.length() + 1);
162 strcpy(str, name.c_str());
164 char* firstWord = strtok(str,
" ");
169 char* secondWord = strtok(NULL,
" ");
174 char* thirdWord = strtok(NULL,
" ");
180 char* tolowerIt = firstWord;
183 *tolowerIt = (char) tolower(*tolowerIt);
187 if(strstr(firstWord,
"matrix") ||
188 strstr(firstWord,
"multivector") ||
189 strstr(firstWord,
"map") ||
190 strstr(firstWord,
"ordinalvector") ||
191 strstr(firstWord,
"int") ||
192 strstr(firstWord,
"scalar") ||
193 strstr(firstWord,
"double") ||
194 strstr(firstWord,
"complex") ||
195 strstr(firstWord,
"string"))
211 char* str = (
char*) malloc(name.length() + 1);
212 strcpy(str, name.c_str());
214 char* firstWord = strtok(str,
" ");
219 char* secondWord = strtok(NULL,
" ");
224 char* thirdWord = strtok(NULL,
" ");
230 char* tolowerIt = firstWord;
233 *tolowerIt = (char) tolower(*tolowerIt);
237 if(strstr(firstWord,
"matrix") ||
238 strstr(firstWord,
"multivector") ||
239 strstr(firstWord,
"map") ||
240 strstr(firstWord,
"ordinalvector") ||
241 strstr(firstWord,
"int") ||
242 strstr(firstWord,
"scalar") ||
243 strstr(firstWord,
"double") ||
244 strstr(firstWord,
"complex") ||
245 strstr(firstWord,
"string") ||
246 strstr(firstWord,
"array<go>") ||
247 strstr(firstWord,
"array<lo>") ||
248 strstr(firstWord,
"arrayrcp<lo>") ||
249 strstr(firstWord,
"arrayrcp<go>"))
266 int numRanks = baseComm->getSize();
267 if(numRanks == 1) {NodeId = baseComm->getRank();
return baseComm;}
270 char hostname[MPI_MAX_PROCESSOR_NAME];
272 MPI_Get_processor_name(hostname,&len);
273 struct hostent * host = gethostbyname(hostname);
274 int myaddr = (int) inet_addr(inet_ntoa(*(
struct in_addr *)host->h_addr));
277 std::vector<int> addressList(numRanks);
278 Teuchos::gatherAll(*baseComm,1,&myaddr,numRanks,&addressList[0]);
281 std::sort(addressList.begin(),addressList.end());
285 for(
int i=0, prev=addressList[0]; i<numRanks && prev != myaddr; i++) {
286 if(prev != addressList[i]) {
287 prev = addressList[i];
294 Teuchos::RCP<const Teuchos::Comm<int> > newComm = baseComm->split(NodeId,baseComm->getRank());
297 if(reductionFactor != 1) {
300 int coresPerNode = 0;
301 for(
int i=0, prev=addressList[0]; i<numRanks; i++) {
302 if(prev != addressList[i]) {
303 prev = addressList[i];
304 coresPerNode = std::max(i - lastI, coresPerNode);
308 coresPerNode = std::max(numRanks - lastI, coresPerNode);
311 if(coresPerNode % reductionFactor != 0)
312 throw std::runtime_error(
"Reduction factor does not evently divide # cores per node");
313 int reducedCPN = coresPerNode / reductionFactor;
314 int nodeDivision = newComm->getRank() / reducedCPN;
316 NodeId = numNodes * reductionFactor + nodeDivision;
317 newComm = baseComm->split(NodeId,baseComm->getRank());
322 NodeId = baseComm->getRank();
Namespace for MueLu classes and methods.
bool IsParamMuemexVariable(const std::string &name)
long ExtractNonSerializableData(const Teuchos::ParameterList &inList, Teuchos::ParameterList &serialList, Teuchos::ParameterList &nonSerialList)
Extract non-serializable data from level-specific sublists and move it to a separate parameter list.
bool IsParamValidVariable(const std::string &name)
void TokenizeStringAndStripWhiteSpace(const std::string &stream, std::vector< std::string > &tokenList, const char *delimChars)
Teuchos::RCP< const Teuchos::Comm< int > > GenerateNodeComm(RCP< const Teuchos::Comm< int > > &baseComm, int &NodeId, const int reductionFactor)