2#ifndef __MATRIXMARKET_TPETRA_NEW_HPP
3#define __MATRIXMARKET_TPETRA_NEW_HPP
24template <
typename global_ordinal_type,
typename scalar_type>
26Teuchos::RCP<Distribution<global_ordinal_type,scalar_type> >
28 std::string &distribution,
32 const Teuchos::ParameterList ¶ms,
33 const Teuchos::RCP<
const Teuchos::Comm<int> > &comm
40 int me = comm->getRank();
42 using basedist_t = Distribution<global_ordinal_type,scalar_type>;
45 bool randomize =
false;
47 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"randomize");
49 randomize = pe->getValue<
bool>(&randomize);
52 std::string partitionFile =
"";
54 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"partitionFile");
56 partitionFile = pe->getValue<std::string>(&partitionFile);
59 if (distribution ==
"2D") {
60 if (partitionFile !=
"") {
62 TEUCHOS_TEST_FOR_EXCEPTION(randomize, std::logic_error,
63 "Randomization not available for 2DVec distributions.");
64 Distribution2DVec<global_ordinal_type,scalar_type> *dist =
65 new Distribution2DVec<global_ordinal_type, scalar_type>(
66 nRow, comm, params, partitionFile);
67 retval =
dynamic_cast<basedist_t *
>(dist);
71 Distribution2DRandom<global_ordinal_type,scalar_type> *dist =
72 new Distribution2DRandom<global_ordinal_type,scalar_type>(
74 retval =
dynamic_cast<basedist_t *
>(dist);
79 Distribution2DLinear<global_ordinal_type,scalar_type> *dist =
80 new Distribution2DLinear<global_ordinal_type,scalar_type>(
82 retval =
dynamic_cast<basedist_t *
>(dist);
85 else if (distribution ==
"1D") {
86 if (partitionFile !=
"") {
88 Distribution1DVec<global_ordinal_type,scalar_type> *dist =
89 new Distribution1DVec<global_ordinal_type,scalar_type>(
90 nRow, comm, params, partitionFile);
91 retval =
dynamic_cast<basedist_t*
>(dist);
95 Distribution1DRandom<global_ordinal_type,scalar_type> *dist =
96 new Distribution1DRandom<global_ordinal_type,scalar_type>(
98 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);
108 else if (distribution ==
"LowerTriangularBlock") {
109 if (randomize && me == 0) {
110 std::cout <<
"WARNING: Randomization not available for "
111 <<
"LowerTriangularBlock distributions." << std::endl;
114 DistributionLowerTriangularBlock<global_ordinal_type,scalar_type> *dist =
115 new DistributionLowerTriangularBlock<global_ordinal_type,scalar_type>(
117 retval =
dynamic_cast<basedist_t*
>(dist);
119 else if (distribution ==
"MMFile") {
121 if (randomize && me == 0) {
122 std::cout <<
"WARNING: Randomization not available for MMFile "
123 <<
"distributions." << std::endl;
125 DistributionMMFile<global_ordinal_type,scalar_type> *dist =
126 new DistributionMMFile<global_ordinal_type,scalar_type>(
128 retval =
dynamic_cast<basedist_t*
>(dist);
132 std::cout <<
"ERROR: Invalid distribution method " << distribution
136 return Teuchos::rcp<basedist_t>(retval);
142 const std::string &filename,
143 const Teuchos::RCP<
const Teuchos::Comm<int> > &comm,
144 const Teuchos::ParameterList ¶ms,
147 typename Distribution<global_ordinal_type,scalar_type>::LocalNZmap_t &localNZ,
148 Teuchos::RCP<Distribution<global_ordinal_type,scalar_type> > &dist
151 bool useTimers =
false;
153 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"useTimers");
155 useTimers = pe->getValue<
bool>(&useTimers);
158 Teuchos::RCP<Teuchos::TimeMonitor> timer = Teuchos::null;
160 timer = rcp(
new Teuchos::TimeMonitor(
161 *Teuchos::TimeMonitor::getNewTimer(
"RMM parameterSetup")));
163 int me = comm->getRank();
165 bool verbose =
false;
167 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"verbose");
169 verbose = pe->getValue<
bool>(&verbose);
172 size_t chunkSize = 500000;
174 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"chunkSize");
176 chunkSize = pe->getValue<
size_t>(&chunkSize);
179 bool symmetrize =
false;
181 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"symmetrize");
183 symmetrize = pe->getValue<
bool>(&symmetrize);
186 bool transpose =
false;
188 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"transpose");
190 transpose = pe->getValue<
bool>(&transpose);
193 std::string diagonal =
"";
197 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"diagonal");
199 diagonal = pe->getValue<std::string>(&diagonal);
201 bool ignoreDiagonal = (diagonal ==
"exclude");
202 bool requireDiagonal = (diagonal ==
"require");
204 std::string distribution =
"1D";
206 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"distribution");
208 distribution = pe->getValue<std::string>(&distribution);
212 timer = Teuchos::null;
213 timer = rcp(
new Teuchos::TimeMonitor(
214 *Teuchos::TimeMonitor::getNewTimer(
"RMM header")));
217 if (verbose && me == 0)
218 std::cout <<
"Reading matrix market file... " << filename << std::endl;
221 size_t dim[3] = {0,0,0};
226 fp = fopen(filename.c_str(),
"r");
229 std::cout <<
"Error: cannot open file " << filename << std::endl;
233 if (mm_read_banner(fp, &mmcode) != 0) {
234 std::cout <<
"Error: bad MatrixMarket banner " << std::endl;
238 if (!mm_is_valid(mmcode) ||
239 mm_is_dense(mmcode) || mm_is_array(mmcode) ||
240 mm_is_complex(mmcode) ||
241 mm_is_skew(mmcode) || mm_is_hermitian(mmcode)) {
242 std::cout <<
"Error: matrix type is not supported by this reader\n "
243 <<
"This reader supports sparse, coordinate, "
244 <<
"real, pattern, integer, symmetric, general"
249 if (mm_read_mtx_crd_size(fp, &dim[0], &dim[1], &dim[2]) != 0) {
250 std::cout <<
"Error: bad matrix dimensions " << std::endl;
251 dim[0] = dim[1] = dim[2] = 0;
261 Teuchos::broadcast<int, size_t>(*comm, 0, 3, dim);
262 if (dim[0] == 0 || dim[1] == 0) {
263 throw std::runtime_error(
"Error: bad matrix header information");
265 Teuchos::broadcast<int, char>(*comm, 0,
sizeof(MM_typecode), mmcode);
270 TEUCHOS_TEST_FOR_EXCEPTION(nRow != nCol, std::logic_error,
271 "This overload of readSparseFile requires nRow == nCol "
272 <<
"(nRow = " << nRow <<
", nCol = " << nCol <<
"); "
273 <<
"For now, use a different overload of readSparseFile until this "
274 <<
"overload is fixed to read rectangular matrices. "
275 <<
"See Trilinos github issues #7045 and #8472.");
278 bool patternInput = mm_is_pattern(mmcode);
279 bool symmetricInput = mm_is_symmetric(mmcode);
280 if (symmetricInput) symmetrize =
true;
282 if (verbose && me == 0)
283 std::cout <<
"Matrix market file... "
284 <<
"\n symmetrize = " << symmetrize
285 <<
"\n transpose = " << transpose
286 <<
"\n change diagonal = " << diagonal
287 <<
"\n distribution = " << distribution
291 timer = Teuchos::null;
292 timer = rcp(
new Teuchos::TimeMonitor(
293 *Teuchos::TimeMonitor::getNewTimer(
"RMM distribution")));
297 dist = buildDistribution<global_ordinal_type,scalar_type>(distribution,
301 timer = Teuchos::null;
302 timer = rcp(
new Teuchos::TimeMonitor(
303 *Teuchos::TimeMonitor::getNewTimer(
"RMM readChunks")));
306 std::set<global_ordinal_type> diagset;
312 typename Distribution<global_ordinal_type,scalar_type>::NZindex_t;
315 const int maxLineLength = 81;
316 char *buffer =
new char[chunkSize*maxLineLength+1];
322 auto timerRead = Teuchos::TimeMonitor::getNewTimer(
"RMM readNonzeros");
323 auto timerSelect = Teuchos::TimeMonitor::getNewTimer(
"RMM selectNonzeros");
325 Teuchos::RCP<Teuchos::TimeMonitor> innerTimer = Teuchos::null;
326 while (nRead < nNz) {
328 innerTimer = rcp(
new Teuchos::TimeMonitor(*timerRead));
330 if (nNz-nRead > chunkSize) nChunk = chunkSize;
331 else nChunk = (nNz - nRead);
337 for (
size_t i = 0; i < nChunk; i++) {
338 eof = fgets(&buffer[rlen],maxLineLength,fp);
340 std::cout <<
"Unexpected end of matrix file." << std::endl;
344 rlen += strlen(&buffer[rlen]);
350 Teuchos::broadcast<int, size_t>(*comm, 0, 1, &rlen);
351 Teuchos::broadcast<int, char>(*comm, 0, rlen, buffer);
353 buffer[rlen++] =
'\0';
356 innerTimer = Teuchos::null;
357 innerTimer = rcp(
new Teuchos::TimeMonitor(*timerSelect));
360 char *lineptr = buffer;
361 for (rlen = 0; rlen < nChunk; rlen++) {
363 char *next = strchr(lineptr,
'\n');
364 global_ordinal_type I = atol(strtok(lineptr,
" \t\n"))
366 global_ordinal_type J = atol(strtok(NULL,
" \t\n"))
369 scalar_type V = (patternInput ? -1. : atof(strtok(NULL,
" \t\n")));
373 if ((I == J) && ignoreDiagonal)
continue;
375 if (transpose) std::swap<global_ordinal_type>(I,J);
380 if (dist->Mine(I,J,
int(V))) {
381 nzindex_t idx = std::make_pair(I,J);
383 if (requireDiagonal && (I == J)) diagset.insert(I);
389 if (symmetrize && (I != J) && dist->Mine(J,I,
int(V))) {
392 nzindex_t idx = std::make_pair(J,I);
399 if (nRead / 1000000 > nMillion) {
401 if (me == 0) std::cout << nMillion <<
"M ";
405 innerTimer = Teuchos::null;
408 if (verbose && me == 0)
409 std::cout << std::endl << nRead <<
" nonzeros read " << std::endl;
411 if (fp != NULL) fclose(fp);
415 timer = Teuchos::null;
416 timer = rcp(
new Teuchos::TimeMonitor(
417 *Teuchos::TimeMonitor::getNewTimer(
"RMM diagonal")));
422 if (requireDiagonal) {
423 if (dist->DistType() == MMFile) {
427 size_t localss = diagset.size();
429 Teuchos::reduceAll<int, size_t>(*comm, Teuchos::REDUCE_SUM, 1,
430 &localss, &globalss);
431 TEUCHOS_TEST_FOR_EXCEPTION(globalss != nRow, std::logic_error,
432 "File-based nonzero distribution requires all diagonal "
433 <<
"entries to be present in the file. \n"
434 <<
"Number of diagonal entries in file = " << globalss <<
"\n"
435 <<
"Number of matrix rows = " << nRow <<
"\n");
438 for (global_ordinal_type i = 0;
439 i < static_cast<global_ordinal_type>(nRow); i++)
441 if (dist->Mine(i,i)) {
442 if (diagset.find(i) == diagset.end()) {
443 nzindex_t idx = std::make_pair(i,i);
451 std::set<global_ordinal_type>().swap(diagset);
454 timer = Teuchos::null;
509 const std::string &filename,
510 const Teuchos::RCP<
const Teuchos::Comm<int> > &comm,
511 const Teuchos::ParameterList ¶ms,
514 typename Distribution<global_ordinal_type,scalar_type>::LocalNZmap_t &localNZ,
515 Teuchos::RCP<Distribution<global_ordinal_type,scalar_type> > &dist
519 int me = comm->getRank();
521 bool verbose =
false;
523 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"verbose");
525 verbose = pe->getValue<
bool>(&verbose);
528 size_t chunkSize = 500000;
530 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"chunkSize");
532 chunkSize = pe->getValue<
size_t>(&chunkSize);
535 bool symmetrize =
false;
537 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"symmetrize");
539 symmetrize = pe->getValue<
bool>(&symmetrize);
542 bool transpose =
false;
544 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"transpose");
546 transpose = pe->getValue<
bool>(&transpose);
549 std::string diagonal =
"";
553 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"diagonal");
555 diagonal = pe->getValue<std::string>(&diagonal);
557 bool ignoreDiagonal = (diagonal ==
"exclude");
558 bool requireDiagonal = (diagonal ==
"require");
560 std::string distribution =
"1D";
562 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"distribution");
564 distribution = pe->getValue<std::string>(&distribution);
567 if (verbose && me == 0)
568 std::cout <<
"Reading binary file... " << filename << std::endl;
571 size_t dim[3] = {0,0,0};
575 fp = fopen(filename.c_str(),
"rb");
578 std::cout <<
"Error: cannot open file " << filename << std::endl;
583 unsigned long long ne = 0;
584 fread(&nv,
sizeof(
unsigned int), 1, fp);
585 fread(&ne,
sizeof(
unsigned long long), 1, fp);
595 Teuchos::broadcast<int, size_t>(*comm, 0, 3, dim);
596 if (dim[0] == 0 || dim[1] == 0) {
597 throw std::runtime_error(
"Error: bad matrix header information");
604 if (verbose && me == 0)
605 std::cout <<
"Binary file... "
606 <<
"\n symmetrize = " << symmetrize
607 <<
"\n transpose = " << transpose
608 <<
"\n change diagonal = " << diagonal
609 <<
"\n distribution = " << distribution
613 dist = buildDistribution<global_ordinal_type,scalar_type>(distribution,
617 std::set<global_ordinal_type> diagset;
623 typename Distribution<global_ordinal_type,scalar_type>::NZindex_t;
626 unsigned int *buffer =
new unsigned int[chunkSize*2];
631 const scalar_type ONE = Teuchos::ScalarTraits<scalar_type>::one();
635 while (nRead < nNz) {
636 if (nNz-nRead > chunkSize) nChunk = chunkSize;
637 else nChunk = (nNz - nRead);
643 for (
size_t i = 0; i < nChunk; i++) {
644 ret = fread(&buffer[rlen],
sizeof(
unsigned int), 2, fp);
646 std::cout <<
"Unexpected end of matrix file." << std::endl;
655 Teuchos::broadcast<int, size_t>(*comm, 0, 1, &rlen);
656 Teuchos::broadcast<int, unsigned int>(*comm, 0, rlen, buffer);
661 for (rlen = 0; rlen < nChunk; rlen++) {
663 global_ordinal_type I = buffer[2*rlen]-1;
664 global_ordinal_type J = buffer[2*rlen+1]-1;
667 if ((I == J) && ignoreDiagonal)
continue;
669 if (transpose) std::swap<global_ordinal_type>(I,J);
674 if (dist->Mine(I,J,ONE)) {
675 nzindex_t idx = std::make_pair(I,J);
678 if (requireDiagonal && (I == J)) diagset.insert(I);
684 if (symmetrize && (I != J) && dist->Mine(J,I,ONE)) {
687 nzindex_t idx = std::make_pair(J,I);
694 if (nRead / 1000000 > nMillion) {
696 if (me == 0) std::cout << nMillion <<
"M ";
701 if (verbose && me == 0)
702 std::cout << std::endl << nRead <<
" nonzeros read " << std::endl;
704 if (fp != NULL) fclose(fp);
709 if (requireDiagonal) {
710 if (dist->DistType() == MMFile) {
714 size_t localss = diagset.size();
716 Teuchos::reduceAll<int, size_t>(*comm, Teuchos::REDUCE_SUM, 1,
717 &localss, &globalss);
718 TEUCHOS_TEST_FOR_EXCEPTION(globalss != nRow, std::logic_error,
719 "File-based nonzero distribution requires all diagonal "
720 <<
"entries to be present in the file. \n"
721 <<
"Number of diagonal entries in file = " << globalss <<
"\n"
722 <<
"Number of matrix rows = " << nRow <<
"\n");
725 for (global_ordinal_type i = 0;
726 i < static_cast<global_ordinal_type>(nRow); i++)
728 if (dist->Mine(i,i)) {
729 if (diagset.find(i) == diagset.end()) {
730 nzindex_t idx = std::make_pair(i,i);
738 std::set<global_ordinal_type>().swap(diagset);
771 const std::string &filename,
772 const Teuchos::RCP<
const Teuchos::Comm<int> > &comm,
773 const Teuchos::ParameterList ¶ms,
776 typename Distribution<global_ordinal_type,scalar_type>::LocalNZmap_t &localNZ,
777 Teuchos::RCP<Distribution<global_ordinal_type,scalar_type> > &dist,
778 unsigned int* &buffer,
783 int me = comm->getRank();
785 bool verbose =
false;
787 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"verbose");
789 verbose = pe->getValue<
bool>(&verbose);
792 std::string distribution =
"1D";
794 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"distribution");
796 distribution = pe->getValue<std::string>(&distribution);
799 if (verbose && me == 0)
800 std::cout <<
"Reading per-process binary files... " << filename << std::endl;
803 std::string rankFileName = filename +
"." + std::to_string(me) +
".cooBin";
806 fp = fopen(rankFileName.c_str(),
"rb");
808 std::cout <<
"Error: cannot open file " << filename << std::endl;
809 throw std::runtime_error(
"Error: non-existing input file: " + rankFileName);
813 unsigned int globalNumRows = 0, globalNumCols = 0;
814 unsigned long long localNumNonzeros = 0;
815 fread(&globalNumRows,
sizeof(
unsigned int), 1, fp);
816 fread(&globalNumCols,
sizeof(
unsigned int), 1, fp);
817 fread(&localNumNonzeros,
sizeof(
unsigned long long), 1, fp);
819 nRow =
static_cast<size_t>(globalNumRows);
820 nCol =
static_cast<size_t>(globalNumCols);
821 nNz =
static_cast<size_t>(localNumNonzeros);
825 buffer =
new unsigned int[nNz*2];
828 size_t ret = fread(buffer,
sizeof(
unsigned int), 2*nNz, fp);
830 std::cout <<
"Unexpected end of matrix file: " << rankFileName << std::endl;
836 if (fp != NULL) fclose(fp);
840 if(verbose && me == 0)
841 std::cout <<
"All ranks finished reading their nonzeros from their individual files\n";
844 dist = buildDistribution<global_ordinal_type,scalar_type>(distribution,
852static Teuchos::RCP<sparse_matrix_type>
854 const std::string &filename,
855 const Teuchos::RCP<
const Teuchos::Comm<int> > &comm,
856 const Teuchos::ParameterList ¶ms
859 Teuchos::RCP<Distribution<global_ordinal_type,scalar_type> > dist;
860 return readSparseFile(filename, comm, params, dist);
866static Teuchos::RCP<sparse_matrix_type>
868 const std::string &filename,
869 const Teuchos::RCP<
const Teuchos::Comm<int> > &comm,
870 const Teuchos::ParameterList ¶ms,
871 Teuchos::RCP<Distribution<global_ordinal_type,scalar_type> > &dist
874 bool useTimers =
false;
876 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"useTimers");
878 useTimers = pe->getValue<
bool>(&useTimers);
881 Teuchos::RCP<Teuchos::TimeMonitor> timer = Teuchos::null;
883 timer = rcp(
new Teuchos::TimeMonitor(
884 *Teuchos::TimeMonitor::getNewTimer(
"RSF parameterSetup")));
886 int me = comm->getRank();
891 bool verbose =
false;
893 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"verbose");
895 verbose = pe->getValue<
bool>(&verbose);
898 bool callFillComplete =
true;
900 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"callFillComplete");
902 callFillComplete = pe->getValue<
bool>(&callFillComplete);
913 typename Distribution<global_ordinal_type,scalar_type>::LocalNZmap_t;
914 localNZmap_t localNZ;
918 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"binary");
920 binary = pe->getValue<
bool>(&binary);
923 bool readPerProcess =
false;
925 const Teuchos::ParameterEntry *pe = params.getEntryPtr(
"readPerProcess");
927 readPerProcess = pe->getValue<
bool>(&readPerProcess);
931 const char *timername = (binary?
"RSF readBinary":
"RSF readMatrixMarket");
932 timer = Teuchos::null;
933 timer = rcp(
new Teuchos::TimeMonitor(
934 *Teuchos::TimeMonitor::getNewTimer(timername)));
938 size_t nRow = 0, nCol = 0;
939 unsigned int *buffer;
size_t nNz = 0;
942 readPerProcessBinary(filename, comm, params, nRow, nCol, localNZ, dist, buffer, nNz);
944 readBinary(filename, comm, params, nRow, nCol, localNZ, dist);
947 readMatrixMarket(filename, comm, params, nRow, nCol, localNZ, dist);
949 if(readPerProcess ==
false){
954 timer = Teuchos::null;
955 timer = rcp(
new Teuchos::TimeMonitor(
956 *Teuchos::TimeMonitor::getNewTimer(
"RSF redistribute")));
959 dist->Redistribute(localNZ);
963 timer = Teuchos::null;
964 timer = rcp(
new Teuchos::TimeMonitor(
965 *Teuchos::TimeMonitor::getNewTimer(
"RSF nonzerosConstruction")));
970 if (verbose && me == 0)
971 std::cout << std::endl <<
"Constructing the matrix" << std::endl;
973 Teuchos::Array<global_ordinal_type> rowIdx;
974 Teuchos::Array<size_t> nnzPerRow;
975 Teuchos::Array<global_ordinal_type> colIdx;
976 Teuchos::Array<scalar_type> val;
977 Teuchos::Array<size_t> offsets;
980 global_ordinal_type prevI = std::numeric_limits<global_ordinal_type>::max();
981 for (
size_t it = 0; it < nNz; it++){
982 global_ordinal_type I = buffer[2*it]-1;
983 global_ordinal_type J = buffer[2*it+1]-1;
987 nnzPerRow.push_back(0);
996 global_ordinal_type prevI = std::numeric_limits<global_ordinal_type>::max();
997 for (
auto it = localNZ.begin(); it != localNZ.end(); it++) {
998 global_ordinal_type I = it->first.first;
999 global_ordinal_type J = it->first.second;
1000 scalar_type V = it->second;
1003 rowIdx.push_back(I);
1004 nnzPerRow.push_back(0);
1007 colIdx.push_back(J);
1012 localNZmap_t().swap(localNZ);
1016 offsets.resize(rowIdx.size() + 1);
1018 for (
size_t row = 0; row < static_cast<size_t>(rowIdx.size()); row++)
1019 offsets[row+1] = offsets[row] + nnzPerRow[row];
1022 timer = Teuchos::null;
1023 timer = rcp(
new Teuchos::TimeMonitor(
1024 *Teuchos::TimeMonitor::getNewTimer(
"RSF insertNonzeros")));
1028 size_t dummy = Teuchos::OrdinalTraits<Tpetra::global_size_t>::invalid();
1029 Teuchos::RCP<const Tpetra::Map<> > rowMap =
1032 Teuchos::RCP<sparse_matrix_type> A =
1033 rcp(
new sparse_matrix_type(rowMap, nnzPerRow()));
1036 if (verbose && me == 0)
1037 std::cout <<
"Inserting global values" << std::endl;
1040 const scalar_type ONE = Teuchos::ScalarTraits<scalar_type>::one();
1041 for (
int i = 0; i < rowIdx.size(); i++) {
1042 size_t nnz = nnzPerRow[i];
1043 size_t off = offsets[i];
1044 val.assign(nnz, ONE);
1047 A->insertGlobalValues(rowIdx[i], colIdx(off, nnz), val());
1051 for (
int i = 0; i < rowIdx.size(); i++) {
1052 size_t nnz = nnzPerRow[i];
1053 size_t off = offsets[i];
1054 A->insertGlobalValues(rowIdx[i], colIdx(off, nnz), val(off, nnz));
1059 Teuchos::Array<size_t>().swap(nnzPerRow);
1060 Teuchos::Array<size_t>().swap(offsets);
1061 Teuchos::Array<global_ordinal_type>().swap(rowIdx);
1062 Teuchos::Array<global_ordinal_type>().swap(colIdx);
1063 Teuchos::Array<scalar_type>().swap(val);
1066 timer = Teuchos::null;
1068 if (callFillComplete) {
1070 if (verbose && me == 0)
1071 std::cout <<
"Building vector maps" << std::endl;
1074 timer = Teuchos::null;
1075 timer = rcp(
new Teuchos::TimeMonitor(
1076 *Teuchos::TimeMonitor::getNewTimer(
"RSF buildVectorMaps")));
1080 Teuchos::Array<global_ordinal_type> vectorSet;
1081 for (global_ordinal_type i = 0;
1082 i < static_cast<global_ordinal_type>(nCol); i++)
1083 if (dist->VecMine(i)) vectorSet.push_back(i);
1085 dummy = Teuchos::OrdinalTraits<Tpetra::global_size_t>::invalid();
1086 Teuchos::RCP<const Tpetra::Map<> > domainMap =
1087 Teuchos::rcp(
new Tpetra::Map<>(dummy, vectorSet(), 0, comm));
1089 Teuchos::Array<global_ordinal_type>().swap(vectorSet);
1092 for (global_ordinal_type i = 0;
1093 i < static_cast<global_ordinal_type>(nRow); i++)
1094 if (dist->VecMine(i)) vectorSet.push_back(i);
1096 dummy = Teuchos::OrdinalTraits<Tpetra::global_size_t>::invalid();
1097 Teuchos::RCP<const Tpetra::Map<> > rangeMap =
1098 Teuchos::rcp(
new Tpetra::Map<>(dummy, vectorSet(), 0, comm));
1100 Teuchos::Array<global_ordinal_type>().swap(vectorSet);
1104 timer = Teuchos::null;
1105 timer = rcp(
new Teuchos::TimeMonitor(
1106 *Teuchos::TimeMonitor::getNewTimer(
"RSF fillComplete")));
1109 if (verbose && me == 0)
1110 std::cout <<
"Calling fillComplete" << std::endl;
1112 A->fillComplete(domainMap, rangeMap);
1115 timer = Teuchos::null;
1118 std::cout <<
"\nRank " << A->getComm()->getRank()
1119 <<
" nRows " << A->getNodeNumRows()
1120 <<
" minRow " << A->getRowMap()->getMinGlobalIndex()
1121 <<
" maxRow " << A->getRowMap()->getMaxGlobalIndex()
1122 <<
"\nRank " << A->getComm()->getRank()
1123 <<
" nCols " << A->getNodeNumCols()
1124 <<
" minCol " << A->getColMap()->getMinGlobalIndex()
1125 <<
" maxCol " << A->getColMap()->getMaxGlobalIndex()
1126 <<
"\nRank " << A->getComm()->getRank()
1127 <<
" nDomain " << A->getDomainMap()->getNodeNumElements()
1128 <<
" minDomain " << A->getDomainMap()->getMinGlobalIndex()
1129 <<
" maxDomain " << A->getDomainMap()->getMaxGlobalIndex()
1130 <<
"\nRank " << A->getComm()->getRank()
1131 <<
" nRange " << A->getRangeMap()->getNodeNumElements()
1132 <<
" minRange " << A->getRangeMap()->getMinGlobalIndex()
1133 <<
" maxRange " << A->getRangeMap()->getMaxGlobalIndex()
1134 <<
"\nRank " << A->getComm()->getRank()
1135 <<
" nEntries " << A->getNodeNumEntries()
A parallel distribution of indices over processes.