| 1608 | } |
| 1609 | |
| 1610 | int vtkGenerateStatistics::MergeRemoteModels(vtkPartitionedDataSetCollection* modelTree) |
| 1611 | { |
| 1612 | auto* controller = this->Controller; |
| 1613 | #if VTK_DBG_MODELDATA |
| 1614 | reportRanks("*** Before Merge ***", modelTree, controller); |
| 1615 | #endif |
| 1616 | if (!controller) |
| 1617 | { |
| 1618 | controller = vtkMultiProcessController::GetGlobalController(); |
| 1619 | } |
| 1620 | if (!controller) |
| 1621 | { |
| 1622 | // No work to do. |
| 1623 | return 0; |
| 1624 | } |
| 1625 | int rank = controller->GetLocalProcessId(); |
| 1626 | int numberOfRanks = controller->GetNumberOfProcesses(); |
| 1627 | if (numberOfRanks < 2) |
| 1628 | { |
| 1629 | // No work to do. |
| 1630 | return 0; |
| 1631 | } |
| 1632 | int maxPower = std::log2(vtkMath::NearestPowerOfTwo(numberOfRanks)); |
| 1633 | #if VTK_DBG_MODELDATA |
| 1634 | // For debugging: |
| 1635 | std::ostringstream commlog; |
| 1636 | commlog << "/tmp/comm_" << rank << ".log"; |
| 1637 | #endif |
| 1638 | // Create a writer to serialize **LOCAL** model information ONLY. |
| 1639 | // We send the resulting XML via \a controller to a partner rank per pass, |
| 1640 | // where it will be aggregated with the partner's model (if any). |
| 1641 | vtkNew<vtkGenericDataObjectWriter> serializer; |
| 1642 | serializer->SetInputDataObject(0, modelTree); |
| 1643 | serializer->WriteToOutputStringOn(); |
| 1644 | serializer->Write(); |
| 1645 | std::string localModelString = serializer->GetOutputString(); |
| 1646 | std::size_t localModelSize = localModelString.size(); |
| 1647 | vtkNew<vtkGenericDataObjectReader> deserializer; |
| 1648 | deserializer->ReadFromInputStringOn(); |
| 1649 | { |
| 1650 | #if VTK_DBG_MODELDATA |
| 1651 | std::ofstream log(commlog.str().c_str()); |
| 1652 | log << "max power " << maxPower << "\n"; |
| 1653 | #endif |
| 1654 | for (int power = 0; power < maxPower; ++power) |
| 1655 | { |
| 1656 | #if VTK_DBG_MODELDATA |
| 1657 | log << "Pass " << power << "\n"; |
| 1658 | #endif |
| 1659 | int delta = (1 << power); |
| 1660 | if (rank % delta == 0) |
| 1661 | { |
| 1662 | bool recvUp = (rank % (2 * delta) == 0); |
| 1663 | if (recvUp) |
| 1664 | { |
| 1665 | int recvFrom = (rank + delta >= numberOfRanks ? -1 : rank + delta); |
| 1666 | if (recvFrom < 0) |
| 1667 | { |
no test coverage detected