136 Teuchos::RCP<const Teuchos::Comm<int> > comm = aggregates->GetMap()->getComm();
137 int numProcs = comm->getSize();
138 int myRank = comm->getRank();
139 string masterFilename = pL.get<std::string>(
"aggregation: output filename");
140 string pvtuFilename =
"";
141 string localFilename = pL.get<std::string>(
"Output filename");
142 string filenameToWrite;
146 if(masterFilename.length())
149 filenameToWrite = masterFilename;
150 if(filenameToWrite.rfind(
".vtu") == string::npos)
151 filenameToWrite.append(
".vtu");
152 if(numProcs > 1 && filenameToWrite.rfind(
"%PROCID") == string::npos)
153 filenameToWrite.insert(filenameToWrite.rfind(
".vtu"),
"-proc%PROCID");
156 filenameToWrite = localFilename;
160 Teuchos::RCP<Matrix> Ac;
163 Teuchos::RCP<CoordinateMultiVector> coords = Teuchos::null;
164 Teuchos::RCP<CoordinateMultiVector> coordsCoarse = Teuchos::null;
165 Teuchos::RCP<GraphBase> fineGraph = Teuchos::null;
166 Teuchos::RCP<GraphBase> coarseGraph = Teuchos::null;
177 dims_ = coords->getNumVectors();
180 if (aggregates->AggregatesCrossProcessors())
182 RCP<Import> coordImporter = Xpetra::ImportFactory<LocalOrdinal, GlobalOrdinal, Node>::Build(coords->getMap(), Amat->getColMap());
183 RCP<CoordinateMultiVector> ghostedCoords = Xpetra::MultiVectorFactory<coordinate_type, LocalOrdinal, GlobalOrdinal, Node>::Build(Amat->getColMap(),
dims_);
184 ghostedCoords->doImport(*coords, *coordImporter, Xpetra::INSERT);
185 coords = ghostedCoords;
190 RCP<Import> coordImporter = Xpetra::ImportFactory<LocalOrdinal, GlobalOrdinal, Node>::Build(coordsCoarse->getMap(), Ac->getColMap());
191 RCP<CoordinateMultiVector> ghostedCoords = Xpetra::MultiVectorFactory<coordinate_type, LocalOrdinal, GlobalOrdinal, Node>::Build(Ac->getColMap(),
dims_);
192 ghostedCoords->doImport(*coordsCoarse, *coordImporter, Xpetra::INSERT);
193 coordsCoarse = ghostedCoords;
198 GetOStream(
Runtime0) <<
"AggregationExportFactory: DofsPerNode: " << DofsPerNode << std::endl;
199 Teuchos::RCP<LocalOrdinalMultiVector> vertex2AggId_vector = aggregates->GetVertex2AggId();
200 Teuchos::RCP<LocalOrdinalVector> procWinner_vector = aggregates->GetProcWinner();
201 Teuchos::ArrayRCP<LocalOrdinal> vertex2AggId = aggregates->GetVertex2AggId()->getDataNonConst(0);
202 Teuchos::ArrayRCP<LocalOrdinal> procWinner = aggregates->GetProcWinner()->getDataNonConst(0);
207 std::vector<GlobalOrdinal> numAggsGlobal (numProcs, 0);
208 std::vector<GlobalOrdinal> numAggsLocal (numProcs, 0);
209 std::vector<GlobalOrdinal> minGlobalAggId(numProcs, 0);
211 numAggsLocal[myRank] = aggregates->GetNumAggregates();
212 Teuchos::reduceAll(*comm, Teuchos::REDUCE_SUM, numProcs, &numAggsLocal[0], &numAggsGlobal[0]);
213 for (
int i = 1; i < Teuchos::as<int>(numAggsGlobal.size()); ++i)
215 numAggsGlobal [i] += numAggsGlobal[i-1];
216 minGlobalAggId[i] = numAggsGlobal[i-1];
222 ArrayRCP<LO> aggStart;
223 ArrayRCP<GlobalOrdinal> aggToRowMap;
224 amalgInfo->UnamalgamateAggregates(*aggregates, aggStart, aggToRowMap);
225 int timeStep = pL.get<
int > (
"Output file: time step");
226 int iter = pL.get<
int > (
"Output file: iter");
232 string masterStem =
"";
235 masterStem = filenameToWrite.substr(0, filenameToWrite.rfind(
".vtu"));
236 masterStem = this->
replaceAll(masterStem,
"%PROCID",
"");
238 pvtuFilename = masterStem +
"-master.pvtu";
239 string baseFname = filenameToWrite;
241 GetOStream(
Runtime0) <<
"AggregationExportFactory: outputfile \"" << filenameToWrite <<
"\"" << std::endl;
242 ofstream fout(filenameToWrite.c_str());
243 GO numAggs = aggregates->GetNumAggregates();
246 GO indexBase = aggregates->GetMap()->getIndexBase();
247 GO offset = amalgInfo->GlobalOffset();
248 vector<GlobalOrdinal> nodeIds;
249 for (
int i = 0; i < numAggs; ++i) {
250 fout <<
"Agg " << minGlobalAggId[myRank] + i <<
" Proc " << myRank <<
":";
253 for (
int k = aggStart[i]; k < aggStart[i+1]; ++k) {
254 nodeIds.push_back((aggToRowMap[k] - offset - indexBase) / DofsPerNode + indexBase);
258 std::sort(nodeIds.begin(), nodeIds.end());
259 typename std::vector<GlobalOrdinal>::iterator endLocation = std::unique(nodeIds.begin(), nodeIds.end());
260 nodeIds.erase(endLocation, nodeIds.end());
263 for(
typename std::vector<GlobalOrdinal>::iterator printIt = nodeIds.begin(); printIt != nodeIds.end(); printIt++)
264 fout <<
" " << *printIt;
273 TEUCHOS_TEST_FOR_EXCEPTION(coords.is_null(),
Exceptions::RuntimeError,
"AggExportFactory could not get coordinates, but they are required for VTK output.");
277 aggSizes_ = aggregates->ComputeAggregateSizesArrayRCP();
279 string aggStyle =
"Point Cloud";
282 aggStyle = pL.get<
string>(
"aggregation: output file: agg style");
284 catch(std::exception& e) {}
285 vector<int> vertices;
286 vector<int> geomSizes;
291 isRoot_.push_back(aggregates->IsRoot(i));
297 ofstream pvtu(pvtuFilename.c_str());
301 if(aggStyle ==
"Point Cloud")
303 else if(aggStyle ==
"Jacks")
305 else if(aggStyle ==
"Jacks++")
307 else if(aggStyle ==
"Convex Hulls")
311 GetOStream(
Warnings0) <<
" Unrecognized agg style.\n Possible values are Point Cloud, Jacks, Jacks++, and Convex Hulls.\n Defaulting to Point Cloud." << std::endl;
312 aggStyle =
"Point Cloud";
315 writeFile_(fout, aggStyle, vertices, geomSizes);
318 string fname = filenameToWrite;
319 string cEdgeFile = fname.insert(fname.rfind(
".vtu"),
"-coarsegraph");
320 std::ofstream edgeStream(cEdgeFile.c_str());
321 doGraphEdges_(edgeStream, Ac, coarseGraph,
false, DofsPerNode);
325 string fname = filenameToWrite;
326 string fEdgeFile = fname.insert(fname.rfind(
".vtu"),
"-finegraph");
327 std::ofstream edgeStream(fEdgeFile.c_str());
328 doGraphEdges_(edgeStream, Amat, fineGraph,
true, DofsPerNode);
330 if(myRank == 0 && pL.get<
bool>(
"aggregation: output file: build colormap"))
363 ArrayView<const Scalar> values;
364 ArrayView<const LocalOrdinal> neighbors;
366 vector<pair<int, int> > vert1;
367 vector<pair<int, int> > vert2;
369 Teuchos::ArrayRCP<const typename Teuchos::ScalarTraits<Scalar>::coordinateType> xCoords =
coords_->getData(0);
370 Teuchos::ArrayRCP<const typename Teuchos::ScalarTraits<Scalar>::coordinateType> yCoords =
coords_->getData(1);
371 Teuchos::ArrayRCP<const typename Teuchos::ScalarTraits<Scalar>::coordinateType> zCoords = Teuchos::null;
375 Teuchos::ArrayRCP<const typename Teuchos::ScalarTraits<Scalar>::coordinateType> cx =
coordsCoarse_->getData(0);
376 Teuchos::ArrayRCP<const typename Teuchos::ScalarTraits<Scalar>::coordinateType> cy =
coordsCoarse_->getData(1);
377 Teuchos::ArrayRCP<const typename Teuchos::ScalarTraits<Scalar>::coordinateType> cz = Teuchos::null;
381 if(A->isGloballyIndexed())
383 ArrayView<const GlobalOrdinal> indices;
387 A->getGlobalRowView(globRow, indices, values);
388 neighbors = G->getNeighborVertices((
LocalOrdinal) globRow);
391 while(gEdge !=
int(neighbors.size()))
395 if(neighbors[gEdge] == indices[aEdge])
398 vert1.push_back(pair<int, int>(
int(globRow), neighbors[gEdge]));
405 vert2.push_back(pair<int, int>(
int(globRow), neighbors[gEdge]));
411 vert1.push_back(pair<int, int>(
int(globRow), neighbors[gEdge]));
419 ArrayView<const LocalOrdinal> indices;
423 A->getLocalRowView(locRow, indices, values);
424 neighbors = G->getNeighborVertices(locRow);
428 while(gEdge !=
int(neighbors.size()))
432 if(neighbors[gEdge] == indices[aEdge])
434 vert1.push_back(pair<int, int>(locRow, neighbors[gEdge]));
440 vert2.push_back(pair<int, int>(locRow, neighbors[gEdge]));
446 vert1.push_back(pair<int, int>(locRow, neighbors[gEdge]));
452 for(
size_t i = 0; i < vert1.size(); i ++)
454 if(vert1[i].first > vert1[i].second)
456 int temp = vert1[i].first;
457 vert1[i].first = vert1[i].second;
458 vert1[i].second = temp;
461 for(
size_t i = 0; i < vert2.size(); i++)
463 if(vert2[i].first > vert2[i].second)
465 int temp = vert2[i].first;
466 vert2[i].first = vert2[i].second;
467 vert2[i].second = temp;
470 sort(vert1.begin(), vert1.end());
471 vector<pair<int, int> >::iterator newEnd = unique(vert1.begin(), vert1.end());
472 vert1.erase(newEnd, vert1.end());
473 sort(vert2.begin(), vert2.end());
474 newEnd = unique(vert2.begin(), vert2.end());
475 vert2.erase(newEnd, vert2.end());
477 points1.reserve(2 * vert1.size());
478 for(
size_t i = 0; i < vert1.size(); i++)
480 points1.push_back(vert1[i].first);
481 points1.push_back(vert1[i].second);
484 points2.reserve(2 * vert2.size());
485 for(
size_t i = 0; i < vert2.size(); i++)
487 points2.push_back(vert2[i].first);
488 points2.push_back(vert2[i].second);
490 vector<int> unique1 = this->
makeUnique(points1);
491 vector<int> unique2 = this->
makeUnique(points2);
492 fout <<
"<VTKFile type=\"UnstructuredGrid\" byte_order=\"LittleEndian\">" << endl;
493 fout <<
" <UnstructuredGrid>" << endl;
494 fout <<
" <Piece NumberOfPoints=\"" << unique1.size() + unique2.size() <<
"\" NumberOfCells=\"" << vert1.size() + vert2.size() <<
"\">" << endl;
495 fout <<
" <PointData Scalars=\"Node Aggregate Processor\">" << endl;
496 fout <<
" <DataArray type=\"Int32\" Name=\"Node\" format=\"ascii\">" << endl;
499 for(
size_t i = 0; i < unique1.size(); i++)
503 fout << endl << indent;
505 for(
size_t i = 0; i < unique2.size(); i++)
508 if((i + 2 * vert1.size()) % 25 == 24)
509 fout << endl << indent;
512 fout <<
" </DataArray>" << endl;
513 fout <<
" <DataArray type=\"Int32\" Name=\"Aggregate\" format=\"ascii\">" << endl;
515 for(
size_t i = 0; i < unique1.size(); i++)
519 fout << endl << indent;
521 for(
size_t i = 0; i < unique2.size(); i++)
524 if((i + 2 * vert2.size()) % 25 == 24)
525 fout << endl << indent;
528 fout <<
" </DataArray>" << endl;
529 fout <<
" <DataArray type=\"Int32\" Name=\"Processor\" format=\"ascii\">" << endl;
531 for(
size_t i = 0; i < unique1.size() + unique2.size(); i++)
535 fout << endl << indent;
538 fout <<
" </DataArray>" << endl;
539 fout <<
" </PointData>" << endl;
540 fout <<
" <Points>" << endl;
541 fout <<
" <DataArray type=\"Float64\" NumberOfComponents=\"3\" format=\"ascii\">" << endl;
543 for(
size_t i = 0; i < unique1.size(); i++)
547 fout << xCoords[unique1[i]] <<
" " << yCoords[unique1[i]] <<
" ";
549 fout << zCoords[unique1[i]] <<
" ";
553 fout << endl << indent;
557 fout << cx[unique1[i]] <<
" " << cy[unique1[i]] <<
" ";
559 fout << cz[unique1[i]] <<
" ";
563 fout << endl << indent;
566 for(
size_t i = 0; i < unique2.size(); i++)
570 fout << xCoords[unique2[i]] <<
" " << yCoords[unique2[i]] <<
" ";
572 fout << zCoords[unique2[i]] <<
" ";
576 fout << endl << indent;
580 fout << cx[unique2[i]] <<
" " << cy[unique2[i]] <<
" ";
582 fout << cz[unique2[i]] <<
" ";
585 if((i + unique1.size()) % 2)
586 fout << endl << indent;
590 fout <<
" </DataArray>" << endl;
591 fout <<
" </Points>" << endl;
592 fout <<
" <Cells>" << endl;
593 fout <<
" <DataArray type=\"Int32\" Name=\"connectivity\" format=\"ascii\">" << endl;
595 for(
size_t i = 0; i < points1.size(); i++)
597 fout << points1[i] <<
" ";
599 fout << endl << indent;
601 for(
size_t i = 0; i < points2.size(); i++)
603 fout << points2[i] + unique1.size() <<
" ";
604 if((i + points1.size()) % 10 == 9)
605 fout << endl << indent;
608 fout <<
" </DataArray>" << endl;
609 fout <<
" <DataArray type=\"Int32\" Name=\"offsets\" format=\"ascii\">" << endl;
612 for(
size_t i = 0; i < vert1.size() + vert2.size(); i++)
615 fout << offset <<
" ";
617 fout << endl << indent;
620 fout <<
" </DataArray>" << endl;
621 fout <<
" <DataArray type=\"Int32\" Name=\"types\" format=\"ascii\">" << endl;
623 for(
size_t i = 0; i < vert1.size() + vert2.size(); i++)
627 fout << endl << indent;
630 fout <<
" </DataArray>" << endl;
631 fout <<
" </Cells>" << endl;
632 fout <<
" </Piece>" << endl;
633 fout <<
" </UnstructuredGrid>" << endl;
634 fout <<
"</VTKFile>" << endl;
642 Teuchos::ArrayRCP<const typename Teuchos::ScalarTraits<Scalar>::coordinateType> xCoords =
coords_->getData(0);
643 Teuchos::ArrayRCP<const typename Teuchos::ScalarTraits<Scalar>::coordinateType> yCoords =
coords_->getData(1);
644 Teuchos::ArrayRCP<const typename Teuchos::ScalarTraits<Scalar>::coordinateType> zCoords = Teuchos::null;
648 vector<int> uniqueFine = this->
makeUnique(vertices);
650 fout <<
"<!--" << styleName <<
" Aggregates Visualization-->" << endl;
651 fout <<
"<VTKFile type=\"UnstructuredGrid\" byte_order=\"LittleEndian\">" << endl;
652 fout <<
" <UnstructuredGrid>" << endl;
653 fout <<
" <Piece NumberOfPoints=\"" << uniqueFine.size() <<
"\" NumberOfCells=\"" << geomSizes.size() <<
"\">" << endl;
654 fout <<
" <PointData Scalars=\"Node Aggregate Processor\">" << endl;
655 fout <<
" <DataArray type=\"Int32\" Name=\"Node\" format=\"ascii\">" << endl;
659 for(
size_t i = 0; i < uniqueFine.size(); i++)
663 fout << uniqueFine[i] <<
" ";
666 fout <<
nodeMap_->getGlobalElement(uniqueFine[i]) <<
" ";
668 fout << endl << indent;
671 fout <<
" </DataArray>" << endl;
672 fout <<
" <DataArray type=\"Int32\" Name=\"Aggregate\" format=\"ascii\">" << endl;
674 for(
size_t i = 0; i < uniqueFine.size(); i++)
681 fout << endl << indent;
684 fout <<
" </DataArray>" << endl;
685 fout <<
" <DataArray type=\"Int32\" Name=\"Processor\" format=\"ascii\">" << endl;
687 for(
size_t i = 0; i < uniqueFine.size(); i++)
691 fout << endl << indent;
694 fout <<
" </DataArray>" << endl;
695 fout <<
" </PointData>" << endl;
696 fout <<
" <Points>" << endl;
697 fout <<
" <DataArray type=\"Float64\" NumberOfComponents=\"3\" format=\"ascii\">" << endl;
699 for(
size_t i = 0; i < uniqueFine.size(); i++)
701 fout << xCoords[uniqueFine[i]] <<
" " << yCoords[uniqueFine[i]] <<
" ";
705 fout << zCoords[uniqueFine[i]] <<
" ";
707 fout << endl << indent;
710 fout <<
" </DataArray>" << endl;
711 fout <<
" </Points>" << endl;
712 fout <<
" <Cells>" << endl;
713 fout <<
" <DataArray type=\"Int32\" Name=\"connectivity\" format=\"ascii\">" << endl;
715 for(
size_t i = 0; i < vertices.size(); i++)
717 fout << vertices[i] <<
" ";
719 fout << endl << indent;
722 fout <<
" </DataArray>" << endl;
723 fout <<
" <DataArray type=\"Int32\" Name=\"offsets\" format=\"ascii\">" << endl;
726 for(
size_t i = 0; i < geomSizes.size(); i++)
728 accum += geomSizes[i];
729 fout << accum <<
" ";
731 fout << endl << indent;
734 fout <<
" </DataArray>" << endl;
735 fout <<
" <DataArray type=\"Int32\" Name=\"types\" format=\"ascii\">" << endl;
737 for(
size_t i = 0; i < geomSizes.size(); i++)
754 fout << endl << indent;
757 fout <<
" </DataArray>" << endl;
758 fout <<
" </Cells>" << endl;
759 fout <<
" </Piece>" << endl;
760 fout <<
" </UnstructuredGrid>" << endl;
761 fout <<
"</VTKFile>" << endl;