// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen // SPDX-License-Identifier: BSD-3-Clause #include "vtkTransmitUnstructuredGridPiece.h" #include "vtkCellData.h" #include "vtkExtractUnstructuredGridPiece.h" #include "vtkInformation.h" #include "vtkInformationVector.h" #include "vtkMultiProcessController.h" #include "vtkObjectFactory.h" #include "vtkPointData.h" #include "vtkStreamingDemandDrivenPipeline.h" #include "vtkUnstructuredGrid.h" #include VTK_ABI_NAMESPACE_BEGIN vtkStandardNewMacro(vtkTransmitUnstructuredGridPiece); vtkCxxSetObjectMacro(vtkTransmitUnstructuredGridPiece, Controller, vtkMultiProcessController); //------------------------------------------------------------------------------ vtkTransmitUnstructuredGridPiece::vtkTransmitUnstructuredGridPiece() { this->CreateGhostCells = 1; // Controller keeps a reference to this object as well. this->Controller = nullptr; this->SetController(vtkMultiProcessController::GetGlobalController()); } //------------------------------------------------------------------------------ vtkTransmitUnstructuredGridPiece::~vtkTransmitUnstructuredGridPiece() { this->SetController(nullptr); } //------------------------------------------------------------------------------ int vtkTransmitUnstructuredGridPiece::RequestData(vtkInformation* vtkNotUsed(request), vtkInformationVector** inputVector, vtkInformationVector* outputVector) { // get the info objects vtkInformation* inInfo = inputVector[0]->GetInformationObject(0); vtkInformation* outInfo = outputVector->GetInformationObject(0); // get the input and output vtkUnstructuredGrid* input = vtkUnstructuredGrid::SafeDownCast(inInfo->Get(vtkDataObject::DATA_OBJECT())); vtkUnstructuredGrid* output = vtkUnstructuredGrid::SafeDownCast(outInfo->Get(vtkDataObject::DATA_OBJECT())); int procId; if (this->Controller == nullptr) { vtkErrorMacro("Could not find Controller."); return 1; } procId = this->Controller->GetLocalProcessId(); if (procId == 0) { // std::cerr << "Root Execute\n"; this->RootExecute(input, output, outInfo); } else { // std::cerr << "Satellite Execute " << procId << endl; this->SatelliteExecute(procId, output, outInfo); } return 1; } //------------------------------------------------------------------------------ void vtkTransmitUnstructuredGridPiece::RootExecute( vtkUnstructuredGrid* input, vtkUnstructuredGrid* output, vtkInformation* outInfo) { vtkUnstructuredGrid* tmp = vtkUnstructuredGrid::New(); vtkExtractUnstructuredGridPiece* extract = vtkExtractUnstructuredGridPiece::New(); int ext[3]; int numProcs, i; int outPiece = outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_PIECE_NUMBER()); if (outPiece != 0) { vtkWarningMacro(<< "Piece " << outPiece << " does not match process 0. " << "Altering request to try to avoid a deadlock."); } vtkStreamingDemandDrivenPipeline* extractExecutive = vtkStreamingDemandDrivenPipeline::SafeDownCast(extract->GetExecutive()); // First, set up the pipeline and handle local request. tmp->ShallowCopy(input); extract->SetCreateGhostCells(this->CreateGhostCells); extract->SetInputData(tmp); extractExecutive->UpdateDataObject(); vtkInformation* extractOutInfo = extractExecutive->GetOutputInformation(0); extractOutInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_PIECES(), outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_PIECES())); extractOutInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_PIECE_NUMBER(), outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_PIECE_NUMBER())); extractOutInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS(), outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS())); extractOutInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT_INITIALIZED(), 1); extract->Update(); // Copy geometry without copying information. output->CopyStructure(extract->GetOutput()); output->GetPointData()->PassData(extract->GetOutput()->GetPointData()); output->GetCellData()->PassData(extract->GetOutput()->GetCellData()); vtkFieldData* inFd = extract->GetOutput()->GetFieldData(); vtkFieldData* outFd = output->GetFieldData(); if (inFd && outFd) { outFd->PassData(inFd); } // Now do each of the satellite requests. numProcs = this->Controller->GetNumberOfProcesses(); for (i = 1; i < numProcs; ++i) { this->Controller->Receive(ext, 3, i, 22341); extractOutInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_PIECES(), ext[1]); extractOutInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_PIECE_NUMBER(), ext[0]); extractOutInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS(), ext[2]); extract->Update(); this->Controller->Send(extract->GetOutput(), i, 22342); } tmp->Delete(); extract->Delete(); } //------------------------------------------------------------------------------ void vtkTransmitUnstructuredGridPiece::SatelliteExecute( int, vtkUnstructuredGrid* output, vtkInformation* outInfo) { vtkUnstructuredGrid* tmp = vtkUnstructuredGrid::New(); int ext[3]; ext[0] = outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_PIECE_NUMBER()); ext[1] = outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_PIECES()); ext[2] = outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS()); this->Controller->Send(ext, 3, 0, 22341); this->Controller->Receive(tmp, 0, 22342); // Copy geometry without copying information. output->CopyStructure(tmp); output->GetPointData()->PassData(tmp->GetPointData()); output->GetCellData()->PassData(tmp->GetCellData()); tmp->Delete(); } //------------------------------------------------------------------------------ void vtkTransmitUnstructuredGridPiece::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); os << indent << "Create Ghost Cells: " << (this->CreateGhostCells ? "On\n" : "Off\n"); os << indent << "Controller: (" << this->Controller << ")\n"; } VTK_ABI_NAMESPACE_END