10 #ifndef __MATRIXMARKET_TPETRA_NEW_HPP
11 #define __MATRIXMARKET_TPETRA_NEW_HPP
31 template <
typename global_ordinal_type,
typename scalar_type>
32 static Teuchos::RCP<Distribution<global_ordinal_type, scalar_type> >
34 std::string &distribution,
38 const Teuchos::ParameterList ¶ms,
39 const Teuchos::RCP<
const Teuchos::Comm<int> > &comm
45 int me = comm->getRank();
47 using basedist_t = Distribution<global_ordinal_type, scalar_type>;
50 bool randomize =
false;
52 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"randomize");
54 randomize = pe->getValue<
bool>(&randomize);
57 std::string partitionFile =
"";
59 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"partitionFile");
61 partitionFile = pe->getValue<std::string>(&partitionFile);
64 if (distribution ==
"2D") {
65 if (partitionFile !=
"") {
67 TEUCHOS_TEST_FOR_EXCEPTION(randomize, std::logic_error,
68 "Randomization not available for 2DVec distributions.");
69 Distribution2DVec<global_ordinal_type, scalar_type> *dist =
70 new Distribution2DVec<global_ordinal_type, scalar_type>(
71 nRow, comm, params, partitionFile);
72 retval =
dynamic_cast<basedist_t *
>(dist);
73 }
else if (randomize) {
75 Distribution2DRandom<global_ordinal_type, scalar_type> *dist =
76 new Distribution2DRandom<global_ordinal_type, scalar_type>(
78 retval =
dynamic_cast<basedist_t *
>(dist);
82 Distribution2DLinear<global_ordinal_type, scalar_type> *dist =
83 new Distribution2DLinear<global_ordinal_type, scalar_type>(
85 retval =
dynamic_cast<basedist_t *
>(dist);
87 }
else if (distribution ==
"1D") {
88 if (partitionFile !=
"") {
90 Distribution1DVec<global_ordinal_type, scalar_type> *dist =
91 new Distribution1DVec<global_ordinal_type, scalar_type>(
92 nRow, comm, params, partitionFile);
93 retval =
dynamic_cast<basedist_t *
>(dist);
94 }
else if (randomize) {
96 Distribution1DRandom<global_ordinal_type, scalar_type> *dist =
97 new Distribution1DRandom<global_ordinal_type, scalar_type>(
99 retval =
dynamic_cast<basedist_t *
>(dist);
102 Distribution1DLinear<global_ordinal_type, scalar_type> *dist =
103 new Distribution1DLinear<global_ordinal_type, scalar_type>(
105 retval =
dynamic_cast<basedist_t *
>(dist);
107 }
else if (distribution ==
"LowerTriangularBlock") {
108 if (randomize && me == 0) {
109 std::cout <<
"WARNING: Randomization not available for "
110 <<
"LowerTriangularBlock distributions." << std::endl;
113 DistributionLowerTriangularBlock<global_ordinal_type, scalar_type> *dist =
114 new DistributionLowerTriangularBlock<global_ordinal_type, scalar_type>(
116 retval =
dynamic_cast<basedist_t *
>(dist);
117 }
else if (distribution ==
"MMFile") {
119 if (randomize && me == 0) {
120 std::cout <<
"WARNING: Randomization not available for MMFile "
121 <<
"distributions." << std::endl;
123 DistributionMMFile<global_ordinal_type, scalar_type> *dist =
124 new DistributionMMFile<global_ordinal_type, scalar_type>(
126 retval =
dynamic_cast<basedist_t *
>(dist);
130 std::cout <<
"ERROR: Invalid distribution method " << distribution
134 return Teuchos::rcp<basedist_t>(retval);
139 const std::string &filename,
140 const Teuchos::RCP<
const Teuchos::Comm<int> > &comm,
141 const Teuchos::ParameterList ¶ms,
144 typename Distribution<global_ordinal_type, scalar_type>::LocalNZmap_t &localNZ,
145 Teuchos::RCP<Distribution<global_ordinal_type, scalar_type> > &dist) {
146 bool useTimers =
false;
148 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"useTimers");
150 useTimers = pe->getValue<
bool>(&useTimers);
153 Teuchos::RCP<Teuchos::TimeMonitor> timer = Teuchos::null;
155 timer = rcp(
new Teuchos::TimeMonitor(
156 *Teuchos::TimeMonitor::getNewTimer(
"RMM parameterSetup")));
158 int me = comm->getRank();
160 bool verbose =
false;
162 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"verbose");
164 verbose = pe->getValue<
bool>(&verbose);
167 size_t chunkSize = 500000;
169 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"chunkSize");
171 chunkSize = pe->getValue<
size_t>(&chunkSize);
174 bool symmetrize =
false;
176 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"symmetrize");
178 symmetrize = pe->getValue<
bool>(&symmetrize);
181 bool transpose =
false;
183 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"transpose");
185 transpose = pe->getValue<
bool>(&transpose);
188 std::string diagonal =
"";
192 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"diagonal");
194 diagonal = pe->getValue<std::string>(&diagonal);
196 bool ignoreDiagonal = (diagonal ==
"exclude");
197 bool requireDiagonal = (diagonal ==
"require");
199 std::string distribution =
"1D";
201 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"distribution");
203 distribution = pe->getValue<std::string>(&distribution);
207 timer = Teuchos::null;
208 timer = rcp(
new Teuchos::TimeMonitor(
209 *Teuchos::TimeMonitor::getNewTimer(
"RMM header")));
212 if (verbose && me == 0)
213 std::cout <<
"Reading matrix market file... " << filename << std::endl;
216 size_t dim[3] = {0, 0, 0};
220 fp = fopen(filename.c_str(),
"r");
223 std::cout <<
"Error: cannot open file " << filename << std::endl;
226 if (mm_read_banner(fp, &mmcode) != 0) {
227 std::cout <<
"Error: bad MatrixMarket banner " << std::endl;
230 if (!mm_is_valid(mmcode) ||
231 mm_is_dense(mmcode) || mm_is_array(mmcode) ||
232 mm_is_complex(mmcode) ||
233 mm_is_skew(mmcode) || mm_is_hermitian(mmcode)) {
234 std::cout <<
"Error: matrix type is not supported by this reader\n "
235 <<
"This reader supports sparse, coordinate, "
236 <<
"real, pattern, integer, symmetric, general"
240 if (mm_read_mtx_crd_size(fp, &dim[0], &dim[1], &dim[2]) != 0) {
241 std::cout <<
"Error: bad matrix dimensions " << std::endl;
242 dim[0] = dim[1] = dim[2] = 0;
252 Teuchos::broadcast<int, size_t>(*comm, 0, 3, dim);
253 if (dim[0] == 0 || dim[1] == 0) {
254 throw std::runtime_error(
"Error: bad matrix header information");
256 Teuchos::broadcast<int, char>(*comm, 0,
sizeof(MM_typecode), mmcode);
261 TEUCHOS_TEST_FOR_EXCEPTION(nRow != nCol, std::logic_error,
262 "This overload of readSparseFile requires nRow == nCol "
263 <<
"(nRow = " << nRow <<
", nCol = " << nCol <<
"); "
264 <<
"For now, use a different overload of readSparseFile until this "
265 <<
"overload is fixed to read rectangular matrices. "
266 <<
"See Trilinos github issues #7045 and #8472.");
269 bool patternInput = mm_is_pattern(mmcode);
270 bool symmetricInput = mm_is_symmetric(mmcode);
271 if (symmetricInput) symmetrize =
true;
273 if (verbose && me == 0)
274 std::cout <<
"Matrix market file... "
275 <<
"\n symmetrize = " << symmetrize
276 <<
"\n transpose = " << transpose
277 <<
"\n change diagonal = " << diagonal
278 <<
"\n distribution = " << distribution
282 timer = Teuchos::null;
283 timer = rcp(
new Teuchos::TimeMonitor(
284 *Teuchos::TimeMonitor::getNewTimer(
"RMM distribution")));
288 dist = buildDistribution<global_ordinal_type, scalar_type>(distribution,
292 timer = Teuchos::null;
293 timer = rcp(
new Teuchos::TimeMonitor(
294 *Teuchos::TimeMonitor::getNewTimer(
"RMM readChunks")));
297 std::set<global_ordinal_type> diagset;
303 typename Distribution<global_ordinal_type, scalar_type>::NZindex_t;
306 const int maxLineLength = 81;
307 char *buffer =
new char[chunkSize * maxLineLength + 1];
313 auto timerRead = Teuchos::TimeMonitor::getNewTimer(
"RMM readNonzeros");
314 auto timerSelect = Teuchos::TimeMonitor::getNewTimer(
"RMM selectNonzeros");
316 Teuchos::RCP<Teuchos::TimeMonitor> innerTimer = Teuchos::null;
317 while (nRead < nNz) {
318 innerTimer = rcp(
new Teuchos::TimeMonitor(*timerRead));
320 if (nNz - nRead > chunkSize)
323 nChunk = (nNz - nRead);
329 for (
size_t i = 0; i < nChunk; i++) {
330 eof = fgets(&buffer[rlen], maxLineLength, fp);
332 std::cout <<
"Unexpected end of matrix file." << std::endl;
336 rlen += strlen(&buffer[rlen]);
338 buffer[rlen++] =
'\n';
342 Teuchos::broadcast<int, size_t>(*comm, 0, 1, &rlen);
343 Teuchos::broadcast<int, char>(*comm, 0, rlen, buffer);
345 buffer[rlen++] =
'\0';
348 innerTimer = Teuchos::null;
349 innerTimer = rcp(
new Teuchos::TimeMonitor(*timerSelect));
352 char *lineptr = buffer;
353 for (rlen = 0; rlen < nChunk; rlen++) {
354 char *next = strchr(lineptr,
'\n');
355 global_ordinal_type I = atol(strtok(lineptr,
" \t\n")) - 1;
356 global_ordinal_type J = atol(strtok(NULL,
" \t\n")) - 1;
358 scalar_type V = (patternInput ? -1. : atof(strtok(NULL,
" \t\n")));
362 if ((I == J) && ignoreDiagonal)
continue;
364 if (transpose) std::swap<global_ordinal_type>(I, J);
369 if (dist->Mine(I, J,
int(V))) {
370 nzindex_t idx = std::make_pair(I, J);
372 if (requireDiagonal && (I == J)) diagset.insert(I);
378 if (symmetrize && (I != J) && dist->Mine(J, I,
int(V))) {
381 nzindex_t idx = std::make_pair(J, I);
388 if (nRead / 1000000 > nMillion) {
390 if (me == 0) std::cout << nMillion <<
"M ";
394 innerTimer = Teuchos::null;
397 if (verbose && me == 0)
398 std::cout << std::endl
399 << nRead <<
" nonzeros read " << std::endl;
401 if (fp != NULL) fclose(fp);
405 timer = Teuchos::null;
406 timer = rcp(
new Teuchos::TimeMonitor(
407 *Teuchos::TimeMonitor::getNewTimer(
"RMM diagonal")));
412 if (requireDiagonal) {
413 if (dist->DistType() == MMFile) {
417 size_t localss = diagset.size();
419 Teuchos::reduceAll<int, size_t>(*comm, Teuchos::REDUCE_SUM, 1,
420 &localss, &globalss);
421 TEUCHOS_TEST_FOR_EXCEPTION(globalss != nRow, std::logic_error,
422 "File-based nonzero distribution requires all diagonal "
423 <<
"entries to be present in the file. \n"
424 <<
"Number of diagonal entries in file = " << globalss <<
"\n"
425 <<
"Number of matrix rows = " << nRow <<
"\n");
427 for (global_ordinal_type i = 0;
428 i < static_cast<global_ordinal_type>(nRow); i++) {
429 if (dist->Mine(i, i)) {
430 if (diagset.find(i) == diagset.end()) {
431 nzindex_t idx = std::make_pair(i, i);
439 std::set<global_ordinal_type>().swap(diagset);
442 timer = Teuchos::null;
496 const std::string &filename,
497 const Teuchos::RCP<
const Teuchos::Comm<int> > &comm,
498 const Teuchos::ParameterList ¶ms,
501 typename Distribution<global_ordinal_type, scalar_type>::LocalNZmap_t &localNZ,
502 Teuchos::RCP<Distribution<global_ordinal_type, scalar_type> > &dist) {
503 int me = comm->getRank();
505 bool verbose =
false;
507 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"verbose");
509 verbose = pe->getValue<
bool>(&verbose);
512 size_t chunkSize = 500000;
514 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"chunkSize");
516 chunkSize = pe->getValue<
size_t>(&chunkSize);
519 bool symmetrize =
false;
521 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"symmetrize");
523 symmetrize = pe->getValue<
bool>(&symmetrize);
526 bool transpose =
false;
528 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"transpose");
530 transpose = pe->getValue<
bool>(&transpose);
533 std::string diagonal =
"";
537 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"diagonal");
539 diagonal = pe->getValue<std::string>(&diagonal);
541 bool ignoreDiagonal = (diagonal ==
"exclude");
542 bool requireDiagonal = (diagonal ==
"require");
544 std::string distribution =
"1D";
546 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"distribution");
548 distribution = pe->getValue<std::string>(&distribution);
551 if (verbose && me == 0)
552 std::cout <<
"Reading binary file... " << filename << std::endl;
555 size_t dim[3] = {0, 0, 0};
558 fp = fopen(filename.c_str(),
"rb");
561 std::cout <<
"Error: cannot open file " << filename << std::endl;
565 unsigned long long ne = 0;
566 if (fread(&nv,
sizeof(
unsigned int), 1, fp) != 1)
567 throw std::runtime_error(
"Error: bad number of read values.");
568 if (fread(&ne,
sizeof(
unsigned long long), 1, fp) != 1)
569 throw std::runtime_error(
"Error: bad number of read values.");
579 Teuchos::broadcast<int, size_t>(*comm, 0, 3, dim);
580 if (dim[0] == 0 || dim[1] == 0) {
581 throw std::runtime_error(
"Error: bad matrix header information");
588 if (verbose && me == 0)
589 std::cout <<
"Binary file... "
590 <<
"\n symmetrize = " << symmetrize
591 <<
"\n transpose = " << transpose
592 <<
"\n change diagonal = " << diagonal
593 <<
"\n distribution = " << distribution
597 dist = buildDistribution<global_ordinal_type, scalar_type>(distribution,
601 std::set<global_ordinal_type> diagset;
607 typename Distribution<global_ordinal_type, scalar_type>::NZindex_t;
610 unsigned int *buffer =
new unsigned int[chunkSize * 2];
615 const scalar_type ONE = Teuchos::ScalarTraits<scalar_type>::one();
618 while (nRead < nNz) {
619 if (nNz - nRead > chunkSize)
622 nChunk = (nNz - nRead);
628 for (
size_t i = 0; i < nChunk; i++) {
629 ret = fread(&buffer[rlen],
sizeof(
unsigned int), 2, fp);
631 std::cout <<
"Unexpected end of matrix file." << std::endl;
640 Teuchos::broadcast<int, size_t>(*comm, 0, 1, &rlen);
641 Teuchos::broadcast<int, unsigned int>(*comm, 0, rlen, buffer);
646 for (rlen = 0; rlen < nChunk; rlen++) {
647 global_ordinal_type I = buffer[2 * rlen] - 1;
648 global_ordinal_type J = buffer[2 * rlen + 1] - 1;
651 if ((I == J) && ignoreDiagonal)
continue;
653 if (transpose) std::swap<global_ordinal_type>(I, J);
658 if (dist->Mine(I, J, ONE)) {
659 nzindex_t idx = std::make_pair(I, J);
662 if (requireDiagonal && (I == J)) diagset.insert(I);
668 if (symmetrize && (I != J) && dist->Mine(J, I, ONE)) {
671 nzindex_t idx = std::make_pair(J, I);
678 if (nRead / 1000000 > nMillion) {
680 if (me == 0) std::cout << nMillion <<
"M ";
685 if (verbose && me == 0)
686 std::cout << std::endl
687 << nRead <<
" nonzeros read " << std::endl;
689 if (fp != NULL) fclose(fp);
694 if (requireDiagonal) {
695 if (dist->DistType() == MMFile) {
699 size_t localss = diagset.size();
701 Teuchos::reduceAll<int, size_t>(*comm, Teuchos::REDUCE_SUM, 1,
702 &localss, &globalss);
703 TEUCHOS_TEST_FOR_EXCEPTION(globalss != nRow, std::logic_error,
704 "File-based nonzero distribution requires all diagonal "
705 <<
"entries to be present in the file. \n"
706 <<
"Number of diagonal entries in file = " << globalss <<
"\n"
707 <<
"Number of matrix rows = " << nRow <<
"\n");
709 for (global_ordinal_type i = 0;
710 i < static_cast<global_ordinal_type>(nRow); i++) {
711 if (dist->Mine(i, i)) {
712 if (diagset.find(i) == diagset.end()) {
713 nzindex_t idx = std::make_pair(i, i);
721 std::set<global_ordinal_type>().swap(diagset);
751 readPerProcessBinary(
752 const std::string &filename,
753 const Teuchos::RCP<
const Teuchos::Comm<int> > &comm,
754 const Teuchos::ParameterList ¶ms,
757 typename Distribution<global_ordinal_type, scalar_type>::LocalNZmap_t &localNZ,
758 Teuchos::RCP<Distribution<global_ordinal_type, scalar_type> > &dist,
759 unsigned int *&buffer,
761 int me = comm->getRank();
763 bool verbose =
false;
765 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"verbose");
767 verbose = pe->getValue<
bool>(&verbose);
770 std::string distribution =
"1D";
772 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"distribution");
774 distribution = pe->getValue<std::string>(&distribution);
777 if (verbose && me == 0)
778 std::cout <<
"Reading per-process binary files... " << filename << std::endl;
780 std::string rankFileName = filename +
"." + std::to_string(me) +
".cooBin";
783 fp = fopen(rankFileName.c_str(),
"rb");
785 std::cout <<
"Error: cannot open file " << filename << std::endl;
786 throw std::runtime_error(
"Error: non-existing input file: " + rankFileName);
790 unsigned int globalNumRows = 0, globalNumCols = 0;
791 unsigned long long localNumNonzeros = 0;
792 if (fread(&globalNumRows,
sizeof(
unsigned int), 1, fp) != 1)
793 throw std::runtime_error(
"Error: bad number of read values.");
794 if (fread(&globalNumCols,
sizeof(
unsigned int), 1, fp) != 1)
795 throw std::runtime_error(
"Error: bad number of read values.");
796 if (fread(&localNumNonzeros,
sizeof(
unsigned long long), 1, fp) != 1)
797 throw std::runtime_error(
"Error: bad number of read values.");
799 nRow =
static_cast<size_t>(globalNumRows);
800 nCol =
static_cast<size_t>(globalNumCols);
801 nNz =
static_cast<size_t>(localNumNonzeros);
805 buffer =
new unsigned int[nNz * 2];
808 size_t ret = fread(buffer,
sizeof(
unsigned int), 2 * nNz, fp);
810 std::cout <<
"Unexpected end of matrix file: " << rankFileName << std::endl;
816 if (fp != NULL) fclose(fp);
820 if (verbose && me == 0)
821 std::cout <<
"All ranks finished reading their nonzeros from their individual files\n";
824 dist = buildDistribution<global_ordinal_type, scalar_type>(distribution,
831 static Teuchos::RCP<sparse_matrix_type>
833 const std::string &filename,
834 const Teuchos::RCP<
const Teuchos::Comm<int> > &comm,
835 const Teuchos::ParameterList ¶ms) {
836 Teuchos::RCP<Distribution<global_ordinal_type, scalar_type> > dist;
837 return readSparseFile(filename, comm, params, dist);
843 static Teuchos::RCP<sparse_matrix_type>
845 const std::string &filename,
846 const Teuchos::RCP<
const Teuchos::Comm<int> > &comm,
847 const Teuchos::ParameterList ¶ms,
848 Teuchos::RCP<Distribution<global_ordinal_type, scalar_type> > &dist) {
849 bool useTimers =
false;
851 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"useTimers");
853 useTimers = pe->getValue<
bool>(&useTimers);
856 Teuchos::RCP<Teuchos::TimeMonitor> timer = Teuchos::null;
858 timer = rcp(
new Teuchos::TimeMonitor(
859 *Teuchos::TimeMonitor::getNewTimer(
"RSF parameterSetup")));
861 int me = comm->getRank();
866 bool verbose =
false;
868 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"verbose");
870 verbose = pe->getValue<
bool>(&verbose);
873 bool callFillComplete =
true;
875 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"callFillComplete");
877 callFillComplete = pe->getValue<
bool>(&callFillComplete);
888 typename Distribution<global_ordinal_type, scalar_type>::LocalNZmap_t;
889 localNZmap_t localNZ;
893 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"binary");
895 binary = pe->getValue<
bool>(&binary);
898 bool readPerProcess =
false;
900 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"readPerProcess");
902 readPerProcess = pe->getValue<
bool>(&readPerProcess);
906 const char *timername = (binary ?
"RSF readBinary" :
"RSF readMatrixMarket");
907 timer = Teuchos::null;
908 timer = rcp(
new Teuchos::TimeMonitor(
909 *Teuchos::TimeMonitor::getNewTimer(timername)));
913 size_t nRow = 0, nCol = 0;
914 unsigned int *buffer = 0;
918 readPerProcessBinary(filename, comm, params, nRow, nCol, localNZ, dist, buffer, nNz);
920 readBinary(filename, comm, params, nRow, nCol, localNZ, dist);
922 readMatrixMarket(filename, comm, params, nRow, nCol, localNZ, dist);
924 if (readPerProcess ==
false) {
928 timer = Teuchos::null;
929 timer = rcp(
new Teuchos::TimeMonitor(
930 *Teuchos::TimeMonitor::getNewTimer(
"RSF redistribute")));
933 dist->Redistribute(localNZ);
937 timer = Teuchos::null;
938 timer = rcp(
new Teuchos::TimeMonitor(
939 *Teuchos::TimeMonitor::getNewTimer(
"RSF nonzerosConstruction")));
944 if (verbose && me == 0)
945 std::cout << std::endl
946 <<
"Constructing the matrix" << std::endl;
948 Teuchos::Array<global_ordinal_type> rowIdx;
949 Teuchos::Array<size_t> nnzPerRow;
950 Teuchos::Array<global_ordinal_type> colIdx;
951 Teuchos::Array<scalar_type> val;
952 Teuchos::Array<size_t> offsets;
954 if (readPerProcess) {
955 global_ordinal_type prevI = std::numeric_limits<global_ordinal_type>::max();
956 for (
size_t it = 0; it < nNz; it++) {
957 global_ordinal_type I = buffer[2 * it] - 1;
958 global_ordinal_type J = buffer[2 * it + 1] - 1;
962 nnzPerRow.push_back(0);
970 global_ordinal_type prevI = std::numeric_limits<global_ordinal_type>::max();
971 for (
auto it = localNZ.begin(); it != localNZ.end(); it++) {
972 global_ordinal_type I = it->first.first;
973 global_ordinal_type J = it->first.second;
974 scalar_type V = it->second;
978 nnzPerRow.push_back(0);
986 localNZmap_t().swap(localNZ);
990 offsets.resize(rowIdx.size() + 1);
992 for (
size_t row = 0; row < static_cast<size_t>(rowIdx.size()); row++)
993 offsets[row + 1] = offsets[row] + nnzPerRow[row];
996 timer = Teuchos::null;
997 timer = rcp(
new Teuchos::TimeMonitor(
998 *Teuchos::TimeMonitor::getNewTimer(
"RSF insertNonzeros")));
1002 size_t dummy = Teuchos::OrdinalTraits<Tpetra::global_size_t>::invalid();
1003 Teuchos::RCP<const Tpetra::Map<> > rowMap =
1006 Teuchos::RCP<sparse_matrix_type> A =
1007 rcp(
new sparse_matrix_type(rowMap, nnzPerRow()));
1010 if (verbose && me == 0)
1011 std::cout <<
"Inserting global values" << std::endl;
1013 if (readPerProcess) {
1014 const scalar_type ONE = Teuchos::ScalarTraits<scalar_type>::one();
1015 for (
int i = 0; i < rowIdx.size(); i++) {
1016 size_t nnz = nnzPerRow[i];
1017 size_t off = offsets[i];
1018 val.assign(nnz, ONE);
1021 A->insertGlobalValues(rowIdx[i], colIdx(off, nnz), val());
1024 for (
int i = 0; i < rowIdx.size(); i++) {
1025 size_t nnz = nnzPerRow[i];
1026 size_t off = offsets[i];
1027 A->insertGlobalValues(rowIdx[i], colIdx(off, nnz), val(off, nnz));
1032 Teuchos::Array<size_t>().swap(nnzPerRow);
1033 Teuchos::Array<size_t>().swap(offsets);
1034 Teuchos::Array<global_ordinal_type>().swap(rowIdx);
1035 Teuchos::Array<global_ordinal_type>().swap(colIdx);
1036 Teuchos::Array<scalar_type>().swap(val);
1039 timer = Teuchos::null;
1041 if (callFillComplete) {
1042 if (verbose && me == 0)
1043 std::cout <<
"Building vector maps" << std::endl;
1046 timer = Teuchos::null;
1047 timer = rcp(
new Teuchos::TimeMonitor(
1048 *Teuchos::TimeMonitor::getNewTimer(
"RSF buildVectorMaps")));
1052 Teuchos::Array<global_ordinal_type> vectorSet;
1053 for (global_ordinal_type i = 0;
1054 i < static_cast<global_ordinal_type>(nCol); i++)
1055 if (dist->VecMine(i)) vectorSet.push_back(i);
1057 dummy = Teuchos::OrdinalTraits<Tpetra::global_size_t>::invalid();
1058 Teuchos::RCP<const Tpetra::Map<> > domainMap =
1059 Teuchos::rcp(
new Tpetra::Map<>(dummy, vectorSet(), 0, comm));
1061 Teuchos::Array<global_ordinal_type>().swap(vectorSet);
1064 for (global_ordinal_type i = 0;
1065 i < static_cast<global_ordinal_type>(nRow); i++)
1066 if (dist->VecMine(i)) vectorSet.push_back(i);
1068 dummy = Teuchos::OrdinalTraits<Tpetra::global_size_t>::invalid();
1069 Teuchos::RCP<const Tpetra::Map<> > rangeMap =
1070 Teuchos::rcp(
new Tpetra::Map<>(dummy, vectorSet(), 0, comm));
1072 Teuchos::Array<global_ordinal_type>().swap(vectorSet);
1076 timer = Teuchos::null;
1077 timer = rcp(
new Teuchos::TimeMonitor(
1078 *Teuchos::TimeMonitor::getNewTimer(
"RSF fillComplete")));
1081 if (verbose && me == 0)
1082 std::cout <<
"Calling fillComplete" << std::endl;
1084 A->fillComplete(domainMap, rangeMap);
1087 timer = Teuchos::null;
1090 std::cout <<
"\nRank " << A->getComm()->getRank()
1091 <<
" nRows " << A->getLocalNumRows()
1092 <<
" minRow " << A->getRowMap()->getMinGlobalIndex()
1093 <<
" maxRow " << A->getRowMap()->getMaxGlobalIndex()
1094 <<
"\nRank " << A->getComm()->getRank()
1095 <<
" nCols " << A->getLocalNumCols()
1096 <<
" minCol " << A->getColMap()->getMinGlobalIndex()
1097 <<
" maxCol " << A->getColMap()->getMaxGlobalIndex()
1098 <<
"\nRank " << A->getComm()->getRank()
1099 <<
" nDomain " << A->getDomainMap()->getLocalNumElements()
1100 <<
" minDomain " << A->getDomainMap()->getMinGlobalIndex()
1101 <<
" maxDomain " << A->getDomainMap()->getMaxGlobalIndex()
1102 <<
"\nRank " << A->getComm()->getRank()
1103 <<
" nRange " << A->getRangeMap()->getLocalNumElements()
1104 <<
" minRange " << A->getRangeMap()->getMinGlobalIndex()
1105 <<
" maxRange " << A->getRangeMap()->getMaxGlobalIndex()
1106 <<
"\nRank " << A->getComm()->getRank()
1107 <<
" nEntries " << A->getLocalNumEntries()
A parallel distribution of indices over processes.