51 #ifdef HAVE_MUELU_EPETRAEXT
61 #include <arpa/inet.h>
73 const std::string& levelName = inListEntry->first;
76 if (inList.
isSublist(levelName) && ((levelName.find(
"level ") == 0 && levelName.size() > 6) || levelName.find(
"user data") == 0)) {
77 int levelID = strtol(levelName.substr(6).c_str(), 0, 0);
79 if (levelName.find(
"user data") == std::string::npos) {
81 levelID = strtol(levelName.substr(6).c_str(), 0, 0);
82 if (maxLevel < levelID)
89 const std::string& name = levelListEntry->first;
90 if (name ==
"A" || name ==
"P" || name ==
"R" || name ==
"M" || name ==
"Mdiag" || name ==
"K" || name ==
"Nullspace" || name ==
"Coordinates" || name ==
"D0" || name ==
"Dk_1" || name ==
"Dk_2" || name ==
"Mk_one" || name ==
"Mk_1_one" || name ==
"M1_beta" || name ==
"M1_alpha" || name ==
"invMk_1_invBeta" || name ==
"invMk_2_invAlpha" || name ==
"M1" || name ==
"Ms" || name ==
"M0inv" || name ==
"Pnodal" || name ==
"NodeMatrix" || name ==
"NodeAggMatrix" || name ==
"Node Comm" || name ==
"DualNodeID2PrimalNodeID"
91 #ifdef HAVE_MUELU_INTREPID2
92 || name ==
"pcoarsen: element to node map"
94 || name ==
"output stream") {
95 nonSerialList.
sublist(levelName).
setEntry(name, levelListEntry->second);
97 #ifdef HAVE_MUELU_MATLAB
99 nonSerialList.
sublist(levelName).
setEntry(name, levelListEntry->second);
103 nonSerialList.
sublist(levelName).
setEntry(name, levelListEntry->second);
110 serialList.
setEntry(inListEntry->first, inListEntry->second);
120 char* buf = (
char*)malloc(stream.size() + 1);
121 strcpy(buf, stream.c_str());
122 char* token = strtok(buf, delimChars);
130 char* tokStart = token;
131 char* tokEnd = token + strlen(token) - 1;
132 while (*tokStart ==
' ' && tokStart < tokEnd)
134 while (*tokEnd ==
' ' && tokStart < tokEnd)
137 if (tokStart < tokEnd) {
138 std::string finishedToken(tokStart, tokEnd - tokStart);
139 tokenList.push_back(finishedToken);
141 token = strtok(NULL, delimChars);
148 char* str = (
char*)malloc(name.length() + 1);
149 strcpy(str, name.c_str());
151 char* firstWord = strtok(str,
" ");
156 char* secondWord = strtok(NULL,
" ");
161 char* thirdWord = strtok(NULL,
" ");
167 char* tolowerIt = firstWord;
169 *tolowerIt = (char)
tolower(*tolowerIt);
173 if (strstr(firstWord,
"matrix") ||
174 strstr(firstWord,
"multivector") ||
175 strstr(firstWord,
"map") ||
176 strstr(firstWord,
"ordinalvector") ||
177 strstr(firstWord,
"int") ||
178 strstr(firstWord,
"scalar") ||
179 strstr(firstWord,
"double") ||
180 strstr(firstWord,
"complex") ||
181 strstr(firstWord,
"string"))
194 char* str = (
char*)malloc(name.length() + 1);
195 strcpy(str, name.c_str());
197 char* firstWord = strtok(str,
" ");
202 char* secondWord = strtok(NULL,
" ");
207 char* thirdWord = strtok(NULL,
" ");
213 char* tolowerIt = firstWord;
215 *tolowerIt = (char)
tolower(*tolowerIt);
219 if (strstr(firstWord,
"matrix") ||
220 strstr(firstWord,
"multivector") ||
221 strstr(firstWord,
"map") ||
222 strstr(firstWord,
"ordinalvector") ||
223 strstr(firstWord,
"int") ||
224 strstr(firstWord,
"scalar") ||
225 strstr(firstWord,
"double") ||
226 strstr(firstWord,
"complex") ||
227 strstr(firstWord,
"string") ||
228 strstr(firstWord,
"array<go>") ||
229 strstr(firstWord,
"array<lo>") ||
230 strstr(firstWord,
"arrayrcp<lo>") ||
231 strstr(firstWord,
"arrayrcp<go>"))
245 int numRanks = baseComm->getSize();
247 NodeId = baseComm->getRank();
252 char hostname[MPI_MAX_PROCESSOR_NAME];
254 MPI_Get_processor_name(hostname, &len);
255 struct hostent* host = gethostbyname(hostname);
256 int myaddr = (int)inet_addr(inet_ntoa(*(
struct in_addr*)host->h_addr));
259 std::vector<int> addressList(numRanks);
260 Teuchos::gatherAll(*baseComm, 1, &myaddr, numRanks, &addressList[0]);
263 std::sort(addressList.begin(), addressList.end());
267 for (
int i = 0, prev = addressList[0]; i < numRanks && prev != myaddr; i++) {
268 if (prev != addressList[i]) {
269 prev = addressList[i];
279 if (reductionFactor != 1) {
282 int coresPerNode = 0;
283 for (
int i = 0, prev = addressList[0]; i < numRanks; i++) {
284 if (prev != addressList[i]) {
285 prev = addressList[i];
286 coresPerNode = std::max(i - lastI, coresPerNode);
290 coresPerNode = std::max(numRanks - lastI, coresPerNode);
293 if (coresPerNode % reductionFactor != 0)
294 throw std::runtime_error(
"Reduction factor does not evently divide # cores per node");
295 int reducedCPN = coresPerNode / reductionFactor;
296 int nodeDivision = newComm->getRank() / reducedCPN;
298 NodeId = numNodes * reductionFactor + nodeDivision;
299 newComm = baseComm->split(NodeId, baseComm->getRank());
304 NodeId = baseComm->getRank();
ParameterList & setEntry(const std::string &name, U &&entry)
ConstIterator end() const
std::string tolower(const std::string &str)
bool IsParamMuemexVariable(const std::string &name)
bool isSublist(const std::string &name) const
params_t::ConstIterator ConstIterator
ConstIterator begin() const
bool IsParamValidVariable(const std::string &name)
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
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)
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...