260  const bool transpose,
 
  264  const int chunk_read = 500000;  
 
  266  const int headerlineLength = 257;
 
  267  const int lineLength = 81;
 
  268  const int tokenLength = 35;
 
  269  char line[headerlineLength];
 
  270  char token1[tokenLength];
 
  271  char token2[tokenLength];
 
  272  char token3[tokenLength];
 
  273  char token4[tokenLength];
 
  274  char token5[tokenLength];
 
  276  int me = comm.
MyPID();
 
  281  if ((domainMap!=0 && rangeMap==0) || (domainMap==0 && rangeMap!=0)) {
 
  288    if (!domainMap->
UniqueGIDs()) {EPETRA_CHK_ERR(-2);}
 
  289    if (!rangeMap->
UniqueGIDs()) {EPETRA_CHK_ERR(-2);}
 
  295      if (!rowMap->
UniqueGIDs()) {EPETRA_CHK_ERR(-2);}
 
  302    if (verbose) std::cout << 
"Reading MatrixMarket file " << filename << std::endl;
 
  303    handle = fopen(filename,
"r");  
 
  310    if( (rv != -1) && fgets(line, headerlineLength, handle)==0 ) {
 
  311      if (handle!=0) fclose(handle);
 
  314    if( (rv != -1) && sscanf(line, 
"%s %s %s %s %s", token1,token2,token3,token4,token5)==0) {
 
  315      if (handle!=0) fclose(handle);
 
  318    if ( (rv != -1) && (strcmp(token1, 
"%%MatrixMarket") ||
 
  319        strcmp(token2, 
"matrix") ||
 
  320        strcmp(token3, 
"coordinate") ||
 
  321        strcmp(token4, 
"real") ||
 
  322        strcmp(token5, 
"general")) ) {
 
  323      if (handle!=0) fclose(handle);
 
  330        if(fgets(line, headerlineLength, handle)==0) {
 
  331          if (handle!=0) fclose(handle);
 
  335      } 
while (line[0] == 
'%');
 
  339    if((rv != -1) && sscanf(line, 
"%d %d %d", &M, &N, &NZ)==0) {
 
  340      if (handle!=0) fclose(handle);
 
  356  char *buffer = 
new char[chunk_read*lineLength];
 
  363  const int localblock = 100000;
 
  364  int localsize = NZ / comm.
NumProc() + localblock;
 
  365  int *iv = (
int *) malloc(localsize * 
sizeof(
int));
 
  366  int *jv = (
int *) malloc(localsize * 
sizeof(
int));
 
  367  double *vv = (
double *) malloc(localsize * 
sizeof(
double));
 
  370  if (!iv || !jv || !vv)
 
  374  bool allocatedHere=
false;
 
  379    allocatedHere = 
true;
 
  382  int joffset = (colMap != 0 ? colMap->
IndexBase()-1 : ioffset);
 
  389    if (NZ-nread > chunk_read) nchunk = chunk_read;
 
  390    else nchunk = NZ - nread;
 
  395      for (
int i = 0; i < nchunk; i++) {
 
  396        eof = fgets(&buffer[rlen],lineLength,handle);
 
  398          fprintf(stderr, 
"%s", 
"Unexpected end of matrix file.");
 
  401        rlen += strlen(&buffer[rlen]);
 
  408    buffer[rlen++] = 
'\0';
 
  412    char *lineptr = buffer;
 
  413    for (rlen = 0; rlen < nchunk; rlen++) {
 
  414      char *next = strchr(lineptr,
'\n');
 
  415      int I = atoi(strtok(lineptr,
" \t\n")) + ioffset;
 
  416      int J = atoi(strtok(NULL,
" \t\n")) + joffset;
 
  417      double V = atof(strtok(NULL,
" \t\n"));
 
  425      if (rowMap1->
MyGID(I)) {
 
  427        if (lnz >= localsize) {
 
  429          localsize += localblock;
 
  430          iv = (
int *) realloc(iv, localsize * 
sizeof(
int));
 
  431          jv = (
int *) realloc(jv, localsize * 
sizeof(
int));
 
  432          vv = (
double *) realloc(vv, localsize * 
sizeof(
double));
 
  438        if (I < prevrow) rowmajor = 0;
 
  444    if (nread / 1000000 > nmillion) {
 
  446      if (verbose && me == 0) std::cout << nmillion << 
"M ";
 
  455    if (verbose && me == 0) std::cout << std::endl << 
"   Sorting local nonzeros" << std::endl;
 
  464  if (verbose && me == 0) std::cout << std::endl << 
"   Constructing the matrix" << std::endl;
 
  466  int *numNonzerosPerRow = 
new int[numRows];
 
  467  for (
int i = 0; i < numRows; i++) numNonzerosPerRow[i] = 0;
 
  468  for (
int i = 0; i < lnz; i++)
 
  469    numNonzerosPerRow[rowMap1->
LID(iv[i])]++;
 
  471  if (rowMap!=0 && colMap !=0)
 
  473  else if (rowMap!=0) {
 
  487  int *gidList = 
new int[numRows];
 
  488  for (
int i = 0; i < numRows; i++) gidList[i] = rowMap1->
GID(i);
 
  493  if (verbose && me == 0) std::cout << 
"   Inserting global values" << std::endl;
 
  496    for (
int sum = 0; i < numRows; i++) {
 
  497      if (numNonzerosPerRow[i]) {
 
  500        if (ierr<0) EPETRA_CHK_ERR(ierr);
 
  501        sum += numNonzerosPerRow[i];
 
  506  delete [] numNonzerosPerRow;
 
  511  if (verbose && me == 0) std::cout << 
"   Completing matrix fill" << std::endl;
 
  512  if (rangeMap != 0 && domainMap != 0) {
 
  517    EPETRA_CHK_ERR(A->
FillComplete(newDomainMap, *rowMap1));
 
  523  if (allocatedHere) 
delete rowMap1;
 
  525  if (handle!=0) fclose(handle);
 
  527  if (verbose && me == 0) std::cout << 
"File Read time (secs):  " << dt << std::endl;
 
 
  540  const bool transpose,
 
  544  const int chunk_read = 500000;  
 
  546  const int headerlineLength = 257;
 
  547  const int lineLength = 81;
 
  548  const int tokenLength = 35;
 
  549  char line[headerlineLength];
 
  550  char token1[tokenLength];
 
  551  char token2[tokenLength];
 
  552  char token3[tokenLength];
 
  553  char token4[tokenLength];
 
  554  char token5[tokenLength];
 
  556  int me = comm.
MyPID();
 
  561  if ((domainMap!=0 && rangeMap==0) || (domainMap==0 && rangeMap!=0)) {
 
  568    if (!domainMap->
UniqueGIDs()) {EPETRA_CHK_ERR(-2);}
 
  569    if (!rangeMap->
UniqueGIDs()) {EPETRA_CHK_ERR(-2);}
 
  575      if (!rowMap->
UniqueGIDs()) {EPETRA_CHK_ERR(-2);}
 
  581    if (verbose) std::cout << 
"Reading MatrixMarket file " << filename << std::endl;
 
  582    handle = fopen(filename,
"r");  
 
  588    if(fgets(line, headerlineLength, handle)==0) {
 
  589      if (handle!=0) fclose(handle);
 
  592    if(sscanf(line, 
"%s %s %s %s %s", token1,token2,token3,token4,token5)==0) {
 
  593      if (handle!=0) fclose(handle);
 
  596    if (strcmp(token1, 
"%%MatrixMarket") ||
 
  597        strcmp(token2, 
"matrix") ||
 
  598        strcmp(token3, 
"coordinate") ||
 
  599        strcmp(token4, 
"real") ||
 
  600        strcmp(token5, 
"general")) {
 
  601      if (handle!=0) fclose(handle);
 
  607      if(fgets(line, headerlineLength, handle)==0) {
 
  608        if (handle!=0) fclose(handle);
 
  611    } 
while (line[0] == 
'%');
 
  614    if(sscanf(line, 
"%lld %lld %lld", &M, &N, &NZ)==0) {
 
  615      if (handle!=0) fclose(handle);
 
  627  char *buffer = 
new char[chunk_read*lineLength];
 
  634  const int localblock = 100000;
 
  635  int localsize = (int) (NZ / comm.
NumProc()) + localblock;
 
  636  long long *iv = (
long long *) malloc(localsize * 
sizeof(
long long));
 
  637  long long *jv = (
long long *) malloc(localsize * 
sizeof(
long long));
 
  638  double *vv = (
double *) malloc(localsize * 
sizeof(
double));
 
  641  if (!iv || !jv || !vv)
 
  645  bool allocatedHere=
false;
 
  650    allocatedHere = 
true;
 
  652  long long ioffset = rowMap1->IndexBase64()-1;
 
  653  long long joffset = (colMap != 0 ? colMap->IndexBase64()-1 : ioffset);
 
  656  long long prevrow = -1;  
 
  660    if (NZ-nread > chunk_read) nchunk = chunk_read;
 
  661    else nchunk = NZ - nread;
 
  666      for (
int i = 0; i < nchunk; i++) {
 
  667        eof = fgets(&buffer[rlen],lineLength,handle);
 
  669          fprintf(stderr, 
"%s", 
"Unexpected end of matrix file.");
 
  672        rlen += strlen(&buffer[rlen]);
 
  679    buffer[rlen++] = 
'\0';
 
  683    char *lineptr = buffer;
 
  684    for (rlen = 0; rlen < nchunk; rlen++) {
 
  685      char *next = strchr(lineptr,
'\n');
 
  689      long long I = _strtoi64(strtok(lineptr,
" \t\n"), &endp, base) + ioffset;
 
  690      long long J = _strtoi64(strtok(NULL,
" \t\n"), &endp, base) + joffset;
 
  694      std::istringstream ssI(strtok(lineptr,
" \t\n"));
 
  695      ssI >> I; I += ioffset;
 
  696      std::istringstream ssJ(strtok(NULL,
" \t\n"));
 
  697      ssJ >> J; J += joffset;
 
  699      long long I = strtoll(strtok(lineptr,
" \t\n"), &endp, base) + ioffset;
 
  700      long long J = strtoll(strtok(NULL,
" \t\n"), &endp, base) + joffset;
 
  703      double V = atof(strtok(NULL,
" \t\n"));
 
  711      if (rowMap1->
MyGID(I)) {
 
  713        if (lnz >= localsize) {
 
  715          localsize += localblock;
 
  716          iv = (
long long *) realloc(iv, localsize * 
sizeof(
long long));
 
  717          jv = (
long long *) realloc(jv, localsize * 
sizeof(
long long));
 
  718          vv = (
double *) realloc(vv, localsize * 
sizeof(
double));
 
  724        if (I < prevrow) rowmajor = 0;
 
  730    if (nread / 1000000 > nmillion) {
 
  732      if (verbose && me == 0) std::cout << nmillion << 
"M ";
 
  741    if (verbose && me == 0) std::cout << std::endl << 
"   Sorting local nonzeros" << std::endl;
 
  750  if (verbose && me == 0) std::cout << std::endl << 
"   Constructing the matrix" << std::endl;
 
  752  int *numNonzerosPerRow = 
new int[numRows];
 
  753  for (
int i = 0; i < numRows; i++) numNonzerosPerRow[i] = 0;
 
  754  for (
int i = 0; i < lnz; i++)
 
  755    numNonzerosPerRow[rowMap1->
LID(iv[i])]++;
 
  757  if (rowMap!=0 && colMap !=0)
 
  759  else if (rowMap!=0) {
 
  773  long long *gidList = 
new long long[numRows];
 
  774  for (
int i = 0; i < numRows; i++) gidList[i] = rowMap1->GID64(i);
 
  779  if (verbose && me == 0) std::cout << 
"   Inserting global values" << std::endl;
 
  782    for (
int sum = 0; i < numRows; i++) {
 
  783      if (numNonzerosPerRow[i]) {
 
  786        if (ierr<0) EPETRA_CHK_ERR(ierr);
 
  787        sum += numNonzerosPerRow[i];
 
  792  delete [] numNonzerosPerRow;
 
  797  if (verbose && me == 0) std::cout << 
"   Completing matrix fill" << std::endl;
 
  798  if (rangeMap != 0 && domainMap != 0) {
 
  802    Epetra_Map newDomainMap(N,rowMap1->IndexBase64(), comm);
 
  803    EPETRA_CHK_ERR(A->
FillComplete(newDomainMap, *rowMap1));
 
  809  if (allocatedHere) 
delete rowMap1;
 
  811  if (handle!=0) fclose(handle);
 
  813  if (verbose && me == 0) std::cout << 
"File Read time (secs):  " << dt << std::endl;
 
 
  825  int_type *list, int_type *parlista, 
double *parlistb,
 
  826  int start, 
int end, 
int *equal, 
int *larger)
 
  832  key = list ? list[(end+start)/2] : 1;
 
  834  *equal = *larger = start;
 
  835  for (i = start; i <= end; i++)
 
  838      parlista[i]         = parlista[*larger];
 
  839      parlista[(*larger)] = parlista[*equal];
 
  840      parlista[(*equal)]  = itmp;
 
  842      parlistb[i]         = parlistb[*larger];
 
  843      parlistb[(*larger)] = parlistb[*equal];
 
  844      parlistb[(*equal)]  = dtmp;
 
  846      list[i]             = list[*larger];
 
  847      list[(*larger)++]   = list[*equal];
 
  848      list[(*equal)++]    = itmp;
 
  850    else if (list[i] == key) {
 
  852      parlista[i]         = parlista[*larger];
 
  853      parlista[(*larger)] = itmp;
 
  855      parlistb[i]         = parlistb[*larger];
 
  856      parlistb[(*larger)] = dtmp;
 
  857      list[i]             = list[*larger];
 
  858      list[(*larger)++]   = key;
 
 
  883  const int lineLength = 1025;
 
  884  char line[lineLength];
 
  890  handle = fopen(filename,
"r");  
 
  894  int numGlobalRows = 0;
 
  895  int numGlobalCols = 0;
 
  896  while(fgets(line, lineLength, handle)!=0) {
 
  897    if(sscanf(line, 
"%d %d %lg\n", &I, &J, &V)==0) {
if (handle!=0) fclose(handle); EPETRA_CHK_ERR(-1);}
 
  898    if (I>numGlobalRows) numGlobalRows = I;
 
  899    if (J>numGlobalCols) numGlobalCols = J;
 
  902  if (handle!=0) fclose(handle);
 
  912  handle = fopen(filename,
"r");  
 
  916  while (fgets(line, lineLength, handle)!=0) {
 
  917    if(sscanf(line, 
"%d %d %lg\n", &I, &J, &V)==0) {
if (handle!=0) fclose(handle); EPETRA_CHK_ERR(-1);}
 
  919    if (rowMap1.
MyGID(I)) {
 
  921      if (ierr<0) EPETRA_CHK_ERR(ierr);
 
  927  if (handle!=0) fclose(handle);
 
 
  937  const int lineLength = 1025;
 
  938  char line[lineLength];
 
  944  handle = fopen(filename,
"r");  
 
  948  long long numGlobalRows = 0;
 
  949  long long numGlobalCols = 0;
 
  950  while(fgets(line, lineLength, handle)!=0) {
 
  951    if(sscanf(line, 
"%lld %lld %lg\n", &I, &J, &V)==0) {
if (handle!=0) fclose(handle); EPETRA_CHK_ERR(-1);}
 
  952    if (I>numGlobalRows) numGlobalRows = I;
 
  953    if (J>numGlobalCols) numGlobalCols = J;
 
  956  if (handle!=0) fclose(handle);
 
  966  handle = fopen(filename,
"r");  
 
  970  while (fgets(line, lineLength, handle)!=0) {
 
  971    if(sscanf(line, 
"%lld %lld %lg\n", &I, &J, &V)==0) {
if (handle!=0) fclose(handle); EPETRA_CHK_ERR(-1);}
 
  973    if (rowMap1.
MyGID(I)) {
 
  975      if (ierr<0) EPETRA_CHK_ERR(ierr);
 
  981  if (handle!=0) fclose(handle);
 
 
  988  int MyPID = comm.
MyPID();
 
  990  double filePID = (double)MyPID/(
double)100000;
 
  991  std::ostringstream stream;
 
  993  stream << std::setiosflags(std::ios::fixed) << std::setprecision(5) << filePID;
 
  995  std::string fileName(filename);
 
  996  fileName += stream.str().substr(1,7);
 
  998  std::ifstream file(fileName.c_str());
 
 1001    std::getline(file, line);
 
 1003    std::istringstream istream(line);
 
 1008    Epetra_Map RowMap(-1, iupper-ilower+1, 0, comm);
 
 1012    std::vector<int> indices;
 
 1013    std::vector<double> values;
 
 1015      std::getline(file, line);
 
 1016      std::istringstream lineStr(line);
 
 1022      if(currRow == -1) currRow = row; 
 
 1025        counter = counter + 1;
 
 1026        indices.push_back(col);
 
 1027        values.push_back(val);
 
 1035        indices.push_back(col);
 
 1036        values.push_back(val);
 
 1037        counter = counter + 1;
 
 1046    std::cout << 
"\nERROR:\nCouldn't open " << fileName << 
".\n";
 
 
 1054  int MyPID = comm.
MyPID();
 
 1056  double filePID = (double)MyPID/(
double)100000;
 
 1057  std::ostringstream stream;
 
 1059  stream << std::setiosflags(std::ios::fixed) << std::setprecision(5) << filePID;
 
 1061  std::string fileName(filename);
 
 1062  fileName += stream.str().substr(1,7);
 
 1064  std::ifstream file(fileName.c_str());
 
 1067    std::getline(file, line);
 
 1069    std::istringstream istream(line);
 
 1074    Epetra_Map RowMap(-1LL, iupper-ilower+1, 0LL, comm);
 
 1076    long long currRow = -1;
 
 1078    std::vector<long long> indices;
 
 1079    std::vector<double> values;
 
 1081      std::getline(file, line);
 
 1082      std::istringstream lineStr(line);
 
 1088      if(currRow == -1) currRow = row; 
 
 1091        counter = counter + 1;
 
 1092        indices.push_back(col);
 
 1093        values.push_back(val);
 
 1101        indices.push_back(col);
 
 1102        values.push_back(val);
 
 1103        counter = counter + 1;
 
 1112    std::cout << 
"\nERROR:\nCouldn't open " << fileName << 
".\n";