/*========================================================================= Program: Visualization Toolkit Module: TestAMRBox.cxx Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkAMRBox.h" #include "vtkStructuredData.h" #include #include void Construct2DAMRBox( vtkAMRBox& box,int lo[3],int hi[3]) { box.SetDimensions( lo, hi, VTK_XY_PLANE ); } //------------------------------------------------------------------------------ void Construct3DAMRBox( vtkAMRBox& box,int lo[3],int hi[3]) { box.SetDimensions( lo, hi , VTK_XYZ_GRID); } //------------------------------------------------------------------------------ int TestAMRBoxEquality() { int rc = 0; double h[3]; int lo[3]; int hi[3]; vtkAMRBox A, B, C, A2D; h[0] = h[1] = h[2] = 1.0; lo[0] = lo[1] = lo[2] = 8; hi[0] = hi[1] = hi[2] = 16; Construct3DAMRBox( A, lo, hi ); Construct3DAMRBox( B, lo, hi ); Construct2DAMRBox( A2D, lo, hi ); h[0] = h[1] = h[2] = 1.0; lo[0] = lo[1] = lo[2] = 16; hi[0] = hi[1] = hi[2] = 32; Construct3DAMRBox( C, lo, hi ); if( A != B ) { rc++; } if( A == A2D ) { rc++; } if( A == C ) { rc++; } return( rc ); } //------------------------------------------------------------------------------ int TestAMRBoxAssignmentOperator() { int rc = 0; double h[3]; int lo[3]; int hi[3]; vtkAMRBox A, B; h[0] = h[1] = h[2] = 1.0; lo[0] = lo[1] = lo[2] = 8; hi[0] = hi[1] = hi[2] = 16; Construct3DAMRBox( A, lo, hi ); B = A; if( A != B ) { rc++; } return( rc ); } //------------------------------------------------------------------------------ int TestAMRBoxCoarsenRefineOperators() { int rc = 0; double h[3]; int lo[3]; int hi[3]; vtkAMRBox A, A0, Ar; // Here is the initial AMR box h[0] = h[1] = h[2] = 1.0; lo[0] = lo[1] = lo[2] = 8; hi[0] = hi[1] = hi[2] = 16; Construct3DAMRBox( A, lo, hi); // Here is the refined AMR box h[0] = h[1] = h[2] = 0.5; lo[0] = lo[1] = lo[2] = 16; hi[0] = hi[1] = hi[2] = 33; Construct3DAMRBox( Ar, lo, hi ); // Save the initial AMR box to A0 A0 = A; // Refine the AMR box to Ar A.Refine( 2 ); if( A != Ar ) { std::cerr << "Here is A: "; A.Print( std::cerr ) << "\n"; std::cerr << "Here is Ar: "; Ar.Print( std::cerr ) << "\n"; std::cerr << "ERROR: refining AMR box failed!\n"; rc++; } // Coarsen AMR box to A0 A.Coarsen( 2 ); if( A != A0 ) { std::cerr << "ERROR: coarsening AMR box failed!\n"; rc++; } return( rc ); } //------------------------------------------------------------------------------ int TestAMRBoxShiftOperator() { int rc = 0; double h[3]; int lo[3]; int hi[3]; vtkAMRBox A, A0, Ashifted; // Here is the initial AMR box h[0] = h[1] = h[2] = 1.0; lo[0] = lo[1] = lo[2] = 8; hi[0] = hi[1] = hi[2] = 16; Construct3DAMRBox( A, lo, hi); A0 = A; int shift[3]; shift[0] = shift[1] = shift[2] = 3; // Here is the shifted AMR box h[0] = h[1] = h[2] = 1.0; lo[0] = lo[1] = lo[2] = 11; hi[0] = hi[1] = hi[2] = 19; Construct3DAMRBox( Ashifted, lo, hi); A.Shift( shift ); if( A != Ashifted ) { std::cerr << "ERROR: shifting AMR box failed!\n"; rc++; } // Reverse shift orientation for( int i=0; i < 3; i++) { shift[i] = shift[i]*(-1); } A.Shift( shift ); if( A != A0 ) { std::cerr << "ERROR: shifting AMR box failed!\n"; rc++; } return( rc ); } //------------------------------------------------------------------------------ int TestAMRBoxGrowShrinkOperators() { int rc = 0; double h[3]; int lo[3]; int hi[3]; vtkAMRBox A, A0, Agrown; // Here is the initial AMR box h[0] = h[1] = h[2] = 1.0; lo[0] = lo[1] = lo[2] = 8; hi[0] = hi[1] = hi[2] = 16; Construct3DAMRBox( A, lo, hi); A0 = A; // Here is the initial AMR box h[0] = h[1] = h[2] = 1.0; lo[0] = lo[1] = lo[2] = 6; hi[0] = hi[1] = hi[2] = 18; Construct3DAMRBox( Agrown, lo, hi); A.Grow( 2 ); if( A != Agrown ) { std::cerr << "ERROR: growing AMR box failed!\n"; rc ++; } A.Shrink( 2 ); if( A != A0 ) { std::cerr << "ERROR: shrinking AMR box failed!\n"; rc ++; } return( rc ); } //------------------------------------------------------------------------------ int TestAMRBoxIntersection() { int rc = 0; double h[3]; int lo[3]; int hi[3]; vtkAMRBox A0, A, B, I; // Here is the initial AMR box h[0] = h[1] = h[2] = 1.0; lo[0] = lo[1] = lo[2] = 8; hi[0] = hi[1] = hi[2] = 16; Construct3DAMRBox( A, lo, hi); // Save the initial A0 = A; B = A; B.Shrink( 2 ); bool doesIntersect = A.Intersect( B ); if( !doesIntersect || (A != B) ) { std::cerr << "ERROR: Intersecting a fully encompassing box failed!\n"; rc++; } A = A0; B = A; B.Shift( 2,2,2 ); // Here is the expected box after intersecting h[0] = h[1] = h[2] = 1.0; lo[0] = lo[1] = lo[2] = 10; hi[0] = hi[1] = hi[2] = 16; Construct3DAMRBox(I, lo, hi ); doesIntersect = A.Intersect( B ); if( !doesIntersect || (A != I) ) { std::cerr << "ERROR: Intersecting a partially overlapping box failed!\n"; rc++; } A = A0; B = A; B.Shift(10,10,10); doesIntersect = A.Intersect( B ); if( doesIntersect ) { std::cerr << "ERROR: Intersecting a non-overlapping box failed!\n"; rc++; } return( rc ); } //------------------------------------------------------------------------------ int TestAMRBoxSerialization() { int rc = 0; double h[3]; int lo[3]; int hi[3]; vtkAMRBox A; // Here is the initial AMR box h[0] = h[1] = h[2] = 1.0; lo[0] = lo[1] = lo[2] = 8; hi[0] = hi[1] = hi[2] = 16; Construct3DAMRBox( A, lo, hi); vtkIdType bytesize = 0; unsigned char *buffer = nullptr; A.Serialize( buffer, bytesize ); if( (buffer == nullptr) || (bytesize == 0) ) { std::cerr << "ERROR: Serializing AMR box failed!\n"; ++rc; } vtkIdType expectedByteSize = vtkAMRBox::GetBytesize(); if( bytesize != expectedByteSize ) { std::cerr << "ERROR: Bytesize of buffer did not match expected size!\n"; ++rc; } vtkAMRBox B; B.Deserialize( buffer, bytesize ); if( A != B ) { std::cerr << "ERROR: Deserialization of AMR box failed!\n"; rc++; } delete [] buffer; return( rc ); } //------------------------------------------------------------------------------ void CheckTestStatus( int rc, const std::string &TestName ) { std::cout << "Test " << TestName << "..."; std::cout.flush(); if( rc == 0 ) { std::cout << "PASSED!\n"; std::cout.flush(); } else { std::cout << "FAILED!\n"; std::cout.flush(); } } #include //------------------------------------------------------------------------------ int TestAMRBox(int , char *[]) { int rc = 0; rc += TestAMRBoxEquality(); CheckTestStatus(rc, "TestAMRBoxEquality"); rc += TestAMRBoxAssignmentOperator(); CheckTestStatus(rc, "TestAMRBoxAssignmentOperator"); rc += TestAMRBoxCoarsenRefineOperators(); CheckTestStatus(rc, "TestAMRBoxCoarsenRefineOperators"); rc += TestAMRBoxShiftOperator(); CheckTestStatus(rc, "TestAMRBoxShiftOperator"); rc += TestAMRBoxGrowShrinkOperators(); CheckTestStatus(rc, "TestAMRBoxGrowShrinkOperators"); rc += TestAMRBoxIntersection(); CheckTestStatus(rc, "TestAMRBoxIntersection"); rc += TestAMRBoxSerialization(); CheckTestStatus(rc, "TestAMRBoxSerialization"); return( rc ); }