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