~ubuntu-branches/ubuntu/quantal/xdmf/quantal

« back to all changes in this revision

Viewing changes to vtk/Testing/Cxx/XdmfTestVTKIO.cxx

  • Committer: Bazaar Package Importer
  • Author(s): Alastair McKinstry
  • Date: 2011-07-09 10:33:32 UTC
  • Revision ID: james.westby@ubuntu.com-20110709103332-2w36cerw7215fzoe
Tags: upstream-2.1.dfsg.1
ImportĀ upstreamĀ versionĀ 2.1.dfsg.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*=========================================================================
 
2
 
 
3
  Program:   Visualization Toolkit
 
4
  Module:    $RCSfile: XdmfTestVTKIO.cxx,v $
 
5
 
 
6
  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
 
7
  All rights reserved.
 
8
  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
 
9
 
 
10
     This software is distributed WITHOUT ANY WARRANTY; without even
 
11
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 
12
     PURPOSE.  See the above copyright notice for more information.
 
13
 
 
14
=========================================================================*/
 
15
//Description:
 
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.
 
23
 
 
24
#include "vtkXdmfWriter2.h"
 
25
 
 
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"
 
39
 
 
40
#define NUMTESTS 20
 
41
 
 
42
const char testobject[NUMTESTS][40] = {
 
43
    "ID1",
 
44
    "ID2",
 
45
    "UF1",
 
46
    "RG1",
 
47
    "SG1",
 
48
    "PD1",
 
49
    "PD2",
 
50
    "UG1",
 
51
    "UG2",
 
52
    "UG3",
 
53
    "UG4",
 
54
    "MB{}",
 
55
    "MB{ID1}",
 
56
    "MB{UF1}",
 
57
    "MB{RG1}",
 
58
    "MB{SG1}",
 
59
    "MB{PD1}",
 
60
    "MB{UG1}",
 
61
    "MB{ ID1 UF1 RG1 SG1 PD1 UG1 }",
 
62
    "HB[ (UF1)(UF1)(UF1) ]",
 
63
};
 
64
 
 
65
bool CleanUpGood = true;
 
66
 
 
67
bool DoFilesExist(const char*xdmffile, const char*hdf5file, bool deleteIfSo)
 
68
{
 
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);
 
73
 
 
74
  bool theyDo = xexists && xlenOK && hexists && hlenOK;
 
75
  if (theyDo && deleteIfSo && CleanUpGood)
 
76
    {
 
77
    unlink(xdmffile);
 
78
    unlink(hdf5file);
 
79
    }
 
80
 
 
81
  return theyDo;
 
82
}
 
83
 
 
84
bool DoDataObjectsDiffer(vtkDataObject *dobj1, vtkDataObject *dobj2)
 
85
{
 
86
  if (strcmp(dobj1->GetClassName(), dobj2->GetClassName()))
 
87
  {
 
88
    cerr << "Class name test failed " << dobj1->GetClassName() << " != " << dobj2->GetClassName() << endl;
 
89
    //return true; //disable for now
 
90
  }
 
91
  if (dobj1->GetFieldData()->GetNumberOfArrays() !=
 
92
      dobj2->GetFieldData()->GetNumberOfArrays())
 
93
  {
 
94
    cerr << "Number of field arrays test failed" << endl;
 
95
    return true;
 
96
  }
 
97
  if (dobj1->GetEstimatedMemorySize()!=dobj2->GetEstimatedMemorySize())
 
98
  {
 
99
    cerr << "Mem size test failed" << endl;
 
100
    return true;
 
101
  }
 
102
  vtkDataSet *ds1 = vtkDataSet::SafeDownCast(dobj1);
 
103
  vtkDataSet *ds2 = vtkDataSet::SafeDownCast(dobj2);
 
104
  if (ds1 && ds2)
 
105
  {
 
106
    if ((ds1->GetNumberOfCells() != ds2->GetNumberOfCells()) ||
 
107
        (ds1->GetNumberOfPoints() != ds2->GetNumberOfPoints()))
 
108
    {
 
109
      cerr << "Number of Cells/Points test failed" << endl;
 
110
      return true;
 
111
    }
 
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]) ||
 
119
        (bds1[5]!=bds2[5]))
 
120
    {
 
121
      cerr << "Bounds test failed" << endl;
 
122
      return true;
 
123
    }
 
124
    if ((ds1->GetPointData()->GetNumberOfArrays() !=
 
125
        ds2->GetPointData()->GetNumberOfArrays()) ||
 
126
        (ds1->GetCellData()->GetNumberOfArrays() !=
 
127
         ds2->GetCellData()->GetNumberOfArrays()))
 
128
    {
 
129
     cerr << "Number of data arrays test failed" << endl;
 
130
     return true;
 
131
    }
 
132
    //TODO:Check array names, types, widths and ranges
 
133
  }
 
134
  return false;
 
135
}
 
136
 
 
137
bool TestXDMFConversion(vtkDataObject*input, char *prefix)
 
138
{
 
139
  char xdmffile[256];
 
140
  char hdf5file[256];
 
141
  char vtkfile[256];
 
142
  sprintf(xdmffile, "%s.xmf", prefix);
 
143
  sprintf(hdf5file, "%s.h5", prefix);
 
144
  sprintf(vtkfile, "%s.vtk", prefix);
 
145
 
 
146
  vtkXdmfWriter2 *xwriter = vtkXdmfWriter2::New();
 
147
  xwriter->SetLightDataLimit(10000);
 
148
  xwriter->WriteAllTimeStepsOn();
 
149
  xwriter->SetFileName(xdmffile);
 
150
  xwriter->SetInput(input);
 
151
  xwriter->Write();
 
152
 
 
153
  xwriter->Delete();
 
154
  vtkDataSet *ds = vtkDataSet::SafeDownCast(input);
 
155
  if (ds)
 
156
    {    
 
157
    vtkDataSetWriter *dsw = vtkDataSetWriter::New();
 
158
    dsw->SetFileName(vtkfile);
 
159
    dsw->SetInput(ds);
 
160
    dsw->Write();
 
161
    dsw->Delete();
 
162
    }
 
163
 
 
164
  if (!DoFilesExist(xdmffile, NULL, false))
 
165
  {
 
166
    cerr << "Writer did not create " << xdmffile << endl;
 
167
    return true;
 
168
  }
 
169
 
 
170
  //TODO: Once it works, enable this
 
171
  vtkXdmfReader *xreader = vtkXdmfReader::New();
 
172
  xreader->SetFileName(xdmffile);
 
173
  xreader->Update();
 
174
  vtkDataObject *rOutput = xreader->GetOutputDataObject(0);
 
175
 
 
176
  bool fail = DoDataObjectsDiffer(input, rOutput);
 
177
  if (!fail && CleanUpGood)
 
178
  {
 
179
   //test passed!
 
180
   unlink(xdmffile);
 
181
   unlink(hdf5file);
 
182
   unlink(vtkfile);
 
183
  }
 
184
 
 
185
  xreader->Delete();
 
186
  return fail;
 
187
}
 
188
 
 
189
int main (int ac, char **av)
 
190
{
 
191
  
 
192
  for (int i = 1; i < ac; i++)
 
193
    {
 
194
    if (!strcmp(av[i], "--dont-clean"))
 
195
      {
 
196
      CleanUpGood = false;
 
197
      }
 
198
    }
 
199
 
 
200
  bool fail = false; 
 
201
 
 
202
  //TEST SET 1
 
203
  vtkDataObjectGenerator *dog = vtkDataObjectGenerator::New();
 
204
  int i = 0;
 
205
  while (!fail && i<NUMTESTS)
 
206
  {
 
207
    char filename[256];
 
208
    sprintf(filename, "xdmfIOtest_%d", i);
 
209
    cerr << "Test vtk object " << testobject[i] << endl;
 
210
    dog->SetProgram(testobject[i]);
 
211
    dog->Update();
 
212
    fail = TestXDMFConversion(dog->GetOutput(), filename);
 
213
    i++;
 
214
  }
 
215
 
 
216
  dog->Delete();
 
217
 
 
218
  if (fail)
 
219
  {
 
220
    return VTK_ERROR;
 
221
  }
 
222
 
 
223
  //TEST SET 2
 
224
  cerr << "Test temporal data" << endl;
 
225
  vtkTimeSourceExample *tsrc = vtkTimeSourceExample::New();
 
226
  tsrc->GrowingOn();
 
227
  tsrc->SetXAmplitude(2.0);
 
228
 
 
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));
 
234
  xwriter->Write();
 
235
 
 
236
  xwriter->Delete();
 
237
  tsrc->Delete();
 
238
 
 
239
  fail = !DoFilesExist("xdmfIOtest_temporal_1.xmf", NULL, true);
 
240
  if (fail)
 
241
  {
 
242
    cerr << "Failed Temporal Test 1" << endl;
 
243
    return VTK_ERROR;
 
244
  }
 
245
 
 
246
#if 0
 
247
  if (!vtkTestUtilities::GetDataRoot(ac,av))
 
248
  {
 
249
      cerr << "NO DATA ROOT" << endl;
 
250
      return 0;
 
251
  }
 
252
 
 
253
  //TEST SET 3
 
254
  char* fname = 
 
255
   vtkTestUtilities::ExpandDataFileName(
 
256
    ac, av, "Data/RectGrid2.vtk");
 
257
  if (DoFilesExist(fname, NULL, false))
 
258
  {
 
259
    vtkDataSetReader *dsr = vtkDataSetReader::New();
 
260
    dsr->SetFileName(fname);
 
261
    dsr->Update();
 
262
    fail = TestXDMFConversion(dsr->GetOutput(), "xdmfIOtest_DSR_1");
 
263
    dsr->Delete();
 
264
    delete[] fname;
 
265
    if (fail)
 
266
    {
 
267
      cerr << "Failed DataSetReader Test 1" << endl;
 
268
      return VTK_ERROR;
 
269
    }
 
270
 
 
271
    dsr = vtkDataSetReader::New();
 
272
    fname = 
 
273
     vtkTestUtilities::ExpandDataFileName(
 
274
      ac, av, "Data/uGridEx.vtk");
 
275
    dsr->SetFileName(fname);
 
276
    dsr->Update();
 
277
    fail = TestXDMFConversion(dsr->GetOutput(), "xdmfIOtest_DSR_2");
 
278
    dsr->Delete();
 
279
    delete[] fname;
 
280
    if (fail)
 
281
    {
 
282
      cerr << "Failed DataSetReader Test 2" << endl;
 
283
      return VTK_ERROR;
 
284
    }
 
285
  }
 
286
  else
 
287
  {
 
288
    delete[] fname;
 
289
  }
 
290
 
 
291
#endif
 
292
 
 
293
  //ETC.
 
294
  return 0;
 
295
}
 
296
 
 
297