3 #include "Tpetra_MultiVector_decl.hpp" 7 #include "Teuchos_XMLParameterListHelpers.hpp" 17 const string& delimiters =
" \f\n\r\t\v" )
19 return s.substr( 0, s.find_last_not_of( delimiters ) + 1 );
24 const string& delimiters =
" \f\n\r\t\v" )
26 return s.substr( s.find_first_not_of( delimiters ) );
31 const string& delimiters =
" \f\n\r\t\v" )
37 void readGeoGenParams(
string paramFileName, Teuchos::ParameterList &geoparams,
const RCP<
const Teuchos::Comm<int> > & comm){
38 std::string input =
"";
40 for(
int i = 0; i < 25000; ++i){
45 if(comm->getRank() == 0){
47 std::fstream inParam(paramFileName.c_str());
55 getline (inParam,tmp);
56 while (!inParam.eof()){
63 getline (inParam,tmp);
66 for (
size_t i = 0; i < input.size(); ++i){
74 int size = input.size();
78 comm->broadcast(0,
sizeof(
int), (
char*) &size);
80 throw "File " + paramFileName +
" cannot be opened.";
82 comm->broadcast(0, size, inp);
83 std::istringstream inParam(inp);
85 getline (inParam,str);
86 while (!inParam.eof()){
88 size_t pos = str.find(
'=');
89 if(pos == std::string::npos){
90 throw "Invalid Line:" + str +
" in parameter file";
92 string paramname =
trim_copy(str.substr(0,pos));
93 string paramvalue =
trim_copy(str.substr(pos + 1));
94 geoparams.set(paramname, paramvalue);
96 getline (inParam,str);
101 for(
int i = 0; args[i] != 0; i++)
106 std::stringstream stream(std::stringstream::in | std::stringstream::out);
107 stream << argumentline;
108 getline(stream, argumentid,
'=');
112 stream >> argumentValue;
116 template <
typename part_t>
125 bool isprocset =
false;
128 for(
int i = 0; i < argc; ++i){
131 string identifier =
"";
135 if(identifier ==
"PROC"){
136 std::stringstream stream(std::stringstream::in | std::stringstream::out);
138 getline(stream, procF,
'=');
143 else if(identifier ==
"NX"){
144 std::stringstream stream(std::stringstream::in | std::stringstream::out);
146 getline(stream, tmp2,
'=');
151 else if(identifier ==
"NY"){
152 std::stringstream stream(std::stringstream::in | std::stringstream::out);
154 getline(stream, tmp2,
'=');
159 else if(identifier ==
"NZ"){
160 std::stringstream stream(std::stringstream::in | std::stringstream::out);
162 getline(stream, tmp2,
'=');
169 throw "Invalid argument at " + tmp;
173 if(!(ispartset == 3&& isprocset)){
174 throw "(PROC && PART) are mandatory arguments.";
178 int main(
int argc,
char *argv[]){
180 typedef Tpetra::MultiVector<zscalar_t, zlno_t, zgno_t, znode_t>
tMVector_t;
182 typedef inputAdapter_t::part_t part_t;
184 Teuchos::GlobalMPISession session(&argc, &argv);
199 part_t jobX = 1, jobY = 1, jobZ = 1;
200 string procfile =
"";
202 const RCP<Comm<int> > commN;
203 RCP<Comm<int> >comm = Teuchos::rcp_const_cast<Comm<int> >
204 (Teuchos::DefaultComm<int>::getDefaultSerialComm(commN));
206 part_t *task_communication_xadj_ = NULL;
207 part_t *task_communication_adj_ = NULL;
218 numParts = jobZ*jobY*jobX;
222 partCenters =
new zscalar_t * [coordDim];
223 for(
int i = 0; i < coordDim; ++i){
224 partCenters[i] =
new zscalar_t[numParts];
228 task_communication_xadj_ =
new part_t [numParts+1];
229 task_communication_adj_ =
new part_t [numParts * 6];
232 task_communication_xadj_[0] = 0;
233 for (part_t i = 0; i < numParts; ++i) {
235 int y = (i / (jobX)) % jobY;
236 int z = (i / (jobX)) / jobY;
237 partCenters[0][i] = x;
238 partCenters[1][i] = y;
239 partCenters[2][i] = z;
242 task_communication_adj_[prevNCount++] = i - 1;
245 task_communication_adj_[prevNCount++] = i + 1;
248 task_communication_adj_[prevNCount++] = i - jobX;
251 task_communication_adj_[prevNCount++] = i + jobX;
254 task_communication_adj_[prevNCount++] = i - jobX * jobY;
257 task_communication_adj_[prevNCount++] = i + jobX * jobY;
259 task_communication_xadj_[i+1] = prevNCount;
266 std::fstream m(procfile.c_str());
267 procCoordinates =
new zscalar_t * [procDim];
268 for(
int i = 0; i < procDim; ++i){
269 procCoordinates[i] =
new zscalar_t[numParts];
273 m >> procCoordinates[0][i] >> procCoordinates[1][i] >> procCoordinates[2][i];
294 RCP<const Teuchos::Comm<int> > tcomm = Teuchos::DefaultComm<int>::getComm();
295 part_t *proc_to_task_xadj_ =
new part_t[numProcs+1];
296 part_t *proc_to_task_adj_ =
new part_t[numParts];
317 part_t *partArray = NULL;
318 int partArraysize = -1;
323 part_t *machineDimensions = NULL;
325 Zoltan2::coordinateTaskMapperInterface<part_t, zscalar_t, zscalar_t>(
335 task_communication_xadj_,
336 task_communication_adj_,
347 if (tcomm->getRank() == 0){
348 cout <<
"PASS" << endl;
355 delete [] proc_to_task_xadj_;
356 delete [] proc_to_task_adj_;
357 delete [] task_communication_xadj_;
358 delete [] task_communication_adj_;
360 for (
int i = 0; i < coordDim; i++)
delete [] partCenters[i];
361 delete [] partCenters;
362 for (
int i = 0; i < procDim; i++)
delete [] procCoordinates[i];
363 delete [] procCoordinates;
365 catch(std::string &s){
372 catch(
char const * s){
string trim_right_copy(const string &s, const string &delimiters=" \f\n\r\t\v")
int main(int argc, char *argv[])
string trim_copy(const string &s, const string &delimiters=" \f\n\r\t\v")
string convert_to_string(char *args)
common code used by tests
void readGeoGenParams(string paramFileName, Teuchos::ParameterList &geoparams, const RCP< const Teuchos::Comm< int > > &comm)
string trim_left_copy(const string &s, const string &delimiters=" \f\n\r\t\v")
void getArgVals(int argc, char **argv, std::string &procF, part_t &nx, part_t &ny, part_t &nz)
An adapter for Xpetra::MultiVector.
static const std::string fail
bool getArgumentValue(string &argumentid, double &argumentValue, string argumentline)