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