31long ExtractNonSerializableData(
const Teuchos::ParameterList& inList, Teuchos::ParameterList& serialList, Teuchos::ParameterList& nonSerialList) {
32 using Teuchos::ParameterList;
36 for (ParameterList::ConstIterator inListEntry = inList.begin(); inListEntry != inList.end(); inListEntry++) {
37 const std::string& levelName = inListEntry->first;
40 if (inList.isSublist(levelName) && ((levelName.find(
"level ") == 0 && levelName.size() > 6) || levelName.find(
"user data") == 0)) {
41 int levelID = strtol(levelName.substr(6).c_str(), 0, 0);
43 if (levelName.find(
"user data") == std::string::npos) {
45 levelID = strtol(levelName.substr(6).c_str(), 0, 0);
46 if (maxLevel < levelID)
51 const ParameterList& levelList = inList.sublist(levelName);
52 for (ParameterList::ConstIterator levelListEntry = levelList.begin(); levelListEntry != levelList.end(); levelListEntry++) {
53 const std::string& name = levelListEntry->first;
55 bool isNumberedNullspace = (name.rfind(
"Nullspace", 0) == 0 && name.length() > 9 && std::isdigit(name.back(), std::locale::classic()));
57 if (name ==
"A" || name ==
"P" || name ==
"R" || name ==
"M" || name ==
"Mdiag" || name ==
"K" || name ==
"Nullspace" || name ==
"Material" || name ==
"Coordinates" || name ==
"BlockNumber" || 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"
58#ifdef HAVE_MUELU_INTREPID2
59 || name ==
"pcoarsen: element to node map"
61 || name ==
"output stream" || isNumberedNullspace) {
62 nonSerialList.sublist(levelName).setEntry(name, levelListEntry->second);
64#ifdef HAVE_MUELU_MATLAB
66 nonSerialList.sublist(levelName).setEntry(name, levelListEntry->second);
70 nonSerialList.sublist(levelName).setEntry(name, levelListEntry->second);
72 serialList.sublist(levelName).setEntry(name, levelListEntry->second);
77 serialList.setEntry(inListEntry->first, inListEntry->second);
87 char* buf = (
char*)malloc(stream.size() + 1);
88 strcpy(buf, stream.c_str());
89 char* token = strtok(buf, delimChars);
97 char* tokStart = token;
98 char* tokEnd = token + strlen(token) - 1;
99 while (*tokStart ==
' ' && tokStart < tokEnd)
101 while (*tokEnd ==
' ' && tokStart < tokEnd)
104 if (tokStart < tokEnd) {
105 std::string finishedToken(tokStart, tokEnd - tokStart);
106 tokenList.push_back(finishedToken);
108 token = strtok(NULL, delimChars);
115 char* str = (
char*)malloc(name.length() + 1);
116 strcpy(str, name.c_str());
118 char* firstWord = strtok(str,
" ");
123 char* secondWord = strtok(NULL,
" ");
128 char* thirdWord = strtok(NULL,
" ");
134 char* tolowerIt = firstWord;
136 *tolowerIt = (char)tolower(*tolowerIt);
140 if (strstr(firstWord,
"matrix") ||
141 strstr(firstWord,
"multivector") ||
142 strstr(firstWord,
"map") ||
143 strstr(firstWord,
"ordinalvector") ||
144 strstr(firstWord,
"int") ||
145 strstr(firstWord,
"scalar") ||
146 strstr(firstWord,
"double") ||
147 strstr(firstWord,
"complex") ||
148 strstr(firstWord,
"string"))
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;
182 *tolowerIt = (char)tolower(*tolowerIt);
186 if (strstr(firstWord,
"matrix") ||
187 strstr(firstWord,
"multivector") ||
188 strstr(firstWord,
"map") ||
189 strstr(firstWord,
"ordinalvector") ||
190 strstr(firstWord,
"int") ||
191 strstr(firstWord,
"scalar") ||
192 strstr(firstWord,
"double") ||
193 strstr(firstWord,
"complex") ||
194 strstr(firstWord,
"string") ||
195 strstr(firstWord,
"array<go>") ||
196 strstr(firstWord,
"array<lo>") ||
197 strstr(firstWord,
"arrayrcp<lo>") ||
198 strstr(firstWord,
"arrayrcp<go>"))
212 int numRanks = baseComm->getSize();
214 NodeId = baseComm->getRank();
219 char hostname[MPI_MAX_PROCESSOR_NAME];
221 MPI_Get_processor_name(hostname, &len);
222 struct hostent* host = gethostbyname(hostname);
223 int myaddr = (int)inet_addr(inet_ntoa(*(
struct in_addr*)host->h_addr));
226 std::vector<int> addressList(numRanks);
227 Teuchos::gatherAll(*baseComm, 1, &myaddr, numRanks, &addressList[0]);
230 std::sort(addressList.begin(), addressList.end());
234 for (
int i = 0, prev = addressList[0]; i < numRanks && prev != myaddr; i++) {
235 if (prev != addressList[i]) {
236 prev = addressList[i];
243 Teuchos::RCP<const Teuchos::Comm<int> > newComm = baseComm->split(NodeId, baseComm->getRank());
246 if (reductionFactor != 1) {
249 int coresPerNode = 0;
250 for (
int i = 0, prev = addressList[0]; i < numRanks; i++) {
251 if (prev != addressList[i]) {
252 prev = addressList[i];
253 coresPerNode = std::max(i - lastI, coresPerNode);
257 coresPerNode = std::max(numRanks - lastI, coresPerNode);
260 if (coresPerNode % reductionFactor != 0)
261 throw std::runtime_error(
"Reduction factor does not evently divide # cores per node");
262 int reducedCPN = coresPerNode / reductionFactor;
263 int nodeDivision = newComm->getRank() / reducedCPN;
265 NodeId = numNodes * reductionFactor + nodeDivision;
266 newComm = baseComm->split(NodeId, baseComm->getRank());
271 NodeId = baseComm->getRank();
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.