1
/*=========================================================================
3
Program: Visualization Toolkit
4
Module: $RCSfile: XdmfTestVTKIO.cxx,v $
6
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
8
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
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.
14
=========================================================================*/
16
//This tests vtkXdmfWriter2 and vtkXdmfReader
17
//It manufactures/reads a bunch of test data objects, writes them to disk
18
//via the xdmfwriter, reads the files back in with the xdmfreader, and
19
//compares the output of the reader against the input to the reader. If
20
//differences are found it fails and stops immediately, leaving any failed
21
//files around for inspection. Otherwise it deletes the temporary files it
22
//creates and returns success.
24
#include "vtkXdmfWriter2.h"
26
#include "vtkCellData.h"
27
#include "vtkDataObject.h"
28
#include "vtkDataObjectGenerator.h"
29
#include "vtkDataSet.h"
30
#include "vtkDataSetWriter.h"
31
#include "vtkFieldData.h"
32
#include "vtkPointData.h"
33
#include "vtkDataSetReader.h"
34
#include "vtksys/SystemTools.hxx"
35
//#include "vtkTemporalFractal.h"
36
//#include "vtkTestUtilities.h"
37
#include "vtkTimeSourceExample.h"
38
#include "vtkXdmfReader.h"
42
const char testobject[NUMTESTS][40] = {
61
"MB{ ID1 UF1 RG1 SG1 PD1 UG1 }",
62
"HB[ (UF1)(UF1)(UF1) ]",
65
bool CleanUpGood = true;
67
bool DoFilesExist(const char*xdmffile, const char*hdf5file, bool deleteIfSo)
69
bool xexists = (xdmffile?vtksys::SystemTools::FileExists(xdmffile):true);
70
bool hexists = (hdf5file?vtksys::SystemTools::FileExists(hdf5file):true);
71
bool xlenOK = (xdmffile?vtksys::SystemTools::FileLength(xdmffile)!=0:true);
72
bool hlenOK = (hdf5file?vtksys::SystemTools::FileLength(hdf5file)!=0:true);
74
bool theyDo = xexists && xlenOK && hexists && hlenOK;
75
if (theyDo && deleteIfSo && CleanUpGood)
84
bool DoDataObjectsDiffer(vtkDataObject *dobj1, vtkDataObject *dobj2)
86
if (strcmp(dobj1->GetClassName(), dobj2->GetClassName()))
88
cerr << "Class name test failed " << dobj1->GetClassName() << " != " << dobj2->GetClassName() << endl;
89
//return true; //disable for now
91
if (dobj1->GetFieldData()->GetNumberOfArrays() !=
92
dobj2->GetFieldData()->GetNumberOfArrays())
94
cerr << "Number of field arrays test failed" << endl;
97
if (dobj1->GetEstimatedMemorySize()!=dobj2->GetEstimatedMemorySize())
99
cerr << "Mem size test failed" << endl;
102
vtkDataSet *ds1 = vtkDataSet::SafeDownCast(dobj1);
103
vtkDataSet *ds2 = vtkDataSet::SafeDownCast(dobj2);
106
if ((ds1->GetNumberOfCells() != ds2->GetNumberOfCells()) ||
107
(ds1->GetNumberOfPoints() != ds2->GetNumberOfPoints()))
109
cerr << "Number of Cells/Points test failed" << endl;
112
double *bds1 = ds1->GetBounds();
113
double *bds2 = ds2->GetBounds();
114
if ((bds1[0]!=bds2[0]) ||
115
(bds1[1]!=bds2[1]) ||
116
(bds1[2]!=bds2[2]) ||
117
(bds1[3]!=bds2[3]) ||
118
(bds1[4]!=bds2[4]) ||
121
cerr << "Bounds test failed" << endl;
124
if ((ds1->GetPointData()->GetNumberOfArrays() !=
125
ds2->GetPointData()->GetNumberOfArrays()) ||
126
(ds1->GetCellData()->GetNumberOfArrays() !=
127
ds2->GetCellData()->GetNumberOfArrays()))
129
cerr << "Number of data arrays test failed" << endl;
132
//TODO:Check array names, types, widths and ranges
137
bool TestXDMFConversion(vtkDataObject*input, char *prefix)
142
sprintf(xdmffile, "%s.xmf", prefix);
143
sprintf(hdf5file, "%s.h5", prefix);
144
sprintf(vtkfile, "%s.vtk", prefix);
146
vtkXdmfWriter2 *xwriter = vtkXdmfWriter2::New();
147
xwriter->SetLightDataLimit(10000);
148
xwriter->WriteAllTimeStepsOn();
149
xwriter->SetFileName(xdmffile);
150
xwriter->SetInput(input);
154
vtkDataSet *ds = vtkDataSet::SafeDownCast(input);
157
vtkDataSetWriter *dsw = vtkDataSetWriter::New();
158
dsw->SetFileName(vtkfile);
164
if (!DoFilesExist(xdmffile, NULL, false))
166
cerr << "Writer did not create " << xdmffile << endl;
170
//TODO: Once it works, enable this
171
vtkXdmfReader *xreader = vtkXdmfReader::New();
172
xreader->SetFileName(xdmffile);
174
vtkDataObject *rOutput = xreader->GetOutputDataObject(0);
176
bool fail = DoDataObjectsDiffer(input, rOutput);
177
if (!fail && CleanUpGood)
189
int main (int ac, char **av)
192
for (int i = 1; i < ac; i++)
194
if (!strcmp(av[i], "--dont-clean"))
203
vtkDataObjectGenerator *dog = vtkDataObjectGenerator::New();
205
while (!fail && i<NUMTESTS)
208
sprintf(filename, "xdmfIOtest_%d", i);
209
cerr << "Test vtk object " << testobject[i] << endl;
210
dog->SetProgram(testobject[i]);
212
fail = TestXDMFConversion(dog->GetOutput(), filename);
224
cerr << "Test temporal data" << endl;
225
vtkTimeSourceExample *tsrc = vtkTimeSourceExample::New();
227
tsrc->SetXAmplitude(2.0);
229
vtkXdmfWriter2 *xwriter = vtkXdmfWriter2::New();
230
xwriter->SetLightDataLimit(10000);
231
xwriter->WriteAllTimeStepsOn();
232
xwriter->SetFileName("xdmfIOtest_temporal_1.xmf");
233
xwriter->SetInputConnection(0,tsrc->GetOutputPort(0));
239
fail = !DoFilesExist("xdmfIOtest_temporal_1.xmf", NULL, true);
242
cerr << "Failed Temporal Test 1" << endl;
247
if (!vtkTestUtilities::GetDataRoot(ac,av))
249
cerr << "NO DATA ROOT" << endl;
255
vtkTestUtilities::ExpandDataFileName(
256
ac, av, "Data/RectGrid2.vtk");
257
if (DoFilesExist(fname, NULL, false))
259
vtkDataSetReader *dsr = vtkDataSetReader::New();
260
dsr->SetFileName(fname);
262
fail = TestXDMFConversion(dsr->GetOutput(), "xdmfIOtest_DSR_1");
267
cerr << "Failed DataSetReader Test 1" << endl;
271
dsr = vtkDataSetReader::New();
273
vtkTestUtilities::ExpandDataFileName(
274
ac, av, "Data/uGridEx.vtk");
275
dsr->SetFileName(fname);
277
fail = TestXDMFConversion(dsr->GetOutput(), "xdmfIOtest_DSR_2");
282
cerr << "Failed DataSetReader Test 2" << endl;