xref: /phasta/phastaIO/vtkPPhastaReader.cxx (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen /*=========================================================================
2*59599516SKenneth E. Jansen 
3*59599516SKenneth E. Jansen   Program:   Visualization Toolkit
4*59599516SKenneth E. Jansen   Module:    $RCSfile: vtkPPhastaReader.cxx,v $
5*59599516SKenneth E. Jansen 
6*59599516SKenneth E. Jansen   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7*59599516SKenneth E. Jansen   All rights reserved.
8*59599516SKenneth E. Jansen   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9*59599516SKenneth E. Jansen 
10*59599516SKenneth E. Jansen      This software is distributed WITHOUT ANY WARRANTY; without even
11*59599516SKenneth E. Jansen      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12*59599516SKenneth E. Jansen      PURPOSE.  See the above copyright notice for more information.
13*59599516SKenneth E. Jansen 
14*59599516SKenneth E. Jansen =========================================================================*/
15*59599516SKenneth E. Jansen #include "vtkPPhastaReader.h"
16*59599516SKenneth E. Jansen 
17*59599516SKenneth E. Jansen #include "vtkCellData.h"
18*59599516SKenneth E. Jansen #include "vtkFieldData.h"
19*59599516SKenneth E. Jansen #include "vtkInformation.h"
20*59599516SKenneth E. Jansen #include "vtkInformationVector.h"
21*59599516SKenneth E. Jansen #include "vtkMultiBlockDataSet.h"
22*59599516SKenneth E. Jansen #include "vtkMultiPieceDataSet.h"
23*59599516SKenneth E. Jansen #include "vtkObjectFactory.h"
24*59599516SKenneth E. Jansen #include "vtkPointData.h"
25*59599516SKenneth E. Jansen #include "vtkPVXMLElement.h"
26*59599516SKenneth E. Jansen #include "vtkPVXMLParser.h"
27*59599516SKenneth E. Jansen #include "vtkPhastaReader.h"
28*59599516SKenneth E. Jansen #include "vtkSmartPointer.h"
29*59599516SKenneth E. Jansen #include "vtkStreamingDemandDrivenPipeline.h"
30*59599516SKenneth E. Jansen #include "vtkUnstructuredGrid.h"
31*59599516SKenneth E. Jansen 
32*59599516SKenneth E. Jansen #include <vtksys/SystemTools.hxx>
33*59599516SKenneth E. Jansen 
34*59599516SKenneth E. Jansen #include <vtkstd/map>
35*59599516SKenneth E. Jansen #include <vtksys/ios/sstream>
36*59599516SKenneth E. Jansen 
37*59599516SKenneth E. Jansen int NUM_PIECES;
38*59599516SKenneth E. Jansen int NUM_FILES;
39*59599516SKenneth E. Jansen int TIME_STEP;
40*59599516SKenneth E. Jansen char * FILE_PATH;
41*59599516SKenneth E. Jansen int PART_ID;
42*59599516SKenneth E. Jansen int FILE_ID;
43*59599516SKenneth E. Jansen 
44*59599516SKenneth E. Jansen double opentime_total = 0.0;
45*59599516SKenneth E. Jansen 
46*59599516SKenneth E. Jansen /*
47*59599516SKenneth E. Jansen  * Modified part is dealing with new phasta data format
48*59599516SKenneth E. Jansen  * SyncIO and rbIO library, contact liun2@cs.rpi.edu
49*59599516SKenneth E. Jansen  *
50*59599516SKenneth E. Jansen  *               ------ Ning Liu
51*59599516SKenneth E. Jansen  *               ------ Sept. 2010
52*59599516SKenneth E. Jansen  */
53*59599516SKenneth E. Jansen 
54*59599516SKenneth E. Jansen struct vtkPPhastaReaderInternal
55*59599516SKenneth E. Jansen {
56*59599516SKenneth E. Jansen   struct TimeStepInfo
57*59599516SKenneth E. Jansen   {
58*59599516SKenneth E. Jansen     int GeomIndex;
59*59599516SKenneth E. Jansen     int FieldIndex;
60*59599516SKenneth E. Jansen     double TimeValue;
61*59599516SKenneth E. Jansen 
TimeStepInfovtkPPhastaReaderInternal::TimeStepInfo62*59599516SKenneth E. Jansen     TimeStepInfo() : GeomIndex(-1), FieldIndex(-1), TimeValue(0.0)
63*59599516SKenneth E. Jansen       {
64*59599516SKenneth E. Jansen       }
65*59599516SKenneth E. Jansen   };
66*59599516SKenneth E. Jansen 
67*59599516SKenneth E. Jansen   typedef vtkstd::map<int, TimeStepInfo> TimeStepInfoMapType;
68*59599516SKenneth E. Jansen   TimeStepInfoMapType TimeStepInfoMap;
69*59599516SKenneth E. Jansen   typedef vtkstd::map<int, vtkSmartPointer<vtkUnstructuredGrid> >
70*59599516SKenneth E. Jansen   CachedGridsMapType;
71*59599516SKenneth E. Jansen   CachedGridsMapType CachedGrids;
72*59599516SKenneth E. Jansen };
73*59599516SKenneth E. Jansen 
74*59599516SKenneth E. Jansen //----------------------------------------------------------------------------
75*59599516SKenneth E. Jansen vtkCxxRevisionMacro(vtkPPhastaReader, "$Revision: 1.6 $");
76*59599516SKenneth E. Jansen vtkStandardNewMacro(vtkPPhastaReader);
77*59599516SKenneth E. Jansen 
78*59599516SKenneth E. Jansen //----------------------------------------------------------------------------
vtkPPhastaReader()79*59599516SKenneth E. Jansen vtkPPhastaReader::vtkPPhastaReader()
80*59599516SKenneth E. Jansen {
81*59599516SKenneth E. Jansen   //this->DebugOn(); // comment out this line when in production
82*59599516SKenneth E. Jansen   this->FileName = 0;
83*59599516SKenneth E. Jansen 
84*59599516SKenneth E. Jansen   this->TimeStepIndex = 0;
85*59599516SKenneth E. Jansen   this->ActualTimeStep = 0;
86*59599516SKenneth E. Jansen 
87*59599516SKenneth E. Jansen   this->Reader = vtkPhastaReader::New();
88*59599516SKenneth E. Jansen 
89*59599516SKenneth E. Jansen   this->SetNumberOfInputPorts(0);
90*59599516SKenneth E. Jansen 
91*59599516SKenneth E. Jansen   this->Parser = 0;
92*59599516SKenneth E. Jansen 
93*59599516SKenneth E. Jansen   this->Internal = new vtkPPhastaReaderInternal;
94*59599516SKenneth E. Jansen 
95*59599516SKenneth E. Jansen   this->TimeStepRange[0] = 0;
96*59599516SKenneth E. Jansen   this->TimeStepRange[1] = 0;
97*59599516SKenneth E. Jansen }
98*59599516SKenneth E. Jansen 
99*59599516SKenneth E. Jansen //----------------------------------------------------------------------------
~vtkPPhastaReader()100*59599516SKenneth E. Jansen vtkPPhastaReader::~vtkPPhastaReader()
101*59599516SKenneth E. Jansen {
102*59599516SKenneth E. Jansen   this->Reader->Delete();
103*59599516SKenneth E. Jansen   this->SetFileName(0);
104*59599516SKenneth E. Jansen 
105*59599516SKenneth E. Jansen   if (this->Parser)
106*59599516SKenneth E. Jansen     {
107*59599516SKenneth E. Jansen     this->Parser->Delete();
108*59599516SKenneth E. Jansen     }
109*59599516SKenneth E. Jansen 
110*59599516SKenneth E. Jansen   delete this->Internal;
111*59599516SKenneth E. Jansen }
112*59599516SKenneth E. Jansen 
113*59599516SKenneth E. Jansen //----------------------------------------------------------------------------
RequestData(vtkInformation *,vtkInformationVector **,vtkInformationVector * outputVector)114*59599516SKenneth E. Jansen int vtkPPhastaReader::RequestData(vtkInformation*,
115*59599516SKenneth E. Jansen                                   vtkInformationVector**,
116*59599516SKenneth E. Jansen                                   vtkInformationVector* outputVector)
117*59599516SKenneth E. Jansen {
118*59599516SKenneth E. Jansen   vtkDebugMacro("Entering PP RequestData()\n");
119*59599516SKenneth E. Jansen   // get the data object
120*59599516SKenneth E. Jansen   vtkInformation *outInfo =
121*59599516SKenneth E. Jansen     outputVector->GetInformationObject(0);
122*59599516SKenneth E. Jansen 
123*59599516SKenneth E. Jansen   this->ActualTimeStep = this->TimeStepIndex;
124*59599516SKenneth E. Jansen 
125*59599516SKenneth E. Jansen   int tsLength =
126*59599516SKenneth E. Jansen     outInfo->Length(vtkStreamingDemandDrivenPipeline::TIME_STEPS());
127*59599516SKenneth E. Jansen   double* steps =
128*59599516SKenneth E. Jansen     outInfo->Get(vtkStreamingDemandDrivenPipeline::TIME_STEPS());
129*59599516SKenneth E. Jansen 
130*59599516SKenneth E. Jansen   // Check if a particular time was requested.
131*59599516SKenneth E. Jansen   if(outInfo->Has(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEPS()))
132*59599516SKenneth E. Jansen     {
133*59599516SKenneth E. Jansen     // Get the requested time step. We only supprt requests of a single time
134*59599516SKenneth E. Jansen     // step in this reader right now
135*59599516SKenneth E. Jansen     double *requestedTimeSteps =
136*59599516SKenneth E. Jansen       outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEPS());
137*59599516SKenneth E. Jansen     double timeValue = requestedTimeSteps[0];
138*59599516SKenneth E. Jansen 
139*59599516SKenneth E. Jansen     // find the first time value larger than requested time value
140*59599516SKenneth E. Jansen     // this logic could be improved
141*59599516SKenneth E. Jansen     int cnt = 0;
142*59599516SKenneth E. Jansen     while (cnt < tsLength-1 && steps[cnt] < timeValue)
143*59599516SKenneth E. Jansen       {
144*59599516SKenneth E. Jansen       cnt++;
145*59599516SKenneth E. Jansen       }
146*59599516SKenneth E. Jansen     this->ActualTimeStep = cnt;
147*59599516SKenneth E. Jansen     }
148*59599516SKenneth E. Jansen 
149*59599516SKenneth E. Jansen   if (this->ActualTimeStep > this->TimeStepRange[1])
150*59599516SKenneth E. Jansen     {
151*59599516SKenneth E. Jansen     vtkErrorMacro("Timestep index too large.");
152*59599516SKenneth E. Jansen     return 0;
153*59599516SKenneth E. Jansen     }
154*59599516SKenneth E. Jansen 
155*59599516SKenneth E. Jansen   // get the current piece being requested
156*59599516SKenneth E. Jansen   int piece =
157*59599516SKenneth E. Jansen     outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_PIECE_NUMBER());
158*59599516SKenneth E. Jansen 
159*59599516SKenneth E. Jansen   int numProcPieces =
160*59599516SKenneth E. Jansen     outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_PIECES());
161*59599516SKenneth E. Jansen 
162*59599516SKenneth E. Jansen   // this is actually # of proc
163*59599516SKenneth E. Jansen   vtkDebugMacro(<<"numProcPieces (i.e. # of proc) = "<< numProcPieces);
164*59599516SKenneth E. Jansen 
165*59599516SKenneth E. Jansen   if (!this->Parser)
166*59599516SKenneth E. Jansen     {
167*59599516SKenneth E. Jansen     vtkErrorMacro("No parser was created. Cannot read file");
168*59599516SKenneth E. Jansen     return 0;
169*59599516SKenneth E. Jansen     }
170*59599516SKenneth E. Jansen 
171*59599516SKenneth E. Jansen   vtkPVXMLElement* rootElement = this->Parser->GetRootElement();
172*59599516SKenneth E. Jansen 
173*59599516SKenneth E. Jansen   int numPieces;
174*59599516SKenneth E. Jansen   int numFiles, timeStep;
175*59599516SKenneth E. Jansen   if (!rootElement->GetScalarAttribute("number_of_pieces", &numPieces))
176*59599516SKenneth E. Jansen     {
177*59599516SKenneth E. Jansen     numPieces = 1;
178*59599516SKenneth E. Jansen     }
179*59599516SKenneth E. Jansen 
180*59599516SKenneth E. Jansen   if (!rootElement->GetScalarAttribute("number_of_files", &numFiles))
181*59599516SKenneth E. Jansen     {
182*59599516SKenneth E. Jansen     numFiles = 1;
183*59599516SKenneth E. Jansen     }
184*59599516SKenneth E. Jansen 
185*59599516SKenneth E. Jansen   NUM_PIECES=numPieces;
186*59599516SKenneth E. Jansen   NUM_FILES=numFiles;
187*59599516SKenneth E. Jansen 
188*59599516SKenneth E. Jansen   vtkDebugMacro(<<"NEW PHT Parameter: number_of_files = "<< numFiles );
189*59599516SKenneth E. Jansen 
190*59599516SKenneth E. Jansen   vtkMultiBlockDataSet *output = vtkMultiBlockDataSet::SafeDownCast(
191*59599516SKenneth E. Jansen     outInfo->Get(vtkDataObject::DATA_OBJECT()));
192*59599516SKenneth E. Jansen   output->SetNumberOfBlocks(1);
193*59599516SKenneth E. Jansen   vtkMultiPieceDataSet* MultiPieceDataSet = vtkMultiPieceDataSet::New();
194*59599516SKenneth E. Jansen   // the following line was deleted in Ning's version
195*59599516SKenneth E. Jansen   MultiPieceDataSet->SetNumberOfPieces(numPieces);
196*59599516SKenneth E. Jansen   output->SetBlock(0, MultiPieceDataSet);
197*59599516SKenneth E. Jansen   MultiPieceDataSet->Delete();
198*59599516SKenneth E. Jansen 
199*59599516SKenneth E. Jansen   const char* geometryPattern = 0;
200*59599516SKenneth E. Jansen   int geomHasPiece = 0;
201*59599516SKenneth E. Jansen   int geomHasTime = 0;
202*59599516SKenneth E. Jansen   const char* fieldPattern = 0;
203*59599516SKenneth E. Jansen   int fieldHasPiece = 0;
204*59599516SKenneth E. Jansen   int fieldHasTime = 0;
205*59599516SKenneth E. Jansen 
206*59599516SKenneth E. Jansen   unsigned int numElements = rootElement->GetNumberOfNestedElements();
207*59599516SKenneth E. Jansen   for (unsigned int i=0; i<numElements; i++)
208*59599516SKenneth E. Jansen     {
209*59599516SKenneth E. Jansen     vtkPVXMLElement* nested = rootElement->GetNestedElement(i);
210*59599516SKenneth E. Jansen 
211*59599516SKenneth E. Jansen     if (strcmp("GeometryFileNamePattern", nested->GetName()) == 0)
212*59599516SKenneth E. Jansen       {
213*59599516SKenneth E. Jansen       geometryPattern = nested->GetAttribute("pattern");
214*59599516SKenneth E. Jansen       if (!nested->GetScalarAttribute("has_piece_entry", &geomHasPiece))
215*59599516SKenneth E. Jansen         {
216*59599516SKenneth E. Jansen         geomHasPiece = 0;
217*59599516SKenneth E. Jansen         }
218*59599516SKenneth E. Jansen       if (!nested->GetScalarAttribute("has_time_entry", &geomHasTime))
219*59599516SKenneth E. Jansen         {
220*59599516SKenneth E. Jansen         geomHasTime = 0;
221*59599516SKenneth E. Jansen         }
222*59599516SKenneth E. Jansen       }
223*59599516SKenneth E. Jansen 
224*59599516SKenneth E. Jansen     if (strcmp("FieldFileNamePattern", nested->GetName()) == 0)
225*59599516SKenneth E. Jansen       {
226*59599516SKenneth E. Jansen       fieldPattern = nested->GetAttribute("pattern");
227*59599516SKenneth E. Jansen       if (!nested->GetScalarAttribute("has_piece_entry", &fieldHasPiece))
228*59599516SKenneth E. Jansen         {
229*59599516SKenneth E. Jansen         fieldHasPiece = 0;
230*59599516SKenneth E. Jansen         }
231*59599516SKenneth E. Jansen       if (!nested->GetScalarAttribute("has_time_entry", &fieldHasTime))
232*59599516SKenneth E. Jansen         {
233*59599516SKenneth E. Jansen         fieldHasTime = 0;
234*59599516SKenneth E. Jansen         }
235*59599516SKenneth E. Jansen       }
236*59599516SKenneth E. Jansen     }
237*59599516SKenneth E. Jansen 
238*59599516SKenneth E. Jansen   if (!geometryPattern)
239*59599516SKenneth E. Jansen     {
240*59599516SKenneth E. Jansen     vtkErrorMacro("No geometry pattern was specified. Cannot load file");
241*59599516SKenneth E. Jansen     return 0;
242*59599516SKenneth E. Jansen     }
243*59599516SKenneth E. Jansen 
244*59599516SKenneth E. Jansen   if (!fieldPattern)
245*59599516SKenneth E. Jansen     {
246*59599516SKenneth E. Jansen     vtkErrorMacro("No field pattern was specified. Cannot load file");
247*59599516SKenneth E. Jansen     return 0;
248*59599516SKenneth E. Jansen     }
249*59599516SKenneth E. Jansen 
250*59599516SKenneth E. Jansen   char* geom_name = new char [ strlen(geometryPattern) + 60 ];
251*59599516SKenneth E. Jansen   char* field_name = new char [ strlen(fieldPattern) + 60 ];
252*59599516SKenneth E. Jansen 
253*59599516SKenneth E. Jansen   //////////////////////
254*59599516SKenneth E. Jansen   int numPiecesPerFile = numPieces/numFiles;
255*59599516SKenneth E. Jansen   //////////////////////
256*59599516SKenneth E. Jansen 
257*59599516SKenneth E. Jansen   // now loop over all of the files that I should load
258*59599516SKenneth E. Jansen   for(int loadingPiece=piece;loadingPiece<numPieces;loadingPiece+=numProcPieces)
259*59599516SKenneth E. Jansen     {
260*59599516SKenneth E. Jansen       TIME_STEP=this->Internal->TimeStepInfoMap[this->ActualTimeStep].FieldIndex;
261*59599516SKenneth E. Jansen       FILE_ID = int(loadingPiece/numPiecesPerFile)+1; // this will be passed to PhastaReader by extern...
262*59599516SKenneth E. Jansen       PART_ID = loadingPiece+1;
263*59599516SKenneth E. Jansen 
264*59599516SKenneth E. Jansen       vtkDebugMacro(<<"PP In loop, piece="<< piece <<", loadingPiece+1="<< loadingPiece +1 << ", numPieces="<<numPieces<<", FILE_ID=" << FILE_ID<<", numProcPieces=" << numProcPieces);
265*59599516SKenneth E. Jansen 
266*59599516SKenneth E. Jansen     if (geomHasTime && geomHasPiece)
267*59599516SKenneth E. Jansen       {
268*59599516SKenneth E. Jansen       sprintf(geom_name,
269*59599516SKenneth E. Jansen               geometryPattern,
270*59599516SKenneth E. Jansen               this->Internal->TimeStepInfoMap[this->ActualTimeStep].GeomIndex,
271*59599516SKenneth E. Jansen               FILE_ID);
272*59599516SKenneth E. Jansen       }
273*59599516SKenneth E. Jansen     else if (geomHasPiece)
274*59599516SKenneth E. Jansen       {
275*59599516SKenneth E. Jansen         sprintf(geom_name, geometryPattern, FILE_ID);
276*59599516SKenneth E. Jansen       }
277*59599516SKenneth E. Jansen     else if (geomHasTime)
278*59599516SKenneth E. Jansen       {
279*59599516SKenneth E. Jansen       sprintf(geom_name,
280*59599516SKenneth E. Jansen               geometryPattern,
281*59599516SKenneth E. Jansen               this->Internal->TimeStepInfoMap[this->ActualTimeStep].GeomIndex);
282*59599516SKenneth E. Jansen       }
283*59599516SKenneth E. Jansen     else
284*59599516SKenneth E. Jansen       {
285*59599516SKenneth E. Jansen       strcpy(geom_name, geometryPattern);
286*59599516SKenneth E. Jansen       }
287*59599516SKenneth E. Jansen 
288*59599516SKenneth E. Jansen     if (fieldHasTime && fieldHasPiece)
289*59599516SKenneth E. Jansen       {
290*59599516SKenneth E. Jansen       sprintf(field_name,
291*59599516SKenneth E. Jansen               fieldPattern,
292*59599516SKenneth E. Jansen               this->Internal->TimeStepInfoMap[this->ActualTimeStep].FieldIndex,
293*59599516SKenneth E. Jansen   //          FILE_ID); // don't use file id, otherwise dup geom and field file id will make PhastaReader not update -- jingfu
294*59599516SKenneth E. Jansen               loadingPiece+1);
295*59599516SKenneth E. Jansen       }
296*59599516SKenneth E. Jansen     else if (fieldHasPiece)
297*59599516SKenneth E. Jansen       {
298*59599516SKenneth E. Jansen       sprintf(field_name, fieldPattern, loadingPiece+1);
299*59599516SKenneth E. Jansen   //FILE_ID);
300*59599516SKenneth E. Jansen       }
301*59599516SKenneth E. Jansen     else if (fieldHasTime)
302*59599516SKenneth E. Jansen       {
303*59599516SKenneth E. Jansen       sprintf(field_name,
304*59599516SKenneth E. Jansen               fieldPattern,
305*59599516SKenneth E. Jansen               this->Internal->TimeStepInfoMap[this->ActualTimeStep].FieldIndex);
306*59599516SKenneth E. Jansen       }
307*59599516SKenneth E. Jansen     else
308*59599516SKenneth E. Jansen       {
309*59599516SKenneth E. Jansen       strcpy(geom_name, fieldPattern);
310*59599516SKenneth E. Jansen       }
311*59599516SKenneth E. Jansen 
312*59599516SKenneth E. Jansen     vtksys_ios::ostringstream geomFName;
313*59599516SKenneth E. Jansen     vtkstd::string gpath = vtksys::SystemTools::GetFilenamePath(geom_name);
314*59599516SKenneth E. Jansen     if (gpath.empty() || !vtksys::SystemTools::FileIsFullPath(gpath.c_str()))
315*59599516SKenneth E. Jansen       {
316*59599516SKenneth E. Jansen       vtkstd::string path = vtksys::SystemTools::GetFilenamePath(this->FileName);
317*59599516SKenneth E. Jansen       if (!path.empty())
318*59599516SKenneth E. Jansen         {
319*59599516SKenneth E. Jansen         geomFName << path.c_str() << "/";
320*59599516SKenneth E. Jansen         }
321*59599516SKenneth E. Jansen       }
322*59599516SKenneth E. Jansen     geomFName << geom_name << ends;
323*59599516SKenneth E. Jansen     this->Reader->SetGeometryFileName(geomFName.str().c_str());
324*59599516SKenneth E. Jansen 
325*59599516SKenneth E. Jansen     vtksys_ios::ostringstream fieldFName;
326*59599516SKenneth E. Jansen     // try to strip out the path of file, if it's a full path file name
327*59599516SKenneth E. Jansen     vtkstd::string fpath = vtksys::SystemTools::GetFilenamePath(field_name);
328*59599516SKenneth E. Jansen 
329*59599516SKenneth E. Jansen     ///////////////////////////////////////////
330*59599516SKenneth E. Jansen     FILE_PATH = new char[fpath.size()+1];
331*59599516SKenneth E. Jansen     strcpy(FILE_PATH,fpath.c_str());
332*59599516SKenneth E. Jansen     ///////////////////////////////////////////
333*59599516SKenneth E. Jansen 
334*59599516SKenneth E. Jansen     if (fpath.empty() || !vtksys::SystemTools::FileIsFullPath(fpath.c_str()))
335*59599516SKenneth E. Jansen       {
336*59599516SKenneth E. Jansen       vtkstd::string path = vtksys::SystemTools::GetFilenamePath(this->FileName); // FileName is the .pht file
337*59599516SKenneth E. Jansen       if (!path.empty())
338*59599516SKenneth E. Jansen         {
339*59599516SKenneth E. Jansen           /////////////////////////////////////////
340*59599516SKenneth E. Jansen           delete [] FILE_PATH;
341*59599516SKenneth E. Jansen           FILE_PATH = new char[path.size()+1];
342*59599516SKenneth E. Jansen           strcpy(FILE_PATH,path.c_str());
343*59599516SKenneth E. Jansen           /////////////////////////////////////////
344*59599516SKenneth E. Jansen           fieldFName << path.c_str() << "/";
345*59599516SKenneth E. Jansen           //std::cout << "something might be wrong here, string path=" << path << ", fieldFName=" << fieldFName<< std::endl;
346*59599516SKenneth E. Jansen         }
347*59599516SKenneth E. Jansen       }
348*59599516SKenneth E. Jansen     fieldFName << field_name << ends;
349*59599516SKenneth E. Jansen     this->Reader->SetFieldFileName(fieldFName.str().c_str());
350*59599516SKenneth E. Jansen 
351*59599516SKenneth E. Jansen     vtkPPhastaReaderInternal::CachedGridsMapType::iterator CachedCopy =
352*59599516SKenneth E. Jansen       this->Internal->CachedGrids.find(loadingPiece);
353*59599516SKenneth E. Jansen 
354*59599516SKenneth E. Jansen     // the following "if" was commented out in previous new version (tweaked by Ning)
355*59599516SKenneth E. Jansen     // if there is a cached copy, use that
356*59599516SKenneth E. Jansen     /*
357*59599516SKenneth E. Jansen     if(CachedCopy != this->Internal->CachedGrids.end())
358*59599516SKenneth E. Jansen       {
359*59599516SKenneth E. Jansen       this->Reader->SetCachedGrid(CachedCopy->second);
360*59599516SKenneth E. Jansen       printf("should use cached copy but can't compile\n");
361*59599516SKenneth E. Jansen       }
362*59599516SKenneth E. Jansen       */
363*59599516SKenneth E. Jansen 
364*59599516SKenneth E. Jansen     // In order to register etc, Reader need a new executative in every
365*59599516SKenneth E. Jansen     // update call, otherwise it doesn't do anything
366*59599516SKenneth E. Jansen     this->Reader->Update();
367*59599516SKenneth E. Jansen     // the following "if" was commented out in previous new version (tweaked by Ning)
368*59599516SKenneth E. Jansen 
369*59599516SKenneth E. Jansen     /*
370*59599516SKenneth E. Jansen     if(CachedCopy == this->Internal->CachedGrids.end())
371*59599516SKenneth E. Jansen       {
372*59599516SKenneth E. Jansen       vtkSmartPointer<vtkUnstructuredGrid> cached =
373*59599516SKenneth E. Jansen         vtkSmartPointer<vtkUnstructuredGrid>::New();
374*59599516SKenneth E. Jansen       cached->ShallowCopy(this->Reader->GetOutput());
375*59599516SKenneth E. Jansen       cached->GetPointData()->Initialize();
376*59599516SKenneth E. Jansen       cached->GetCellData()->Initialize();
377*59599516SKenneth E. Jansen       cached->GetFieldData()->Initialize();
378*59599516SKenneth E. Jansen       this->Internal->CachedGrids[loadingPiece] = cached;
379*59599516SKenneth E. Jansen       }
380*59599516SKenneth E. Jansen       */
381*59599516SKenneth E. Jansen 
382*59599516SKenneth E. Jansen     vtkSmartPointer<vtkUnstructuredGrid> copy =
383*59599516SKenneth E. Jansen       vtkSmartPointer<vtkUnstructuredGrid>::New();
384*59599516SKenneth E. Jansen     copy->ShallowCopy(this->Reader->GetOutput());
385*59599516SKenneth E. Jansen     MultiPieceDataSet->SetPiece(loadingPiece, copy);
386*59599516SKenneth E. Jansen     //MultiPieceDataSet->SetPiece(MultiPieceDataSet->GetNumberOfPieces(),copy); // Ning's version
387*59599516SKenneth E. Jansen     }
388*59599516SKenneth E. Jansen 
389*59599516SKenneth E. Jansen   delete [] FILE_PATH;
390*59599516SKenneth E. Jansen   delete [] geom_name;
391*59599516SKenneth E. Jansen   delete [] field_name;
392*59599516SKenneth E. Jansen 
393*59599516SKenneth E. Jansen   if (steps)
394*59599516SKenneth E. Jansen     {
395*59599516SKenneth E. Jansen     output->GetInformation()->Set(vtkDataObject::DATA_TIME_STEPS(),
396*59599516SKenneth E. Jansen                                   steps+this->ActualTimeStep, 1);
397*59599516SKenneth E. Jansen     }
398*59599516SKenneth E. Jansen 
399*59599516SKenneth E. Jansen   vtkDebugMacro("End of PP RequestData()\n, total open time is " << opentime_total);
400*59599516SKenneth E. Jansen   // if it's not too many printf, print it out
401*59599516SKenneth E. Jansen   if( numProcPieces < 16) printf("total open time for sync-io is %lf (nf=%d, np=%d)\n", opentime_total, numFiles, numProcPieces);
402*59599516SKenneth E. Jansen 
403*59599516SKenneth E. Jansen   return 1;
404*59599516SKenneth E. Jansen }
405*59599516SKenneth E. Jansen 
406*59599516SKenneth E. Jansen //----------------------------------------------------------------------------
RequestInformation(vtkInformation *,vtkInformationVector **,vtkInformationVector * outputVector)407*59599516SKenneth E. Jansen int vtkPPhastaReader::RequestInformation(vtkInformation*,
408*59599516SKenneth E. Jansen                                        vtkInformationVector**,
409*59599516SKenneth E. Jansen                                        vtkInformationVector* outputVector)
410*59599516SKenneth E. Jansen {
411*59599516SKenneth E. Jansen   vtkDebugMacro(<<"In PP requestInformation() -- nothing modified in this func\n");
412*59599516SKenneth E. Jansen   this->Internal->TimeStepInfoMap.clear();
413*59599516SKenneth E. Jansen   this->Reader->ClearFieldInfo();
414*59599516SKenneth E. Jansen 
415*59599516SKenneth E. Jansen   vtkInformation *outInfo =
416*59599516SKenneth E. Jansen     outputVector->GetInformationObject(0);
417*59599516SKenneth E. Jansen 
418*59599516SKenneth E. Jansen   if (!this->FileName)
419*59599516SKenneth E. Jansen     {
420*59599516SKenneth E. Jansen     vtkErrorMacro("FileName has to be specified.");
421*59599516SKenneth E. Jansen     return 0;
422*59599516SKenneth E. Jansen     }
423*59599516SKenneth E. Jansen 
424*59599516SKenneth E. Jansen   if (this->Parser)
425*59599516SKenneth E. Jansen     {
426*59599516SKenneth E. Jansen     this->Parser->Delete();
427*59599516SKenneth E. Jansen     this->Parser = 0;
428*59599516SKenneth E. Jansen     }
429*59599516SKenneth E. Jansen 
430*59599516SKenneth E. Jansen   vtkSmartPointer<vtkPVXMLParser> parser =
431*59599516SKenneth E. Jansen     vtkSmartPointer<vtkPVXMLParser>::New();
432*59599516SKenneth E. Jansen 
433*59599516SKenneth E. Jansen   parser->SetFileName(this->FileName);
434*59599516SKenneth E. Jansen   if (!parser->Parse())
435*59599516SKenneth E. Jansen     {
436*59599516SKenneth E. Jansen     return 0;
437*59599516SKenneth E. Jansen     }
438*59599516SKenneth E. Jansen 
439*59599516SKenneth E. Jansen   vtkPVXMLElement* rootElement = parser->GetRootElement();
440*59599516SKenneth E. Jansen   if (!rootElement)
441*59599516SKenneth E. Jansen     {
442*59599516SKenneth E. Jansen     vtkErrorMacro("Cannot parse file.");
443*59599516SKenneth E. Jansen     return 0;
444*59599516SKenneth E. Jansen     }
445*59599516SKenneth E. Jansen 
446*59599516SKenneth E. Jansen   if (strcmp(rootElement->GetName(), "PhastaMetaFile") != 0)
447*59599516SKenneth E. Jansen     {
448*59599516SKenneth E. Jansen     vtkErrorMacro("This is not a phasta metafile.");
449*59599516SKenneth E. Jansen     return 0;
450*59599516SKenneth E. Jansen     }
451*59599516SKenneth E. Jansen 
452*59599516SKenneth E. Jansen   this->Parser = parser;
453*59599516SKenneth E. Jansen   parser->Register(this);
454*59599516SKenneth E. Jansen 
455*59599516SKenneth E. Jansen   int numTimeSteps=1;
456*59599516SKenneth E. Jansen   int hasTimeValues = 0;
457*59599516SKenneth E. Jansen 
458*59599516SKenneth E. Jansen   unsigned int numElements = rootElement->GetNumberOfNestedElements();
459*59599516SKenneth E. Jansen   for (unsigned int i=0; i<numElements; i++)
460*59599516SKenneth E. Jansen     {
461*59599516SKenneth E. Jansen     vtkPVXMLElement* nested = rootElement->GetNestedElement(i);
462*59599516SKenneth E. Jansen     if (strcmp("TimeSteps", nested->GetName()) == 0)
463*59599516SKenneth E. Jansen       {
464*59599516SKenneth E. Jansen       if (!nested->GetScalarAttribute("number_of_steps", &numTimeSteps))
465*59599516SKenneth E. Jansen         {
466*59599516SKenneth E. Jansen         numTimeSteps = 1;
467*59599516SKenneth E. Jansen         }
468*59599516SKenneth E. Jansen       int autoGen;
469*59599516SKenneth E. Jansen       int indexIncr;
470*59599516SKenneth E. Jansen       int startIndex;
471*59599516SKenneth E. Jansen       if (!nested->GetScalarAttribute("auto_generate_indices", &autoGen))
472*59599516SKenneth E. Jansen         {
473*59599516SKenneth E. Jansen         autoGen = 0;
474*59599516SKenneth E. Jansen         }
475*59599516SKenneth E. Jansen       if (!nested->GetScalarAttribute("increment_index_by", &indexIncr))
476*59599516SKenneth E. Jansen         {
477*59599516SKenneth E. Jansen         indexIncr = 1;
478*59599516SKenneth E. Jansen         }
479*59599516SKenneth E. Jansen       if (!nested->GetScalarAttribute("start_index", &startIndex))
480*59599516SKenneth E. Jansen         {
481*59599516SKenneth E. Jansen         startIndex = 0;
482*59599516SKenneth E. Jansen         }
483*59599516SKenneth E. Jansen       double startValue = 0.;
484*59599516SKenneth E. Jansen       double valueIncr = 1.*indexIncr;
485*59599516SKenneth E. Jansen       if (nested->GetScalarAttribute("start_value", &startValue))
486*59599516SKenneth E. Jansen         {
487*59599516SKenneth E. Jansen         hasTimeValues = 1;
488*59599516SKenneth E. Jansen         }
489*59599516SKenneth E. Jansen       if (nested->GetScalarAttribute("increment_value_by", &valueIncr))
490*59599516SKenneth E. Jansen         {
491*59599516SKenneth E. Jansen         hasTimeValues = 1;
492*59599516SKenneth E. Jansen         }
493*59599516SKenneth E. Jansen       if (autoGen)
494*59599516SKenneth E. Jansen         {
495*59599516SKenneth E. Jansen         for (int j=0; j<numTimeSteps; j++)
496*59599516SKenneth E. Jansen           {
497*59599516SKenneth E. Jansen           vtkPPhastaReaderInternal::TimeStepInfo& info =
498*59599516SKenneth E. Jansen             this->Internal->TimeStepInfoMap[j];
499*59599516SKenneth E. Jansen           info.GeomIndex = startIndex;
500*59599516SKenneth E. Jansen           info.FieldIndex = startIndex;
501*59599516SKenneth E. Jansen           info.TimeValue = startValue;
502*59599516SKenneth E. Jansen           startIndex += indexIncr;
503*59599516SKenneth E. Jansen           startValue += valueIncr;
504*59599516SKenneth E. Jansen           }
505*59599516SKenneth E. Jansen         }
506*59599516SKenneth E. Jansen 
507*59599516SKenneth E. Jansen       unsigned int numElements2 = nested->GetNumberOfNestedElements();
508*59599516SKenneth E. Jansen       for (unsigned int j=0; j<numElements2; j++)
509*59599516SKenneth E. Jansen         {
510*59599516SKenneth E. Jansen         vtkPVXMLElement* nested2 = nested->GetNestedElement(j);
511*59599516SKenneth E. Jansen         if (strcmp("TimeStep", nested2->GetName()) == 0)
512*59599516SKenneth E. Jansen           {
513*59599516SKenneth E. Jansen           int index;
514*59599516SKenneth E. Jansen           if (nested2->GetScalarAttribute("index", &index))
515*59599516SKenneth E. Jansen             {
516*59599516SKenneth E. Jansen             if ( (index+1) > numTimeSteps )
517*59599516SKenneth E. Jansen               {
518*59599516SKenneth E. Jansen               numTimeSteps = index+1;
519*59599516SKenneth E. Jansen               }
520*59599516SKenneth E. Jansen             vtkPPhastaReaderInternal::TimeStepInfo& info =
521*59599516SKenneth E. Jansen               this->Internal->TimeStepInfoMap[index];
522*59599516SKenneth E. Jansen             int gIdx;
523*59599516SKenneth E. Jansen             if (nested2->GetScalarAttribute("geometry_index",
524*59599516SKenneth E. Jansen                                              &gIdx))
525*59599516SKenneth E. Jansen               {
526*59599516SKenneth E. Jansen               info.GeomIndex = gIdx;
527*59599516SKenneth E. Jansen               }
528*59599516SKenneth E. Jansen             int fIdx;
529*59599516SKenneth E. Jansen             if (nested2->GetScalarAttribute("field_index",
530*59599516SKenneth E. Jansen                                              &fIdx))
531*59599516SKenneth E. Jansen               {
532*59599516SKenneth E. Jansen               info.FieldIndex = fIdx;
533*59599516SKenneth E. Jansen               }
534*59599516SKenneth E. Jansen             double val;
535*59599516SKenneth E. Jansen             if (nested2->GetScalarAttribute("value",
536*59599516SKenneth E. Jansen                                             &val))
537*59599516SKenneth E. Jansen               {
538*59599516SKenneth E. Jansen               info.TimeValue = val;
539*59599516SKenneth E. Jansen               hasTimeValues = 1;
540*59599516SKenneth E. Jansen               }
541*59599516SKenneth E. Jansen             }
542*59599516SKenneth E. Jansen           }
543*59599516SKenneth E. Jansen         }
544*59599516SKenneth E. Jansen       break;
545*59599516SKenneth E. Jansen       }
546*59599516SKenneth E. Jansen     }
547*59599516SKenneth E. Jansen 
548*59599516SKenneth E. Jansen   int numberOfFields=0, numberOfFields2=0;
549*59599516SKenneth E. Jansen   for (unsigned int i=0; i<numElements; i++)
550*59599516SKenneth E. Jansen     {
551*59599516SKenneth E. Jansen     vtkPVXMLElement* nested = rootElement->GetNestedElement(i);
552*59599516SKenneth E. Jansen     if (strcmp("Fields", nested->GetName()) == 0)
553*59599516SKenneth E. Jansen       {
554*59599516SKenneth E. Jansen       if (!nested->GetScalarAttribute("number_of_fields", &numberOfFields))
555*59599516SKenneth E. Jansen         {
556*59599516SKenneth E. Jansen         numberOfFields = 1;
557*59599516SKenneth E. Jansen         }
558*59599516SKenneth E. Jansen 
559*59599516SKenneth E. Jansen       numberOfFields2 = 0;
560*59599516SKenneth E. Jansen       unsigned int numElements2 = nested->GetNumberOfNestedElements();
561*59599516SKenneth E. Jansen       for (unsigned int j=0; j<numElements2; j++)
562*59599516SKenneth E. Jansen         {
563*59599516SKenneth E. Jansen         vtkPVXMLElement* nested2 = nested->GetNestedElement(j);
564*59599516SKenneth E. Jansen         if (strcmp("Field", nested2->GetName()) == 0)
565*59599516SKenneth E. Jansen           {
566*59599516SKenneth E. Jansen           numberOfFields2++;
567*59599516SKenneth E. Jansen           vtkstd::string paraviewFieldTagStr, dataTypeStr;
568*59599516SKenneth E. Jansen           const char* paraviewFieldTag = 0;
569*59599516SKenneth E. Jansen           paraviewFieldTag = nested2->GetAttribute("paraview_field_tag");
570*59599516SKenneth E. Jansen           if (!paraviewFieldTag)
571*59599516SKenneth E. Jansen             {
572*59599516SKenneth E. Jansen             vtksys_ios::ostringstream paraviewFieldTagStrStream;
573*59599516SKenneth E. Jansen             paraviewFieldTagStrStream << "Field " << numberOfFields2 << ends;
574*59599516SKenneth E. Jansen             paraviewFieldTagStr = paraviewFieldTagStrStream.str();
575*59599516SKenneth E. Jansen             paraviewFieldTag = paraviewFieldTagStr.c_str();
576*59599516SKenneth E. Jansen             }
577*59599516SKenneth E. Jansen           const char* phastaFieldTag = 0;
578*59599516SKenneth E. Jansen           phastaFieldTag = nested2->GetAttribute("phasta_field_tag");
579*59599516SKenneth E. Jansen           if (!phastaFieldTag)
580*59599516SKenneth E. Jansen             {
581*59599516SKenneth E. Jansen             vtkErrorMacro("No phasta field tag was specified");
582*59599516SKenneth E. Jansen             return 0;
583*59599516SKenneth E. Jansen             }
584*59599516SKenneth E. Jansen           int index; // 0 as default (for safety)
585*59599516SKenneth E. Jansen           if (!nested2->GetScalarAttribute("start_index_in_phasta_array", &index))
586*59599516SKenneth E. Jansen             {
587*59599516SKenneth E. Jansen             index = 0;
588*59599516SKenneth E. Jansen             }
589*59599516SKenneth E. Jansen           int numOfComps; // 1 as default (for safety)
590*59599516SKenneth E. Jansen           if (!nested2->GetScalarAttribute("number_of_components", &numOfComps))
591*59599516SKenneth E. Jansen             {
592*59599516SKenneth E. Jansen             numOfComps = 1;
593*59599516SKenneth E. Jansen             }
594*59599516SKenneth E. Jansen           int dataDependency; // nodal as default
595*59599516SKenneth E. Jansen           if (!nested2->GetScalarAttribute("data_dependency", &dataDependency))
596*59599516SKenneth E. Jansen             {
597*59599516SKenneth E. Jansen             dataDependency = 0;
598*59599516SKenneth E. Jansen             }
599*59599516SKenneth E. Jansen           const char* dataType = 0;
600*59599516SKenneth E. Jansen           dataType = nested2->GetAttribute("data_type");
601*59599516SKenneth E. Jansen           if (!dataType) // "double" as default
602*59599516SKenneth E. Jansen             {
603*59599516SKenneth E. Jansen             dataTypeStr = "double";
604*59599516SKenneth E. Jansen             dataType = dataTypeStr.c_str();
605*59599516SKenneth E. Jansen             }
606*59599516SKenneth E. Jansen 
607*59599516SKenneth E. Jansen           this->Reader->SetFieldInfo(paraviewFieldTag,phastaFieldTag,index,numOfComps,dataDependency,dataType);
608*59599516SKenneth E. Jansen           }
609*59599516SKenneth E. Jansen         }
610*59599516SKenneth E. Jansen 
611*59599516SKenneth E. Jansen       if (numberOfFields<numberOfFields2)
612*59599516SKenneth E. Jansen         {
613*59599516SKenneth E. Jansen         numberOfFields = numberOfFields2;
614*59599516SKenneth E. Jansen         }
615*59599516SKenneth E. Jansen 
616*59599516SKenneth E. Jansen       break;
617*59599516SKenneth E. Jansen       }
618*59599516SKenneth E. Jansen     }
619*59599516SKenneth E. Jansen 
620*59599516SKenneth E. Jansen   if (!numberOfFields2) // by default take "solution" with only flow variables
621*59599516SKenneth E. Jansen     {
622*59599516SKenneth E. Jansen     numberOfFields = 3;
623*59599516SKenneth E. Jansen     this->Reader->SetFieldInfo("pressure","solution",0,1,0,"double");
624*59599516SKenneth E. Jansen     this->Reader->SetFieldInfo("velocity","solution",1,3,0,"double");
625*59599516SKenneth E. Jansen     this->Reader->SetFieldInfo("temperature","solution",4,1,0,"double");
626*59599516SKenneth E. Jansen     }
627*59599516SKenneth E. Jansen 
628*59599516SKenneth E. Jansen   int tidx;
629*59599516SKenneth E. Jansen   // Make sure all indices are there
630*59599516SKenneth E. Jansen   for (tidx=1; tidx<numTimeSteps; tidx++)
631*59599516SKenneth E. Jansen     {
632*59599516SKenneth E. Jansen     vtkPPhastaReaderInternal::TimeStepInfoMapType::iterator iter =
633*59599516SKenneth E. Jansen       this->Internal->TimeStepInfoMap.find(tidx);
634*59599516SKenneth E. Jansen     if (iter == this->Internal->TimeStepInfoMap.end())
635*59599516SKenneth E. Jansen       {
636*59599516SKenneth E. Jansen       vtkErrorMacro("Missing timestep, index=" << tidx);
637*59599516SKenneth E. Jansen       return 0;
638*59599516SKenneth E. Jansen       }
639*59599516SKenneth E. Jansen     }
640*59599516SKenneth E. Jansen 
641*59599516SKenneth E. Jansen   if (hasTimeValues)
642*59599516SKenneth E. Jansen     {
643*59599516SKenneth E. Jansen     double* timeSteps = new double[numTimeSteps];
644*59599516SKenneth E. Jansen     for (tidx=0; tidx<numTimeSteps; tidx++)
645*59599516SKenneth E. Jansen       {
646*59599516SKenneth E. Jansen       timeSteps[tidx] = this->Internal->TimeStepInfoMap[tidx].TimeValue;
647*59599516SKenneth E. Jansen       }
648*59599516SKenneth E. Jansen     outInfo->Set(vtkStreamingDemandDrivenPipeline::TIME_STEPS(),
649*59599516SKenneth E. Jansen                  timeSteps,
650*59599516SKenneth E. Jansen                  numTimeSteps);
651*59599516SKenneth E. Jansen     double timeRange[2];
652*59599516SKenneth E. Jansen     timeRange[0] = timeSteps[0];
653*59599516SKenneth E. Jansen     timeRange[1] = timeSteps[numTimeSteps-1];
654*59599516SKenneth E. Jansen     outInfo->Set(vtkStreamingDemandDrivenPipeline::TIME_RANGE(),
655*59599516SKenneth E. Jansen                      timeRange, 2);
656*59599516SKenneth E. Jansen     delete[] timeSteps;
657*59599516SKenneth E. Jansen     }
658*59599516SKenneth E. Jansen 
659*59599516SKenneth E. Jansen   this->TimeStepRange[0] = 0;
660*59599516SKenneth E. Jansen   this->TimeStepRange[1] = numTimeSteps-1;
661*59599516SKenneth E. Jansen 
662*59599516SKenneth E. Jansen   vtkInformation* info = outputVector->GetInformationObject(0);
663*59599516SKenneth E. Jansen   info->Set(
664*59599516SKenneth E. Jansen     vtkStreamingDemandDrivenPipeline::MAXIMUM_NUMBER_OF_PIECES(), -1);
665*59599516SKenneth E. Jansen 
666*59599516SKenneth E. Jansen   return 1;
667*59599516SKenneth E. Jansen }
668*59599516SKenneth E. Jansen 
669*59599516SKenneth E. Jansen //-----------------------------------------------------------------------------
CanReadFile(const char * filename)670*59599516SKenneth E. Jansen int vtkPPhastaReader::CanReadFile(const char *filename)
671*59599516SKenneth E. Jansen {
672*59599516SKenneth E. Jansen   vtkSmartPointer<vtkPVXMLParser> parser
673*59599516SKenneth E. Jansen     = vtkSmartPointer<vtkPVXMLParser>::New();
674*59599516SKenneth E. Jansen   parser->SuppressErrorMessagesOn();
675*59599516SKenneth E. Jansen   parser->SetFileName(filename);
676*59599516SKenneth E. Jansen 
677*59599516SKenneth E. Jansen   // Make sure we can parse the XML metafile.
678*59599516SKenneth E. Jansen   if (!parser->Parse()) return 0;
679*59599516SKenneth E. Jansen 
680*59599516SKenneth E. Jansen   // Make sure the XML file has a root element and it is of the right tag.
681*59599516SKenneth E. Jansen   vtkPVXMLElement *rootElement = parser->GetRootElement();
682*59599516SKenneth E. Jansen   if (!rootElement) return 0;
683*59599516SKenneth E. Jansen   if (strcmp(rootElement->GetName(), "PhastaMetaFile") != 0) return 0;
684*59599516SKenneth E. Jansen 
685*59599516SKenneth E. Jansen   // The file clearly is supposed to be a Phasta file.
686*59599516SKenneth E. Jansen   return 1;
687*59599516SKenneth E. Jansen }
688*59599516SKenneth E. Jansen 
689*59599516SKenneth E. Jansen //----------------------------------------------------------------------------
PrintSelf(ostream & os,vtkIndent indent)690*59599516SKenneth E. Jansen void vtkPPhastaReader::PrintSelf(ostream& os, vtkIndent indent)
691*59599516SKenneth E. Jansen {
692*59599516SKenneth E. Jansen   this->Superclass::PrintSelf(os,indent);
693*59599516SKenneth E. Jansen 
694*59599516SKenneth E. Jansen   os << indent << "FileName: "
695*59599516SKenneth E. Jansen      << (this->FileName?this->FileName:"(none)")
696*59599516SKenneth E. Jansen      << endl;
697*59599516SKenneth E. Jansen   os << indent << "TimeStepIndex: " << this->TimeStepIndex << endl;
698*59599516SKenneth E. Jansen   os << indent << "TimeStepRange: "
699*59599516SKenneth E. Jansen      << this->TimeStepRange[0] << " " << this->TimeStepRange[1]
700*59599516SKenneth E. Jansen      << endl;
701*59599516SKenneth E. Jansen }
702*59599516SKenneth E. Jansen 
703