void Teuchos::updateParametersFromXmlFileAndBroadcast( const std::string &xmlFileName, const Ptr<ParameterList> ¶mList, const Comm<int> &comm ) { if (comm.getSize()==1) updateParametersFromXmlFile(xmlFileName, paramList); else { if (comm.getRank()==0) { XMLParameterListReader xmlPLReader; xmlPLReader.setAllowsDuplicateSublists( false ); FileInputSource xmlFile(xmlFileName); XMLObject xmlParams = xmlFile.getObject(); std::string xmlString = toString(xmlParams); int strsize = xmlString.size(); broadcast<int, int>(comm, 0, &strsize); broadcast<int, char>(comm, 0, strsize, &xmlString[0]); updateParametersFromXmlString(xmlString, paramList); } else { int strsize; broadcast<int, int>(comm, 0, &strsize); std::string xmlString; xmlString.resize(strsize); broadcast<int, char>(comm, 0, strsize, &xmlString[0]); updateParametersFromXmlString(xmlString, paramList); } } }
TEUCHOS_UNIT_TEST( XMLParameterListReader, XMLDuplicatedSublistsBackwardsCompatible ) { FileInputSource xmlFile(filename); XMLObject xmlParams = xmlFile.getObject(); XMLParameterListReader xmlPLReader; TEST_EQUALITY_CONST( xmlPLReader.getAllowsDuplicateSublists(), true ); TEST_NOTHROW( xmlPLReader.toParameterList(xmlParams) ); }
Teuchos::RCP<Teuchos::ParameterList> Teuchos::getParametersFromXmlString(const std::string &xmlStr, RCP<DependencySheet> depSheet) { XMLParameterListReader xmlPLReader; xmlPLReader.setAllowsDuplicateSublists( false ); StringInputSource xmlStrSrc(xmlStr); XMLObject xmlParams = xmlStrSrc.getObject(); return xmlPLReader.toParameterList(xmlParams, depSheet); }
TEUCHOS_UNIT_TEST( XMLParameterListReader, XMLDuplicatedSublistsThrowsError ) { FileInputSource xmlFile(filename); XMLObject xmlParams = xmlFile.getObject(); XMLParameterListReader xmlPLReader; TEST_EQUALITY_CONST( xmlPLReader.getAllowsDuplicateSublists(), true ); out << "Changing policy to disallow duplicate sublists" << std::endl; xmlPLReader.setAllowsDuplicateSublists( false ); TEST_EQUALITY_CONST( xmlPLReader.getAllowsDuplicateSublists(), false ); TEST_THROW( xmlPLReader.toParameterList(xmlParams), DuplicateParameterSublist ); }
void Teuchos::updateParametersFromXmlFile( const std::string &xmlFileName, const Ptr<ParameterList> ¶mList ) { XMLParameterListReader xmlPLReader; xmlPLReader.setAllowsDuplicateSublists( false ); FileInputSource xmlFile(xmlFileName); XMLObject xmlParams = xmlFile.getObject(); paramList->setParameters(xmlPLReader.toParameterList(xmlParams)); }
int main(int argc, char *argv[]) { #ifdef HAVE_MPI MPI_Init(&argc,&argv); Epetra_MpiComm Comm(MPI_COMM_WORLD); int mypid = Comm.MyPID(); #else Epetra_SerialComm Comm; int mypid = 0; #endif // Read XML input deck ParameterList masterList; if (argc > 1) { if (strncmp("-h",argv[1],2) == 0) { cout << "help" << endl; ML_Print_Help(); ML_Exit(mypid,0,EXIT_SUCCESS); } else { int i=0,j; FILE* fid = fopen(argv[1],"r"); if (fid) { i++; fclose(fid); } Comm.SumAll(&i, &j, 1); if (j!=Comm.NumProc()) { cout << "Could not open input file." << endl; ML_Print_Help(); ML_Exit(mypid,0,EXIT_FAILURE); } FileInputSource fileSrc(argv[1]); XMLObject fileXML = fileSrc.getObject(); XMLParameterListReader ListReader; masterList = ListReader.toParameterList(fileXML); } } else { cout << "No input file specified." << endl; ML_Print_Help(); ML_Exit(mypid,0,EXIT_SUCCESS); } ParameterList *fileList, *AztecOOList; try {fileList = &(masterList.sublist("data files",true));} catch(...) {ML_Exit(mypid,"Missing \"data files\" sublist.",EXIT_FAILURE);} try {AztecOOList = &(masterList.sublist("AztecOO"));} catch(...) {ML_Exit(mypid,"Missing \"AztecOO\" sublist.",EXIT_FAILURE);} #ifdef ML_SCALING const int ntimers=4; enum {total, probBuild, precBuild, solve}; ml_DblLoc timeVec[ntimers], maxTime[ntimers], minTime[ntimers]; for (int i=0; i<ntimers; i++) timeVec[i].rank = Comm.MyPID(); timeVec[total].value = MPI_Wtime(); #endif string matrixfile = fileList->get("matrix input file","A.dat"); const char *datafile = matrixfile.c_str(); int numGlobalRows; ML_Read_Matrix_Dimensions(datafile, &numGlobalRows, Comm); #ifdef ML_SCALING timeVec[probBuild].value = MPI_Wtime(); #endif // ===================================================== // // READ IN MATRICES FROM FILE // // ===================================================== // if (!mypid) printf("reading %s\n",datafile); fflush(stdout); Epetra_CrsMatrix *Amat=NULL; //Epetra_Map *RowMap=NULL; int errCode=0; //if (RowMap) errCode=EpetraExt::MatrixMarketFileToCrsMatrix(datafile, *RowMap, Amat); //else errCode=EpetraExt::MatrixMarketFileToCrsMatrix(datafile, Comm, Amat); errCode=EpetraExt::MatrixMarketFileToCrsMatrix(datafile, Comm, Amat); if (errCode) ML_Exit(mypid,"error reading matrix", EXIT_FAILURE); Amat->OptimizeStorage(); Epetra_Vector LHS(Amat->RowMap()); LHS.Random(); Epetra_Vector RHS(Amat->RowMap()); RHS.PutScalar(0.0); Epetra_LinearProblem Problem(Amat, &LHS, &RHS); #ifdef ML_SCALING timeVec[probBuild].value = MPI_Wtime() - timeVec[probBuild].value; #endif // =========================== build preconditioner =========================== #ifdef ML_SCALING timeVec[precBuild].value = MPI_Wtime(); #endif // no preconditioner right now #ifdef ML_SCALING timeVec[precBuild].value = MPI_Wtime() - timeVec[precBuild].value; #endif // =========================== outer solver ============================= #ifdef ML_SCALING timeVec[solve].value = MPI_Wtime(); #endif solver.SetParameters(*AztecOOList); int maxits = AztecOOList->get("Aztec iterations",250); double tol = AztecOOList->get("Aztec tolerance",1e-10); #ifdef ML_SCALING timeVec[solve].value = MPI_Wtime() - timeVec[solve].value; #endif // compute the real residual double residual; LHS.Norm2(&residual); if( Comm.MyPID()==0 ) { cout << "||b-Ax||_2 = " << residual << endl; } delete Amat; //delete RowMap; #ifdef ML_SCALING timeVec[total].value = MPI_Wtime() - timeVec[total].value; //avg double dupTime[ntimers],avgTime[ntimers]; for (int i=0; i<ntimers; i++) dupTime[i] = timeVec[i].value; MPI_Reduce(dupTime,avgTime,ntimers,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD); for (int i=0; i<ntimers; i++) avgTime[i] = avgTime[i]/Comm.NumProc(); //min MPI_Reduce(timeVec,minTime,ntimers,MPI_DOUBLE_INT,MPI_MINLOC,0,MPI_COMM_WORLD); //max MPI_Reduce(timeVec,maxTime,ntimers,MPI_DOUBLE_INT,MPI_MAXLOC,0,MPI_COMM_WORLD); if (Comm.MyPID() == 0) { printf("timing : max (pid) min (pid) avg\n"); printf("Problem build : %2.3e (%d) %2.3e (%d) %2.3e \n", maxTime[probBuild].value,maxTime[probBuild].rank, minTime[probBuild].value,minTime[probBuild].rank, avgTime[probBuild]); printf("Preconditioner build : %2.3e (%d) %2.3e (%d) %2.3e \n", maxTime[precBuild].value,maxTime[precBuild].rank, minTime[precBuild].value,minTime[precBuild].rank, avgTime[precBuild]); printf("Solve : %2.3e (%d) %2.3e (%d) %2.3e \n", maxTime[solve].value,maxTime[solve].rank, minTime[solve].value,minTime[solve].rank, avgTime[solve]); printf("Total : %2.3e (%d) %2.3e (%d) %2.3e \n", maxTime[total].value,maxTime[total].rank, minTime[total].value,minTime[total].rank, avgTime[total]); } #endif #ifdef HAVE_MPI MPI_Finalize(); #endif return(EXIT_SUCCESS); } //main