------------------------------------------------------------------------------
| 963 | |
| 964 | //------------------------------------------------------------------------------ |
| 965 | void 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), |
no test coverage detected