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