1 // -*- c++ -*-
2 /*=========================================================================
3 
4   Program:   Visualization Toolkit
5   Module:    PSLACReaderLinear.cxx
6 
7   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
8   All rights reserved.
9   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
10 
11      This software is distributed WITHOUT ANY WARRANTY; without even
12      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
13      PURPOSE.  See the above copyright notice for more information.
14 
15 =========================================================================*/
16 /*-------------------------------------------------------------------------
17   Copyright 2009 Sandia Corporation.
18   Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
19   the U.S. Government retains certain rights in this software.
20 -------------------------------------------------------------------------*/
21 
22 #include "vtkActor.h"
23 #include "vtkCamera.h"
24 #include "vtkCompositeDataGeometryFilter.h"
25 #include "vtkCompositeRenderManager.h"
26 #include "vtkLookupTable.h"
27 #include "vtkMPIController.h"
28 #include "vtkPLSDynaReader.h"
29 #include "vtkPolyDataMapper.h"
30 #include "vtkRegressionTestImage.h"
31 #include "vtkRenderWindow.h"
32 #include "vtkRenderWindowInteractor.h"
33 #include "vtkRenderer.h"
34 #include "vtkTestUtilities.h"
35 
36 #include "vtkNew.h"
37 #include "vtkSmartPointer.h"
38 
39 struct TestArgs
40 {
41   int* retval;
42   int argc;
43   char** argv;
44 };
45 
46 //=============================================================================
PLSDynaReader(vtkMultiProcessController * controller,void * _args)47 void PLSDynaReader(vtkMultiProcessController* controller, void* _args)
48 {
49   TestArgs* args = reinterpret_cast<TestArgs*>(_args);
50   int argc = args->argc;
51   char** argv = args->argv;
52   *(args->retval) = 1;
53 
54   // Set up reader.
55   vtkNew<vtkPLSDynaReader> reader;
56 
57   char* meshFileName =
58     vtkTestUtilities::ExpandDataFileName(argc, argv, "Data/LSDyna/hemi.draw/hemi_draw.d3plot");
59   reader->SetFileName(meshFileName);
60 
61   // Extract geometry that we can render.
62   vtkNew<vtkCompositeDataGeometryFilter> geometry;
63   geometry->SetInputConnection(reader->GetOutputPort());
64 
65   // Set up rendering stuff.
66   vtkNew<vtkPolyDataMapper> mapper;
67   mapper->SetInputConnection(geometry->GetOutputPort());
68   mapper->SetScalarModeToUsePointFieldData();
69 
70   vtkNew<vtkActor> actor;
71   actor->SetMapper(mapper);
72 
73   vtkNew<vtkCompositeRenderManager> prm;
74 
75   vtkSmartPointer<vtkRenderer> renderer;
76   renderer.TakeReference(prm->MakeRenderer());
77   renderer->AddActor(actor);
78 
79   vtkSmartPointer<vtkRenderWindow> renwin;
80   renwin.TakeReference(prm->MakeRenderWindow());
81   renwin->SetSize(300, 300);
82   renwin->SetPosition(0, 200 * controller->GetLocalProcessId());
83   renwin->AddRenderer(renderer);
84 
85   prm->SetRenderWindow(renwin);
86   prm->SetController(controller);
87   prm->InitializePieces();
88   prm->InitializeOffScreen(); // Mesa GL only
89 
90   if (controller->GetLocalProcessId() == 0)
91   {
92     renwin->Render();
93 
94     // Do the test comparison.
95     int retval = vtkRegressionTestImage(renwin);
96     if (retval == vtkRegressionTester::DO_INTERACTOR)
97     {
98       vtkNew<vtkRenderWindowInteractor> iren;
99       iren->SetRenderWindow(renwin);
100       iren->Initialize();
101       iren->Start();
102       retval = vtkRegressionTester::PASSED;
103     }
104 
105     *(args->retval) = (retval == vtkRegressionTester::PASSED) ? 0 : 1;
106 
107     prm->StopServices();
108   }
109   else // not root node
110   {
111     prm->StartServices();
112   }
113 
114   controller->Broadcast(args->retval, 1, 0);
115 }
116 
117 //=============================================================================
PLSDynaReader(int argc,char * argv[])118 int PLSDynaReader(int argc, char* argv[])
119 {
120   int retval = 1;
121 
122   vtkNew<vtkMPIController> controller;
123   controller->Initialize(&argc, &argv);
124 
125   vtkMultiProcessController::SetGlobalController(controller);
126 
127   TestArgs args;
128   args.retval = &retval;
129   args.argc = argc;
130   args.argv = argv;
131 
132   controller->SetSingleMethod(PLSDynaReader, &args);
133   controller->SingleMethodExecute();
134 
135   controller->Finalize();
136 
137   return retval;
138 }
139