1 /*=========================================================================
2 
3   Program:   Visualization Toolkit
4   Module:    TestIOSSExodusParitionedFiles.cxx
5 
6   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7   All rights reserved.
8   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10      This software is distributed WITHOUT ANY WARRANTY; without even
11      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12      PURPOSE.  See the above copyright notice for more information.
13 
14 =========================================================================*/
15 /**
16  * Reads a partitioned exodus file in parallel
17  */
18 #include <vtkBoundingBox.h>
19 #include <vtkCamera.h>
20 #include <vtkCompositePolyDataMapper2.h>
21 #include <vtkCompositedSynchronizedRenderers.h>
22 #include <vtkDataObject.h>
23 #include <vtkDataSetSurfaceFilter.h>
24 #include <vtkIOSSReader.h>
25 #include <vtkNew.h>
26 #include <vtkProcessIdScalars.h>
27 #include <vtkRegressionTestImage.h>
28 #include <vtkRenderWindow.h>
29 #include <vtkRenderWindowInteractor.h>
30 #include <vtkRenderer.h>
31 #include <vtkSynchronizedRenderWindows.h>
32 #include <vtkTestUtilities.h>
33 
34 #if VTK_MODULE_ENABLE_VTK_ParallelMPI
35 #include "vtkMPIController.h"
36 #else
37 #include "vtkDummyController.h"
38 #endif
39 
GetFileName(int argc,char * argv[],const std::string & fnameC)40 static std::string GetFileName(int argc, char* argv[], const std::string& fnameC)
41 {
42   char* fileNameC = vtkTestUtilities::ExpandDataFileName(argc, argv, fnameC.c_str());
43   std::string fname(fileNameC);
44   delete[] fileNameC;
45   return fname;
46 }
47 
TestIOSSExodusParitionedFiles(int argc,char * argv[])48 int TestIOSSExodusParitionedFiles(int argc, char* argv[])
49 {
50 #if VTK_MODULE_ENABLE_VTK_ParallelMPI
51   vtkNew<vtkMPIController> contr;
52 #else
53   vtkNew<vtkDummyController> contr;
54 #endif
55   contr->Initialize(&argc, &argv);
56   vtkMultiProcessController::SetGlobalController(contr);
57 
58   const int myId = contr->GetLocalProcessId();
59   const int numProcs = contr->GetNumberOfProcesses();
60 
61   vtkNew<vtkIOSSReader> reader;
62   for (int cc = 0; cc < 4; ++cc)
63   {
64     auto fname =
65       GetFileName(argc, argv, std::string("Data/Exodus/can.e.4/can.e.4.") + std::to_string(cc));
66     reader->AddFileName(fname.c_str());
67   }
68 
69   // Let's read only 3 files.
70   reader->SetFileRange(0, 3);
71 
72   vtkNew<vtkProcessIdScalars> procIdScalars;
73   vtkNew<vtkDataSetSurfaceFilter> surface;
74   vtkNew<vtkCompositePolyDataMapper2> mapper;
75   vtkNew<vtkActor> actor;
76   vtkNew<vtkRenderWindow> renWin;
77   vtkNew<vtkRenderer> ren;
78 
79   procIdScalars->SetInputConnection(reader->GetOutputPort());
80   procIdScalars->SetScalarModeToCellData();
81   surface->SetInputConnection(procIdScalars->GetOutputPort());
82   mapper->SetInputConnection(surface->GetOutputPort());
83   mapper->SetPiece(myId);
84   mapper->SetNumberOfPieces(numProcs);
85   mapper->SetScalarModeToUseCellFieldData();
86   mapper->SetColorModeToMapScalars();
87   mapper->SelectColorArray("ProcessId");
88   mapper->SetScalarRange(0, numProcs - 1);
89 
90   // update mapper an get parallel bounds.
91   mapper->Update();
92   vtkBoundingBox bbox(mapper->GetBounds());
93   contr->AllReduce(bbox, bbox);
94   double bds[6];
95   bbox.GetBounds(bds);
96 
97   actor->SetMapper(mapper);
98   renWin->AddRenderer(ren);
99 
100   ren->AddActor(actor);
101   renWin->SetSize(300, 300);
102   auto cam = ren->GetActiveCamera();
103   cam->SetPosition(10., 10., 5.);
104   cam->SetViewUp(0., 0.4, 1.);
105   ren->ResetCamera(bds);
106   ren->ResetCameraClippingRange(bds);
107 
108   vtkNew<vtkSynchronizedRenderWindows> syncWindows;
109   syncWindows->SetRenderWindow(renWin);
110   syncWindows->SetParallelController(contr);
111   syncWindows->SetIdentifier(1);
112 
113   vtkNew<vtkCompositedSynchronizedRenderers> syncRenderers;
114   syncRenderers->SetRenderer(ren);
115   syncRenderers->SetParallelController(contr);
116 
117   int retVal = EXIT_FAILURE;
118   if (myId == 0)
119   {
120     vtkNew<vtkRenderWindowInteractor> iren;
121     iren->SetRenderWindow(renWin);
122     iren->Initialize();
123     retVal = vtkRegressionTestImage(renWin);
124     if (retVal == vtkRegressionTester::DO_INTERACTOR)
125     {
126       iren->Start();
127     }
128     contr->TriggerBreakRMIs();
129     contr->Broadcast(&retVal, 1, 0);
130   }
131   else
132   {
133     renWin->OffScreenRenderingOn();
134     contr->ProcessRMIs();
135     contr->Broadcast(&retVal, 1, 0);
136   }
137   vtkMultiProcessController::SetGlobalController(nullptr);
138   contr->Finalize();
139   return !retVal;
140 }
141