41 #include "Epetra_ConfigDefs.h"
43 #include "Epetra_Comm.h"
44 #include "Epetra_CrsMatrix.h"
45 #include "Epetra_Map.h"
46 #include "Epetra_IntVector.h"
47 #include "Epetra_IntSerialDenseVector.h"
48 #include "Epetra_Import.h"
49 #include "Epetra_Time.h"
50 #include "Epetra_Util.h"
77 using namespace EpetraExt;
80 template<
typename int_type>
81 static void sort_three(int_type* list, int_type *parlista,
double *parlistb,
85 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
98 0, 0, 0, 0, transpose));
109 transpose, verbose));
122 &rangeMap, &domainMap,
123 transpose, verbose));
135 transpose, verbose));
147 &rowMap, &colMap, 0, 0,
148 transpose, verbose));
162 &rangeMap, &domainMap,
163 transpose, verbose));
168 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
181 0, 0, 0, 0, transpose));
192 transpose, verbose));
205 &rangeMap, &domainMap,
206 transpose, verbose));
218 transpose, verbose));
230 &rowMap, &colMap, 0, 0,
231 transpose, verbose));
245 &rangeMap, &domainMap,
246 transpose, verbose));
252 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
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) {
483 A->SetTracebackMode(1);
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;
532 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
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');
688 #if defined(_MSC_VER)
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) {
769 A->SetTracebackMode(1);
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;
823 template<
typename int_type>
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;
863 template<
typename int_type>
864 static void sort_three(int_type* list, int_type *parlista,
double *parlistb,
872 sort_three(list, parlista, parlistb, start, equal-1);
873 sort_three(list, parlista, parlistb, larger, end);
878 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
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);
932 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
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);
986 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
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";
1052 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
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";
double ElapsedTime(void) const
int MatrixMarketFileToCrsMatrix64(const char *filename, const Epetra_Comm &comm, Epetra_CrsMatrix *&A)
virtual void Barrier() const =0
int HypreFileToCrsMatrix64(const char *filename, const Epetra_Comm &comm, Epetra_CrsMatrix *&Matrix)
virtual int MyPID() const =0
int FillComplete(bool OptimizeDataStorage=true)
static void quickpart_list_inc_int(int_type *list, int_type *parlista, double *parlistb, int start, int end, int *equal, int *larger)
const Epetra_Map & RowMap() const
int NumMyElements() const
int MatrixMarketFileToCrsMatrix(const char *filename, const Epetra_Comm &comm, Epetra_CrsMatrix *&A)
int MatlabFileToCrsMatrix64(const char *filename, const Epetra_Comm &comm, Epetra_CrsMatrix *&A)
int MatrixMarketFileToCrsMatrixHandle(const char *filename, const Epetra_Comm &comm, Epetra_CrsMatrix *&A, const Epetra_Map *rowMap, const Epetra_Map *colMap, const Epetra_Map *rangeMap, const Epetra_Map *domainMap, const bool transpose, const bool verbose)
static void Sort(bool SortAscending, int NumKeys, T *Keys, int NumDoubleCompanions, double **DoubleCompanions, int NumIntCompanions, int **IntCompanions, int NumLongLongCompanions, long long **LongLongCompanions)
bool MyGID(int GID_in) const
virtual int Broadcast(double *MyVals, int Count, int Root) const =0
const Epetra_Comm & Comm() const
virtual int InsertGlobalValues(int GlobalRow, int NumEntries, const double *Values, const int *Indices)
int MatlabFileToCrsMatrix(const char *filename, const Epetra_Comm &comm, Epetra_CrsMatrix *&A)
Constructs an Epetra_CrsMatrix object from a Matlab format file, distributes rows evenly across proce...
virtual int NumProc() const =0
int HypreFileToCrsMatrix(const char *filename, const Epetra_Comm &comm, Epetra_CrsMatrix *&Matrix)
Constructs an Epetra_CrsMatrix object from a Hypre Matrix Print command, the row map is specified...
int MatrixMarketFileToCrsMatrixHandle64(const char *filename, const Epetra_Comm &comm, Epetra_CrsMatrix *&A, const Epetra_Map *rowMap, const Epetra_Map *colMap, const Epetra_Map *rangeMap, const Epetra_Map *domainMap, const bool transpose, const bool verbose)
const Epetra_Comm & Comm() const
static void sort_three(int_type *list, int_type *parlista, double *parlistb, int start, int end)