1 /*=========================================================================
2 
3   Program:   Visualization Toolkit
4 
5   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
6   All rights reserved.
7   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
8 
9      This software is distributed WITHOUT ANY WARRANTY; without even
10      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11      PURPOSE.  See the above copyright notice for more information.
12 
13 =========================================================================*/
14 
15 #include "vtkAbstractElectronicData.h"
16 #include "vtkDataSetCollection.h"
17 #include "vtkImageData.h"
18 #include "vtkMolecule.h"
19 #include "vtkNew.h"
20 #include "vtkOpenQubeElectronicData.h"
21 #include "vtkOpenQubeMoleculeSource.h"
22 #include "vtkTestUtilities.h"
23 #include "vtkWeakPointer.h"
24 
25 #include <openqube/basissetloader.h>
26 
TestOpenQubeElectronicData(int argc,char * argv[])27 int TestOpenQubeElectronicData(int argc, char *argv[])
28 {
29   char* fname = vtkTestUtilities::ExpandDataFileName(
30     argc, argv, "Data/2h2o.out");
31 
32   vtkNew<vtkOpenQubeMoleculeSource> oq;
33   oq->SetFileName(fname);
34   oq->Update();
35 
36   vtkWeakPointer<vtkOpenQubeElectronicData> oqed;
37   oqed = vtkOpenQubeElectronicData::SafeDownCast(
38         oq->GetOutput()->GetElectronicData());
39 
40   if (!oqed)
41   {
42     cerr << "Molecule's electronic data is not from OpenQube.\n";
43     return EXIT_FAILURE;
44   }
45 
46   // Set parameters to generate fast, low-res cubes
47   const float lowResSpacing1 = 1.0;
48   const float lowResSpacing2 = 1.5;
49   const float lowResPadding1 = 1.0;
50   const float lowResPadding2 = 1.5;
51   vtkIdType expectedNumberOfImages = 0;
52 
53   // Calculate 4 cubes using all combinations of the above parameters.
54   // Test that the number of cached images increases accordingly, and that
55   // when a cached image is returned, it is the correct one.
56   oqed->SetSpacing(lowResSpacing1);
57   oqed->SetPadding(lowResPadding1);
58   vtkImageData *testImage11 = oqed->GetHOMO();
59   ++expectedNumberOfImages;
60   if (oqed->GetImages()->GetNumberOfItems() != expectedNumberOfImages)
61   {
62     cerr << "Number of cached images ("
63          << oqed->GetImages()->GetNumberOfItems() << ") not equal to the "
64             "number of expected images (" << expectedNumberOfImages << ")\n";
65     return EXIT_FAILURE;
66   }
67   if (oqed->GetHOMO() != testImage11)
68   {
69     cerr << "(Test11) New orbital calculated when cached image is "
70             "available\n";
71     return EXIT_FAILURE;
72   }
73 
74   oqed->SetSpacing(lowResSpacing1);
75   oqed->SetPadding(lowResPadding2);
76   vtkImageData *testImage12 = oqed->GetHOMO();
77   ++expectedNumberOfImages;
78   if (oqed->GetImages()->GetNumberOfItems() != expectedNumberOfImages)
79   {
80     cerr << "Number of cached images ("
81          << oqed->GetImages()->GetNumberOfItems() << ") not equal to the "
82             "number of expected images (" << expectedNumberOfImages << ")\n";
83     return EXIT_FAILURE;
84   }
85   if (oqed->GetHOMO() != testImage12)
86   {
87     cerr << "(Test12) New orbital calculated when cached image is "
88             "available\n";
89     return EXIT_FAILURE;
90   }
91 
92   oqed->SetSpacing(lowResSpacing2);
93   oqed->SetPadding(lowResPadding1);
94   vtkImageData *testImage21 = oqed->GetHOMO();
95   ++expectedNumberOfImages;
96   if (oqed->GetImages()->GetNumberOfItems() != expectedNumberOfImages)
97   {
98     cerr << "Number of cached images ("
99          << oqed->GetImages()->GetNumberOfItems() << ") not equal to the "
100             "number of expected images (" << expectedNumberOfImages << ")\n";
101     return EXIT_FAILURE;
102   }
103   if (oqed->GetHOMO() != testImage21)
104   {
105     cerr << "(Test21) New orbital calculated when cached image is "
106             "available\n";
107     return EXIT_FAILURE;
108   }
109 
110   oqed->SetSpacing(lowResSpacing2);
111   oqed->SetPadding(lowResPadding2);
112   vtkImageData *testImage22 = oqed->GetHOMO();
113   ++expectedNumberOfImages;
114   if (oqed->GetImages()->GetNumberOfItems() != expectedNumberOfImages)
115   {
116     cerr << "Number of cached images ("
117          << oqed->GetImages()->GetNumberOfItems() << ") not equal to the "
118             "number of expected images (" << expectedNumberOfImages << ")\n";
119     return EXIT_FAILURE;
120   }
121   if (oqed->GetHOMO() != testImage22)
122   {
123     cerr << "(Test22) New orbital calculated when cached image is "
124             "available\n";
125     return EXIT_FAILURE;
126   }
127 
128 
129   return EXIT_SUCCESS;
130 }
131