/usr/include/trilinos/Xpetra_BlockReorderManager.cpp is in libtrilinos-xpetra-dev 12.10.1-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | #include <Xpetra_BlockReorderManager.hpp>
namespace Xpetra {
void BlockReorderManager::SetBlock(int blockIndex, int reorder) {
TEUCHOS_ASSERT(blockIndex < (int) children_.size());
Teuchos::RCP<BlockReorderManager> child = Teuchos::rcp(new BlockReorderLeaf(reorder));
children_[blockIndex] = child;
}
void BlockReorderManager::SetBlock(int blockIndex, const Teuchos::RCP<BlockReorderManager> & reorder) {
TEUCHOS_ASSERT(blockIndex < (int) children_.size());
children_[blockIndex] = reorder;
}
// this function tokenizes a string, breaking out whitespace but saving the
// brackets [,] as special tokens.
void tokenize(std::string srcInput,std::string whitespace,std::string prefer, std::vector<std::string> & tokens) {
std::string input = srcInput;
std::vector<std::string> wsTokens;
std::size_t endPos = input.length()-1;
while(endPos<input.length()) {
std::size_t next = input.find_first_of(whitespace);
// get the sub string
std::string s;
if(next!=std::string::npos) {
s = input.substr(0,next);
// break out the old substring
input = input.substr(next+1,endPos);
}
else {
s = input;
input = "";
}
endPos = input.length()-1;
// add it to the WS tokens list
if(s=="") continue;
wsTokens.push_back(s);
}
for(unsigned int i=0;i<wsTokens.size();i++) {
// get string to break up
input = wsTokens[i];
endPos = input.length()-1;
while(endPos<input.length()) {
std::size_t next = input.find_first_of(prefer);
std::string s = input;
if(next>0 && next<input.length()) {
// get the sub string
s = input.substr(0,next);
input = input.substr(next,endPos);
}
else if(next==0) {
// get the sub string
s = input.substr(0,next+1);
input = input.substr(next+1,endPos);
}
else input = "";
// break out the old substring
endPos = input.length()-1;
// add it to the tokens list
tokens.push_back(s);
}
}
}
// this function takes a set of tokens and returns the first "block", i.e. those
// values (including) brackets that correspond to the first block
std::vector<std::string>::const_iterator buildSubBlock(
std::vector<std::string>::const_iterator begin,
std::vector<std::string>::const_iterator end,
std::vector<std::string> & subBlock) {
std::stack<std::string> matched;
std::vector<std::string>::const_iterator itr;
for(itr=begin;itr!=end;++itr) {
subBlock.push_back(*itr);
// push/pop brackets as they are discovered
if(*itr=="[") matched.push("[");
else if(*itr=="]") matched.pop();
// found all matching brackets
if(matched.empty())
return itr;
}
TEUCHOS_ASSERT(matched.empty());
return itr-1;
}
// This function takes a tokenized vector and converts it to a block reorder manager
Teuchos::RCP<Xpetra::BlockReorderManager> blockedReorderFromTokens(const std::vector<std::string> & tokens)
{
// base case
if(tokens.size()==1)
return Teuchos::rcp(new Xpetra::BlockReorderLeaf(Teuchos::StrUtils::atoi(tokens[0])));
// check first and last character
TEUCHOS_ASSERT(*(tokens.begin())=="[")
TEUCHOS_ASSERT(*(tokens.end()-1)=="]");
std::vector<Teuchos::RCP<Xpetra::BlockReorderManager> > vecRMgr;
std::vector<std::string>::const_iterator itr = tokens.begin()+1;
while(itr!=tokens.end()-1) {
// figure out which tokens are relevant for this block
std::vector<std::string> subBlock;
itr = buildSubBlock(itr,tokens.end()-1,subBlock);
// build the child block reorder manager
vecRMgr.push_back(blockedReorderFromTokens(subBlock));
// move the iterator one more
itr++;
}
// build the parent reorder manager
Teuchos::RCP<Xpetra::BlockReorderManager> rMgr = Teuchos::rcp(new Xpetra::BlockReorderManager());
rMgr->SetNumBlocks(vecRMgr.size());
for(unsigned int i=0;i<vecRMgr.size();i++)
rMgr->SetBlock(i,vecRMgr[i]);
return rMgr;
}
/** \brief Convert a string to a block reorder manager object
*
* Convert a string to a block reorder manager object. These
* strings have numbers delimted by [,]. For example,
* the string "[[2 1] 0]" will give a manager with [2 1] in the
* first block and 0 in the second block.
*
* \param[in] reorder Block structure corresponding to the manager
*
* \returns A block reorder manager with the requested structure
*/
Teuchos::RCP<const Xpetra::BlockReorderManager> blockedReorderFromString(std::string reorder)
{
// vector of tokens to use
std::vector<std::string> tokens;
// manager to be returned
// build tokens vector
tokenize(reorder," \t\n","[]",tokens);
// parse recursively and build reorder manager
Teuchos::RCP<Xpetra::BlockReorderManager> mgr = blockedReorderFromTokens(tokens);
return mgr;
}
} // end namespace
|