17 #include "vtkAppendCompositeDataLeaves.h"
18 #include "vtkAppendFilter.h"
19 #include "vtkAppendPolyData.h"
20 #include "vtkCompositeDataSet.h"
22 #include "vtkImageAppend.h"
23 #include "vtkImageData.h"
24 #include "vtkMolecule.h"
26 #include "vtkMultiProcessController.h"
27 #include "vtkMultiProcessStream.h"
29 #include "vtkObjectFactory.h"
30 #include "vtkStreamingDemandDrivenPipeline.h"
31 #include "vtkStructuredGridAppend.h"
32 #include "vtkTrivialProducer.h"
33 #include "vtkUnstructuredGrid.h"
50 vtkMultiProcessStream&
data,
51 void (*operation)(vtkMultiProcessStream& A, vtkMultiProcessStream& B),
int vtkNotUsed(tag))
53 int numProcs = controller->GetNumberOfProcesses();
59 std::vector<unsigned char> raw_data;
60 data.GetRawData(raw_data);
63 std::vector<vtkIdType> counts(numProcs);
64 const auto my_count =
static_cast<vtkIdType
>(raw_data.size());
65 controller->AllGather(&my_count, &counts[0], 1);
67 std::vector<vtkIdType> offsets(numProcs, 0);
68 for (
int cc = 1; cc < numProcs; ++cc)
70 offsets[cc] = offsets[cc - 1] + counts[cc - 1];
73 std::vector<unsigned char> buffer(offsets.back() + counts.back());
75 controller->AllGatherV(&raw_data[0], &buffer[0], my_count, &counts[0], &offsets[0]);
78 data.SetRawData(&buffer[0],
static_cast<unsigned int>(counts[0]));
79 for (
int cc = 1; cc < numProcs; ++cc)
81 vtkMultiProcessStream other;
82 other.SetRawData(&buffer[offsets[cc]],
static_cast<unsigned int>(counts[cc]));
84 (*operation)(other,
data);
91 vtkDataObject** pieces,
unsigned int num_pieces)
98 vtkDataObject*
result = pieces[0]->NewInstance();
100 std::vector<vtkSmartPointer<vtkDataObject> > piece_vector;
101 piece_vector.resize(num_pieces);
102 for (
unsigned int cc = 0; cc < num_pieces; cc++)
104 piece_vector[cc] = pieces[cc];
119 if (pieces.size() == 0)
124 if (pieces.size() == 1)
126 result->ShallowCopy(pieces[0]);
127 vtkImageData*
id = vtkImageData::SafeDownCast(pieces[0]);
130 vtkStreamingDemandDrivenPipeline::SetWholeExtent(
131 result->GetInformation(),
static_cast<vtkImageData*
>(pieces[0].GetPointer())->GetExtent());
137 vtkAlgorithm* appender =
NULL;
138 if (vtkPolyData::SafeDownCast(
result))
140 appender = vtkAppendPolyData::New();
142 else if (vtkUnstructuredGrid::SafeDownCast(
result))
144 appender = vtkAppendFilter::New();
146 else if (vtkImageData::SafeDownCast(
result))
148 vtkImageAppend* ia = vtkImageAppend::New();
149 ia->PreserveExtentsOn();
152 else if (vtkStructuredGrid::SafeDownCast(
result))
154 appender = vtkStructuredGridAppend::New();
157 else if (vtkMolecule::SafeDownCast(
result))
161 else if (vtkGraph::SafeDownCast(
result))
163 vtkGenericWarningMacro(
"Support for vtkGraph has been depreciated.");
166 else if (vtkCompositeDataSet::SafeDownCast(
result))
170 vtkAppendCompositeDataLeaves* cdl = vtkAppendCompositeDataLeaves::New();
171 cdl->AppendFieldDataOn();
176 vtkGenericWarningMacro(<<
result->GetClassName() <<
" cannot be merged");
177 result->ShallowCopy(pieces[0]);
180 std::vector<vtkSmartPointer<vtkDataObject> >::iterator iter;
181 for (iter = pieces.begin(); iter != pieces.end(); ++iter)
183 vtkDataSet* ds = vtkDataSet::SafeDownCast(iter->GetPointer());
184 if (ds && ds->GetNumberOfPoints() == 0)
189 vtkMolecule* mol = vtkMolecule::SafeDownCast(iter->GetPointer());
190 if (mol && mol->GetNumberOfAtoms() == 0)
195 vtkNew<vtkTrivialProducer> tp;
196 tp->SetOutput(iter->GetPointer());
197 appender->AddInputConnection(0, tp->GetOutputPort());
200 if (appender->GetNumberOfInputConnections(0) > 0)
203 result->ShallowCopy(appender->GetOutputDataObject(0));
212 this->Superclass::PrintSelf(os, indent);
void PrintSelf(ostream &os, vtkIndent indent) override
static vtkDataObject * MergePieces(vtkDataObject **pieces, unsigned int num_pieces)
~vtkMultiProcessControllerHelper() override
vtkMultiProcessControllerHelper()
static int ReduceToAll(vtkMultiProcessController *controller, vtkMultiProcessStream &data, void(*operation)(vtkMultiProcessStream &A, vtkMultiProcessStream &B), int tag)
vtkStandardNewMacro(vtkMultiProcessControllerHelper)