MCPcopy Create free account
hub / github.com/Kitware/VTK / ExchangeCellArray

Method ExchangeCellArray

Filters/ParallelMPI/vtkHyperTreeGridRedistribute.cxx:965–1058  ·  view source on GitHub ↗

------------------------------------------------------------------------------

Source from the content-addressed store, hash-verified

963
964//------------------------------------------------------------------------------
965void vtkHyperTreeGridRedistribute::ExchangeCellArray(int arrayId,
966 std::vector<int>& cellsSentPerPartOffset, std::vector<int>& cellsReceivedPerPartOffset,
967 std::vector<int>& nbCellDataSentPerPart, std::vector<int>& nbCellDataReceivedPerPart)
968{
969 vtkAbstractArray* outputArray = this->OutputHTG->GetCellData()->GetAbstractArray(arrayId);
970 vtkAbstractArray* inputArray = nullptr;
971 if (arrayId < this->InputHTG->GetCellData()->GetNumberOfArrays())
972 {
973 inputArray = this->InputHTG->GetCellData()->GetAbstractArray(arrayId);
974 }
975 int numComp = outputArray->GetNumberOfComponents();
976
977 vtkSmartPointer<vtkAbstractArray> cellDataSendArrayBuffer =
978 vtk::TakeSmartPointer(outputArray->NewInstance());
979 cellDataSendArrayBuffer->SetNumberOfComponents(numComp);
980 int totalNbCellsSent =
981 std::accumulate(nbCellDataSentPerPart.begin(), nbCellDataSentPerPart.end(), 0);
982 cellDataSendArrayBuffer->SetNumberOfTuples(totalNbCellsSent);
983
984 // Extract data from local trees
985 int countCells = 0;
986 vtkNew<vtkHyperTreeGridNonOrientedCursor> cursor;
987 for (int part = 0; part < this->NumPartitions; part++)
988 {
989 for (size_t id = 0; id < this->TreesToSend[part].size(); id++)
990 {
991 this->InputHTG->InitializeNonOrientedCursor(cursor, this->TreesToSend[part][id]);
992 if (inputArray)
993 {
994 ::CollectArray(cursor, inputArray, cellDataSendArrayBuffer, countCells);
995 }
996 }
997 }
998
999 int totalNbCellsReceived =
1000 std::accumulate(nbCellDataReceivedPerPart.begin(), nbCellDataReceivedPerPart.end(), 0);
1001
1002 // Prepare input send/recv structures
1003 vtkSmartPointer<vtkAbstractArray> cellDataReceivedBuffer =
1004 vtk::TakeSmartPointer(outputArray->NewInstance());
1005 cellDataReceivedBuffer->SetNumberOfComponents(numComp);
1006 cellDataReceivedBuffer->SetNumberOfTuples(totalNbCellsReceived);
1007
1008 std::vector<int> cellDataSentSizes(this->NumPartitions);
1009 std::transform(nbCellDataSentPerPart.begin(), nbCellDataSentPerPart.end(),
1010 cellDataSentSizes.begin(), [numComp](int elem) { return elem * numComp; });
1011 std::vector<int> cellDataSentOffsets(this->NumPartitions);
1012 std::transform(cellsSentPerPartOffset.begin(), cellsSentPerPartOffset.end(),
1013 cellDataSentOffsets.begin(), [numComp](int elem) { return elem * numComp; });
1014 std::vector<int> cellDataReceivedSizes(this->NumPartitions);
1015 std::transform(nbCellDataReceivedPerPart.begin(), nbCellDataReceivedPerPart.end(),
1016 cellDataReceivedSizes.begin(), [numComp](int elem) { return elem * numComp; });
1017 std::vector<int> cellDataReceivedOffsets(this->NumPartitions);
1018 std::transform(cellsReceivedPerPartOffset.begin(), cellsReceivedPerPartOffset.end(),
1019 cellDataReceivedOffsets.begin(), [numComp](int elem) { return elem * numComp; });
1020
1021 // Exchange cell data information
1022 this->MPIComm->AllToAllVVoidArray(cellDataSendArrayBuffer->GetVoidPointer(0),

Callers 1

ProcessTreesMethod · 0.95

Calls 15

CollectArrayFunction · 0.85
SetArrayValuesFunction · 0.85
CopyArrayValuesFunction · 0.85
GetAbstractArrayMethod · 0.80
AllToAllVVoidArrayMethod · 0.80
transformFunction · 0.50
GetCellDataMethod · 0.45
GetNumberOfArraysMethod · 0.45
GetNumberOfComponentsMethod · 0.45
NewInstanceMethod · 0.45
SetNumberOfComponentsMethod · 0.45

Tested by

no test coverage detected