1 /*=========================================================================
2 
3   Program:   Visualization Toolkit
4   Module:    TestEnzoReader.cxx
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 #include <iostream>
16 #include <string>
17 
18 #include "vtkAMREnzoReader.h"
19 #include "vtkSetGet.h"
20 #include "vtkTestUtilities.h"
21 #include "vtkOverlappingAMR.h"
22 #include "vtkCompositeDataPipeline.h"
23 #include "vtkUniformGrid.h"
24 #include "vtkUniformGridAMRDataIterator.h"
25 namespace EnzoReaderTest {
26 
27 //------------------------------------------------------------------------------
28 template<class T>
CheckValue(const std::string & name,T actualValue,T expectedValue)29 int CheckValue( const std::string &name, T actualValue, T expectedValue )
30 {
31     if( actualValue != expectedValue )
32     {
33       std::cerr << "ERROR: " << name << " value mismatch! ";
34       std::cerr << "Expected: " << expectedValue << " Actual: " << actualValue;
35       std::cerr << std::endl;
36       return 1;
37     }
38     return 0;
39 }
40 
41 } // END namespace
42 
ComputeMaxNonEmptyLevel(vtkOverlappingAMR * amr)43 int ComputeMaxNonEmptyLevel(vtkOverlappingAMR* amr)
44 {
45   vtkUniformGridAMRDataIterator* iter = vtkUniformGridAMRDataIterator::SafeDownCast(amr->NewIterator());
46   iter->SetSkipEmptyNodes(true);
47   int maxLevel(-1);
48   for(iter->InitTraversal(); !iter->IsDoneWithTraversal(); iter->GoToNextItem())
49   {
50     int level = iter->GetCurrentLevel();
51     if(level>maxLevel)
52     {
53       maxLevel = level;
54     }
55   }
56   iter->Delete();
57   return maxLevel+1;
58 }
59 
ComputeNumberOfVisibileCells(vtkOverlappingAMR * amr)60 int ComputeNumberOfVisibileCells(vtkOverlappingAMR* amr)
61 {
62   int numVisibleCells(0);
63   vtkCompositeDataIterator* iter = amr->NewIterator();
64   iter->SkipEmptyNodesOn();
65   for(iter->GoToFirstItem(); !iter->IsDoneWithTraversal(); iter->GoToNextItem())
66   {
67     vtkUniformGrid* grid = vtkUniformGrid::SafeDownCast(iter->GetCurrentDataObject());
68     vtkIdType num = grid->GetNumberOfCells();
69     for(vtkIdType i=0; i<num; i++)
70     {
71       if(grid->IsCellVisible(i))
72       {
73         numVisibleCells++;
74       }
75     }
76   }
77   iter->Delete();
78   return numVisibleCells;
79 }
80 
81 
TestEnzoReader(int argc,char * argv[])82 int TestEnzoReader( int argc, char *argv[] )
83 {
84   int rc = 0;
85   int NumBlocksPerLevel[] = { 1,3,1,1,1,1,1,1 };
86   int numVisibleCells[] = {4096, 6406, 13406, 20406, 23990, 25502, 26377, 27077};
87   vtkAMREnzoReader *myEnzoReader = vtkAMREnzoReader::New();
88   char *fileName =
89     vtkTestUtilities::ExpandDataFileName(argc,argv,
90         "Data/AMR/Enzo/DD0010/moving7_0010.hierarchy");
91   std::cout << "Filename: " << fileName << std::endl;
92   std::cout.flush();
93 
94   vtkOverlappingAMR *amr = nullptr;
95   myEnzoReader->SetFileName( fileName );
96   for(int level = 0; level < myEnzoReader->GetNumberOfLevels(); ++level )
97   {
98     myEnzoReader->SetMaxLevel( level );
99     myEnzoReader->Update();
100     rc+=EnzoReaderTest::CheckValue("LEVEL",myEnzoReader->GetNumberOfLevels(),8);
101     rc+=EnzoReaderTest::CheckValue("BLOCKS",myEnzoReader->GetNumberOfBlocks(),10);
102 
103     amr = myEnzoReader->GetOutput();
104     amr->Audit();
105     if( amr != nullptr )
106     {
107       rc+=EnzoReaderTest::CheckValue(
108         "OUTPUT LEVELS",static_cast<int>(ComputeMaxNonEmptyLevel(amr)),level+1);
109       rc+=EnzoReaderTest::CheckValue(
110           "NUMBER OF BLOCKS AT LEVEL",
111           static_cast<int>(amr->GetNumberOfDataSets(level)),
112           NumBlocksPerLevel[level]
113           );
114       rc+= EnzoReaderTest::CheckValue("Number of Visible cells ",ComputeNumberOfVisibileCells(amr), numVisibleCells[level]);
115     }
116     else
117     {
118       std::cerr << "ERROR: output AMR dataset is nullptr!";
119       return 1;
120     }
121   } // END for all levels
122 
123   myEnzoReader->Delete();
124   delete [] fileName;
125   return( rc );
126 }
127